2016-06-01 2 views
0

xmm 레지스터에 고정되어있는 double precision float 값의 아크 탄젠트를 계산하려고합니다. 정상적인 float 포인팅을 사용하면 FPATAN x87 명령을 사용하는 것이 가능하지만 어떻게 double을 사용하여이 작업을 수행 할 수 있습니까?인텔 x86_64 어셈블리, x87과 SSE2 사이를 이동하는 방법? (double의 역 탄젠트 계산)

+1

오래된 x87 부동 소수점 스택은 xmm 레지스터보다 정밀도가 높기 때문에 여기에서 계산을 수행 할 수 있습니다. – MicroVirus

+0

그러면 어떻게 xmm 값을 해당 포인트 스택으로 옮길 수 있습니까 ?? fld xmm does does all at – formateu

+2

'[x/y/z] mm'-registers와 x87-stack 사이에서 값을 이동하려면 메모리 (일반적으로 프로그램 스택)를 사용해야합니다. – EOF

답변

2

은 여전히 ​​xmm에서 x87로 데이터를 복사하여 fpatan과 같은 명령어를 사용하지만 일반적으로 수학 라이브러리 함수를 호출해야합니다. (fpatan은 너무 느리기 때문에 많은 간단한 지침으로 대체하는 것이 좋습니다.) Wikipedia는 무료로 재배포 가능한 C 구현을 위해 Netlib을 살펴볼 것을 제안합니다. (물론 가장 쉬운 방법은 당신이 사용하는 어떤 시스템에 libm의에서 함수를 호출하는 것입니다.)


당신은 당신을 통해 반송 메모리 정적 스토리지를 사용하지 않는, 그것을하기 위하여려고하는 경우에; 스택에 임시를 사용하십시오.

fpatan takes 2 inputs 또한 atan2 library function을 구현하므로 두 입력의 부호에 따라 적절한 사분면을 결과로 제공합니다.

; assuming you did sub rsp, 24 or something earlier in your function 

movsd [rsp], xmm1 
fld  qword [rsp] ; st0 = xmm1 
movsd [rsp], xmm0 
fld  qword [rsp] ; st0 = xmm0, st1 = xmm1 

fpatan    ; st0 = arctan(xmm1/xmm0) 

fstp qword [rsp]  ; x87 stack is empty again 
movsd xmm0, [rsp] ; xmm0 = arctan(xmm1/xmm0) 

; and then add rsp, 24 at some point before returning 
관련 문제