문제

SSE에서 접두사 066h (피연산자 크기 재정의) 0F2H (Repne) 및 0F3h (Repe)는 Opcode의 일부입니다.

비 SSE에서 066h 32 비트 (또는 64 비트)와 16 비트 작동 사이의 스위치. 0F2h 그리고 0F3h 문자열 작업에 사용됩니다. 그들은 결합 할 수 있습니다 066h 그리고 0F2h (또는 0F3h)는 의미가 있기 때문에 동일한 지시에 사용할 수 있습니다. SSE 명령의 행동은 무엇입니까? 예를 들어, 우리는 (현재 mod/rm 무시)를 가지고 있습니다.

0f 58 --> addps

66 0f 58 --> addpd

f2 0f 58 --> addsd

f3 0f 58 --> addss

그러나 이것이 무엇입니까?

66 f2 0f 58

그리고 어떻습니까?

f2 66 0f 58

두 개의 충돌하는 담당자 접두사가있는 다음은 말할 것도 없습니다.

f2 f3 0f 58

이것들의 사양은 무엇입니까?

도움이 되었습니까?

해결책

임의의 접두사를 격렬하게 결합한 경우에 예상해야 할 사항에 대한 사양을 보지 못했기 때문에 CPU 동작이 "정의되지 않은"상태 일 수 있으며 CPU 특정 일 수 있습니다. (명확하게, 일부는 예를 들어 Intel의 문서에 지정되어 있지만 많은 경우가 포함되지 않습니다). 그리고 일부 조합은 향후 사용을 위해 예약 될 수 있습니다.

나의 순진한 가정은 일반적으로 추가 접두사가 없을 것이지만 보장은 없다는 것입니다. 예를 들어 일부 최적화 매뉴얼이 멀티 바이트를 추천한다는 점을 감안할 때 합리적으로 보입니다. NOP (정식 90h) 접두사로 66h, EG :

db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP

그러나 나는 또한 그것을 알고 있습니다 CS 그리고 DS 세그먼트 오버라이드 접두사는 SSE2 브랜치 힌트 접두사 (Predict Branch avecte = = 3Eh = DS 우세하다; 촬영되지 않은 분기를 예측합니다 = 2Eh = CS 재정의) 조건부 점프 지침에 적용될 때.

어쨌든, 나는 위의 예를 보았고, 항상 XMM1 모든 0 그리고 XMM7 모든 0FFh ~에 의해

pxor xmm1, xmm1    ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs 

그리고 문제의 코드와 함께 xmm1, xmm7 논쟁. 내가 관찰 한 내용 (Win64 System 및 Intel T7300 Core 2 Duo의 32 비트 코드)은 다음과 같습니다.

1) 변화는 관찰되지 않았다 addsd 추가하여 66h 접두사

db 66h 
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF     

2) 변화는 관찰되지 않았다 addss 추가하여 0F2h 접두사

db 0f2h     
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF

3) 그러나 나는 접두사를 통해 변화를 관찰했다. addpd ~에 의해 0F2h:

db 0f2h    
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF

이 경우 XMM1의 결과는있었습니다 0000000000000000FFFFFFFFFFFFFFFFh 대신에 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh.

그래서 내 결론은 어떤 가정도하지 말고 "정의되지 않은"행동을 기대하는 것입니다.. 그러나 Agner Fog의 단서를 찾을 수 있다면 놀라지 않을 것입니다. 매뉴얼.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top