인텔 8087

Intel 8087
인텔 8087
Intel C8087.jpg
인텔 8087 마스 코프로세서
일반 정보
개시.1980
마케팅 담당자인텔, IBM[1]
설계자인텔(R)
공통 제조원
성능
최대 CPU 클럭 속도4MHz~10MHz
아키텍처 및 분류
테크놀로지 노드3μm
명령 집합x87(x86-16코프로세서 확장)
물리 사양
트랜지스터
  • 45000
패키지
역사
전임자8231/8232
후계자80287

1980년에 발표된 인텔 80878086 마이크로프로세서 [4][5][6]라인의 최초의 x87 부동소수점 코프로세서입니다.

8087의 목적은 덧셈, 뺄셈, 곱셈, 나눗셈 및 제곱근같은 부동 소수점 산술의 연산 속도를 높이는 것이었습니다.또한 지수, 로그 또는 삼각 계산과 같은 초월 함수를 계산하고 부동 소수점 외에도 큰 이진수 및 십진수 정수에서도 연산할 수 있습니다.성능 향상은 특정 애플리케이션에 따라 약 20%에서 500% 이상으로 향상되었습니다.8087은 약 2.4와트를 [6]사용하여 약 50,000개[5] FLOPS를 실행할 수 있습니다.8087을 설치하는 것은 산술 연산뿐입니다.예를 들어 워드 프로세싱과 같은 어플리케이션에서만 사용되는 컴퓨터는 8087의 추가 비용(약 150달러[7])과 전력 소비량에서는 혜택을 받지 못합니다.

인텔 8087의 다이

8087은 당시 제조 기술의 한계를 뛰어넘는 첨단 IC였다.초기 수확량은 극히 [citation needed]낮았다.

IBM이 IBM PC 마더보드에 코프로세서 소켓을 포함시키면서 8087의 판매가 크게 증가했습니다.칩 부족으로 인해 IBM은 PC가 출시된 지 6개월이 지나기 전까지 PC용 옵션으로 8087을 제공하지 않았다.8087의 개발로 IEEE 754-1985 부동소수점 산술 규격이 도입되었습니다.이후 80186(PC 호환에는 사용되지 않음), 80286, 8038680386SX 프로세서용 x87 코프로세서가 출시되었습니다.80486 이후 인텔 x86 프로세서는 별도의 부동소수점 코프로세서를 사용하지 않고 부동소수점 함수가 프로세서에 통합되었습니다.

내부적으로는 하드웨어 곱셈기가 없어 CORDIC 알고리즘을 [8]사용하여 계산을 구현했습니다.

설계 및 개발

인텔은 이전에 8231 연산처리장치8232 부동소수점 프로세서를 제조한 바 있습니다.8080 또는 유사한 프로세서에서 사용하도록 설계되었으며 8비트 데이터 버스를 사용했습니다.이들은 프로그래밍된 I/O [9]또는 DMA 컨트롤러를 통해 호스트 시스템에 인터페이스되었습니다.

8087은 인텔의 엔지니어링 매니저인 빌 폴먼이 8086 칩 개발을 감독하면서 처음 고안했습니다.빌은 8086 칩이 아직 개발되지 않은 수학 칩을 지원할 수 있도록 조치를 취했다.

1977년 폴먼은 8087 수학 칩을 설계하는 데 성공했다.Bruce Ravenel은 건축가로, John Palmer는 이 프로젝트의 공동 건축자이자 수학자로 고용되었다.이 둘은 가장 긴 형식의 실수에 대해 64비트의 가수와 16비트의 지수를 가진 혁신적인 설계를 내놓았습니다.스택 아키텍처 CPU와 8개의 80비트 스택 레지스터는 계산 능력이 풍부한 명령 세트를 갖추고 있습니다.이 설계는 수치 컴퓨팅과 수치 소프트웨어에서 몇 가지 알려진 문제를 해결했습니다. 즉, 64비트 오퍼랜드에 대한 반올림 오류 문제가 제거되었으며 64비트 번호 모두에 대한 수치 모드 변환이 해결되었습니다.파머는 윌리엄 카한의 부동소수점에 대한 글들이 [10]그들의 디자인에 중요한 영향을 미쳤다고 여겼다.

8087 디자인은 처음에는 공격적인 디자인으로 인해 산타클라라에서 멋진 평가를 받았습니다.결국 이 설계는 인텔 이스라엘에 맡겨졌고, Rafi Nave는 칩 구현을 주도하게 되었습니다.Palmer, Ravenel, Nave는 디자인 [11]특허를 받았다.Robert Koehler와 John Bayliss는 특정 비트 패턴을 가진 명령어를 코프로세서에 [12]오프로드하는 기술에 대한 특허도 받았습니다.

8087은 45,000개의 트랜지스터를 가지고 있으며 3μm의 고갈 부하 HMOS 회로로 제조되었습니다.8086 또는 8088과 함께 작동하며 약 60개의 새로운 명령을 도입했습니다.대부분의 8087 어셈블리 니모닉은 FADD, FMUL, FCOM 등과 같이 F로 시작하므로 8086 명령과 쉽게 구분할 수 있습니다.모든 8087 명령의 바이너리 인코딩은 ASCII 문자 ESC와 같은 비트 패턴 11011, 10진수 27로 시작합니다.비록 바이트의 상위 비트이지만, 유사한 명령 접두사는 "에스케이프 코드"라고도 불립니다.이러한 코프로세서 명령에 대해 인텔이 할당하는 명령어 니모닉은 "ESC"입니다.

8086 또는 8088 CPU가 ESC 명령을 실행했을 때, 두 번째 바이트(ModR/M 바이트)가 메모리 오퍼랜드를 지정하면 CPU는 명령에서 지정된 메모리 위치(8086 주소 지정 모드 사용)에서1개의 워드를 읽기 위해 버스 사이클을 실행하지만, 읽기 오퍼레이션을 CPU 레지스터에 저장하거나 CPU 레지스터에 조작을 실행하지는 않습니다.8087은 버스를 감시하고 8086과 동기하여 명령 스트림을 디코딩하여 코프로세서 명령을 인식합니다.메모리 피연산자가 있는 8087 명령의 경우 명령어가 피연산자를 읽도록 요구하면 8087은 데이터 버스로부터 메인 CPU에 의해 읽힌 데이터 워드를 가져옵니다.읽을 오퍼랜드가 1워드보다 길 경우 8087은 주소 버스에서도 주소를 복사하고 CPU에 의해 구동되는 데이터 읽기 사이클이 완료된 후 DMA를 사용하여 버스를 제어하고 오퍼랜드 자체의 추가 바이트를 전송합니다.메모리 피연산자를 포함한 8087 명령어가 해당 피연산자의 쓰기를 요구하면 8087은 데이터 버스 상의 읽기 워드를 무시하고 주소를 복사한 다음 확장 피연산자의 끝을 읽는 것과 같은 방식으로 DMA를 요청하고 피연산자 전체를 씁니다.이와 같이 메인 CPU는 버스와 버스 타이밍의 일반적인 제어를 유지한 반면 8087은 코프로세서 명령의 실행의 다른 모든 측면을 처리했다.단, 8087은 자신의 내부 레지스터에서 피연산자를 읽거나 쓰는 짧은 DMA 기간을 제외한다.이 설계의 결과로, 8087은 메모리 또는 자체 레지스터에서 가져온 오퍼랜드에서만 작동할 수 있었고, 8087과 8086 또는 8088 사이의 데이터 교환은 RAM을 통해서만 가능했습니다.

메인 CPU 프로그램은 8087이 명령을 실행하는 동안 계속 실행되었습니다.메인 8086 또는 8088 CPU의 관점에서 코프로세서 명령은 opcode 및 메모리 오퍼랜드 사이클(피연산자가 없는 경우 2 클럭 사이클, 8 클럭 사이클, EA 계산 시간 [5 ~ 12 클럭 사이클])만큼만 소요되었습니다.피연산자 [8088에서 4개의 클럭 사이클을 추가하여 피연산자 워드의 두 번째 바이트를 전송한다]를 지정하면 CPU는 프로그램의 다음 명령을 실행하기 시작합니다.따라서 8087을 탑재한 시스템은 메인 CPU의 정수 ALU에서1개의 동작을 실행하는 동시에 8087 코프로세서에서 부동소수점 동작을 실행하는 진정한 병렬처리를 할 수 있었습니다.8086 또는 8088은 명령 흐름과 타이밍을 독점적으로 제어하고 8087의 내부 상태에 직접 액세스할 수 없었기 때문에 8087은 한 번에 하나의 명령만 실행할 수 있었기 때문에 복합 8086/8087 또는 8088/8087 시스템용 프로그램은 8087에 대해 마지막으로 발행된 명령을 완료할 시간을 확보해야 했습니다.아니면 다른 것을 발급받았거나.이를 위해 (메인 CPU의) WAIT 명령이 제공되었으며 대부분의 어셈블러는 대부분의 부동소수점 코프로세서 명령의 각 인스턴스 앞에 암묵적으로 WAIT 명령을 단언했습니다.( 프로그램이 타이밍에 민감한 8087 명령어 발행 사이에 충분한 시간이 경과하여 8087이 이전 명령을 완료할 때까지 이러한 명령을 수신할 수 없도록 하기 위해 다른 수단을 사용하는 경우 8087 동작 전에 WAIT 명령을 사용할 필요는 없습니다.또한 WAIT를 사용할 경우 다음 8087 명령 바로 앞에 배치할 필요가 없습니다.)WAIT 명령은 8086/8088의 -TEST 입력 핀이 아사트(낮음)될 때까지 기다렸고 8087이 장착된 모든 시스템에서 이 핀이 8087의 BUSY 핀에 연결되었습니다(따라서 BUSY가 아사트 해제될 때 TEST가 아사트되었습니다).

8086 및 8088의 명령 프리페치 큐는 명령 실행 시간을 항상 취득 시간과 동일하지 않게 하기 때문에 8087 등의 코프로세서는 명령 자체가 CPU 버스를 순수하게 감시하는 것만으로 다음 실행 명령인지 판단할 수 없다.8086 및 8088에는 2개의 큐상태 신호가 코프로세서에 접속되어 있어 프리페치큐로부터의 명령 실행의 CPU 내부 타이밍과 동기할 수 있습니다.8087은 자체 동일한 프리페치큐를 유지하며 여기서 실제로 실행되는 코프로세서의 opcode를 읽습니다.8086 및 8088 프리페치 큐는 크기와 관리 알고리즘이 다르기 때문에 8087은 시스템이 리셋될 때 특정 CPU 버스 라인을 관찰하여 어떤 종류의 CPU에 연결되어 있는지 판단하고 8087은 이에 따라 내부 명령 큐를 조정합니다.CPU와 코프로세서에 프리페치 큐하드웨어를 용장하게 복제하는 것은 전력 소비량과 총 다이 면적 면에서 비효율적이지만 코프로세서 인터페이스에서는 전용IC 핀을 거의 사용하지 않는 것이 중요했습니다.코프로세서 인터페이스를 정의한 8086이 도입되었을 당시 40핀이 넘는 IC 패키지는 드물고 비싸며 신호 속도의 주요 제한 요소인 과도한 납 캐패시턴스 등의 문제로 뒤엉켜 있었습니다.

코프로세서 동작 코드는 이스케이프 시퀀스부터 시작하여6비트, 2바이트로 부호화됩니다.

"---------------------------------------------------------------------------------------------------------------------------------------------------------------

처음 3개의 "x" 비트는 부동 소수점 연산 코드의 처음 3비트입니다.다음으로 2개의 "m" 비트, 다음으로 부동소수점 연산 코드의 후반 3비트, 이어서 3개의 "r" 비트입니다."m" 및 "r" 비트는 주소 지정 모드 [13]정보를 지정합니다.

특별한 부동소수점 명령을 이용하려면 응용 프로그램을 작성해야 했습니다.실행 시 소프트웨어는 코프로세서를 검출하여 부동소수점 조작에 사용할 수 있습니다.존재하지 않는 것을 검출했을 경우, 유사한 부동 소수점 함수를 소프트웨어로 계산하거나,[7] 보다 정확한 수치 호환성을 위해 코프로세서 전체를 소프트웨어로 에뮬레이트해야 했습니다.

레지스터

심플한 8087 마이크로 아키텍처

x87 패밀리는 x86 프로세서의 메인 레지스터와 같은 직접 주소 지정 가능한 레지스터 세트를 사용하지 않습니다.대신 x87 레지스터는 st0에서 st7까지의 8레벨 스택[14] 구조를 형성합니다.여기서 st0은 최상위입니다.x87 명령은 이 스택의 값을 푸시, 계산 및 팝하는 방식으로 작동합니다.단, FADD, FMUL, FCMP 등의 쌍방향 연산은 최상위 st0 및 st1을 암묵적으로 사용하거나 명시적인 메모리 오퍼랜드 또는 레지스터와 함께 st0을 사용할 수 있습니다.따라서 st0 레지스터는 어큐뮬레이터(즉, 결합된 행선지 및 왼쪽 연산)로서 사용할 수 있으며 스택 u 레지스터 8의 임의의 것과 교환할 수도 있습니다.FXCH stX(코드 D9C8~D9)라고 하는 명령을 부르다이것에h 의해, x87 스택은, 주소 지정이 가능한 7개의 레지스터와 어큐뮬레이터로서 사용할 수 있게 됩니다.이것은 특히 슈퍼칼라 x86 프로세서(1993년 이후 Pentium)에 적용할 수 있습니다.이 프로세서에서는 이러한 교환 명령이 제로 클럭 패널티까지 최적화되어 있습니다.

IEEE 부동소수점 표준

인텔은 8087을 설계할 때 미래의 설계를 위해 표준 부동소수점 형식을 만드는 것을 목표로 했습니다.역사적 관점에서 8087의 중요한 측면은 IEEE 754 부동소수점 표준의 기초가 되었다는 것입니다.8087은 IEEE 754 표준을 1985년까지 구현하지 않았지만 80387은 구현했습니다.8087은 2개의 기본적인 32/64비트 부동소수점 데이터 타입과 확장 80비트 내부 임시 형식(메모리에 저장 가능)을 제공하여 크고 복잡한 계산보다 정확도를 향상시켰습니다.이와 별도로 8087은 80비트/18자리 패킹 BCD(이진 코드 10진수) 형식과 16비트, 32비트 및 64비트 정수 데이터 유형을 [14]제공했습니다.

8087 데이터 타입
79 ... 71 ... 67 ... 63 ... 50 ... 31 ... 22 ... 15 ... 00 (비트 위치)
± 지수 분율 80비트 확장 대역폭 리얼
± 지수 분율 64비트 더블 패리티 리얼
± 지수 분율 32비트 싱글 소켓 리얼
± BCD 정수 18자리 소수점 정수
± 정수 64비트 바이너리 정수
± 정수 32비트 바이너리 정수
± 정수 16비트 바이너리 정수

Infinity

8087은 상태 레지스터에서 선택한 아핀 닫힘 또는 투영 닫힘을 통해 무한대 을 처리합니다.아핀 닫힘의 경우 양의 무한과 음의 무한은 다른 값으로 취급됩니다.투영 닫힘의 경우 무한대는 매우 작거나 매우 큰 [15]숫자에 대한 부호 없는 표현으로 취급됩니다.이러한 무한대 처리의 두 가지 방법이 IEEE 754 부동 소수점 표준의 초안 버전에 통합되었습니다.그러나 IEEE 754-1985의 이후 정식호에서 사영폐쇄(사영확장실수시스템)가 삭제되었다.80287은 프로젝티브 클로저를 옵션으로 유지했지만 80387과 후속 부동소수점 프로세서(80187 포함)는 아핀 클로저만 지원했습니다.

코프로세서 인터페이스

8087은 주소 및 데이터 버스에 직접 연결되어 있다는 점에서 후속 인텔 코프로세서와 다릅니다.8087은 "11011" 시퀀스로 시작하는 명령을 찾고 이에 따라 즉시 메인 CPU에 DMA를 요청하여 1워드(16비트)보다 긴 메모리 오퍼랜드에 액세스하고 즉시 버스 제어를 메인 CPU로 되돌립니다.코프로세서의 명령이 완료될 때까지 코프로세서는 프로그램의 실행을 보류하지 않았습니다.또, 상기의 「설계와 개발」섹션에서 설명한 바와 같이, 프로그램은 2개의 프로세서를 명시적으로 동기화할 필요가 있었습니다.코프로세서 명령이 코프로세서가 인식하는 명령어 디코딩에 실패하면 크래시 문제가 발생할 수 있습니다.인텔의 최신 코프로세서는 같은 방법으로 버스에 접속하지 않고 메인 프로세서 I/O 포트를 통해 명령을 받았습니다.이로 인해 실행 시간 패널티가 발생했지만 코프로세서가 명령을 거부하면 메인 프로세서가 명령을 무시하기 때문에 잠재적인 크래시 문제는 회피되었습니다.8087은 리셋 사이클 중에 데이터 버스를 모니터링하여 8088과 8086 중 어느 쪽에 연결되어 있는지 감지할 수 있었습니다.

8087은 이론적으로 동시에 작동할 수 있는 반면 8086/8은 추가 명령을 처리합니다.실제로는 마지막 명령어가 완료되기 전에 코프로세서가 새로운 명령을 발행하면 프로그램 장애가 발생할 가능성이 있었습니다.어셈블러는 모든 코프로세서의 opcode 뒤에 FWAIT 명령을 자동으로 삽입하여 8086/8이 [16]종료 신호를 보낼 때까지 실행을 중지하도록 강제합니다.이 제한은 이후 설계에서 제거되었습니다.

모델 및 두 번째 소스

인텔 8087 산술 코프로세서 핀 할당

인텔 8087 코프로세서는 세라믹 사이드 브레이즈드 DIP(CerDIP)와 밀폐 DIP(PDIP)의 2종류로 제작되어 이하의 온도 범위에서 동작하도록 설계되어 있습니다.

  • C, D, QC 및 QD 프리픽스: 0°C ~ +70°C(상용).
  • LC, LD, TC 및 TD 접두사: -40°C ~ +85°C(산업용).
  • MC 및 MD 프리픽스: -55 °C ~+125 °C (군사용).

