TL;DR

Автор исследует сопроцессор Intel 8087 по фотографиям вскрытого кристалла и разбирает схему его регистрового стека: как устроены 80-битные SRAM-регистры, тэг-биты и декодер выбора регистра, почему линии выбора частично дублируются металлом ради скорости, и как реализована управляющая логика стека (сумматор, инкремент/декремент TOP, выбор ST(i)). В конце — почему стековая модель оказалась неудобной в реальной разработке и как её вытеснили SSE/AVX.

Ранние микропроцессоры были очень медленными при работе с числами с плавающей запятой. Но в 1980 году Intel представила сопроцессор 8087 для операций с плавающей запятой, который выполнял такие операции до 100 раз быстрее. Это давало огромный выигрыш приложениям для IBM PC — таким как AutoCAD, электронные таблицы и авиасимуляторы. 8087 оказался настолько удачным, что и сегодня компьютеры по-прежнему используют систему (формат) чисел с плавающей запятой, основанную на 8087.(примеч. 1)

8087 был чрезвычайно сложной микросхемой для своего времени: по разным источникам, он содержал от 40 000 до 75 000 транзисторов.(примеч. 2) Чтобы разобраться, как работает 8087, я вскрыл микросхему и сделал множество фотографий кремниевого кристалла под микроскопом. По краям кристалла видны тончайшие бонд-провода, соединяющие чип с его 40 внешними выводами. Сложные узоры на кристалле образованы металлической разводкой, а также слоем поликремния и кремнием под ним. Нижняя половина чипа — это «тракт данных» (datapath), схемы, выполняющие вычисления над 80-битными числами с плавающей запятой. Слева от тракта данных ПЗУ констант хранит важные значения, например π. Справа находятся восемь регистров, образующих стек, вместе со схемами управления стеком.

Die of the Intel 8087 floating point unit chip, with main functional blocks labeled. The die is 5mm×6mm.  Click for a larger image.
Кристалл микросхемы Intel 8087 (блока вычислений с плавающей запятой) с обозначенными основными функциональными блоками. Размер кристалла — 5 мм × 6 мм. По клику открывается в полном размере.

Набор команд микросхемы задаётся большим ПЗУ микрокода в центре. Это ПЗУ устроено очень необычно: оно «полуаналоговое» и хранит по два бита на транзистор, используя четыре разных размера транзисторов. Чтобы выполнить команду с плавающей запятой, 8087 декодирует её, после чего механизм микрокода начинает выполнять соответствующие микроинструкции из ПЗУ микрокода. Схемы декодирования справа от ПЗУ формируют нужные управляющие сигналы на основе каждой микроинструкции. Регистры шины и управляющая логика обеспечивают взаимодействие с основным процессором 8086 и остальной системой. Наконец, генератор смещения использует зарядовый насос, чтобы получить отрицательное напряжение для смещения подложки чипа — базового слоя кремния.

Тема этой статьи — стековые регистры и схемы управления стеком (выделены красным выше). В отличие от большинства процессоров, 8087 организует регистры в виде стека, и инструкции работают с вершиной стека. Например, команда квадратного корня заменяет значение на вершине стека на его квадратный корень. Также можно обращаться к регистру относительно вершины стека — например, прибавить значение с вершины к значению, находящемуся на две позиции ниже. Архитектура со стеком задумывалась как способ улучшить набор команд, упростить разработку компиляторов и сделать вызовы функций эффективнее, хотя на практике это сработало не так хорошо, как ожидалось.

The stack on the 8087. From The 8087 Primer, page 60.
Стек в 8087. Из книги The 8087 Primer, стр. 60.

Диаграмма выше показывает, как работает стек. Стек состоит из восьми регистров; указатель вершины стека Stack Top (ST) обозначает текущую вершину. Чтобы поместить число с плавающей запятой в стек (push), указатель Stack Top уменьшают, а затем значение записывают в новый верхний регистр. Операция извлечения из стека (pop) выполняется так: значение копируют с вершины стека, после чего указатель Stack Top увеличивают. Для сравнения: в большинстве процессоров регистры адресуются напрямую, поэтому «регистр 2» — это всегда один и тот же регистр.

Регистры

