인텔 FMA 명령어 vfmaddrnd231pd, 문서에만 남고 CPU에선 #UD가 나는 수수께끼
- vfmaddrnd231pd는 SDM 2024판에는 있었지만 2026판에서 빠졌고, Haswell CPU에서 실행하면 #UD 예외가 발생함
- GNU 어셈블러, Clang, ICC 모두 이 명령어와 짝이 되는 _mm_fmaddround_pd 인트린식을 인식하지 못함
- 명령어 인코딩에 나오는 DDS 표기는 SDM에서 이 한 곳에만 등장하며, binutils 기록상 VEX.vvvv 레지스터 사용 방식을 뜻함
- 저자는 인텔이 반올림 제어 변형을 추가하려다 막판에 문제를 발견해 CPU에서 빼고 문서는 고치지 않은 것으로 추정하지만 확인할 방법은 없다고 밝힘
Hacker News opinions
요즘 어셈블리 직접 만져본 사람이 줄어들면서 이런 이름을 고칠 기회도 줄어드는 것 같음. 명령어 표현이 좋아지면 칩 설계자랑 컴파일러 개발자 인지 부담도 줄어들 거임.
그건 좀 과대해석 아님? 인텔 벡터 ISA는 원래 이상한 의미랑 이름이 많았음. 깊은 코너 케이스에서 반올림 구현 실수 나서 칩 비트로 막고 다음 세대로 미룬 거일 가능성이 큼.
asm 문법은 사람이 읽기 쉽게 만든 게 아니라 어셈블러랑 디스어셈블러 복잡도를 줄이려고 만든 거임. FMA도 인코딩 순서에 맞춰 1/2/3 번호를 쓰는 거라 읽기 편하라고 설계된 게 아님.
그럼 명령어 의도는 누가 LLM한테 넣어주냐는 문제가 남음. 예전에 LLM을 밈 생성기 반대로 쓸 수 있다는 글도 읽었는데 방향은 비슷한 듯.
나는 symbolasm이라는 어셈블러 문법 프로젝트를 하고 있음. 목표가 사람이랑 LLM 둘 다 벡터 코드를 다루기 쉽게 만드는 거임. 요즘은 AI로 구현 속도를 올리는 중임.
인코딩 문제임? 아니면 어셈블러 문법 문제임? 바이너리 인코딩을 깔끔하게 하면서 하위 호환을 유지하는 건 거의 불가능하고, 새로 시작해도 결국 AMD 쪽처럼 짬이 쌓임.
x64는 설계라기보다 40년 동안 매년 덧칠한 아파트 벽지 같음. 긁어보면 층층이 쌓인 게 보임.
felixcloutier 문서에도 나오는데, 하드웨어 이슈로 빠졌고 원래 제대로 동작한 적이 없었다는 쪽에 한 표 던짐.
오래된 binutils 커밋 보면 DDS 뜻이 나옴. VEX.vvvv에 레지스터를 넣고 첫 소스 내용을 결과로 덮어쓰는 방식이라는 거임. 어셈블러 입장에선 NDS, DDS, NDD2 차이가 없다고 함.