MIPS ( микропроцессор без взаимосвязанных конвейерных стадий ) [1] — это семейство архитектур набора команд (ISA) компьютера с сокращенным набором команд (RISC) [2] : A-1 [3] : 19, разработанных компанией MIPS Computer Systems, ныне MIPS Technologies , базирующейся в США .
Существует несколько версий MIPS, включая MIPS I, II, III, IV и V, а также пять выпусков MIPS32/64 (для 32- и 64-битных реализаций соответственно). Ранние архитектуры MIPS были 32-битными; 64-битные версии были разработаны позже. По состоянию на апрель 2017 года текущей версией MIPS является MIPS32/64 Release 6. [4] [5] MIPS32/64 в первую очередь отличается от MIPS I–V определением привилегированного режима ядра System Control Coprocessor в дополнение к архитектуре пользовательского режима.
Архитектура MIPS имеет несколько дополнительных расширений: MIPS-3D , простой набор инструкций SIMD с плавающей точкой , предназначенный для общих 3D-задач; [6] MDMX (MaDMaX), более обширный набор целочисленных инструкций SIMD , использующий 64-битные регистры с плавающей точкой; MIPS16e, который добавляет сжатие в поток инструкций для уменьшения занимаемого программами пространства; [7] и MIPS MT, который добавляет возможность многопоточности . [8]
Курсы по компьютерной архитектуре в университетах и технических училищах часто изучают архитектуру MIPS. [9] Архитектура оказала большое влияние на более поздние архитектуры RISC, такие как Alpha . В марте 2021 года MIPS объявила, что разработка архитектуры MIPS завершена, поскольку компания переходит на RISC-V . [10]
Первая версия архитектуры MIPS была разработана MIPS Computer Systems для своего микропроцессора R2000 , первой реализации MIPS. И MIPS, и R2000 были представлены вместе в 1985 году. [11] [ проверка не удалась ] Когда был представлен MIPS II, MIPS был переименован в MIPS I, чтобы отличать его от новой версии. [3] : 32
Микропроцессор R6000 (1989) компании MIPS Computer Systems был первой реализацией MIPS II. [3] : 8 Разработанный для серверов, R6000 был изготовлен и продан компанией Bipolar Integrated Technology , но оказался коммерческим провалом. В середине 1990-х годов многие новые 32-битные процессоры MIPS для встраиваемых систем были реализациями MIPS II, поскольку введение 64-битной архитектуры MIPS III в 1991 году оставило MIPS II как новейшую 32-битную архитектуру MIPS до появления MIPS32 в 1999 году. [3] : 19
Микропроцессор MIPS Computer Systems R4000 ( 1991) был первой реализацией MIPS III. Он был разработан для использования в персональных компьютерах, рабочих станциях и серверах. MIPS Computer Systems активно продвигала архитектуру MIPS и R4000, создав консорциум Advanced Computing Environment (ACE) для продвижения своего стандарта Advanced RISC Computing (ARC), целью которого было сделать MIPS доминирующей платформой персональных вычислений. ARC не имел большого успеха в персональных компьютерах, но R4000 (и производная от R4400) широко использовались в рабочих станциях и серверах, особенно его крупнейшим пользователем, Silicon Graphics . Другие области применения R4000 включали высокопроизводительные встроенные системы и суперкомпьютеры. MIPS III в конечном итоге был реализован рядом встроенных микропроцессоров. R4600 (1993) компании Quantum Effect Design и его производные широко использовались в высокопроизводительных встроенных системах и низкопроизводительных рабочих станциях и серверах. MIPS Technologies' R4200 (1994) был разработан для встраиваемых систем, ноутбуков и персональных компьютеров. Производная, R4300i, изготовленная NEC Electronics , использовалась в игровой консоли Nintendo 64. Nintendo 64, наряду с PlayStation , были одними из самых крупных пользователей процессоров архитектуры MIPS в середине 1990-х годов.
Первой реализацией MIPS IV стал набор микросхем микропроцессора MIPS Technologies R8000 (1994). Разработка R8000 началась в Silicon Graphics, Inc., и он использовался только в высокопроизводительных рабочих станциях и серверах для научных и технических приложений, где была важна высокая производительность при больших рабочих нагрузках с плавающей точкой. Более поздними реализациями были MIPS Technologies R10000 (1996) и Quantum Effect Devices R5000 (1996) и RM7000 (1998). R10000, произведенный и проданный NEC Electronics и Toshiba, и его производные использовались NEC, Pyramid Technology, Silicon Graphics и Tandem Computers (среди прочих) в рабочих станциях, серверах и суперкомпьютерах. R5000 и R7000 нашли применение в высокопроизводительных встраиваемых системах, персональных компьютерах и низкопроизводительных рабочих станциях и серверах. Производная от R5000 от Toshiba, R5900, использовалась в Emotion Engine компании Sony Computer Entertainment , на котором работала игровая консоль PlayStation 2 .
Анонсированный 21 октября 1996 года на Microprocessor Forum 1996 вместе с расширением MIPS Digital Media Extensions (MDMX), MIPS V был разработан для повышения производительности преобразований 3D-графики. [12] В середине 1990-х годов основным применением невстраиваемых микропроцессоров MIPS были графические рабочие станции от Silicon Graphics. MIPS V был дополнен расширением MDMX только для целочисленных вычислений, чтобы предоставить полную систему для повышения производительности приложений 3D-графики. [13] Реализации MIPS V так и не были представлены. 12 мая 1997 года Silicon Graphics анонсировала микропроцессоры H1 («Beast») и H2 («Capitan»). Первая должна была стать первой реализацией MIPS V и должна была быть представлена в первой половине 1999 года. [14] Проекты H1 и H2 были позже объединены и в конечном итоге отменены в 1998 году. Хотя не было никаких реализаций MIPS V, MIPS64 Release 1 (1999) был основан на MIPS V и сохранил все его функции в качестве дополнительной функции сопроцессора 1 (FPU), называемой Paired-Single.
Когда MIPS Technologies отделилась от Silicon Graphics в 1998 году, она переориентировалась на рынок встраиваемых систем. Благодаря MIPS V каждая последующая версия была строгим надмножеством предыдущей версии, но это свойство оказалось проблемой, [ нужна ссылка ] и определение архитектуры было изменено для определения 32-битной и 64-битной архитектуры: MIPS32 и MIPS64. Обе были представлены в 1999 году. [15] MIPS32 основан на MIPS II с некоторыми дополнительными функциями из MIPS III, MIPS IV и MIPS V; MIPS64 основан на MIPS V. [15] NEC , Toshiba и SiByte (позже приобретенная Broadcom ) получили лицензии на MIPS64, как только он был анонсирован. С тех пор к ним присоединились Philips , LSI Logic , IDT , Raza Microelectronics, Inc. , Cavium , Loongson Technology и Ingenic Semiconductor . MIPS32/MIPS64 Release 5 был анонсирован 6 декабря 2012 года. [16] По словам директора по маркетингу продукции MIPS, Release 4 был пропущен, поскольку число четыре считается несчастливым во многих азиатских культурах. [17]
В декабре 2018 года Wave Computing, новый владелец архитектуры MIPS, объявила, что MIPS ISA будет открыта в рамках программы, получившей название MIPS Open Initiative. [18] Программа была предназначена для открытия доступа к самым последним версиям как 32-битных, так и 64-битных проектов, делая их доступными без каких-либо лицензионных или лицензионных сборов, а также предоставляя участникам лицензии на существующие патенты MIPS. [19] [20] [21]
В марте 2019 года одна из версий архитектуры была доступна по бесплатной лицензии [22] , но позднее в том же году программа была снова закрыта. [23]
В марте 2021 года Wave Computing объявила, что разработка архитектуры MIPS прекращена. Компания присоединилась к фонду RISC-V, и будущие разработки процессоров будут основаны на архитектуре RISC-V. [10] [24] Несмотря на это, некоторые лицензиаты, такие как Loongson, продолжают самостоятельно разрабатывать новые расширения совместимых с MIPS ISA. [25]
В январе 2024 года компания Loongson выиграла дело о правах на использование архитектуры MIPS. [26]
MIPS — это модульная архитектура, поддерживающая до четырех сопроцессоров (CP0/1/2/3). В терминологии MIPS CP0 — это сопроцессор управления системой (неотъемлемая часть процессора, которая определяется реализацией в MIPS I–V), CP1 — это необязательный блок с плавающей точкой (FPU), а CP2/3 — это необязательные сопроцессоры, определяемые реализацией (MIPS III удалил CP3 и повторно использовал его коды операций для других целей). Например, в игровой консоли PlayStation CP2 — это механизм преобразования геометрии (GTE), который ускоряет обработку геометрии в трехмерной компьютерной графике.
MIPS — это архитектура загрузки/сохранения (также известная как архитектура регистр-регистр ); за исключением инструкций загрузки/сохранения, используемых для доступа к памяти , все инструкции работают с регистрами.
MIPS I имеет тридцать два 32-битных регистра общего назначения (GPR). Регистр $0 жестко привязан к нулю, и записи в него отбрасываются. Регистр $31 является регистром связи . Для инструкций целочисленного умножения и деления, которые выполняются асинхронно из других инструкций, предусмотрена пара 32-битных регистров, HI и LO . Существует небольшой набор инструкций для копирования данных между регистрами общего назначения и регистрами HI/LO.
Счетчик программ имеет 32 бита. Два младших бита всегда содержат ноль, поскольку инструкции MIPS I имеют длину 32 бита и выровнены по естественным границам слов.
Инструкции делятся на три типа: R (регистр), I (немедленный) и J (переход). Каждая инструкция начинается с 6-битного кода операции. В дополнение к коду операции инструкции R-типа определяют три регистра, [27] поле величины сдвига и поле функции; инструкции I-типа определяют два регистра и 16-битное немедленное значение; инструкции J-типа следуют за кодом операции с 26-битной целью перехода. [2] : A-174
Ниже приведены три формата, используемые для основного набора инструкций:
MIPS I имеет инструкции, которые загружают и сохраняют 8-битные байты, 16-битные полуслова и 32-битные слова. Поддерживается только один режим адресации : база + смещение. Поскольку MIPS I является 32-битной архитектурой, загрузка величин менее 32 бит требует, чтобы данные были либо расширены знаком, либо расширены нулем до 32 бит. Инструкции загрузки с суффиксом "unsigned" выполняют нулевое расширение; в противном случае выполняется знаковое расширение. Инструкции загрузки берут базу из содержимого GPR (rs) и записывают результат в другой GPR (rt). Инструкции сохранения берут базу из содержимого GPR (rs) и сохраняют данные из другого GPR (rt). Все инструкции загрузки и сохранения вычисляют адрес памяти путем суммирования базы с расширенным знаком 16-битным непосредственным. MIPS I требует, чтобы все доступы к памяти были выровнены по их естественным границам слов, в противном случае выдается исключение. Для поддержки эффективного невыровненного доступа к памяти существуют инструкции загрузки/хранения слов с суффиксом «left» или «right». За всеми инструкциями по загрузке следует слот задержки загрузки . Инструкция в слоте задержки загрузки не может использовать данные, загруженные инструкцией загрузки. Слот задержки загрузки может быть заполнен инструкцией, которая не зависит от загрузки; если такая инструкция не может быть найдена, заменяется nop.
MIPS I имеет инструкции для выполнения сложения и вычитания. Эти инструкции берут свои операнды из двух GPR (rs и rt) и записывают результат в третий GPR (rd). В качестве альтернативы сложение может брать один из операндов из 16-битного непосредственного числа (которое расширено знаком до 32 бит). Инструкции для сложения и вычитания имеют два варианта: по умолчанию исключение сигнализируется, если результат переполняется; инструкции с суффиксом "unsigned" не сигнализируют об исключении. Проверка переполнения интерпретирует результат как 32-битное целое число в дополнительном коде. MIPS I имеет инструкции для выполнения побитовых логических операций AND, OR, XOR и NOR. Эти инструкции берут свои операнды из двух GPR и записывают результат в третий GPR. Инструкции AND, OR и XOR могут в качестве альтернативы брать один из операндов из 16-битного непосредственного числа (которое расширено нулем до 32 бит). Инструкции Set on relation записывают единицу или ноль в регистр назначения, если указанное отношение истинно или ложно. Эти инструкции берут свои операнды из двух GPR или одного GPR и 16-битного immediately (который расширен знаком до 32 бит) и записывают результат в третий GPR. По умолчанию операнды интерпретируются как целые числа со знаком. Варианты этих инструкций, которые имеют суффикс "unsigned", интерпретируют операнды как целые числа без знака (даже те, которые берут операнд из 16-битного immediately со знаком).
Инструкция Load Immediate Upper копирует 16-битную немедленную в старшие 16 бит GPR. Она используется вместе с инструкцией Or Immediate для загрузки 32-битной немедленной в регистр.
MIPS I имеет инструкции для выполнения левых и правых логических сдвигов и правых арифметических сдвигов. Операнд получается из GPR (rt), а результат записывается в другой GPR (rd). Расстояние сдвига получается либо из GPR (rs), либо из 5-битной «величины сдвига» (поле «sa»).
MIPS I имеет инструкции для знакового и беззнакового целочисленного умножения и деления. Эти инструкции берут свои операнды из двух GPR и записывают свои результаты в пару 32-битных регистров, называемых HI и LO, поскольку они могут выполняться отдельно от (и одновременно с) другими инструкциями ЦП. Для умножения старшая и младшая половины 64-битного произведения записываются в HI и LO (соответственно). Для деления частное записывается в LO, а остаток в HI. Для доступа к результатам предусмотрена пара инструкций (Переместить из HI и Переместить из LO) для копирования содержимого HI или LO в GPR. Эти инструкции взаимосвязаны: чтение HI и LO не продолжается после незавершенной арифметической инструкции, которая будет записывать в HI и LO. Другая пара инструкций (Переместить в HI или Переместить в LO) копирует содержимое GPR в HI и LO. Эти инструкции используются для восстановления HI и LO в исходное состояние после обработки исключений. Инструкции, которые читают HI или LO, должны быть разделены двумя инструкциями, которые не записывают в HI или LO.
За всеми инструкциями потока управления MIPS I следует слот задержки перехода . Если слот задержки перехода не заполнен инструкцией, выполняющей полезную работу, заменяется nop. Инструкции перехода MIPS I сравнивают содержимое GPR (rs) с нулем или другим GPR (rt) как знаковые целые числа и выполняют переход, если указанное условие истинно. Управление передается по адресу, вычисленному путем сдвига 16-битного смещения влево на два бита, расширения знака 18-битного результата и добавления 32-битного результата с расширенным знаком к сумме счетчика программ (адрес инструкции) и 8 10 . Переходы имеют две версии: абсолютные и косвенные через регистр. Абсолютные переходы («Jump» и «Jump and Link») вычисляют адрес, по которому передается управление, путем сдвига 26-битного instr_index влево на два бита и конкатенации 28-битного результата с четырьмя старшими битами адреса инструкции в слоте задержки перехода. Косвенные переходы регистра передают управление инструкции по адресу, полученному из GPR (rs). Адрес, полученный из GPR, должен быть выровнен по слову, в противном случае после выполнения инструкции в слоте задержки перехода выдается исключение. Инструкции перехода и перехода, которые связываются (за исключением «Jump and Link Register»), сохраняют адрес возврата в GPR 31. Инструкция «Jump and Link Register» позволяет сохранять адрес возврата в любой доступный для записи GPR.
MIPS I имеет две инструкции для программного обеспечения, чтобы сигнализировать об исключении: System Call и Breakpoint. System Call используется программным обеспечением пользовательского режима для выполнения вызовов ядра; а Breakpoint используется для передачи управления отладчику через обработчик исключений ядра. Обе инструкции имеют 20-битное поле кода, которое может содержать информацию об операционной среде для обработчика исключений.
MIPS имеет 32 регистра с плавающей точкой. Два регистра спарены для чисел двойной точности. Регистры с нечетными номерами не могут использоваться для арифметики или ветвления, просто как часть пары регистров двойной точности, в результате чего для большинства инструкций доступно 16 регистров (перемещения/копирования и загрузки/сохранения не затронуты).
Одинарная точность обозначается суффиксом .s, а двойная точность обозначается суффиксом .d.
MIPS II удалил слот задержки загрузки [3] : 41 и добавил несколько наборов инструкций. Для многопроцессорной обработки с общей памятью были добавлены инструкции Synchronize Shared Memory , Load Linked Word и Store Conditional Word . [28] Был добавлен набор инструкций Trap-on-Condition. Эти инструкции вызывали исключение, если оцениваемое условие было истинным. Всем существующим инструкциям ветвления были предоставлены версии с ветвлениями , которые выполняли инструкцию в слоте задержки ветвления, только если ветвь была выполнена. [3] : 40 Эти инструкции повышают производительность в определенных случаях, позволяя полезным инструкциям заполнять слот задержки ветвления. [3] : 212 Были добавлены инструкции загрузки и сохранения двойного слова для COP1–3. В соответствии с другими инструкциями доступа к памяти, эти загрузки и сохранения требовали естественного выравнивания двойного слова.
В набор инструкций для сопроцессора с плавающей точкой также было добавлено несколько инструкций. Была добавлена инструкция квадратного корня с плавающей точкой, совместимая с IEEE 754. Она поддерживала операнды как одинарной, так и двойной точности. Был добавлен набор инструкций, которые преобразовывали числа с плавающей точкой одинарной и двойной точности в 32-битные слова. Они дополняли существующие инструкции преобразования, позволяя указывать режим округления IEEE инструкцией вместо регистра управления и состояния плавающей точкой.
MIPS III — это обратно совместимое расширение MIPS II, которое добавило поддержку 64-битной адресации памяти и целочисленных операций. 64-битный тип данных называется doubleword, и MIPS III расширил регистры общего назначения, регистры HI/LO и счетчик программ до 64 бит для его поддержки. Были добавлены новые инструкции для загрузки и хранения двойных слов, для выполнения целочисленных операций сложения, вычитания, умножения, деления и сдвига над ними, а также для перемещения двойных слов между GPR и регистрами HI/LO. Для многопроцессорной обработки с общей памятью были добавлены инструкции Load Linked Double Word и Store Conditional Double Word . [28] Существующие инструкции, изначально определенные для работы с 32-битными словами, были переопределены, где это необходимо, для расширения знака 32-битных результатов, чтобы разрешить идентичную обработку слов и двойных слов большинством инструкций. Среди этих переопределенных инструкций была Load Word . В MIPS III она расширяет знак слова до 64 бит. В дополнение к Load Word была добавлена версия с нулевым расширением.
Неспособность формата инструкции R указать полное расстояние сдвига для 64-битных сдвигов (его 5-битное поле величины сдвига слишком узкое, чтобы указать расстояние сдвига для двойных слов) потребовала от MIPS III предоставить три 64-битных версии каждой инструкции сдвига MIPS I. Первая версия представляет собой 64-битную версию исходных инструкций сдвига, используемых для указания постоянных расстояний сдвига от 0 до 31 бита. Вторая версия похожа на первую, но добавляет 32 10 к значению поля величины сдвига, так что можно указать постоянные расстояния сдвига от 32 до 63 бит. Третья версия получает расстояние сдвига из шести младших битов GPR.
MIPS III добавил уровень привилегий супервизора между существующими уровнями привилегий ядра и пользователя. Эта функция затронула только процессор управления системой, определенный реализацией (сопроцессор 0).
MIPS III удалил инструкции поддержки сопроцессора 3 (CP3) и повторно использовал его коды операций для новых инструкций с двойными словами. Оставшиеся сопроцессоры получили инструкции для перемещения двойных слов между регистрами сопроцессора и GPR. Плавающие общие регистры (FGR) были расширены до 64 бит, а требование к инструкциям использовать только четные регистры было удалено. Это несовместимо с более ранними версиями архитектуры; бит в регистре управления/состояния с плавающей точкой используется для работы блока с плавающей точкой MIPS III (FPU) в режиме, совместимом с MIPS I и II. Регистры управления с плавающей точкой не были расширены для совместимости. Единственными новыми инструкциями с плавающей точкой, добавленными, были инструкции для копирования двойных слов между CPU и FPU, преобразования чисел с плавающей точкой одинарной и двойной точности в целые числа с плавающей точкой и наоборот.
MIPS IV — четвертая версия архитектуры. Она является надмножеством MIPS III и совместима со всеми существующими версиями MIPS. [29] : A-1 MIPS IV был разработан в основном для улучшения производительности с плавающей точкой (FP). Для улучшения доступа к операндам был добавлен индексированный режим адресации (база + индекс, оба получены из GPR) для загрузки и сохранения FP, а также инструкции предварительной выборки для выполнения предварительной выборки памяти и указания кэш-подсказок (они поддерживали как базовый + смещение, так и базовый + индексный режим адресации).
MIPS IV добавил несколько функций для улучшения параллелизма на уровне инструкций. Чтобы устранить узкое место, вызванное одним битом условия, в регистр управления и статуса с плавающей точкой было добавлено семь битов кода условия, что увеличило общее количество до восьми. Инструкции сравнения и ветвления FP были переопределены, чтобы они могли указывать, какой бит условия был записан или прочитан (соответственно); и слот задержки между ветвью FP, которая считывала бит условия, записанный предыдущим сравнением FP, был удален. Поддержка частичного предикации была добавлена в форме инструкций условного перемещения как для GPR, так и для FPR; и реализация могла выбирать между точными или неточными исключениями для ловушек IEEE 754.
MIPS IV добавил несколько новых арифметических инструкций FP для FPN как одинарной, так и двойной точности: слитное умножение сложение или вычитание, обратный и обратный квадратный корень. Инструкции слитного умножения сложение или вычитание FP выполняют одно или два округления (это определяется реализацией), чтобы превзойти или удовлетворить требованиям точности IEEE 754 (соответственно). Инструкции FP обратный и обратный квадратный корень не соответствуют требованиям точности IEEE 754 и выдают результаты, которые отличаются от требуемой точности на одну или две единицы последнего разряда (это определяется реализацией). Эти инструкции обслуживают приложения, в которых задержка инструкции важнее точности.
MIPS V добавил новый тип данных, Paired Single (PS), который состоял из двух чисел с плавающей точкой одинарной точности (32 бита), хранящихся в существующих 64-битных регистрах с плавающей точкой. Варианты существующих инструкций с плавающей точкой для арифметики, сравнения и условного перемещения были добавлены для работы с этим типом данных в стиле SIMD. Были добавлены новые инструкции для загрузки, перестановки и преобразования данных PS. [3] : 426–429 Это был первый набор инструкций, который использовал SIMD с плавающей точкой с существующими ресурсами. [13]
Первый выпуск MIPS32, основанный на MIPS II, добавил условные перемещения, инструкции предварительной выборки и другие функции из семейств 64-разрядных процессоров R4000 и R5000. [15] Первый выпуск MIPS64 добавляет режим MIPS32 для запуска 32-разрядного кода. [15] Инструкции MUL и MADD ( умножение-сложение ), ранее доступные в некоторых реализациях, были добавлены в спецификации MIPS32 и MIPS64, как и инструкции управления кэшем . [15] Для управления кэшем были подготовлены инструкции и . SYNC
[ 30] [31]SYNCI
В MIPS32/MIPS64 версии 6 в 2014 году добавлено следующее: [32]
Удалены редко используемые инструкции:
Реорганизовано кодирование инструкций, что освободило место для будущих расширений.
Архитектуры microMIPS32/64 являются надмножествами архитектур MIPS32 и MIPS64 (соответственно), разработанными для замены MIPS16e ASE. Недостатком MIPS16e является то, что он требует переключения режима перед обработкой любой из своих 16-битных инструкций. microMIPS добавляет версии наиболее часто используемых 32-битных инструкций, которые кодируются как 16-битные инструкции. Это позволяет программам смешивать 16- и 32-битные инструкции без необходимости переключения режимов. microMIPS был представлен вместе с MIPS32/64 Release 3, и каждый последующий выпуск MIPS32/64 имеет соответствующую версию microMIPS32/64. Процессор может реализовывать microMIPS32/64 или как microMIPS32/64, так и соответствующее ему подмножество MIPS32/64. Начиная с версии MIPS32/64 Release 6 поддержка MIPS16e прекратилась, и microMIPS стал единственной формой сжатия кода в MIPS.
Базовые архитектуры MIPS32 и MIPS64 могут быть дополнены рядом дополнительных архитектурных расширений, которые в совокупности называются расширениями, специфичными для приложений (ASE). Эти ASE предоставляют функции, которые повышают эффективность и производительность определенных рабочих нагрузок, таких как цифровая обработка сигналов .
В MIPS существует несколько соглашений о вызовах, особенно на 32-битной платформе.
O32 ABI является наиболее часто используемым ABI, благодаря своему статусу как оригинального System V ABI для MIPS. [37] [38] Он строго основан на стеке, и для передачи аргументов доступны только четыре регистра $a0 - $a3 . Место в стеке зарезервировано на случай, если вызываемому необходимо сохранить свои аргументы, но регистры не сохраняются там вызывающим. Возвращаемое значение сохраняется в регистре $v0 ; второе возвращаемое значение может сохраняться в $v1 . ABI оформился в 1990 году и последний раз обновлялся в 1994 году. Эта воспринимаемая медлительность, наряду с устаревшей моделью с плавающей точкой всего с 16 регистрами, способствовала распространению многих других соглашений о вызовах. Он определен только для 32-битного MIPS, но GCC создал 64-битную вариацию под названием O64. [39]
Для 64-битной версии чаще всего используется N64 ABI от Silicon Graphics. Самым важным улучшением является то, что теперь для передачи аргументов доступны восемь регистров; это также увеличивает количество регистров с плавающей точкой до 32. Существует также версия ILP32 под названием N32, которая использует 32-битные указатели для меньшего кода, аналогично x32 ABI . Обе работают в 64-битном режиме ЦП. [39] ABI N32 и N64 передают первые восемь аргументов функции в регистрах $a0 - $a7 ; последующие аргументы передаются в стеке. Возвращаемое значение (или указатель на него) сохраняется в регистрах $v0 ; второе возвращаемое значение может сохраняться в $v1 . В обоих ABI N32 и N64 все регистры считаются имеющими ширину 64 бита.
Было сделано несколько попыток заменить O32 32-битным ABI, который больше похож на N32. На конференции 1995 года был представлен MIPS EABI, для которого 32-битная версия была весьма похожа. [40] EABI вдохновил MIPS Technologies предложить более радикальный "NUBI" ABI, дополнительно повторно использующий регистры аргументов для возвращаемого значения. [41] MIPS EABI поддерживается GCC, но не LLVM, и ни один из них не поддерживает NUBI.
Для всех O32 и N32/N64 адрес возврата хранится в регистре $ra . Он автоматически устанавливается с использованием инструкций JAL (переход и ссылка) или JALR (регистр перехода и ссылки). Пролог функции (не листовой) подпрограммы MIPS помещает адрес возврата (в $ra ) в стек. [42] [43]
На O32 и N32/N64 стек растет вниз, но ABI N32/N64 требуют 64-битного выравнивания для всех записей стека. Указатель кадра ( $30 ) является необязательным и на практике используется редко, за исключением случаев, когда распределение стека в функции определяется во время выполнения, например, путем вызова .alloca()
Для N32 и N64 адрес возврата обычно хранится за 8 байт до указателя стека , хотя это может быть необязательно.
Для ABI N32 и N64 функция должна сохранять регистры $s0 - $s7 , глобальный указатель ( $gp или $28 ), указатель стека ( $sp или $29 ) и указатель кадра ( $30 ). ABI O32 такой же, за исключением того, что вызывающая функция должна сохранять регистр $gp вместо вызываемой функции.
Для многопоточного кода указатель локального хранилища потока обычно хранится в специальном аппаратном регистре $29 и к нему можно получить доступ с помощью инструкции mfhw (переместить из оборудования). Известно, что по крайней мере один поставщик хранит эту информацию в регистре $k0 , который обычно зарезервирован для использования ядром, но это не является стандартом.
Регистры $k0 и $k1 ( $26 – $27 ) зарезервированы для использования ядром и не должны использоваться приложениями, поскольку эти регистры могут быть изменены ядром в любое время из-за прерываний, переключений контекста или других событий.
Регистры, сохраняемые во время вызова, — это регистры, которые (по соглашению) не будут изменены системным вызовом или вызовом процедуры (функции). Например, $s-регистры должны быть сохранены в стеке процедурой, которой необходимо их использовать, а $sp и $fp всегда увеличиваются на константы и уменьшаются обратно после того, как процедура завершается с ними (и памятью, на которую они указывают). Напротив, $ra автоматически изменяется любым обычным вызовом функции (тем, который использует jal), а $t-регистры должны быть сохранены программой перед любым вызовом процедуры (если программе нужны значения внутри них после вызова).
Соглашение о вызовах в пользовательском пространстве позиционно-независимого кода в Linux дополнительно требует, чтобы при вызове функции регистр $t9 содержал адрес этой функции. [45] Это соглашение восходит к дополнению System V ABI для MIPS. [46]
Процессоры MIPS используются во встраиваемых системах, таких как домашние шлюзы и маршрутизаторы . Первоначально MIPS был разработан для вычислений общего назначения. В 1980-х и 1990-х годах процессоры MIPS для персональных компьютеров , рабочих станций и серверов использовались многими компаниями, такими как Digital Equipment Corporation , MIPS Computer Systems , NEC , Pyramid Technology , SiCortex , Siemens Nixdorf , Silicon Graphics и Tandem Computers .
Исторически игровые консоли , такие как Nintendo 64 , Sony PlayStation , PlayStation 2 и PlayStation Portable , использовали процессоры MIPS. Процессоры MIPS также были популярны в суперкомпьютерах в 1990-х годах, но все такие системы выпали из списка TOP500 . Сначала эти применения дополнялись встроенными приложениями, но в 1990-х годах MIPS стал основным присутствием на рынке встроенных процессоров, и к 2000-м годам большинство процессоров MIPS предназначались для этих приложений.
В середине-конце 1990-х годов было подсчитано, что каждый третий произведенный RISC-микропроцессор был процессором MIPS. [47]
К концу 2010-х годов машины MIPS все еще широко использовались на рынках встраиваемых систем, включая автомобильные, беспроводные маршрутизаторы, модемы LTE (в основном через MediaTek ) и микроконтроллеры (например, Microchip Technology PIC32M ). Они в основном исчезли из персонального, серверного и прикладного пространства.
Open Virtual Platforms (OVP) [48] включает в себя свободно доступный для некоммерческого использования симулятор OVPsim , библиотеку моделей процессоров, периферийных устройств и платформ, а также API, которые позволяют пользователям разрабатывать собственные модели. Модели в библиотеке имеют открытый исходный код, написаны на языке C и включают ядра MIPS 4K, 24K, 34K, 74K, 1004K, 1074K, M14K, microAptiv, interAptiv, proAptiv 32-бит и диапазон ядер MIPS 64-бит 5K. Эти модели созданы и поддерживаются Imperas [49] и в партнерстве с MIPS Technologies были протестированы и получили знак MIPS-Verified. Примеры платформ на базе MIPS включают как среды bare metal, так и платформы для загрузки немодифицированных двоичных образов Linux. Эти платформы-эмуляторы доступны в виде исходного кода или двоичных файлов, быстры, бесплатны для некоммерческого использования и просты в использовании. OVPsim разработан и поддерживается компанией Imperas, он очень быстр (сотни миллионов инструкций в секунду) и создан для работы с многоядерными однородными и неоднородными архитектурами и системами.
Существует свободно доступный симулятор MIPS32 (более ранние версии имитировали только R2000/R3000), называемый SPIM, для использования в образовании. EduMIPS64 [50] — это графический кроссплатформенный симулятор MIPS64 CPU, лицензированный под GPL, написанный на Java/Swing. Он поддерживает широкий подмножество MIPS64 ISA и позволяет пользователю графически видеть, что происходит в конвейере, когда программа сборки выполняется CPU.
MARS [51] — еще один эмулятор MIPS на основе графического интерфейса, разработанный для использования в образовании, в частности для использования с Hennessy's Computer Organization and Design .
WebMIPS [52] — это браузерный симулятор MIPS с визуальным представлением общего конвейерного процессора. Этот симулятор весьма полезен для отслеживания регистров во время пошагового выполнения.
QtMips обеспечивает простую 5-ступенчатую визуализацию конвейера, а также визуализацию принципа кэширования для базовых курсов по компьютерной архитектуре. [53] [54] [55] Он доступен как в виде веб-приложения , так и в виде загружаемой программы для Windows, Linux и macOS .
Более продвинутые бесплатные эмуляторы доступны в проектах GXemul (ранее известный как проект mips64emul) и QEMU . Они эмулируют различные микропроцессоры MIPS III и IV, а также целые компьютерные системы, которые их используют.
Специально для встраиваемого использования процессоров MIPS доступны коммерческие симуляторы, например, Wind River Simics (MIPS 4Kc и 5Kc, PMC RM9000, QED RM7000, Broadcom/Netlogic ec4400, Cavium Octeon I), Imperas (все ядра MIPS32 и MIPS64), VaST Systems (R3000, R4000) и CoWare (MIPS4KE, MIPS24K, MIPS25Kf и MIPS34K).
Симулятор Creator [56] [57] [58] [59] [60] является переносимым и позволяет пользователю изучать различные языки ассемблера разных процессоров (в Creator есть примеры с реализацией инструкций MIPS32 и RISC-V).
WepSIM [61] [62] — это браузерный симулятор, в котором подмножество инструкций MIPS микропрограммируется. Этот симулятор очень полезен для изучения работы ЦП (микропрограммирование Архивировано 26 июля 2022 г., на Wayback Machine , процедуры MIPS Архивировано 26 июля 2022 г., на Wayback Machine , прерывания Архивировано 20 августа 2022 г., на Wayback Machine , системные вызовы Архивировано 26 июля 2022 г., на Wayback Machine и т. д.)
R-type — сокращение от register-type. Инструкции R-типа используют три регистра в качестве операндов: два в качестве источников и один в качестве назначения.
{{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка )(источник)