8087의 모든 모델은 40핀 DIP 패키지를 탑재하고 있으며 5V로 작동하며 약 2.4와트를 소비합니다.이후의 인텔 코프로세서와 달리 8087은 메인 [7]프로세서와 같은 클럭 속도로 동작해야 했습니다.부품 번호의 접미사는 클럭 속도를 나타냅니다.

8087 클럭[6][14] 속도
모델 번호 빈도수.
인텔 8087 5 MHz
인텔 8087-1 10 MHz
인텔 8087-2 8 MHz
인텔 8087-3 4 MHz
인텔 8087-6 6 MHz

이 부품은 AMD가 AMD 8087로[2] 세컨드 소싱하고 Cyrix가 [3]Cyrix 8087로 세컨드 소싱했습니다.클론 K18108087의 WM87은 소련에서 [17]생산되었다.

후계자

8088 및 8086 프로세서가 이후의 부품으로 대체된 것처럼 8087도 교체되었습니다.다른 인텔 코프로세서로는 80287, 80387, 80187이 있습니다.80486 이후의 인텔 프로세서는 별도의 부동소수점 코프로세서를 사용하지 않았습니다.단, 80486SX는 FPU를 무효로 한 80486DX를 제외하고, 거의 모든 프로세서가 메인 프로세서에 포함되어 있었습니다.사실 80487은 핀이 하나 더 달린 완전한 80486DX 칩이었다.인스톨 하면, 80486SX CPU가 무효가 됩니다.80486DX, Pentium 및 그 이후의 프로세서에는 CPU 코어에 부동소수점 기능이 포함되어 있습니다.

레퍼런스

  1. ^ Shvets, Gennadiy (8 October 2011). "IBM 8087 floating-point unit". CPU World. Retrieved 1 December 2011.
  2. ^ a b Shvets, Gennadiy (8 October 2011). "AMD 8087 floating-point unit". CPU World. Retrieved 1 December 2011.
  3. ^ a b Shvets, Gennadiy (8 October 2011). "Cyrix 8087 floating-point unit". CPU World. Retrieved 1 December 2011.
  4. ^ Palmer, John F. (1980). "The INTEL® 8087 Numeric Data Processor" (PDF). AFIPS '80, Proceedings of the, May 19–22, 1980, National Computer Conference. Anaheim, California: ACM. pp. 887–893. doi:10.1145/1500518.1500674.
  5. ^ a b "8087". Coprocessor Dot Info. 2007. Archived from the original on 30 September 2011. Retrieved 1 December 2011.
  6. ^ a b c "Intel FPU". cpu-collection.de. 2011. Retrieved 1 December 2011.
  7. ^ a b c Mueller, Scott (1992). Upgrading and repairing PCs (2nd ed.). Que. pp. 395–403. ISBN 0-88022-856-3.
  8. ^ Shirriff, Ken (May 2020). "Extracting ROM constants from the 8087 math coprocessor's die". righto.com. Self-published by Ken Shirriff. Retrieved 3 September 2020. The ROM contains 16 arctangent values, the arctans of 2−n. It also contains 14 log values, the base-2 logs of (1+2−n). These may seem like unusual values, but they are used in an efficient algorithm called CORDIC, which was invented in 1958.
  9. ^ 인텔 컴포넌트 데이터 카탈로그 1980, 인텔 카탈로그 번호C-864/280/150K/CP, 8-21, 8-28페이지.
  10. ^ Sanchez & Canton 2007, 페이지 96.
  11. ^ US 4484259, "숫자 데이터 프로세서에서 사용하기 위한 분절 버스"
  12. ^ US 4270167, "듀플렉스 중앙 처리 장치 동기화 회로"
  13. ^ Lemone, Karen A. (1985). Assembly Language and Systems Programming for the IBM PC and Compatibles. Little Brown. p. 302. ISBN 978-0-316-52069-0.
  14. ^ a b c Shvets, Gennadiy (8 October 2011). "Intel 8087 family". CPU World. Retrieved 1 December 2011.
  15. ^ Sanchez & Canton 2007, 페이지 110.
  16. ^ Lemone 1985, 300페이지
  17. ^ Frolov, Sergej (10 October 2006). "USSR-made i8087 clone". CPU World. Retrieved 1 December 2011.

참고 문헌

  • Sanchez, Julio; Canton, Maria P. (2007). Software Solutions for Engineers and Scientists. CRC Press. ISBN 1-4200-4302-1.

외부 링크