Стековые регистры занимают заметную площадь на кристалле 8087, потому что числа с плавающей запятой требуют много бит. Число с плавающей запятой состоит из дробной части (её иногда называют мантиссой или значащей частью), а также из экспоненты; экспонента позволяет представлять числа в диапазоне от чрезвычайно малых до чрезвычайно больших. В 8087 числа с плавающей запятой имеют длину 80 бит: 64 бита значащей части, 15 бит экспоненты и один бит знака. 80-битный регистр был очень «широким» для эпохи 8- и 16-битных компьютеров; восемь регистров в 8087 по объёму сопоставимы с 40 регистрами в процессоре 8086.

The registers in the 8087 form an 8×80 grid of cells. The close-up shows an 8×8 block. I removed the metal layer with acid to reveal the underlying silicon circuitry.
Регистры в 8087 образуют матрицу ячеек 8×80. На увеличенном фрагменте показан блок 8×8. Я удалил металлический слой кислотой, чтобы открыть расположенную ниже кремниевую схемотехнику.

Регистры хранят каждый бит в ячейке статической памяти (SRAM). В каждой ячейке два инвертора соединены в кольцо. Такая схема образует устойчивую петлю обратной связи: один инвертор открыт, другой закрыт. В зависимости от того, какой инвертор «включён», схема хранит 0 или 1. Чтобы записать новое значение, одну из линий принудительно тянут к нулю, переводя петлю в нужное состояние. Хитрость в том, что каждый инвертор использует очень слабый транзистор, чтобы подтягивать выход к высокому уровню, поэтому его легко «пересилить», меняя состояние.

Two inverters in a loop can store a 0 or a 1.
Два инвертора, соединённые в кольцо, могут хранить 0 или 1.

Эти пары инверторов уложены в матрицу 8×80, реализующую восемь слов по 80 бит. В каждом из 80 рядов проходят две битовые линии (bitline), через которые обеспечивается доступ к биту. Битовые линии используются и для чтения, и для записи; пара битовых линий позволяет притянуть к нулю любой из инверторов, чтобы записать нужное значение бита. Восемь вертикальных линий слова (wordline) открывают доступ к одному слову — то есть к одному столбцу из 80 бит. Каждая wordline включает 160 проходных транзисторов, соединяя битовые линии с инверторами в выбранном столбце. Таким образом, когда wordline активна, по битовым линиям можно читать или записывать выбранное слово.

Хотя чип выглядит двумерным, на самом деле он состоит из нескольких слоёв. Нижний слой — кремний. Розоватые области ниже — это места, где кремний был «легирован», чтобы изменить его электрические свойства и сделать его активной частью схемы. Легированный кремний образует сетку горизонтальных и вертикальных проводников, с более крупными легированными областями в середине. Поверх кремния расположен слой проводников из поликремния, который выполняет две функции. Во-первых, он служит ещё одним слоем разводки для соединения схемы. Но важнее другое: там, где поликремний пересекает легированный кремний, образуется транзистор. Поликремний формирует затвор, включая и выключая транзистор. На этом снимке поликремний почти не виден, поэтому я выделил его часть красным. Наконец, горизонтальные металлические проводники дают третий слой межсоединений. Обычно металл скрывает нижележащую схемотехнику, поэтому для этого фото я удалил металлический слой кислотой. Синими линиями я обозначил металлический слой. Контактные отверстия (contacts) обеспечивают соединения между слоями.

A close-up of a storage cell in the registers. The metal layer and most of the polysilicon have been removed to show the underlying silicon.
Крупный план ячейки хранения в регистрах. Металлический слой и большая часть поликремния удалены, чтобы показать расположенный ниже кремний.

Слои вместе образуют инверторы и транзисторы выбора ячейки памяти; они обведены пунктиром ниже. Здесь шесть транзисторов (жёлтым) — в местах, где поликремний пересекает легированный кремний. В каждом инверторе есть транзистор, который тянет выход вниз, и слабый транзистор, который подтягивает выход вверх. Когда активна строковая линия (wordline, вертикальный поликремний), она через два транзистора выбора соединяет выбранные инверторы с битовыми линиями (bitline, горизонтальный металл). Это позволяет читать или записывать бит.

The function of the circuitry in a storage cell.
Назначение схемы в ячейке хранения.

С каждым регистром связаны два тэг-бита — необычная форма метаданных, показывающая, пуст ли регистр, содержит ли ноль, содержит ли корректное значение или специальное значение вроде бесконечности. Тэг-биты используются для внутренней оптимизации быстродействия и в основном не важны для программиста. Помимо доступа вместе с регистром, к тэг-битам можно обращаться параллельно как к 16-битному «слову тегов» (Tag Word). Это позволяет сохранять или загружать тэги как часть состояния 8087 — например, при обработке прерываний.

Декодер

Схема декодера, «вклиненная» в середину массива регистров, выбирает один из регистров. Внутри чипа регистр задаётся трёхбитным значением. По этому значению декодер активирует одну из восьми линий выбора регистра.

Схема декодера довольно проста: в ней восемь трёхвходовых элементов ИЛИ-НЕ (NOR), каждый из которых соответствует одному из восьми возможных двоичных шаблонов. Затем линия выбора усиливается через драйвер большого тока на крупных транзисторах. (На фото ниже можно сравнить большие «змеевидные» транзисторы драйвера с маленькими транзисторами в ячейке бита.)

The decoder circuitry has eight similar blocks to drive the eight select lines.
В схеме декодера восемь похожих блоков, управляющих восемью линиями выбора.

В декодере есть любопытная электрическая оптимизация. Как показано выше, линии выбора регистра — это восемь поликремниевых линий, идущих вертикально по всей высоте массива регистров. К сожалению, у поликремния довольно высокое сопротивление: лучше, чем у кремния, но намного хуже, чем у металла. Проблема в том, что сопротивление длинной поликремниевой линии замедляет систему. Иными словами, ёмкость затворов транзисторов в сочетании с высоким сопротивлением даёт RC-задержку (резистивно-ёмкостную) распространения сигнала.

Решение в том, что линии выбора регистра дублируются и в металлическом слое: второй набор линий проходит сразу справа от массива регистров. Эти линии ответвляются от массива примерно на трети пути вниз, идут вниз, а затем внизу снова соединяются с поликремниевыми линиями выбора. Это уменьшает максимальное сопротивление на пути сигнала по линии выбора и тем самым повышает скорость.

A diagram showing how 8 metal lines run parallel to the main select lines. The register file is much taller than shown; the middle has been removed to make the diagram fit.
Схема, показывающая, как 8 металлических линий идут параллельно основным линиям выбора. Массив регистров на самом деле намного выше, чем показано; середина удалена, чтобы схема поместилась.

Схемы управления стеком

Стеку нужно больше управляющей логики, чем обычному массиву регистров, поскольку схемам приходится отслеживать положение вершины стека.(примеч. 3) Управляющая логика увеличивает или уменьшает указатель вершины стека (TOP) при операциях помещения в стек и извлечения из стека (фиолетовый).(примеч. 4) Кроме того, инструкция 8087 может обращаться к регистру по смещению — например, к третьему регистру от вершины. Чтобы это поддержать, управляющая логика может временно прибавлять смещение к положению вершины стека (зелёный). Мультиплексор (красный) выбирает либо значение вершины стека, либо результат сумматора и подаёт его на декодер (синий), который выбирает один из восьми стековых регистров в массиве регистров (жёлтый), как описано выше.

The register stack in the 8087. Adapted from Patent USRE33629E. I don't know what the GRX field is. I also don't know why this shows a subtractor and not an adder.
Регистровый стек в 8087. Адаптировано по патенту USRE33629E. Я не знаю, что означает поле GRX. И ещё я не понимаю, почему здесь показан вычитатель, а не сумматор.

Ниже показана физическая реализация схем стека. Логика в верхней части выбирает операцию со стеком на основе 16-битной микроинструкции.(примеч. 5) Ниже расположены три защёлки, которые хранят значение вершины стека. (Большие белые квадраты выглядят значимыми, но на самом деле это просто «перемычки» от линии земли к схеме, проложенные под металлическими проводниками.)

The stack control circuitry. The blue regions on the right are oxide residue that remained when I dissolved the metal rail for the 5V power.
Схемы управления стеком. Синие области справа — это остатки оксида, которые остались после того, как я растворил металлическую шину питания 5 В.

Трёхбитный сумматор находится внизу вместе с мультиплексором. Можно было бы ожидать, что сумматор будет построен на простой схеме «полного сумматора». Но вместо этого здесь использован более быстрый сумматор с упреждающим переносом (carry-lookahead). Я не буду углубляться в детали, но в общих чертах так: на каждом разряде элемент И формирует сигнал генерации переноса (Carry Generate), а элемент XOR — сигнал распространения переноса (Carry Propagate). Затем логические элементы комбинируют эти сигналы и параллельно вычисляют выходные биты, избегая замедления из-за «протекания» переноса через разряды.

Инкрементатор/декрементатор устроен совсем иначе. Каждый из трёх бит реализован на триггере с переключением (toggle flip-flop). Несколько логических элементов определяют, должен ли каждый бит переключиться или сохранить предыдущее значение. Например, при увеличении старший бит переключается, если младшие биты равны 11 (например, при переходе с 011 на 100). При уменьшении старший бит переключается, если младшие биты равны 00 (например, с 100 на 011). Более простая логика решает, нужно ли переключать средний бит. С младшим всё проще: он переключается каждый раз — и при увеличении, и при уменьшении.

Схема ниже показывает логику для одного бита стека. Каждый бит реализован на умеренно сложном триггере, который по управляющим сигналам микрокода может быть сброшен, загружен значением или переключён. Триггер собран из двух защёлок типа set-reset (SR). Обратите внимание: выходы триггера перекрещены при обратной подаче на вход, что даёт инверсию, необходимую для режима переключения. Справа мультиплексор выбирает либо значение регистра, либо сумму с выхода сумматора (не показан), формируя сигналы для декодера.

Schematic of one bit of the stack.
Схема одного бита стека.

Недостатки стекового подхода

По словам разработчиков 8087,(примеч. 7) главная причина выбрать стек вместо плоского набора регистров заключалась в том, что в командах не хватало бит, чтобы адресовать несколько регистровых операндов. Кроме того, стек даёт «преимущества по сравнению с регистрами общего назначения при разборе выражений и вложенных вызовах функций». То есть стек хорошо подходит для вычисления математических выражений: подвыражения можно вычислять на вершине стека. А для вызовов функций можно избежать затрат на сохранение регистров в память, потому что подпрограмма может работать со стеком, не затрагивая значения ниже. По крайней мере, так задумывалось.

Главная проблема — «переполнение стека». В стеке 8087 восемь элементов, поэтому если поместить в стек девятое значение, произойдёт переполнение. Конкретно: указатель вершины стека «обернется» и затрёт нижнее значение в стеке. В 8087 предусмотрено обнаружение переполнения с помощью тегов регистров: запись значения в непустой регистр вызывает исключение «недопустимая операция».(примеч. 6)

Разработчики рассчитывали, что переполнение будет редким и его сможет обрабатывать операционная система (или библиотечный код). После обнаружения переполнения программа должна была выгрузить текущий стек в память, создавая иллюзию бесконечного стека. К сожалению, неудачные проектные решения сделали обработку переполнения сложной «и технически, и коммерчески».

Один из разработчиков 8087 (Кахан) объясняет проблемы стека 8087 разницей во времени между Калифорнией, где жили разработчики, и Израилем, где 8087 реализовывали. Из-за недостатка коммуникации каждая команда думала, что программную часть обработки переполнения делает другая. И лишь когда 8087 уже пошёл в производство, они поняли, что «возможно, не получится обрабатывать недополнение/переполнение стека 8087 разумным способом. Это не невозможно — просто невозможно сделать это разумно».

В итоге стек оказался скорее проблемой, чем решением. Большинство программ для 8087 сохраняли весь стек в память перед вызовом функции, создавая дополнительный трафик к памяти. Более того, компиляторы, как выяснилось, лучше работают с обычными регистрами, чем со стеком, поэтому авторам компиляторов приходилось неловко использовать стек, эмулируя им обычные регистры. Сообщается, что компилятору GCC нужно около 3000 дополнительных строк кода для поддержки стека x87.

В 1990-х Intel представила новую систему вычислений с плавающей запятой — SSE, а в 2011 году за ней последовала AVX. Эти системы используют обычные (не стековые) регистры и обеспечивают параллельные операции для более высокой производительности, из-за чего стековые инструкции 8087 в основном стали неактуальными.

Успех 8087

