MIPS ( микропроцессор без взаимосвязанных конвейерных этапов ) [1] представляет собой семейство архитектур набора команд компьютера с сокращенным набором команд (RISC) (ISA) [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 тем, что в дополнение к архитектуре пользовательского режима определяет сопроцессор управления системой в привилегированном режиме ядра.
Архитектура 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
Микропроцессор MIPS Computer Systems R6000 (1989 г.) был первой реализацией MIPS II. [3] : 8 Разработанный для серверов, R6000 был изготовлен и продан компанией Bipolar Integrated Technology , но потерпел коммерческий провал. В середине 1990-х годов многие новые 32-битные процессоры MIPS для встраиваемых систем представляли собой реализации MIPS II, поскольку с появлением 64-битной архитектуры MIPS III в 1991 году MIPS II оставался новейшей 32-битной архитектурой MIPS до тех пор, пока в 1999 году не был представлен MIPS32. [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 и его производные широко использовались в высокопроизводительных встроенных системах, а также в недорогих рабочих станциях и серверах. R4200 (1994 г.) компании MIPS Technologies был разработан для встраиваемых систем, ноутбуков и персональных компьютеров. Производная версия 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 .
MIPS V , анонсированный 21 октября 1996 года на Microprocessor Forum 1996 вместе с расширением MIPS Digital Media Extensions (MDMX), был разработан для повышения производительности преобразований 3D-графики. [12] В середине 1990-х годов основным применением невстроенных микропроцессоров MIPS были графические рабочие станции от Silicon Graphics. MIPS V был дополнен расширением MDMX только для целых чисел, чтобы обеспечить полную систему для повышения производительности приложений 3D-графики. [13] Реализации MIPS V так и не были представлены. 12 мая 1997 года компания Silicon Graphics анонсировала микропроцессоры H1 («Зверь») и H2 («Капитан»). Первый должен был стать первой реализацией MIPS V и должен был быть представлен в первой половине 1999 года. [14] Проекты H1 и H2 позже были объединены и в конечном итоге отменены в 1998 году. Хотя MIPS V еще не было В реализации MIPS64 Release 1 (1999) был основан на MIPS V и сохранил все его функции в качестве дополнительной функции сопроцессора 1 (FPU), называемой Paired-Single.
Когда в 1998 году MIPS Technologies была выделена из Silicon Graphics, она переориентировалась на рынок встраиваемых систем. В 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 . 6 декабря 2012 года было объявлено о выпуске MIPS32/MIPS64 5. [16] По словам директора по маркетингу продуктов MIPS, выпуск 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), который ускоряет обработку геометрии в компьютерной 3D-графике.
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] : А-174
Ниже приведены три формата, используемые для основного набора команд:
MIPS I имеет инструкции, которые загружают и сохраняют 8-битные байты, 16-битные полуслова и 32-битные слова. Поддерживается только один режим адресации : база + смещение. Поскольку MIPS I представляет собой 32-битную архитектуру, загрузка величин менее 32 бит требует, чтобы данные были расширены либо со знаком, либо с расширением нуля до 32 бит. Инструкции загрузки с суффиксом «unsigned» выполняют нулевое расширение; в противном случае выполняется расширение знака. Инструкции загрузки берут базу из содержимого георадара (rs) и записывают результат в другой георадар (rt). Инструкции сохранения исходят из содержимого GPR (rs) и данных сохранения из другого GPR (rt). Все инструкции загрузки и сохранения вычисляют адрес памяти путем суммирования основания с немедленным 16-битным расширенным знаком. MIPS I требует, чтобы все обращения к памяти были выровнены по естественным границам слов, в противном случае сигнализируется исключение. Для поддержки эффективного невыровненного доступа к памяти существуют инструкции загрузки/сохранения слов с суффиксом «left» или «right». За всеми инструкциями по загрузке следует слот задержки загрузки . Инструкция в слоте задержки загрузки не может использовать данные, загруженные инструкцией загрузки. Слот задержки загрузки может быть заполнен инструкцией, не зависящей от нагрузки; nop заменяется, если такая инструкция не может быть найдена.
MIPS I имеет инструкции для выполнения сложения и вычитания. Эти инструкции получают свои операнды из двух GPR (rs и rt) и записывают результат в третий GPR (rd). Альтернативно, сложение может получить один из операндов из 16-битного непосредственного значения (который расширяется по знаку до 32 бит). Инструкции сложения и вычитания имеют два варианта: по умолчанию выдается исключение, если результат переполняется; инструкции с суффиксом «без знака» не сигнализируют об исключении. Проверка переполнения интерпретирует результат как 32-битное целое число с дополнением до двух. MIPS I имеет инструкции для выполнения поразрядных логических операций И, ИЛИ, XOR и NOR. Эти инструкции получают свои операнды из двух GPR и записывают результат в третий GPR. Инструкции AND, OR и XOR могут альтернативно получать один из операндов из 16-битного непосредственного операнда (который расширяется с нуля до 32 бит). Инструкции Установить отношение записывают единицу или ноль в регистр назначения, если указанное отношение истинно или ложно. Эти инструкции получают свои операнды из двух GPR или одного GPR и 16-битного непосредственного сигнала (который расширяется по знаку до 32 битов) и записывают результат в третий GPR. По умолчанию операнды интерпретируются как целые числа со знаком. Варианты этих инструкций с суффиксом «без знака» интерпретируют операнды как целые числа без знака (даже те, которые получают операнд из 16-битного немедленного значения с расширенным знаком).
Команда Load Immediate Upper копирует 16-битный немедленный сигнал в старшие 16 бит GPR. Он используется вместе с командой Or Immediate для загрузки 32-битного немедленного значения в регистр.
MIPS I имеет инструкции для выполнения логических сдвигов влево и вправо, а также арифметических сдвигов вправо. Операнд получается из георадара (rt), а результат записывается в другой георадар (rd). Расстояние сдвига получается либо из георадара (rs), либо из 5-битной «величины сдвига» (поле «sa»).
MIPS I имеет инструкции для умножения и деления целых чисел со знаком и без знака. Эти инструкции получают свои операнды из двух GPR и записывают свои результаты в пару 32-битных регистров, называемых HI и LO, поскольку они могут выполняться отдельно от других инструкций ЦП (и одновременно с ними). При умножении старшая и младшая половины 64-битного произведения записываются в HI и LO (соответственно). При делении частное записывается в LO, а остаток в HI. Для доступа к результатам предусмотрена пара инструкций (Move from HI и Move from LO) для копирования содержимого HI или LO в георадар. Эти инструкции взаимосвязаны: чтение HI и LO не продолжается после незавершенной арифметической инструкции, которая будет записывать в HI и LO. Другая пара инструкций (Move to HI или Move to LO) копирует содержимое GPR в HI и LO. Эти инструкции используются для восстановления исходного состояния HI и LO после обработки исключений. Инструкции, которые читают HI или LO, должны быть разделены двумя инструкциями, которые не записывают HI или LO.
За всеми инструкциями потока управления MIPS I следует слот задержки перехода . Если слот задержки ветвления не заполнен инструкцией, выполняющей полезную работу, заменяется no. Инструкции ветвления MIPS I сравнивают содержимое GPR (rs) с нулевым или другим GPR (rt) как целые числа со знаком и выполняют переход, если указанное условие истинно. Управление передается по адресу, вычисленному путем смещения 16-битного смещения влево на два бита, расширения знака 18-битного результата и добавления 32-битного результата с расширенным знаком к сумме счетчика программы (адрес инструкции) и 8 10 . Переходы имеют две версии: абсолютные и косвенные по регистру. Абсолютные переходы («Jump» и «Jump and Link») вычисляют адрес, по которому передается управление, путем сдвига 26-битного instr_index влево на два бита и объединения 28-битного результата с четырьмя старшими битами адреса инструкцию в слоте задержки ветвления. Регистр-косвенные переходы передают управление инструкции по адресу, полученному от GPR (rs). Адрес, полученный от GPR, должен быть выровнен по слову, иначе после выполнения инструкции в слоте задержки ветвления будет сигнализироваться исключение. Инструкции перехода и перехода, которые связывают (за исключением «Регистра перехода и связи»), сохраняют обратный адрес в GPR 31. Команда «Регистр перехода и связи» позволяет сохранить обратный адрес в любом записываемом GPR.
MIPS I имеет две инструкции для программного обеспечения, сигнализирующего об исключении: системный вызов и точка останова. Системный вызов используется программным обеспечением пользовательского режима для выполнения вызовов ядра; а точка останова используется для передачи управления отладчику через обработчик исключений ядра. Обе инструкции имеют 20-битное поле кода, которое может содержать информацию, специфичную для операционной среды, для обработчика исключений.
MIPS имеет 32 регистра с плавающей запятой. Два регистра объединены в пары для чисел двойной точности. Регистры с нечетными номерами нельзя использовать для арифметических операций или ветвления, просто как часть пары регистров двойной точности, в результате чего для большинства инструкций можно использовать 16 регистров (перемещение/копирование и загрузка/сохранение не затрагиваются).
Одинарная точность обозначается суффиксом .s, а двойная точность обозначается суффиксом .d.
MIPS II удалил слот задержки загрузки [3] : 41 и добавил несколько наборов инструкций. Для многопроцессорной обработки с общей памятью были добавлены инструкции «Синхронизировать общую память» , «Загрузить связанное слово » и «Сохранить условное слово» . [28] Был добавлен набор инструкций Trap-on-Condition. Эти инструкции вызвали исключение, если оцененное условие истинно. Всем существующим инструкциям ветвления были присвоены версии , вероятные для ветвления , которые выполняли инструкцию в слоте задержки ветвления только в том случае, если ветвление было выполнено. [3] : 40 Эти инструкции в некоторых случаях улучшают производительность, позволяя полезным инструкциям заполнить слот задержки ветвления. [3] : добавлено 212 инструкций загрузки и сохранения двойных слов для COP1–3. Как и в случае с другими инструкциями доступа к памяти, эти загрузки и сохранения требовали естественного выравнивания двойного слова.
В набор инструкций для сопроцессора с плавающей запятой также было добавлено несколько инструкций. Была добавлена совместимая со стандартом IEEE 754 инструкция извлечения квадратного корня с плавающей запятой. Он поддерживал операнды как одинарной, так и двойной точности. Был добавлен набор инструкций, преобразующих числа с плавающей запятой одинарной и двойной точности в 32-битные слова. Они дополняли существующие инструкции преобразования, позволяя задавать режим округления IEEE с помощью инструкции вместо регистра управления и состояния с плавающей запятой.
MIPS III — это обратно совместимое расширение MIPS II, в которое добавлена поддержка 64-битной адресации памяти и целочисленных операций. 64-битный тип данных называется двойным словом, и MIPS III расширил регистры общего назначения, регистры HI/LO и программный счетчик до 64 бит для его поддержки. Были добавлены новые инструкции для загрузки и хранения двойных слов, для выполнения над ними операций сложения, вычитания, умножения, деления и сдвига целых чисел, а также для перемещения двойного слова между регистрами GPR и регистрами HI/LO. Для многопроцессорной обработки с общей памятью были добавлены инструкции «Загрузить связанное двойное слово» и «Сохранить условное двойное слово» . [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 бита. Третья версия получает расстояние сдвига из шести младших битов георадара.
MIPS III добавил уровень привилегий супервизора между существующими уровнями привилегий ядра и пользователя. Эта функция затронула только определенный реализацией процессор управления системой (сопроцессор 0).
MIPS III удалил инструкции поддержки сопроцессора 3 (CP3) и повторно использовал его коды операций для новых инструкций двойного слова. Остальные сопроцессоры получили инструкции по перемещению двойных слов между регистрами сопроцессора и GPR. Плавающие регистры общего назначения (FGR) были расширены до 64 бит, а требование к инструкциям использовать только регистры с четными номерами было удалено. Это несовместимо с более ранними версиями архитектуры; бит в регистре управления/состояния с плавающей запятой используется для работы модуля с плавающей запятой (FPU) MIPS III в режиме, совместимом с MIPS I и II. Регистры управления плавающей запятой не были расширены для совместимости. Единственными новыми добавленными инструкциями с плавающей запятой были те, которые копируют двойные слова между ЦП и 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 благодаря своему статусу исходного ABI System V для 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 предложить более радикальный ABI «NUBI», дополнительно повторно использующий регистры аргументов для возвращаемого значения. [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 и включают 32-разрядные ядра MIPS 4K, 24K, 34K, 74K, 1004K, 1074K, M14K, microAptiv, interAptiv, proAptiv и диапазон ядер MIPS 64-бит 5K. . Эти модели созданы и поддерживаются компанией Imperas [49] и в сотрудничестве с MIPS Technologies были протестированы и получили знак MIPS-Verified. Примеры платформ на базе MIPS включают как «голые» среды, так и платформы для загрузки немодифицированных двоичных образов Linux. Эти платформы-эмуляторы доступны в виде исходного кода или двоичных файлов, они быстрые, бесплатны для некоммерческого использования и просты в использовании. OVPsim разработан и поддерживается компанией Imperas, он очень быстр (сотни миллионов инструкций в секунду) и создан для работы с многоядерными однородными и гетерогенными архитектурами и системами.
Существует свободно доступный симулятор MIPS32 (более ранние версии моделировали только R2000/R3000) под названием SPIM для использования в образовании. EduMIPS64 [50] — это графический кроссплатформенный симулятор процессора MIPS64 под лицензией GPL, написанный на Java/Swing. Он поддерживает широкий набор MIPS64 ISA и позволяет пользователю графически видеть, что происходит в конвейере, когда программа ассемблера запускается ЦП.
MARS [51] — еще один эмулятор MIPS на основе графического пользовательского интерфейса, разработанный для использования в сфере образования, в частности для использования с компьютерной организацией и дизайном Hennessy .
WebMIPS [52] — это симулятор MIPS на основе браузера с визуальным представлением обычного конвейерного процессора. Этот симулятор весьма полезен для отслеживания регистров во время пошагового выполнения.
QtMips [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] является портативным и позволяет пользователю изучать различные языки ассемблера разных процессоров (у Creator есть примеры с реализацией инструкций MIPS32 и RISC-V).
WepSIM [60] [61] — это браузерный симулятор, в котором микропрограммируется подмножество инструкций MIPS. Этот симулятор очень полезен для изучения того, как работает процессор (микропрограммирование, процедуры MIPS, прерывания, системные вызовы и т. д.).
R-тип — это сокращение от типа регистра. Инструкции R-типа используют три регистра в качестве операндов: два в качестве источников и один в качестве назначения.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка )(источник)