문제
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의 단서를 찾을 수 있다면 놀라지 않을 것입니다. 매뉴얼.