Поначалу Intel не горела желанием выпускать 8087, считая, что он вряд ли станет успешным продуктом. Джону Палмеру, ведущему архитектору чипа, почти не удавалось убедить скептически настроенное руководство Intel в том, что рынок для 8087 огромен. В конце концов он сказал: «Давайте так. Я откажусь от зарплаты — при условии, что вы зафиксируете вашу цифру, сколько, по-вашему, мы продадим, а потом будете платить мне по доллару за каждый экземпляр, проданный сверх этого числа».(примеч. 7) Intel на сделку не пошла — а она сделала бы Палмера очень богатым, — но нехотя согласилась запустить чип в производство.

Инженеры Intel в Санта-Кларе сторонились 8087, считая, что он вряд ли вообще заработает: 8087 должен был быть в два-три раза сложнее 8086, а кристалл — настолько большим, что на пластине могло не оказаться ни одного годного экземпляра. Вместо них за рискованный проект взялся Рафи Наве из израильского подразделения Intel:

«Послушайте, все и так уверены, что это не заработает, так что если не заработает — я просто подтвержу их ожидания и оценку. А если вдруг заработает — отлично, тогда мы получим огромное уважение и совершим большой прорыв в наших возможностях».

Небольшая команда из семи инженеров разработала 8087 в Израиле. Они проектировали чип на листах майлара: один миллиметр на майларе соответствовал одному микрону на реальном чипе. Затем чертежи оцифровывали в системе Calma — кликая по каждому многоугольнику, чтобы сформировать топологию. Когда чип перевели в серийное производство, выход годных оказался очень низким, но всё же лучше, чем опасались: два годных кристалла с четырёхдюймовой пластины.

В итоге 8087 стал большим успехом; говорят, что временами это была самая прибыльная продуктовая линейка Intel. Успех 8087 (вместе с 8088) укрепил репутацию Intel Israel, которая со временем стала крупнейшим технологическим работодателем Израиля. Выгоды аппаратной поддержки вычислений с плавающей запятой оказались настолько значительными, что Intel начала встраивать блок вычислений с плавающей запятой в последующие процессоры, начиная с 80486 (1989). Сегодня большинство современных компьютеров — от мобильных телефонов до мейнфреймов — обеспечивают аппаратную поддержку вычислений с плавающей запятой, основанную на наследии 8087, поэтому я считаю 8087 одним из самых влиятельных чипов из когда-либо созданных.

Примечания и ссылки

1. Сейчас большинство компьютеров используют стандарт IEEE 754 для чисел с плавающей запятой, который во многом вдохновлён 8087. Этот стандарт получил статус «вехи в вычислительной технике». 

2. Любопытно, что надёжные источники расходятся в оценке числа транзисторов в 8087 почти вдвое. Intel называет 40 000, то же говорит и разработчик Уильям Кахан (ссылка). Но в работе «Численный сопроцессор» (A Numeric Data Processor) разработчики Рафи Наве и Джон Палмер писали, что микросхема содержит «эквивалент более 65 000 устройств» (что бы ни значило «эквивалент»). Это число повторяет и статья того времени в журнале Electronics (1980), где сказано: «более 65 000 H-MOS-транзисторов на кристалле площадью 78 000 mil²». Многие другие источники, например Upgrading & Repairing PCs, указывают 45 000 транзисторов. Разработчик Рафи Наве утверждал, что в 8087 63 000 или 64 000 транзисторов, если считать транзисторы ПЗУ напрямую; но если считать транзисторы ПЗУ как эквивалент двух транзисторов, тогда получается около 75 000 транзисторов. 

3. У 8087 есть 16-битное слово состояния (Status Word), которое содержит поле TOP (указатель вершины стека), флаги исключений, четырёхбитный код условий и другие значения. Хотя слово состояния выглядит как 16-битный регистр, как регистр оно не реализовано. Вместо этого части слова состояния хранятся в разных местах микросхемы: указатель вершины стека находится в схемах стека, флаги исключений — часть схем обработки прерываний, биты кода условий расположены рядом с трактом данных и т. д. Когда слово состояния читают или записывают, эти различные узлы подключаются к внутренней шине данных 8087, из-за чего слово состояния выглядит как единое целое. Поэтому в схемах стека предусмотрена поддержка его чтения и записи. 

4. Intel подала несколько патентов, связанных с 8087, включая «Численный сопроцессор» (Numeric data processor), ещё один «Численный сопроцессор» (another Numeric data processor), «Программируемый двунаправленный сдвигатель» (Programmable bidirectional shifter), «Шина дробной части для использования в численном сопроцессоре» (Fraction bus for use in a numeric data processor) и «Арбитраж системной шины: схемотехника и методология» (System bus arbitration, circuitry and methodology). 

5. Я начал детально разбирать стек, чтобы выполнить обратное проектирование формата микроинструкций и понять, как работает микрокод 8087. Я занимаюсь этим проектом вместе с «Opcode Collective» в Discord, но прогресс идёт медленно из-за сложности микроинструкций. 

6. 8087 обнаруживает недополнение стека похожим образом. Если извлечь из стека больше значений, чем там есть, тег покажет, что регистр пуст и к нему нельзя обращаться. Это вызывает исключение «недопустимая операция».

7. 8087 подробно описан в документе «Руководство пользователя семейства 8086, дополнение по численным вычислениям» (The 8086 Family User's Manual, Numerics Supplement). Краткий обзор стека есть на странице 60 книги «The 8087 Primer» Палмера и Морса. Более подробное описание приведено в «On the Advantages of the 8087's Stack» Кахана — это неопубликованный конспект курса (возможно, CS 279?) с датой 2 ноября 1990 года или, возможно, 23 августа 1994 года. Кахан обсуждает, почему устройство 8087 усложняет обработку переполнения стека, в статье «How important is numerical accuracy» в Dr. Dobbs, ноябрь 1997. Ещё один источник — «Устная история Рафи Наве» (Oral History of Rafi Nave). 

Читайте другие выпуски:


Если после этого разбора 8087 захотелось «потрогать низкий уровень руками» — вот два бесплатных урока, которые пройдут 15 января и ложатся в ту же плоскость:

  • «Работа с памятью на языке C»
    Короткий разбор, как процесс реально живёт в памяти: секции процесса, стек vs куча, как ОС выдаёт память, как работает malloc/free, и что делают brk()/sbrk().
    Записаться

  • «Восстанавливаем MBR, GPT и LVM после критических сбоев»
    Практический recovery-разбор: как устроены метаданные разметки, чем GPT лучше MBR, и что делать, если “снесли” разделы или поломали LVM. Плюс набор консольных утилит (dd/gdisk/vgcfgrestore) и чек-лист первых действий, чтобы не усугубить потерю данных. Записаться

Оба урока проведут преподаватели в рамках набора на курсы «Программист С» и «Инфраструктура высоконагруженных систем».

Комментарии (4)


  1. NutsUnderline
    24.12.2025 09:00

    всегда интриговало что сопроцессор реализовывал по сути свой набор команд и было бы прикольно приспособить его сопроцессором к совсем другой архитектуры, скажем motorola


    1. HardWrMan
      24.12.2025 09:00

      Ну, 8087 повторял арбитраж шины 8086 и использовал "дырку" в таблице опкодов 8086 для своих опкодов. Это позволяло просто садить 8087 практически параллельно 8086 (за исключением пары сигналов) и так же обрабатывать опкоды сопроцессора через исключение в случае его отсутствия.


    1. Denis_Chernyshev
      24.12.2025 09:00

      Первые FPU Am9511 и Am9512 были отвязаны от архитектуры CPU - размещались в области ввода-вывода, как внешнее устройство. Целевой архитектурой разработки были все восьмибитники: i8080, z80, M6800, MOS6502 и любые другие.


  1. Denis_Chernyshev
    24.12.2025 09:00

    Intel тут представлены первооткрывателями, однако:

    • Первый FPU (16/32 бит) для восьмибитных персоналок выпустили AMD в 1977, это был Am9511.

    • В 1979 выпущена версия на 64 бит - Am9512

    • Intel получила лицензии на эти FPU (в обмен на i8080/8085 и MCS-48) и выпустила, соответственно Intel 8231/8232
      Intel получила лицензии на эти FPU (в обмен на i8080/8085 и MCS-48) и выпустила, соответственно Intel 8231/8232
    • И, да, именно оттуда пошла архитектура с 8-ми разрядным стеком.

    • Черновик IEEE 754 писался под эту серию, отсюда и стандартные форматы 16/32/64, а 80 бит - отсебятина Intel.

    • Первые FPU размещались в области регистров ввода-вывода. А вот посадить FPU параллельно CPU и перехватывать свои опкоды - это вот да, Intel интересно придумали.