📄 timesoftfloat.c
字号:
}
count += minIterations;
} while ( clock() - startClock < CLOCKS_PER_SEC );
inputNum = 0;
startClock = clock();
for ( i = count; i; --i ) {
a.low = inputs_float128[ inputNum ].low;
a.high = inputs_float128[ inputNum ].high;
function( a );
inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
}
endClock = clock();
reportTime( count, endClock - startClock );
}
static void time_ab_float128_z_flag( flag function( float128, float128 ) )
{
clock_t startClock, endClock;
int32 count, i;
int8 inputNumA, inputNumB;
float128 a, b;
count = 0;
inputNumA = 0;
inputNumB = 0;
startClock = clock();
do {
for ( i = minIterations; i; --i ) {
a.low = inputs_float128[ inputNumA ].low;
a.high = inputs_float128[ inputNumA ].high;
b.low = inputs_float128[ inputNumB ].low;
b.high = inputs_float128[ inputNumB ].high;
function( a, b );
inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
if ( inputNumA == 0 ) ++inputNumB;
inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
}
count += minIterations;
} while ( clock() - startClock < CLOCKS_PER_SEC );
inputNumA = 0;
inputNumB = 0;
startClock = clock();
for ( i = count; i; --i ) {
a.low = inputs_float128[ inputNumA ].low;
a.high = inputs_float128[ inputNumA ].high;
b.low = inputs_float128[ inputNumB ].low;
b.high = inputs_float128[ inputNumB ].high;
function( a, b );
inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
if ( inputNumA == 0 ) ++inputNumB;
inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
}
endClock = clock();
reportTime( count, endClock - startClock );
}
static void time_abz_float128( float128 function( float128, float128 ) )
{
clock_t startClock, endClock;
int32 count, i;
int8 inputNumA, inputNumB;
float128 a, b;
count = 0;
inputNumA = 0;
inputNumB = 0;
startClock = clock();
do {
for ( i = minIterations; i; --i ) {
a.low = inputs_float128[ inputNumA ].low;
a.high = inputs_float128[ inputNumA ].high;
b.low = inputs_float128[ inputNumB ].low;
b.high = inputs_float128[ inputNumB ].high;
function( a, b );
inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
if ( inputNumA == 0 ) ++inputNumB;
inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
}
count += minIterations;
} while ( clock() - startClock < CLOCKS_PER_SEC );
inputNumA = 0;
inputNumB = 0;
startClock = clock();
for ( i = count; i; --i ) {
a.low = inputs_float128[ inputNumA ].low;
a.high = inputs_float128[ inputNumA ].high;
b.low = inputs_float128[ inputNumB ].low;
b.high = inputs_float128[ inputNumB ].high;
function( a, b );
inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
if ( inputNumA == 0 ) ++inputNumB;
inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
}
endClock = clock();
reportTime( count, endClock - startClock );
}
static const struct {
bits64 high, low;
} inputs_float128_pos[ numInputs_float128 ] = {
{ LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
{ LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
{ LIT64( 0x05F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
{ LIT64( 0x72B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
{ LIT64( 0x0000000000000000 ), LIT64( 0x0000000000000000 ) },
{ LIT64( 0x3FFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
{ LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
{ LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
{ LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
{ LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
{ LIT64( 0x3F7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
{ LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
{ LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
{ LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
{ LIT64( 0x3FFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
{ LIT64( 0x3DB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
{ LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
{ LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
{ LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
{ LIT64( 0x0001000000000000 ), LIT64( 0x0000001000000001 ) },
{ LIT64( 0x4036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
{ LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
{ LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
{ LIT64( 0x3FFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
{ LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
{ LIT64( 0x35CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
{ LIT64( 0x6228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
{ LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
{ LIT64( 0x41AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
{ LIT64( 0x496F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
{ LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
{ LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
};
static void time_az_float128_pos( float128 function( float128 ) )
{
clock_t startClock, endClock;
int32 count, i;
int8 inputNum;
float128 a;
count = 0;
inputNum = 0;
startClock = clock();
do {
for ( i = minIterations; i; --i ) {
a.low = inputs_float128_pos[ inputNum ].low;
a.high = inputs_float128_pos[ inputNum ].high;
function( a );
inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
}
count += minIterations;
} while ( clock() - startClock < CLOCKS_PER_SEC );
inputNum = 0;
startClock = clock();
for ( i = count; i; --i ) {
a.low = inputs_float128_pos[ inputNum ].low;
a.high = inputs_float128_pos[ inputNum ].high;
function( a );
inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
}
endClock = clock();
reportTime( count, endClock - startClock );
}
#endif
enum {
INT32_TO_FLOAT32 = 1,
INT32_TO_FLOAT64,
#ifdef FLOATX80
INT32_TO_FLOATX80,
#endif
#ifdef FLOAT128
INT32_TO_FLOAT128,
#endif
INT64_TO_FLOAT32,
INT64_TO_FLOAT64,
#ifdef FLOATX80
INT64_TO_FLOATX80,
#endif
#ifdef FLOAT128
INT64_TO_FLOAT128,
#endif
FLOAT32_TO_INT32,
FLOAT32_TO_INT32_ROUND_TO_ZERO,
FLOAT32_TO_INT64,
FLOAT32_TO_INT64_ROUND_TO_ZERO,
FLOAT32_TO_FLOAT64,
#ifdef FLOATX80
FLOAT32_TO_FLOATX80,
#endif
#ifdef FLOAT128
FLOAT32_TO_FLOAT128,
#endif
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_INT64,
FLOAT64_TO_INT64_ROUND_TO_ZERO,
FLOAT64_TO_FLOAT32,
#ifdef FLOATX80
FLOAT64_TO_FLOATX80,
#endif
#ifdef FLOAT128
FLOAT64_TO_FLOAT128,
#endif
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,
#ifdef FLOATX80
FLOATX80_TO_INT32,
FLOATX80_TO_INT32_ROUND_TO_ZERO,
FLOATX80_TO_INT64,
FLOATX80_TO_INT64_ROUND_TO_ZERO,
FLOATX80_TO_FLOAT32,
FLOATX80_TO_FLOAT64,
#ifdef FLOAT128
FLOATX80_TO_FLOAT128,
#endif
FLOATX80_ROUND_TO_INT,
FLOATX80_ADD,
FLOATX80_SUB,
FLOATX80_MUL,
FLOATX80_DIV,
FLOATX80_REM,
FLOATX80_SQRT,
FLOATX80_EQ,
FLOATX80_LE,
FLOATX80_LT,
FLOATX80_EQ_SIGNALING,
FLOATX80_LE_QUIET,
FLOATX80_LT_QUIET,
#endif
#ifdef FLOAT128
FLOAT128_TO_INT32,
FLOAT128_TO_INT32_ROUND_TO_ZERO,
FLOAT128_TO_INT64,
FLOAT128_TO_INT64_ROUND_TO_ZERO,
FLOAT128_TO_FLOAT32,
FLOAT128_TO_FLOAT64,
#ifdef FLOATX80
FLOAT128_TO_FLOATX80,
#endif
FLOAT128_ROUND_TO_INT,
FLOAT128_ADD,
FLOAT128_SUB,
FLOAT128_MUL,
FLOAT128_DIV,
FLOAT128_REM,
FLOAT128_SQRT,
FLOAT128_EQ,
FLOAT128_LE,
FLOAT128_LT,
FLOAT128_EQ_SIGNALING,
FLOAT128_LE_QUIET,
FLOAT128_LT_QUIET,
#endif
NUM_FUNCTIONS
};
static struct {
char *name;
int8 numInputs;
flag roundingPrecision, roundingMode;
flag tininessMode, tininessModeAtReducedPrecision;
} functions[ NUM_FUNCTIONS ] = {
{ 0, 0, 0, 0, 0, 0 },
{ "int32_to_float32", 1, FALSE, TRUE, FALSE, FALSE },
{ "int32_to_float64", 1, FALSE, FALSE, FALSE, FALSE },
#ifdef FLOATX80
{ "int32_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE },
#endif
#ifdef FLOAT128
{ "int32_to_float128", 1, FALSE, FALSE, FALSE, FALSE },
#endif
{ "int64_to_float32", 1, FALSE, TRUE, FALSE, FALSE },
{ "int64_to_float64", 1, FALSE, TRUE, FALSE, FALSE },
#ifdef FLOATX80
{ "int64_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE },
#endif
#ifdef FLOAT128
{ "int64_to_float128", 1, FALSE, FALSE, FALSE, FALSE },
#endif
{ "float32_to_int32", 1, FALSE, TRUE, FALSE, FALSE },
{ "float32_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float32_to_int64", 1, FALSE, TRUE, FALSE, FALSE },
{ "float32_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float32_to_float64", 1, FALSE, FALSE, FALSE, FALSE },
#ifdef FLOATX80
{ "float32_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE },
#endif
#ifdef FLOAT128
{ "float32_to_float128", 1, FALSE, FALSE, FALSE, FALSE },
#endif
{ "float32_round_to_int", 1, FALSE, TRUE, FALSE, FALSE },
{ "float32_add", 2, FALSE, TRUE, FALSE, FALSE },
{ "float32_sub", 2, FALSE, TRUE, FALSE, FALSE },
{ "float32_mul", 2, FALSE, TRUE, TRUE, FALSE },
{ "float32_div", 2, FALSE, TRUE, FALSE, FALSE },
{ "float32_rem", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_sqrt", 1, FALSE, TRUE, FALSE, FALSE },
{ "float32_eq", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_le", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_lt", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_le_quiet", 2, FALSE, FALSE, FALSE, FALSE },
{ "float32_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_to_int32", 1, FALSE, TRUE, FALSE, FALSE },
{ "float64_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float64_to_int64", 1, FALSE, TRUE, FALSE, FALSE },
{ "float64_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float64_to_float32", 1, FALSE, TRUE, TRUE, FALSE },
#ifdef FLOATX80
{ "float64_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE },
#endif
#ifdef FLOAT128
{ "float64_to_float128", 1, FALSE, FALSE, FALSE, FALSE },
#endif
{ "float64_round_to_int", 1, FALSE, TRUE, FALSE, FALSE },
{ "float64_add", 2, FALSE, TRUE, FALSE, FALSE },
{ "float64_sub", 2, FALSE, TRUE, FALSE, FALSE },
{ "float64_mul", 2, FALSE, TRUE, TRUE, FALSE },
{ "float64_div", 2, FALSE, TRUE, FALSE, FALSE },
{ "float64_rem", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_sqrt", 1, FALSE, TRUE, FALSE, FALSE },
{ "float64_eq", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_le", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_lt", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_le_quiet", 2, FALSE, FALSE, FALSE, FALSE },
{ "float64_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE },
#ifdef FLOATX80
{ "floatx80_to_int32", 1, FALSE, TRUE, FALSE, FALSE },
{ "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_to_int64", 1, FALSE, TRUE, FALSE, FALSE },
{ "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_to_float32", 1, FALSE, TRUE, TRUE, FALSE },
{ "floatx80_to_float64", 1, FALSE, TRUE, TRUE, FALSE },
#ifdef FLOAT128
{ "floatx80_to_float128", 1, FALSE, FALSE, FALSE, FALSE },
#endif
{ "floatx80_round_to_int", 1, FALSE, TRUE, FALSE, FALSE },
{ "floatx80_add", 2, TRUE, TRUE, FALSE, TRUE },
{ "floatx80_sub", 2, TRUE, TRUE, FALSE, TRUE },
{ "floatx80_mul", 2, TRUE, TRUE, TRUE, TRUE },
{ "floatx80_div", 2, TRUE, TRUE, FALSE, TRUE },
{ "floatx80_rem", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_sqrt", 1, TRUE, TRUE, FALSE, FALSE },
{ "floatx80_eq", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_le", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_lt", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_le_quiet", 2, FALSE, FALSE, FALSE, FALSE },
{ "floatx80_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE },
#endif
#ifdef FLOAT128
{ "float128_to_int32", 1, FALSE, TRUE, FALSE, FALSE },
{ "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float128_to_int64", 1, FALSE, TRUE, FALSE, FALSE },
{ "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
{ "float128_to_float32", 1, FALSE, TRUE, TRUE, FALSE },
{ "float128_to_float64", 1, FALSE, TRUE, TRUE, FALSE },
#ifdef FLOATX80
{ "float128_to_floatx80", 1, FALSE, TRUE, TRUE, FALSE },
#endif
{ "float128_round_to_int", 1, FALSE, TRUE, FALSE, FALSE },
{ "float128_add", 2, FALSE, TRUE, FALSE, FALSE },
{ "float128_sub", 2, FALSE, TRUE, FALSE, FALSE },
{ "float128_mul", 2, FALSE, TRUE, TRUE, FALSE },
{ "float128_div", 2, FALSE, TRUE, FALSE, FALSE },
{ "float128_rem", 2, FALSE, FALSE, FALSE, FALSE },
{ "float128_sqrt", 1, FALSE, TRUE, FALSE, FALSE },
{ "float128_eq", 2, FA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -