8087 FSCALE는 140개 넘는 마이크로명령과 3단계 서브루틴 호출로 예외를 처리함
- FSCALE는 수에 2의 거듭제곱을 곱하는 명령이지만, 예외 처리를 위해 140개 이상 마이크로명령과 3단계 서브루틴 호출을 사용함
- Ken Shirriff와 Opcode Collective은 칩을 개봉해 현미경 고해상도 이미지로 분석했으며, 8087의 중앙 마이크로코드 ROM에는 칩 동작을 제어하는 1,648개 마이크로명령이 들어 있음
- 8087 데이터패스는 지수용 16비트 경로와 가수용 64비트 경로로 나뉘며, FSCALE는 지수 ROM, 지수 변환기, 64비트 시프터, 가산기를 사용함
- 8087은 8개 스택 레지스터에 80비트 임시 실수를 저장하고, 각 값에 유효·특수·0·비어 있음 상태를 기록하는 태그를 붙여 예외값 처리를 빠르게 함
- 8087은 1980년에 등장했으며 IBM PC에 장착하면 스프레드시트와 CAD 같은 프로그램의 부동소수점 연산을 최대 100배 빠르게 했다고 글은 설명함
Hacker News opinions
마이크로코드라기보다 특수 목적 어셈블리에 가까워 보임. 알고리즘이 복잡하니 마이크로명령 하나를 매 사이클 실행하는 구조라면 성능 이득도 이해됨.
인텔의 8087 에뮬레이션 코드가 16KB였다고 했는데, 8087 마이크로코드 상태 기계를 그대로 흉내 냈는지 다른 방식이었는지 궁금함.
x87은 과학용 계산기처럼 설계된 기묘한 구조임. 컴파일러가 겨냥하기에는 너무 다르고, 지금은 가능하면 SSE나 AVX 같은 SIMD를 쓰는 이유가 있음.
80비트는 임의로 정한 폭만은 아님. 64비트 가수 덕분에 까지의 정수를 정확히 계산할 수 있었고, 당시 문서에서도 이 기능을 내세웠음.
가수 ALU를 2의 거듭제곱 폭으로 잡으면 64비트가 자연스럽고, 지수에 그만큼의 비트는 필요 없음. 메모리 바이트 단위까지 고려하면 80비트는 정확히 10바이트라서 실용적인 선택임.
x87의 스택 ISA 자체가 컴파일러에 그렇게 고통스러운 건 아니라고 봄. 진짜 문제는 스택 값이 모두 80비트 확장 정밀도인데, 프로그램은 32비트와 64비트 타입을 기대한다는 점임. Java의 strictfp와 Intel icc 정도가 이 차이를 제대로 다뤘다고 알고 있음.
초기 계산기를 보면 x87보다도 훨씬 낯선 세계였음. BCD를 썼고, 초창기 제품은 1비트 가산기와 시프트 레지스터로 비트를 계속 이동시켰음. Sinclair Scientific은 TI의 4비트 구조와 좋지 않은 알고리즘을 조합했음.
지난 20년쯤의 x86에서 실제 부동소수점 장치는 사실상 SIMD 유닛임. 레거시 x87 명령도 그 위에서 에뮬레이션되는 셈임.
8087의 산술 100배 가속은 과장이 아니었음. 내 80286에서는 계산 결과가 3초 대 300초였음. x86 명령과 8087 명령을 같은 코드 흐름에 섞으면 두 칩이 병렬로 일하므로, 명령 배치를 잘하면 정수 코드와 부동소수점 연산을 겹칠 수 있었음.
현대 프로세서도 용도가 다른 실행 포트를 여러 개 두고 명령을 병렬 실행함. 차이는 초스칼라 실행, 비순차 실행, SMT가 이런 배치를 하드웨어에서 대부분 처리한다는 점임.