관련글 : http://asmlove.co.kr/zBdC7/viewtopic.php?t=1776

본 내용은 FPU 명령중에 FLD와 FISTP 에 대한 이해와 gcc와 VC간의 inline assembly 의 변환관계를 다루었던 글입니다.


질문 내용

long long llrint (double x)
{
long long retval;
__asm__ __volatile__ \
("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
return retval;
}

위 코드입니다.

Visaul C++ 에서 인라인 어셈코드로 바뀌면 어떻게 되나요?
제가 어셈블러를 몰라서입니다.

꼭 가르쳐주세요!!!






답변 내용

코드:
long long llrint (double x)
{
#if defined(_WIN32)
volatile long long r;
__asm {
  FLD QWORD PTR x;
  FISTP QWORD PTR r;
}
return(r);
#elif defined(__GNUC__)
long long retval;
__asm__ __volatile__ \
("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
return retval;
#else
# warning not supported llrint function (standard by C99)
#endif
}



다음과 같이 하시면 되겠습니다.

이것은 일종의 double 값을 반올림하여 정수로 반환하는 함수가 되겠습니다.

FLD는 FP 에 주어진 메모리를 읽는 명령입니다.
FISTP는 FP에서 읽어와서 메모리로 저장할때 정수로 반올림과 동시에 pop 을 합니다.


제가 알기로는 C99 표준에는 llrint 가 채택된거 같은데 정확한건 모르겠네요.
그래서 llrint 함수는 gcc 에서는 그냥 컴파일 옵션으로 "-std=c99" 와 링크옵션으로 "-lm" 그리고 "math.h"를 include 하면 사용할수 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/195

댓글을 달아 주세요