Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Архитектура наборов команд RISC
RISC instruction set architecture
Fujitsu также прекратит производство SPARC (уже перешла к производству собственных процессоров на базе ARM) после двух "улучшенных" версий более старого сервера SPARC M12 в 2020–2022 годах (ранее планировалось на 2021 год) и снова в 2026–2027 годах, прекращение продаж в 2029 году для серверов UNIX и через год для их мейнфреймов, а также окончание поддержки в 2034 году "для стимулирования модернизации клиентов".
Fujitsu will also discontinue their SPARC production (has already shifted to producing their own ARM based CPUs), after two "enhanced" versions of Fujitsu's older SPARC M12 server in 2020–22 (formerly planned for 2021) and again in 2026–27, end of sale in 2029, of UNIX servers and a year later for their mainframe and end of support in 2034 "to promote customer modernization".
Особенности
Архитектура SPARC была сильно подвержена влиянию более ранних RISC-проектов, включая RISC I и II из Калифорнийского университета в Беркли и IBM 801. Эти оригинальные RISC-проекты были минималистичными, содержали как можно меньше функций или мнемоник и были нацелены на выполнение инструкций со скоростью почти одна инструкция за такт. Это делало их во многом похожими на архитектуру MIPS, включая отсутствие инструкций умножения или деления. Еще одной особенностью SPARC, унаследованной от раннего движения RISC, является слот задержки ветвления. Процессор SPARC обычно содержит до 160 регистров общего назначения. Согласно спецификации "Oracle SPARC Architecture 2015", "реализация может содержать от 72 до 640 64-битных регистров общего назначения". В любой момент времени только 32 из них непосредственно доступны программному обеспечению: 8 – это набор глобальных регистров (один из которых, g0, аппаратно привязан к нулю, поэтому только семь из них могут использоваться как регистры), а остальные 24 – из стека регистров. Эти 24 регистра образуют так называемое окно регистров, и при вызове/возврате функции это окно перемещается вверх и вниз по стеку регистров. Каждое окно имеет восемь локальных регистров и разделяет восемь регистров с каждым из соседних окон. Разделяемые регистры используются для передачи параметров функции и возврата значений, а локальные регистры – для сохранения локальных значений между вызовами функций. "Масштабируемость" в SPARC обусловлена тем, что спецификация SPARC позволяет реализациям масштабироваться от встроенных процессоров до крупных серверных процессоров, используя один и тот же базовый (непривилегированный) набор инструкций. Одним из архитектурных параметров, который можно масштабировать, является количество реализованных окон регистров; спецификация позволяет реализовать от трех до 32 окон, поэтому реализация может выбрать реализацию всех 32 для обеспечения максимальной эффективности стека вызовов, или реализовать только три для снижения стоимости и сложности конструкции, или реализовать какое-либо количество между ними. Другие архитектуры, включающие аналогичные функции регистрового файла, включают Intel i960, IA-64 и AMD 29000. Архитектура претерпела несколько пересмотров. Аппаратные функции умножения и деления были добавлены в версии 8. 64-битная (адресация и данные) поддержка была добавлена в спецификацию SPARC версии 9, опубликованную в 1994 году. Инструкции сложения и вычитания со знаком выполняют сложение и вычитание значений, проверяя, что младшие два бита обоих операндов равны 0, и сообщают о переполнении, если это не так. Это может быть полезно при реализации среды выполнения для ML, Lisp и подобных языков, которые могут использовать формат целых чисел с тегами. Порядок байтов 32-битной архитектуры SPARC V8 – исключительно старший. 64-битная архитектура SPARC V9 использует инструкции старшего порядка байтов, но может получать доступ к данным в порядке байтов старшего или младшего порядка, выбранном либо на уровне инструкции приложения (load-store), либо на уровне страницы памяти (через настройку MMU). Последнее часто используется для доступа к данным с устройств, изначально использующих младший порядок байтов, таких как те, что на шинах PCI.
The SPARC architecture was heavily influenced by the earlier RISC designs, including the RISC I and II from the University of California, Berkeley and the IBM 801. These original RISC designs were minimalist, including as few features or op codes as possible and aiming to execute instructions at a rate of almost one instruction per clock cycle. This made them similar to the MIPS architecture in many ways, including the lack of instructions such as multiply or divide. Another feature of SPARC influenced by this early RISC movement is the branch delay slot. The SPARC processor usually contains as many as 160 general purpose registers. According to the "Oracle SPARC Architecture 2015" specification an "implementation may contain from 72 to 640 general purpose 64 bit" registers. At any point, only 32 of them are immediately visible to software — 8 are a set of global registers (one of which, g0, is hard wired to zero, so only seven of them are usable as registers) and the other 24 are from the stack of registers. These 24 registers form what is called a register window, and at function call/return, this window is moved up and down the register stack. Each window has eight local registers and shares eight registers with each of the adjacent windows. The shared registers are used for passing function parameters and returning values, and the local registers are used for retaining local values across function calls. The "scalable" in SPARC comes from the fact that the SPARC specification allows implementations to scale from embedded processors up through large server processors, all sharing the same core (non privileged) instruction set. One of the architectural parameters that can scale is the number of implemented register windows; the specification allows from three to 32 windows to be implemented, so the implementation can choose to implement all 32 to provide maximum call stack efficiency, or to implement only three to reduce cost and complexity of the design, or to implement some number between them. Other architectures that include similar register file features include Intel i960, IA 64, and AMD 29000. The architecture has gone through several revisions. It gained hardware multiply and divide functionality in version 8. 64 bit (addressing and data) were added to the version 9 SPARC specification published in 1994. Tagged add and subtract instructions perform adds and subtracts on values checking that the bottom two bits of both operands are 0 and reporting overflow if they are not. This can be useful in the implementation of the run time for ML, Lisp, and similar languages that might use a tagged integer format. The endianness of the 32 bit SPARC V8 architecture is purely big endian. The 64 bit SPARC V9 architecture uses big endian instructions, but can access data in either big endian or little endian byte order, chosen either at the application instruction (load–store) level or at the memory page level (via an MMU setting). The latter is often used for accessing data from inherently little endian devices, such as those on PCI buses.
Грузы и запасы
Инструкции загрузки и сохранения имеют трех-операндный формат: два операнда представляют значения для адреса, а один – регистр для чтения или записи. Адрес формируется путем сложения двух операндов адреса. Второй операнд адреса может быть константой или регистром. Инструкции загрузки берут значение по вычисленному адресу и помещают его в регистр, указанный третьим операндом, в то время как инструкции сохранения берут значение из регистра, указанного первым операндом, и помещают его по вычисленному адресу. Для большей наглядности в языке ассемблера адресные операнды обозначаются квадратными скобками с плюсом между ними, а не списком, разделенным запятыми. Примеры:
Load and store instructions have a three operand format, in that they have two operands representing values for the address and one operand for the register to read or write to. The address is created by adding the two address operands to produce an address. The second address operand may be a constant or a register. Loads take the value at the address and place it in the register specified by the third operand, whereas stores take the value in the register specified by the first operand and place it at the address. To make this more obvious, the assembler language indicates address operands using square brackets with a plus sign separating the operands, instead of using a comma separated list. Examples: