📄 timesoftfloat.c
字号:
}
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -