x87

x87

x87x86 아키텍처 명령 세트의 부동소수점 관련 서브셋입니다.이는 x86 CPU와 연동하여 동작하는 옵션 부동소수점 코프로세서 형태의 8086 명령어 세트의 확장에서 비롯되었습니다.이 마이크로칩의 이름은 "87"로 끝납니다.이것은 NPX(Numeric Processor eXtension)라고도 불립니다.기본 명령 집합의 다른 확장과 마찬가지로 x87 명령어는 작업 프로그램을 구축하기 위해 엄격하게 필요하지 않지만 공통 수치 태스크의 하드웨어 및 마이크로코드 구현을 제공하여 이러한 태스크를 대응하는 기계 코드 루틴보다 훨씬 빠르게 수행할 수 있습니다.x87 명령어 세트에는 덧셈, 뺄셈 및 비교와 같은 기본적인 부동소수점 연산을 위한 명령어가 포함되어 있을 뿐만 아니라 탄젠트 함수와 그 역함수의 계산과 같은 보다 복잡한 수치 연산을 위한 명령어가 포함되어 있습니다.

인텔 80486 이후 대부분의 x86 프로세서는 이러한 x87 명령어를 메인 CPU에 실장하고 있습니다만, 명령어 세트의 그 부분을 가리키는 용어로 사용되는 경우가 있습니다.x87 명령어가 PC에서 표준으로 사용되기 전에는 컴파일러나 프로그래머가 부동소수점 연산을 수행하기 위해 다소 느린 라이브러리 호출을 사용해야 했습니다.이것은 (저비용) 임베디드 시스템에서 여전히 일반적인 방법입니다.

묘사

x87 레지스터는 ST(0)부터 ST(7)까지의 8레벨 딥 비엄격 스택 구조를 형성하며, 피연산자는 상부에 상대적인 오프셋을 사용하여 직접 액세스할 수 있으며 푸시 및 팝도 사용할 수 있습니다.(이 방식은 스택프레임을 푸시/팝 및 인덱스화하는 방법과 비교할 수 있습니다).

이 스택 위에는 값을 푸시, 계산 및 팝하는 명령이 있습니다.단항 연산(FSQRT, FPTAN 등)은 최상위 ST(0)를 암묵적으로, 바이너리 연산(FADD, FMUL, FCOM 등)은 암묵적으로 ST(0) 및 ST(1)를 암묵적으로 주소 지정합니다.또한 엄격하지 않은 스택모델을 사용하면 바이너리 연산에서는 ST(0)를 직접 메모리 오퍼랜드 또는 명시적으로 지정된 스택레지스터 ST(x)와 함께 기존의 어큐뮬레이터(접속처와 왼쪽 오퍼랜드)와 유사한 역할로 사용할 수 있습니다.또한 명령별로 ST(0)를 수정되지 않은 오퍼랜드로, ST(x)를 수신처로 하여 반전시킬 수도 있습니다.또, ST(0)내의 컨텐츠는, FXCH ST(x)라고 불리는 명령을 사용해 다른 스택 레지스터와 교환할 수 있다.

이러한 속성을 통해 x87 스택은 7개의 자유로운 주소 지정 레지스터와 전용 어큐뮬레이터(또는 7개의 독립된 어큐뮬레이터)로 사용할 수 있습니다.이는 특히 슈퍼스케일러 x86 프로세서(예를 들어 Pentium of 1993 등)에 적용되며 이들 프로세서가 명령을 교환합니다(코드 D9C8).D9CFh)는 FPU 명령과 병행하여 FXCH ST(x)의 정수 경로 중 하나를 사용함으로써 제로 클럭 패널티까지 최적화됩니다.인간 어셈블리 언어 프로그래머에게 자연스럽고 편리함에도 불구하고, 일부 컴파일러 라이터는 x87 코드를 효과적으로 스케줄 하는 자동 코드 생성기를 구축하는 것이 복잡하다는 것을 알게 되었습니다.이러한 스택 기반 인터페이스는 레지스터 기반[1] 인터페이스와 비교하여 함수 호출에 스크래치 변수를 저장할 필요성을 최소화할 수 있습니다(역사적으로는 8087 구현의 설계 문제로 인해 그 가능성이 제한되었습니다).[2][3]

