2016-09-19 2 views
3

AVX2 명령어에 대한 코드 생성기를 개발 중이며 사양에 따라 AVX2를 실행해야하는 AMD A10 8700 프로세서에서 테스트하려고합니다. VGATHERDPS 법적해야한다, 그래서AVX2 지원 프로세서에서 잘못된 명령어 vgatherdps

vmovdqu  yMM0, [ r9+ PmainBase + -256]; LDdqyy;0 
lea   r9, [  PmainBase + -192];0 
vpcmpeqw ymm8, ymm8, ymm8;0 
vgatherdps YMM0, [ r9+ yMM0*4 ] ,ymm8;0 

CPUID 정보는 AVX2가 포함되어 있다고 말한다 :

그러나, 그것은에서 vgatherdps 명령에 잘못된 명령과 충돌합니다.

실마리가 있습니까?

+2

그러면 일부 AVX2 명령어가 실행되어 활성화됩니다. 그 기계 코드는 무엇입니까? – harold

+0

모든 라인의 끝에'; 0' 개의 코멘트가있는 이유는 무엇입니까? 'yMM0'과 같은 일관성없는 대문자 사용? 기본적으로 코드는 서식 지정/가독성 측면에서 난장판입니다. (조립 방법과는 무관 함). –

답변

2

Intel's Instruction Reference 따르면 : 인덱스, 마스크 또는 목적지 레지스터 중 어느 한 쌍의 동일한 경우

는 이 명령은 UD 결함을 초래한다.

목적지와 색인 레지스터는 동일합니다 (ymm0). 따라서 교육은 불법입니다. 나는 어셈블러가 그것을 거절하지 않은 것에 놀랐다. 그래서 어셈블러에 버그가 있다고 생각합니다.


이러한 제한 사항의 추론은 gather 명령이 실제로 두 레지스터에 쓰는 것입니다.

  1. 수집 결과를 대상에 씁니다.
  2. 어떤 차선이 성공했는지를 나타내는 0의 마스크를 마스크 레지스터에 다시 씁니다.

정상 실행에서 마스크 레지스터는 완전히 0으로 덮어 씁니다. 그러나 오류가 발생하면 모든로드가 성공한 것은 아닙니다. 따라서 명령이 부분적으로 만 실행될 수도 있습니다. 마스크 레지스터를 덮어 쓰는 목적은 신호 처리기에게 어떤 차선이 성공했는지 그리고 어떤 차선이 실패했는지 알려주는 것입니다.

인덱스 레지스터는 대상 레지스터 또는 마스크 레지스터로 별칭을 지정할 수 없으므로 덮어 쓰기되므로 신호 처리기에서 반환 될 때 명령을 다시 시작할 수 없으므로이 레지스터를 별칭으로 사용할 수 없습니다.

+0

OP가 코드 생성기를 작성 중이므로 어셈블러를 통해 코드를 실행하지 않았을 수 있습니다. 게다가,'idx' reg가'dst' 또는'msk' reg와 일치 할 수없는 아주 좋은 이유가 있습니다. 'vgatherdps'의 의사 코드를보십시오. VEX.256 : _ ** 처음 **,'msk' 레지스터에있는 모든 레인의 최상위 비트가 레인 _의 모든 비트에 스플래트되고, 그 다음 사용 가능한 레인의 경우 하드웨어 데이터를로드하려고 시도하고 성공하면 해당 레인에서 마스크를 지 웁니다. 'msk'는 무조건적이고 완전히 덮어 씌여지기 때문에'dst' 나'idx'에 별명을 붙여서는 안됩니다. 그렇지 않으면 쓰기 충돌이 생길 수 있기 때문입니다. –

+0

그리고이 쓰기 충돌을 해결할 수 없습니다 :'msk'를 잃고 어떤 차선이 실패했는지,'idx'를 잃을 수없고 다시 시도 할 수없고'dst'를 잃을 수 있으며 지시의 요지는 무엇인지 알 수 없습니다 그때? 그리고'msk'가'dst' 값으로 부분적으로 업데이트 되더라도 대역 내 통신 문제 때문에 모호한 점이 있습니다. '0xFFFFFFFF'를 성공적으로 읽었을 가능성이 있습니다 만,이 값이 마스크 레지스터 내에 있다면, 읽기 성공 여부를'0xFFFFFFFF'로 알 수 있습니까? 게다가,'idx'는 음의 인덱스가 합법적이기 때문에'msk'의 별칭이 될 수 없습니다. –

+0

그리고'idx'는'vgather * '명령어 군에서'idx'가 qword 또는 dword가 될 수 있고'msk'와'dst' 차선 크기가 항상 일치하기 때문에'msk'의 별명을 지정할 수 없습니다. dst'는 dword이고'idx'가 qword이면 레지스터의 아래쪽 절반 만 채워지고 상반부는 0이됩니다. –

0

고정 기계 설명을 수집 지침에 인덱스 및 대상에 대한 레지스터의 개별 세트를 사용하고 지금은 잘 작동

vmovdqu yMM4, [ PmainBase +   -256]; LDdqyy;0 
lea r8,[ PmainBase +   -192];0 
vpcmpeqw ymm8, ymm8, ymm8;0 
vgatherdps YMM0,[r8+ yMM4*4 ] ,ymm8;0 

를 얻을 수 있습니다.

+2

계좌에 로그인하는 것을 잊었습니까? – Mysticial

관련 문제