No older revisions available
No older revisions available
~cpp
// 인라인 어셈 사용.
fprep dd 59c00000h
fadd [fprep]
fsub [fprep]
~cpp
// C언어 함수
#ifdef __BIGENDIAN__
# define FTOI_LONG reserved, l
#else
# define FTOI_LONG l
#endif
#define USE_FTOI register union{ double r; struct { _integer4 FTOI_LONG; } l; } __ftoitmp;
#define OP_FTOI(val)\
( ( (__ftoitmp.r=(val)+((((65536.*65536.*16.)+(65536.*.5))*65536.)) ),\
__ftoitmp.l.l-0x80000000L ) )
~cpp
// 테스트
#include <stdio.h>
#include <stdlib.h>
#ifndef _WIN32
/* for linux/unix */
#include <time.h>
#include <sys/time.h>
static void printf_localtime()
{
struct tm * ttt;
struct timeval tv;
gettimeofday(&tv, NULL);
ttt = localtime(&tv);
printf("%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d", ttt->tm_year, ttt->tm_mon, ttt->tm_mday, ttt->tm_hour, ttt->tm_min, ttt->tm_sec, tv.tv_usec/1000);
}
static unsigned int get_clock()
{
struct timeval tv;
unsigned int t;
gettimeofday(&tv, NULL);
t = ((tv.tv_sec % 1000000) * 1000) + (tv.tv_usec / 1000);
return t;
}
#else
/* for windows */
#define get_clock clock
#endif
#ifdef __BIGENDIAN__
# define FTOI_LONG reserved, l
#else
# define FTOI_LONG l
#endif
#define USE_FTOI union{ double r; struct { long FTOI_LONG; } l; } __ftoitmp;
#define OP_FTOI(val) \
( ( (__ftoitmp.r=(val)+((((65536.*65536.*16.)+(65536.*.5))*65536.)) ), \
__ftoitmp.l.l-0x80000000L ) )
#define USE_FTOI2 union{ double r; struct { long FTOI_LONG; } l; } __ftoitmp;
#define LOOPCNT1 10
#define LOOPCNT2 10000000
void conv1(double *dv, long *lv)
{
*lv = *dv;
}
void test1()
{
double dval = 123456789.12345678;
long lval = 0;
long total = 0;
long start = 0, finish = 0;
long avg = 0;
long i=0, j=0;
start = get_clock();
for(j=0; j<LOOPCNT1; j++) {
for(i=0; i<LOOPCNT2; i++) {
conv1(&dval, &lval);
}
}
finish = get_clock();
total = finish - start;
avg = total / LOOPCNT1 / LOOPCNT2;
printf("1.... value %ld total %ld ms, avg %ld ms\n", lval, total, avg);
}
void conv2(double *dv, long *lv)
{
USE_FTOI
*lv = OP_FTOI(*dv);
}
void test2()
{
double dval = 123456789.12345678;
long lval = 0;
long total = 0;
long start = 0, finish = 0;
long avg = 0;
long i=0, j=0;
start = get_clock();
for(j=0; j<LOOPCNT1; j++) {
for(i=0; i<LOOPCNT2; i++) {
conv2(&dval, &lval);
}
}
finish = get_clock();
total = finish - start;
avg = total / LOOPCNT1 / LOOPCNT2;
printf("2.... value %ld total %ld ms, avg %ld ms\n", lval, total, avg);
}
void conv3(double *dv, long *lv)
{
register USE_FTOI
*lv = OP_FTOI(*dv);
}
void test3()
{
double dval = 123456789.12345678;
long lval = 0;
long total = 0;
long start = 0, finish = 0;
long avg = 0;
long i=0, j=0;
start = get_clock();
for(j=0; j<LOOPCNT1; j++) {
for(i=0; i<LOOPCNT2; i++) {
conv3(&dval, &lval);
}
}
finish = get_clock();
total = finish - start;
avg = total / LOOPCNT1 / LOOPCNT2;
printf("3.... value %ld total %ld ms, avg %ld ms\n", lval, total, avg);
}
int main(int argc, char *argv[])
{
test1();
test2();
test3();
return 0;
}
~cpp
// 결과값
-O0
1.... value 123456789 total 1750 ms, avg 0 ms
2.... value 123456789 total 921 ms, avg 0 ms
3.... value 123456789 total 1579 ms, avg 0 ms
-O1
1.... value 123456789 total 1671 ms, avg 0 ms
2.... value 123456789 total 829 ms, avg 0 ms
3.... value 123456789 total 828 ms, avg 0 ms
-O2
1.... value 123456789 total 1656 ms, avg 0 ms
2.... value 123456789 total 1047 ms, avg 0 ms
3.... value 123456789 total 1031 ms, avg 0 ms
-O3
1.... value 123456789 total 62 ms, avg 0 ms
2.... value 123456789 total 203 ms, avg 0 ms
3.... value 123456789 total 188 ms, avg 0 ms