x87은 IEEE 754-1985 표준에 따라 단정도, 2배 정밀도 및 80비트 2배 확장 정밀도 바이너리 부동 소수점 연산을 제공합니다.기본적으로는 x87 프로세서는 모두 내부적으로 80비트의 이중 확장 정밀도를 사용합니다(많은 계산에 대해 정밀도를 유지하려면 IEEE 754 설계 근거를 참조하십시오).산술 연산자의 특정 시퀀스 조금 다르게 엄격한 단정 밀도 또는 배정 밀도 IEEE754FPU.[4]에 비해 이 가끔semi-numerical 계산 정확한 작동을 위해 배정 밀도, 그러한 문제를 피하기 위해 가정해 작성된 문제가 될 수 있는 x87 specia를 사용하여 설정할 수 있게 행동할 수도 있다.l구성/상태 레지스터를 사용하여 각 작업 후 단일 또는 이중 정밀도로 자동 반올림합니다.SSE2가 도입된 이후 x87 명령어는 이전처럼 필수적이지는 않지만 반올림 오류에 민감한 수치 계산을 위해 고정밀 스칼라 유닛으로서 중요하며 64비트 가수 정밀도와 80비트 포맷에서 사용할 수 있는 확장 범위를 필요로 합니다.

성능

일반적인 x87 FPU 명령의 예에 대한 클럭 사이클 카운트(여기에는 [5]레지스터-레지스터 버전만 표시됨)

A는...B 표기법(최소부터 최대까지)은 과도 파이프라인 상태 및 선택한 산술 정밀도(32, 64 또는 80비트)에 따라 타이밍 변동을 포함합니다.또, 숫자 케이스(설정 비트 수, 0 등)에 의한 변동도 포함합니다.L → H 표기법은 사용 가능한 최소(L) 및 최대(H) 클럭 주파수에 해당하는 값을 나타냅니다.

x87의 실장 FAD FMUL FDIV FXCH FCOM FSQRT FPTAN 파탄 최대 클럭
(MHz)
피크 FMUL
(표준/)
FMUL§
관계. 5 MHz 8087
8087 70…100 90…145 193…203 10…15 40…50 180…186 30…540 250…800 00050010 0.034…0.055 → 0.100…0.111 ~00001 → 2배의 속도
80287 (오리지널) 00060012 0.041…0.066 → 0.083…0.133 .0001.2 → 2.4×
80387(및 이후 287 모델) 23…34 29…57 88…91 18 24 122…129 191…497 314…487 00160033 0.280…0.552 → 0.580…1.1 000 ~ 10 → 20 ×
80486(또는 80487) 8…20 16 73 4 4 83…87 200…273 218…303 00160050 ….00001.0 → 3.1 000 ~ 18 → 56 ×
Cyrix 6x86, Cyrix MII 4…7 4…6 24…34 2 4 59…60 117…129 97…161 0066 → 0300 ..000011…16 → 50…75 00~320 → 1400×
AMD K6 (K6 II/III 포함) 2 2 21…41 2 3 21…41 ? ? 0166 → 0550 ....000083 → 275 0 ~ 16 → 5000 ×
Pentium / Pentium MMX 1…3 1…3 39 1 (0*) 1…4 70 17…173 19…134 0060 → 0300 ..000020…60 → 100…300 0 ~ 1100 → 5400 ×
펜티엄 프로 1…3 2…5 16…56 1 28…68 ? ? 0150 → 0200 ..000030…75 → 40…100 0 ~ 160 → 1800 ×
Pentium II / III 1…3 2…5 17…38 1 27…50 ? ? 0233 → 1400 ..00047...표준 → 280...700 0 ~ 2100 → 13000 ×
애슬론 (K7) 1…4 1…4 13…24 1…2 16…35 ? ? 0500 → 2330 ..00125…500 → 580…2330 0 ~ 9000 → 42000 ×
Athlon 64 (K8) 1000 → 3200 ..0250…1000 → 800…3200 ~18000 → 58000×
펜티엄 4 1…5 2…7 20…43 복수
사이클
1 20…43 ? ? 1300 → 3800 ..00186...650 → 543...120 ~11000 → 34000×
* 효과적인 제로 클럭 지연은 슈퍼스칼라 실행을 통해 종종 가능합니다.
§ 5MHz 8087은 원래 x87 프로세서입니다.8086(8087이 없는 경우)의 일반적인 소프트웨어 구현 부동소수점 루틴과 비교했을 때, 그 인자는 10의 다른 계수만큼 더 커집니다(즉, 어셈블리 언어에서의 올바른 부동소수점 추가는 1000 사이클 이상을 소비할 수 있습니다).

제조원

거나 manufactured[를]부동 소수 점 유닛은 인텔 8087거나 나중에 모델과 호환되게 디자인 회사들은 AMD(287명 387, 486DX, 5x86, K5미국, K7, K8), 과자, 그리고 기술(슈퍼 MATH coprocessors), 사이릭스 사(그 FasMath, Cx87SLC, Cx87DLC 등, 6x86, 사이릭스 집중 관리 품목), 후지츠(초기 펜티엄 모바일 등), 해리스 반도체(manufa을 포함한다.ctu빨간색 80387 및 486DX 프로세서, IBM(다양한 387486 설계), IDT(WinChip, C3, C7, Nano 등), IIT(2C87, 3C87 등), LC Technology(그린 매스 코프로세서), National Semiconductor(GEX, Gode 1).Ments(제조된 486DX 프로세서 등), Transmeta(TM5600TM5800), ULSI(Math/Co 코프로세서), VIA(C3, C7, Nano 등), Xtend(83S87SX-25 및 기타 코프로세서 등).

아키텍처 세대

8087

8087인텔이 설계한 최초의 16비트 프로세서용 연산 코프로세서입니다.인텔 8088 또는 8086 마이크로프로세서와 페어링되도록 설계되어 있습니다.(i8080 CPU용으로 시판된 인텔의 초기 8231 및 8232 부동소수점 프로세서는 사실상 1977년과 1979년에 AMD의 Am9511 및 Am9512 FPU의 라이센스 버전입니다.)[6]

80187

인텔 80187 16MHz 버전

80187 (80C187)[7]은 인텔 80186 CPU용 연산 코프로세서입니다.80188은 8비트 데이터 버스를 가지고 있기 때문에 80188에서는 동작할 수 없습니다.80188에서는 8087만 사용할 수 있습니다.80187은 80186 및 80188과 동시에 등장하지는 않았지만 실제로는 80287과 80387 이후에 출시되었습니다.메인 프로세서에 대한 인터페이스는 8087과 동일하지만 80387의 핵심이므로 IEEE 754에 완전히 준거하여 80387의 모든 추가 [8]명령을 실행할 수 있습니다.

80287

80287 (i287)은 인텔 80286 시리즈 마이크로프로세서용 연산 코프로세서입니다.인텔의 모델에는 6~12MHz의 상한 주파수가 지정되어 있습니다.나중에 i80287XL(387 마이크로아키텍처 및 i80287X)가 도입되었습니다.LT, 노트북 및 기타 변종용 특수 버전입니다.10MHz Intel 80287-10 Numberics 코프로세서 버전은 250달러(수량은 100달러)[9]였습니다.

80287XL은 실제로는 287핀 배치가 있는80387SX입니다내부 3/2 멀티플라이어가 포함되어 있기 때문에 코프로세서를 2/3 CPU 속도로 실행한 메인보드는 CPU와 같은 속도로 FPU를 실행할 수 있습니다.CHMOS III를 사용하여 구축된 인텔 80C287과 AMD의 CMOS 프로세스로 제조된 AMD 80EC287은 387과 유사한 성능을 가진 다른 287 모델입니다.이러한 모델은 완전 정적 게이트만을 사용합니다.

80287 및 80287XL은 80386 마이크로프로세서와 함께 작동하며, 1987년 80387이 출시될 때까지 80386에서 사용할 수 있는 유일한 코프로세서였습니다.마침내 Cyrix Cx486SLC를 사용할 수 있게 되었습니다.그러나 이 두 칩 모두 80387은 높은 성능과 명령 집합의 더 큰 성능 때문에 강하게 선호됩니다.

80387

인텔 80387 CPU 다이이미지

80387(387 또는 i387)은 IEEE 754-1985 규격에 완전히 준거한 최초의 인텔 코프로세서입니다.i387은 386 칩이 출시된 지 2년 만인 [10]1987년에 출시되었으며 인텔의 이전 8087/80287 코프로세서보다 훨씬 향상된 속도와 삼각함수 특성을 갖추고 있습니다.8087 및 80287의 FPTAN 및 FPATAN 명령은 ±θ/4(±45°) 범위의 인수로 제한되며 8087 및 80287에는 SIN [11][full citation needed]및 COS 기능에 대한 직접 지침이 없습니다.

코프로세서가 없는 경우 386은 일반적으로 (상대적으로 느린) 소프트웨어 루틴을 통해 부동소수점 연산을 실행하며 런타임에 소프트웨어 예외 핸들러를 통해 구현됩니다.연산 코프로세서가 386과 페어링되면 코프로세서는 하드웨어에서 부동소수점 연산을 실행하여 (에뮬레이트) 소프트웨어 라이브러리 호출보다 훨씬 빠르게 결과를 반환합니다.

i387은 32비트 프로세서 버스를 탑재한 표준 i386 칩에만 호환됩니다.보다 좁은 16비트 데이터 버스를 갖춘 최신 i386SX는 i387의 32비트 버스와 상호 작용할 수 없습니다.i386SX에는 SX의 좁은 16비트 데이터 버스와 호환되는 자체 코프로세서인 80387SX가 필요합니다.

80487

i487SX

i487SX(P23N)는 인텔 i486SX 머신용 부동소수점 유닛 코프로세서로 판매되고 있습니다.실제로 본격적인 i486DX 구현이 포함되어 있습니다.i486SX 시스템에 설치하면 i487이 메인 CPU를 비활성화하여 모든 CPU 동작을 인계받습니다.i487은 i486SX의 존재를 검출하기 위한 조치를 취했으며 원래 CPU를 [12][13][failed verification]장착하지 않으면 작동하지 않습니다.

80587

Nx587은 x86이 CPU와 별도로 제조된 마지막 FPU(이 경우 NexGen의 Nx586)입니다.

「 」를 참조해 주세요.

메모들

  1. ^ 팹리스 기업은 칩을 설계하고 팹브 회사에 의존하며, 팹브 기업은 설계와 제조를 모두 스스로 할 수 있습니다.

레퍼런스

  1. ^ William Kahan (2 November 1990). "On the advantages of 8087's stack" (PDF). Unpublished course notes, Computer Science Division, University of California at Berkeley. Archived from the original (PDF) on 18 January 2017.
  2. ^ William Kahan (8 July 1989). "How Intel 8087 stack overflow/underflow should have been handled" (PDF). Archived from the original (PDF) on 12 June 2013.
  3. ^ Jack Woehr (1 November 1997). "A conversation with William Kahan".
  4. ^ David Monniaux, 부동소수점 계산 검증의 함정, ACM TOPLAS에 표시됩니다.
  5. ^ 숫자는 각 프로세서의 데이터 시트, 프로그래밍 매뉴얼 및 최적화 매뉴얼에서 가져옵니다.
  6. ^ "Arithmetic Processors: Then and Now - The CPU Shack Museum". www.cpushack.com. Retrieved 14 April 2018.
  7. ^ "CPU Collection – Model 80187". cpu-info.com. Archived from the original on 23 July 2011. Retrieved 14 April 2018.
  8. ^ "80C187 80-BIT MATH COPROCESSOR" (PDF). datasheetcatalog.org. November 1992. Retrieved 11 August 2020.
  9. ^ Intel Corporation, "신제품 포커스 컴포넌트: 32비트 마이크로프로세서 (일부 친구로부터 약간의 도움을 받은 경우)", 스페셜 32비트 문제 해결법, 1985년 11월/12월, 13페이지.
  10. ^ Moran, Tom (1987-02-16). "Chips to Improve Performance Of 386 Machines, Intel Says". InfoWorld. Vol. 9, no. 7. p. 5. ISSN 0199-6649.
  11. ^ Borland Turbo Assembler 매뉴얼.
  12. ^ 인텔 487SX 온라인 컴퓨팅 무료 딕셔너리
  13. ^ "Intel 80487". www.cpu-world.com. Retrieved 9 June 2021.

외부 링크