Inside the Intel 8087 chip: floating-point addition and subtraction
인텔 8087 칩 내부: 부동소수점 덧셈과 뺄셈
8087의 다이 사진과 마이크로코드를 분석해 부동소수점 덧셈과 뺄셈이 하드웨어에서 처리되는 과정을 설명합니다. 지수 맞춤, 가수 연산과 정규화뿐 아니라 0, 무한대, NaN, 비정규 수를 다루는 분기와 선행 0 검출 회로도 살펴봅니다.
- 주제
에디터 노트
8087의 성능은 가산기 하나보다 데이터 경로와 마이크로코드가 함께 작동한 결과로 설명됩니다. 지수 차이에 따른 정렬, 부호에 따라 갈리는 가수 덧셈과 뺄셈, 정규화, 정밀도 조정이 순서대로 이어지고, 특수 값 처리는 별도의 분기들을 더합니다. 특히 선행 0을 바이트와 비트 단위로 나눠 세는 설계는 속도만 좇기보다 회로 복잡도와 처리 단계를 함께 고려한 선택으로 드러납니다. 이 설명은 8087의 마이크로코드와 회로를 토대로 한 구현 분석이며, 모든 부동소수점 구현이 같은 방식을 쓴다는 뜻은 아닙니다. 원문도 8087의 projective infinity와 pseudo-zero 같은 기능이 이후 표준에서 빠졌다고 구분합니다. 따라서 이 사례의 가치는 현대 연산 규칙의 보편적 구현을 보여주는 데 있기보다, 오늘날 익숙한 예외 규칙이 초기 하드웨어에서 어떤 제어 흐름과 회로 부담으로 처리됐는지 구체적으로 보여주는 데 있습니다.
AI 요약
8087은 1980년 인텔이 출시한 부동소수점 연산 보조 프로세서입니다. 원문은 칩의 다이 사진과 마이크로코드를 바탕으로 덧셈과 뺄셈의 실행 과정을 추적합니다. 당시 8086에서 소프트웨어로 처리하던 부동소수점 덧셈보다 거의 100배 빠른 성능을 냈으며, 이 글은 그 연산을 맡은 회로와 예외 처리 경로를 분석합니다.
연산에 쓰이는 회로와 데이터
8087은 내부에서 부호 1비트, 지수 15비트, 가수 64비트로 된 80비트 임시 실수 형식으로 값을 보관합니다. 반올림용 guard, round, sticky 비트도 계산 경로에 쓰입니다. 다이 중앙의 마이크로코드 ROM에는 칩 동작을 제어하는 마이크로 명령 1,648개가 들어 있습니다. 산술 연산의 중심에는 69비트 정수 가산기가 있고, 가수 정렬과 정규화에는 임의의 비트 수만큼 이동하는 시프터를 사용합니다. 선행 0 회로는 결과에서 0이 몇 개 이어지는지 세어 뺄셈 결과를 정규화합니다.
덧셈과 뺄셈의 마이크로코드
기본 산술 연산은 공통 코드에서 피연산자를 임시 레지스터 tmpA와 tmpB로 옮긴 뒤 연산별 마이크로 서브루틴을 호출합니다. 덧셈과 뺄셈 서브루틴은 먼저 지수를 비교하고, 지수가 작은 쪽의 가수를 오른쪽으로 이동해 두 값을 정렬합니다. 부호와 연산 종류에 따라 가수의 크기를 더하거나 뺍니다. 따라서 덧셈 명령도 부호 조합에 따라 실제로는 가수 뺄셈을 수행할 수 있습니다.
가수 덧셈에서 최상위 자리 올림이 발생하면 결과를 한 비트 오른쪽으로 옮기고 지수를 조정합니다. 가수 뺄셈은 결과가 음수인지 확인해 가수를 양수로 바꾸고 결과 부호를 갱신합니다. 결과가 0이 아니면 선행 0 수를 세어 왼쪽으로 이동합니다. 8087은 회로를 단순하게 유지하려고 선행 0을 한 번에 64비트 검사하지 않습니다. 먼저 바이트 단위로 이동한 뒤 남은 0에서 7비트 사이를 다시 셉니다. 두 단계에서 얻은 이동량은 지수 조정에 반영됩니다.
정밀도 조정과 특수 값
8087은 결과 정밀도를 80비트, 64비트, 32비트 형식에 맞춥니다. 작은 형식에서는 ADJUST_PRECISION 서브루틴이 가수의 정밀도를 줄이며, 반올림으로 지수가 바뀌는 경우도 반영합니다. 계산이 끝나면 지수 변환 회로가 오버플로와 언더플로를 검사합니다.
공통 마이크로코드는 덧셈과 뺄셈 외에도 곱셈과 나눗셈의 특수 사례를 처리합니다. 0, 무한대, NaN, 비정규 수와 빈 스택 레지스터를 구분하며, 원문에 따르면 이 구간에는 조건 분기 18개가 이어집니다. 예를 들어 0 나누기 0, 무한대 곱하기 0, 무한대에서 무한대를 빼는 경우에는 NaN을 반환합니다. 8087은 무한대를 부호 있는 값으로 보는 affine closure와 부호 없는 값으로 보는 projective closure를 지원합니다. 원문은 projective closure에서 무한대 연산이 모두 의미를 갖지 않는다고 설명합니다. 8087의 일부 기능인 projective infinity, unnormal, pseudo-zero는 이후 표준에서 빠졌습니다.
원문: Righto / 번역·요약: Trawling