用于扩展可用于指令的通用寄存器的数目的方法和系统 【技术领域】
本发明涉及计算机系统, 更具体地涉及计算机系统处理器指令功能性。背景技术 商标 是 U.S.A( 美国 ) 纽约阿蒙克的国际商业机器公司的注册商标。 S/390、 Z900、 z990 和 z10 以及其它产品名称可能是国际商业机器公司或其它公司的注册商标或产 品名称。
IBM 从二十世纪六十年代的公知 系统 360 的机器开始至今, 通过许多非 常有才能的工程师的工作, 已经创建了一种特殊的架构, 由于其对于计算系统的本质特性 而被公知为 “大型机” , 其操作原理通过描述已经由 IBM 发明人发明的指令来陈述机器的 架构, 可以在 “大型机” 实施所述指令时执行所述指令, 并且由于它们对改进 “大型机” 所 表示的计算机器的状态的显著贡献, 而被选择包含在多年陈述的 IBM 的操作原理 (IBM’ s Principles of Operation) 中作为显著贡献。 2009 年 2 月出版的
操 作 原理 的第八版 已经成 为作为 SA22-7832-07 的标 准出 版的 参考 文献, 并且 被 并 入 包 括 IBM 系 统 企 业 级 服 务 器 的 IBM 的 大 型 机 服 务 器 中。 通 过 全 文 引 用 将 操作原理 ( 出版物 SA22-7832-07) 合并于此。
参考图 1A, 描绘了主机计算机系统 50 的典型组件。 在计算机系统中也可以采用本 领域众所周知的其它组件布置。典型的主机计算机 50 包括一个或多个 CPU 1, 其与主存储 器 ( 计算机存储器 2) 通信 ; 以及到存储装置 11 和网络 10 的 I/O 接口, 用于与其它计算机或 SAN 等通信。CPU 1 与具有架构的 (architected) 指令集和架构的功能性的架构兼容。CPU 1 可以具有动态地址转换 (DAT)3, 用于将程序地址 ( 虚拟地址 ) 变换为存储器的真实地址。 DAT 典型地包括用于高速缓存 (cache) 转换的转换后备缓冲器 (TLB)7, 使得以后对计算机 存储器 2 的块的访问不需要地址转换的延迟。典型地, 在计算机存储器 2 与处理器 1 之间 采用高速缓存 9。 高速缓存 9 可以是分层级的, 具有对于多于一个 CPU 可用的大高速缓存以 及在大高速缓存与每个 CPU 之间的较小、 较快 ( 较低级 ) 的高速缓存。在一些实施方式中, 较低级的高速缓存被划分以提供用于指令取出和数据访问的分离低级高速缓存。 在实施例 中, 由指令取出单元 4 经由高速缓存 9 从存储器 2 取出指令。在指令解码单元 (6) 中解码 该指令, 并且将该指令调度 (dispatch)( 在一些实施例中与其它指令一起 ) 至指令执行单 元 8。典型地, 采用几个执行单元 8, 例如, 算术执行单元、 浮点执行单元和分支指令执行单 元。由执行单元执行指令, 如需要则从指令指定的寄存器或存储器访问操作数。如果要从 存储器 2 访问 ( 加载或存储 ) 操作数, 则加载存储单元 5 典型地在被执行的指令的控制下 处理访问。可以在硬件电路中、 或在内部微代码 ( 固件 ) 中、 或通过这两者的组合来执行指 令。
在图 1B 中, 提供了仿真的主机计算机系统 12 的示例, 其仿真主机架构的主机计算 机系统 50。在仿真的主机计算机系统 21 中, 主机处理器 (CPU)1 是仿真的主机处理器 ( 或 虚拟主机处理器 ) 并包括仿真处理器 27, 其具有与主机计算机 50 的处理器 1 不同的本地指令集架构。仿真的主机计算机系统 21 具有对于仿真处理器 27 可访问的存储器 22。在该示 例实施例中, 存储器 22 被分割为主机计算机存储器 2 部分和仿真例程 23 部分。主机计算 机存储器 2 对于根据主机计算机架构的仿真的主机计算机 21 的程序可用。仿真处理器 27 执行与仿真的处理器 1 的架构不同的架构的架构指令集的本地指令 ( 所述本地指令从仿真 例程存储器 23 获得 ), 并且可以通过采用在序列 & 访问 / 解码例程中获得的一个或多个指 令来从主机计算机存储器 2 中的程序访问用于执行的主指令, 所述序列 & 访问 / 解码例程 可以解码所访问的主机指令, 以确定本地指令执行例程, 用于仿真所访问的主机指令的功 能。可以通过架构的设施例程 (Architected Facilities Routines) 仿真为主机计算机系 统 50 的架构所定义的其它设施, 例如, 包括诸如通用寄存器、 控制寄存器、 动态地址转换和 I/O 子系统支持和处理器高速缓存的设施。 仿真例程还可以利用仿真处理器 27 中可用的功 能 ( 诸如通用寄存器和虚拟地址的动态转换 ) 来增强仿真例程的性能。还可以提供特殊硬 件和卸载 (Off-Load) 引擎来辅助处理器 27 仿真主机计算机 50 的功能。
在大型机中, 程序员 ( 现今通常是 “C” 程序员 ) 通常通过编译器应用使用架构的 机器指令。可以在 z/Architecture IBM 服务器中本地地执行、 或者可替代地在执行其它架 构的机器中执行存储在存储介质中的这些指令。可以在现有的和未来的 IBM 大型机服务器 中以及在 IBM 的其它机器 ( 例如, 服务器和 服务器 ) 上仿真它们。可以 在使用由 AMDTM、 Sun Microsystem(Sun 微系统 ) 等制造的硬件的多种机器 上运行 Linux 的机器中执行它们。 除了在 下的该硬件上执行之外, 还可以 使用 Linux 以及通过 Hercules、 UMX、 FSI( 基础软件公司 (Fundamental Software, Inc.)) 或平台解决方案公司 (Platform Solutions, Inc.)(PSI) 使用仿真的机器, 其中通常执行是 在仿真模式中。在仿真模式中, 通过本地处理器执行仿真软件以仿真所仿真的处理器的架 构。
本地处理器 27 典型地执行包括固件或本地操作系统的仿真软件 23 来执行所仿真 的处理器的仿真。仿真软件 23 负责取出并执行所仿真的处理器架构的指令。仿真软件 23 维持仿真程序计数器以跟踪指令边界。仿真软件 23 一次可以取出一个或多个仿真机器指 令, 并将一个或多个仿真机器指令转变为对应组的本地机器指令, 用于由本地处理器 27 执 行。这些经转变的指令可以被高速缓存, 使得可以实现更快的转变。尽管如此, 仿真软件必 须维持仿真的处理器架构的架构规则, 以便确保为仿真的处理器所写的操作系统和应用正 确操作。此外, 仿真软件必须提供由仿真的处理器 1 的架构识别的资源, 其包括但不限于控 制寄存器、 通用寄存器、 浮点寄存器、 动态地址转换功能 ( 例如, 包括段表和页表 )、 中断机 制、 上下文切换机制、 当日时间 (TOD) 时钟以及至 I/O 子系统的架构的接口, 使得设计为在 仿真的处理器上运行的操作系统或应用程序可以在具有仿真软件的本地处理器上运行。
解码被仿真的特定指令, 并且调用子例程来执行各个单独 (individual) 指令 的功能。例如, 在 “C”子例程或驱动器中, 或者在提供用于特定硬件的驱动器的某些其 它方法中, 实施仿真所仿真的处理器 1 的功能的仿真软件功能 23, 在理解优选实施例 的描述之后, 其将在本领域的技术人员的技艺内。各种软件和硬件仿真专利包括但不 限 于 US5551013(Beausoleil 等 人 的 “Multiprocessor for hardware emulation” )、 US6009261(Scalzi 等人的 “Preprocessing of stored target routines for emulating incompatible instructions on a target processor” )、 US5574873(Davidian 等人的“Decoding guest instruction to directly access emulation routines that emulate the guest instructions” )、 US6308255(Gorishek 等人的 “Symmetrical multiprocessing bus and chipset used for coprocessor support allowing non-native code to run in a system” )、 US6463582(Lethin 等人的 “Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method” ) 以及 US5790825(Eric Traut 的 “Method for emulating guest instructions on a host computer through dynamic recompilation of host instructions” ); 通过 全文引用将每个上述专利合并在此。 这些参考文献说明了针对本领域技术人员可用的目标 机器、 实现为不同机器而架构的指令格式的仿真的各种已知方式, 以及上述这些参考文献 所使用的商用软件技术。
需要的是与现有架构一致的新指令功能性, 其减轻对诸如通用寄存器的架构资源 的依赖, 增强采用新指令的软件版本的功能性和性能。 发明内容 在高字 (High-word) 设施的实施例中, 在具有第一数目的大通用寄存器 (GPR) 的计算机中扩展对于程序的指令可用的 GPR 的有效数目, 每个指令包括操作码 (opcode、 OpCode、 op code、 Op Code) 和用于指定对应 GPR 的一个或多个 GPR 字段, 每个大 GPR 包括
第一部分和第二部分, 所述大 GPR 包括由第一部分组成的第一小 GPR 和由第二部分组成的 第二小 GPR。其中, 响应于小 GPR 模式中的计算机, 进行 a) 和 b) : a) 执行第一指令集的指 令, 第一指令集用于访问所述第一小 GPR, 所述执行包括基于所述第一小 GPR 生成用于访问 存储器操作数的存储器地址或者访问第一小 GPR 操作数, 其中第一小 GPR 由所述第一部分 组成 ; 以及 b) 执行第二指令集的指令, 第二指令集用于访问所述第二小 GPR, 所述执行包括 基于所述第二小 GPR 生成用于访问存储器操作数的存储器地址或者访问第二小 GPR 操作 数, 其中所述第二小 GPR 由所述第二部分组成 ; 并且响应于大 GPR 模式中的计算机, 执行第 三指令集的指令, 所述执行包括基于所述大 GPR 生成用于访问存储器操作数的存储器地址 或者访问包括所述第一部分和所述第二部分的大 GPR 操作数。
在实施例中, 小 GPR 模式包括处于 24 位寻址模式或 31 位寻址模式之一中。
在实施例中, 第一部分是 32 位, 第二部分是 32 位, 并且第三部分是 64 位。
在实施例中, 第二指令集的指令的执行包括基于两个操作数执行对应操作码定义 的功能, 并且存储结果, 对应操作码定义的功能由两个操作数的 ADD( 加 ) 功能或者两个操 作数的 COMPARE( 比较 ) 功能组成。
在实施例中, 第二指令集的指令的执行包括基于两个操作数执行对应操作码定义 的功能, 并且存储结果, 对应操作码定义的功能由从存储器 LOAD( 加载 ) 操作数的功能或者 将操作数 STORE( 存储 ) 到存储器的功能组成。
在实施例中, 第二指令集的指令的执行包括基于两个操作数执行对应操作码定义 的功能, 并且存储结果, 对应操作码定义的功能是 ROTATE THEN INSERT SELECTED BITS( 循 环然后插入所选择的位 ) 功能, 包括 :
将源操作数循环指令指定的量 ; 并
将所循环的源操作数的所选择的部分插入目标操作数的所选择部分中。在实施例中, 支持操作在大 GPR 模式中的操作系统, 其中在运行在小 GPR 模式中的 应用的上下文切换期间, 保存并恢复大 GPR。
在实施例中, 操作系统在大 GPR 模式中操作, 其中在运行在小 GPR 模式中的应用的 上下文切换期间, 保存并恢复大 GPR。
实施例的以上以及附加的目的、 特征和优点将在下面所写的描述中变得明显。
这里其它实施例和方面被详细描述, 并被认为是所要求权利的本发明的一部分。 为了更好地理解优势和特征, 参照描述和附图。 附图说明 在说明书的结论处的权利要求中具体提出并清楚主张认为是本发明的主题。 前述 和其它目的、 特征和优势依据下面结合附图的详细描述而明显, 其中 :
图 1A 是描绘示例主机计算机系统的图 ;
图 1B 是描绘示例仿真主机计算机系统的图 ;
图 1C 是描绘示例计算机系统的图 ;
图 2 是描绘示例计算机网络的图 ;
图 3 是描绘计算机系统的元件的图 ; 图 4A-4C 描绘计算机系统的详细元件 ; 图 5A-5F 描绘计算机系统的机器指令格式 ; 图 6 描绘示例大 GPR ; 图 7A-7B 呈现示例高字实施例流 ; 以及 图 8 描绘示例上下文切换流。具体实施方式
可以通过软件 ( 有时指许可的内部代码、 固件、 微代码、 毫代码 (Milli-code)、 微 微代码 (Pico-code) 等, 它们中的任何一个将与实施例一致 ) 来实践实施例。 参考图 1A, 典 型地, 由系统 50 的处理器 ( 还称为 CPU( 中央处理单元 ))1 从诸如 CD-ROM 驱动器、 磁带驱 动器或硬盘驱动器的长期存储介质 11 访问软件程序代码。可以在用于数据处理系统的多 种已知介质 ( 诸如, 磁盘、 硬盘驱动器、 或 CD-ROM) 的任何一种上包含软件程序代码。代码 可以分布在这样的介质上, 或者可以从一个计算机系统的计算机存储器 2 或存储器通过到 其它计算机系统的网络 10 而分布至用户, 用以由这种其它系统的用户使用。
可替代地, 程序代码可以包含在存储器 2 中, 并且被处理器 1 使用处理器总线访 问。 这样的程序代码包括控制各种计算机组件和一个或多个应用程序的功能和交互的操作 系统。通常将程序代码从密集存储介质 11 调页面 (page) 至高速存储器 2, 在存储器 2 中, 程序代码可用于处理器 1 的处理。 用于将软件程序代码包含在存储器中、 物理介质上以及 / 或者经由网络分布软件代码的技术和方法是已知的, 这里将不再讨论。当在有形介质 ( 包 括但不限于电子存储器模块 (RAM)、 闪存、 紧凑盘 (CD)、 DVD、 磁带等 ) 上创建并存储程序代 码时, 程序代码通常被称为 “计算机程序产品” 。计算机程序产品介质典型地可由优选地在 计算机系统中的处理电路读取, 用以通过该处理电路执行。
图 1C 图示了典型的工作站或服务器硬件系统。图 1C 的系统 100 包括典型的计算机系统 101, 诸如个人计算机、 工作站或服务器, 包括可选的外围设备。 工作站 101 包括一个 或多个处理器 106 和总线, 所述总线被用于根据已知技术将处理器 106 与系统 101 的其它 组件连接, 并使处理器 106 与系统 101 的其它组件之间能够通信。总线将处理器 106 连接 至存储器 105 和长期存储器 107, 所述长期存储器 107 例如可包括硬盘驱动器 ( 例如, 包括 磁介质、 CD、 DVD 和闪存中的任何一个 ) 或磁带驱动器。系统 101 还可以包括用户接口适配 器, 其经由总线将微处理器 106 连接至一个或多个接口设备, 诸如键盘 104、 鼠标 103、 打印 机 / 扫描仪 110 和 / 或其它接口设备, 其可以是任何用户接口设备, 诸如触摸感应屏、 数字 化输入板等。总线还将显示设备 102( 诸如 LCD 屏或监视器 ) 经由显示器适配器连接至微 处理器 106。
系统 101 可以通过能够与网络 109 通信 108 的网络适配器与其它计算机或计算机 网络通信。示例网络适配器是通信信道、 令牌环、 以太网或调制解调器。可替代地, 工作站 101 可以使用诸如 CDPD( 蜂窝数字分组数据 ) 卡的无线接口通信。工作站 101 可以与局域 网 (LAN) 或广域网 (WAN) 中的其它这样的计算机相关联, 或者工作站 101 可以是具有另一 计算机的客户端 / 服务器布置中的客户端等。所有这些配置以及适当的通信硬件和软件在 本领域中是已知的。 图 2 图示了其中可以实践实施例的数据处理网络 200。数据处理网络 200 可以包 括多个单独网络, 诸如无线网络和有线网络, 它们中的每一个可以包括多个单独的工作站 101、 201、 202、 203、 204。 此外, 如本领域技术人员将理解的, 可以包括一个或多个 LAN, 其中, LAN 可以包括耦接至主机处理器的多个智能工作站。
仍然参考图 2, 网络还可以包括大型机计算机或服务器, 诸如网关计算机 ( 客户端 服务器 206) 或应用服务器 ( 远程服务器 208, 其可以访问数据存储库 (repository) 并且 还可以从工作站 205 直接访问该远程服务器 208)。网关计算机 206 充当进入各个网络 207 的点。当将一个网络协议连接至另一个网络协议时, 需要网关。优选地, 网关 206 可以通过 通信链路耦接至另一网络 ( 例如, 因特网 207)。网关 206 还可以使用通信链路直接耦接至 一个或多个工作站 101、 201、 202、 203、 204。可以利用可以从 IBM 公司得到的 IBMeServerTM、 服务器实施网关计算机。
典型地, 由系统 101 的处理器 106 从长期存储介质 107( 诸如 CD-ROM 驱动器或硬 盘驱动器 ) 访问软件程序代码。软件程序代码可以包含在各种用于数据处理系统的已知介 质的任何一种上, 诸如磁盘、 硬盘驱动器或 CD-ROM。所述代码可以分布在这样的介质上, 或 者可以从一个计算机系统的存储器或储存器通过至其它计算机系统的网络而分布至用户 210、 211, 用以由这样的其它系统的用户使用。
可替代地, 程序代码 111 可以包含在存储器 105 中, 并且由处理器 106 使用处理器 总线访问。这样的程序代码包括操作系统, 其控制各种计算机组件以及一个或多个应用程 序 112 的功能和交互。 通常将程序代码从密集存储介质 107 调页面至高速存储器 105, 在存 储器 105 中, 程序代码可用于处理器 106 的处理。用于将软件程序代码包含在存储器中、 物 理介质上以及 / 或者经由网络分布软件代码的技术和方法是公知的, 这里将不再讨论。当 在有形介质 ( 包括但不限于电子存储器模块 (RAM)、 闪存、 紧凑盘 (CD)、 DVD、 磁带等 ) 上创 建并存储程序代码时, 程序代码通常被称为 “计算机程序产品” 。计算机程序产品介质典型 地可由优选地在计算机系统中的处理电路读取, 用以通过该处理电路执行。
最易用于处理器的高速缓存 ( 通常比处理器的其它高速缓存更快且更小 ) 是最低 (L1 或等级一 ) 高速缓存, 且主储存器 ( 主存储器 ) 是最高级高速缓存 ( 在存在 3 个等级 的情况下为 L3)。最低级高速缓存通常被划分为保持要被执行的机器指令的指令高速缓存 (I- 高速缓存 ) 和保持数据操作数的数据高速缓存 (D- 高速缓存 )。
参考图 3, 描绘用于处理器 106 的示例性处理器实施例。典型地, 采用一个或多个 等级的高速缓存 303 来缓冲存储器块, 以便增强处理器性能。高速缓存 303 是保持很可能 被使用的存储器数据的高速缓存行 (line) 的高速缓冲器。典型的高速缓存行是 64、 128 或 256 字节的存储器数据。 通常采用独立的高速缓存用于高速缓存指令, 而非用于高速缓存数 据。通常通过本领域公知的各种 “窥探 (Snoop)” 算法提供高速缓存一致性 ( 存储器和高速 缓存中的行的复制的同步 )。处理器系统的主存储器 105 通常称为高速缓存。在具有 4 个 等级的高速缓存 303 的处理器系统中, 主存储器 105 有时称为等级 5(L5) 高速缓存, 因为其 典型地更快且仅保持可用于计算机系统的非易失性存储器 (DASD、 磁带等 ) 的一部分。 主存 储器 105 通过操作系统 “高速缓存” 主存储器 105 的页面调入和页面调出的数据的页面。
程序计数器 ( 指令计数器 )311 跟踪要被执行的当前指令的地址。 z/Architecture 处理器中的程序计数器是 64 位并且可以被截短为 31 或 24 位, 以支持现有的寻址限制。程 序计数器典型地包含在计算机的 PSW( 程序状态字 ) 中, 使得其在上下文切换期间持续。因 此, 具有程序计数器值的、 进行中的程序可以被例如操作系统 ( 从程序环境到操作系统环 境的上下文切换 ) 中断。程序的 PSW 在程序未激活时维持程序计数器值, 并且在操作系统 正在执行时使用操作系统的 (PSW 中的 ) 程序计数器。典型地, 程序计数器被递增与当前指 令的字节数目相等的量。 RISC( 精简指令集计算 ) 指令典型地为固定长度, 而 CISC( 复杂指 令集计算 ) 指令典型地为可变长度。IBMz/Architecture 的指令是具有 2、 4 或 6 字节长度 的 CISC 指令。例如, 通过上下文切换操作或者分支指令的分支采取操作来修改程序计数器 311。在上下文切换操作中, 当前程序计数器值与关于正被执行的程序的其它状态信息 ( 诸 如条件码 ) 一起保存在程序状态字 (PSW) 中, 并且加载指向要被执行的新程序模块的指令 的新程序计数器值。 执行分支采取操作, 以便通过将分支指令的结果加载到程序计数器 311 中来允许程序进行判决或在程序内循环 (loop)。
典型地, 采用指令取出单元 305 代表处理器 106 取出指令。取出单元取出 “下个顺 序 (sequential) 指令” 、 分支采取指令的目标指令、 或跟随在上下文切换之后的程序的第一 指令。现代的指令取出单元通常采用预取出技术, 以基于可能使用预取出的指令的可能性 推测性地 (speculatively) 预取出指令。例如, 取出单元可以取出 16 字节的指令, 其包括 下个顺序指令和其它顺序指令的附加字节。
随后由处理器 106 执行所取出的指令。在实施例中, 将所取出的指令传递至取出 单元的调度单元 306。调度单元解码所述指令并将关于所解码的指令的信息转发至合适的 单元 307、 308、 310。执行单元 307 将典型地从指令取出单元 305 接收关于所解码的算术指 令的信息, 并且将根据指令的操作码执行对操作数的算术运算。优选地, 从存储器 105、 架 构的寄存器 309 或者从正被执行的指令的立即 (immediate) 字段, 将操作数提供给执行单 元 307。当存储执行的结果时, 将执行的结果存储在存储器 105、 寄存器 309 中或其它机器 硬件 ( 诸如控制寄存器、 PSW 寄存器等 ) 中。
处理器 106 典型地具有一个或多个执行单元 307、 308、 310, 用于执行指令的功能。参考图 4A, 执行单元 307 可以通过接口逻辑 407 与架构的通用寄存器 309、 解码 / 调度单元 306、 加载存储单元 310 和其它 401 处理器单元通信。执行单元 307 可以采用几个寄存器电 路 403、 404、 405 来保持将被算术逻辑单元 (ALU)402 操作的信息。ALU 执行算术运算 ( 诸 如, 加、 减、 乘和除 ) 以及逻辑功能 ( 诸如, 与、 异或 (xor)、 循环和移位 )。优选地, ALU 支持 与设计有关的专门操作。 其它电路可以提供其它架构的设施 408, 包括例如条件码和恢复支 持逻辑。典型地, ALU 操作的结果保持在输出寄存器电路 406 中, 输出寄存器电路 406 可以 将该结果转发至各种其它处理功能。存在许多处理器单元布置, 当前描述仅意在提供对一 个实施例的代表性理解。
例如, ADD 指令将在具有算术和逻辑功能性的执行单元 307 中执行, 而例如浮点指 令将在具有专门的浮点能力的浮点执行中执行。优选地, 执行单元通过对由指令识别的操 作数执行操作码定义的功能, 而对所述操作数进行操作。例如, 可以由执行单元 307 对在由 指令的寄存器字段识别的两个寄存器 309 中发现的操作数执行 ADD 指令。
执行单元 307 对两个操作数执行算术加法, 并且将结果存储在第三操作数中, 其 中第三操作数可以是第三寄存器或者两个源寄存器之一。 执行单元优选地使用算术逻辑单 元 (ALU)402, 其能够执行各种逻辑功能 ( 诸如, 移位、 循环、 与、 或、 异或 ) 以及各种数学功 能, 包括加、 减、 乘、 除中的任何一个。某些 ALU 402 被设计用于标量操作, 而某些 ALU 402 被设计用于浮点。根据架构, 数据可以是大端 (Big Endian)( 其中, 最低有效字节在最高 字节地址处 ) 或小端 (Little Endian)( 其中, 最低有效字节在最低字节地址处 )。IBM z/ Architecture 是大端。根据架构, 带符号的字段可以是符号和量值、 1 的补或 2 的补。2 的 补数的优势在于 : ALU 不需要设计减法能力, 因为 2 的补中的负值或正值仅需要 ALU 内的与 加法。通常用简略的方法描述数, 其中 12 位的字段定义 4096 字节的块的地址, 其通常被描 述为例如 4Kbyte( 千字节 ) 块。
三模式寻址
“三模式寻址” 指在 24 位、 31 位和 64 位寻址模式之间切换的能力。此切换可以通 过以下指令来完成 :
●旧指令 BRANCH AND SAVE AND SET MODE( 分支和保存和设置模式 ) 和 BRANCH AND SET MODE( 分支和设置模式 )。如果 R2 通用寄存器的位 63 是 1, 则这两个指令均设置 64 位寻址模式。如果位 63 是 0, 则在寄存器的位 32 分别为 0 或 1 的情况下, 所述指令分别 设置 24 位或 31 位寻址模式。
●新指令 SET ADDRESSING MODE (SAM24, SAM31 和 SAM64)( 设置寻址模式 (SAM24, SAM31 和 SAM64))。该指令如由操作码所确定地设置 24 位、 31 位、 64 位寻址模式。
三模式指令
三模式寻址仅以处理逻辑存储地址的方式影响通用指令, 但以下除外。
●指令 BRANCH AND LINK( 分支和链接 )、 BRANCH AND SAVE( 分支和保存 )、 BRANCH AND SAVE AND SET MODE、 BRANCH AND SET MODE 和 BRANCH RELATIVE AND SAVE( 分支相对和 保存 ) 在 24 位或 31 位寻址模式中将信息放置 (place) 在通用寄存器 R1 的比特位置 32-39 中 ( 如在 ESA/390 中 ), 或者在 64 位寻址模式中将地址位放置在这些比特位置中。新指令 BRANCH RELATIVE AND SAVE LONG( 分支相对和保存长 ) 同样如此。
●指令 BRANCH AND SAVE AND SET MODE 和 BRANCH AND SET MODE 在 64 位寻址模式中将 1 放置在通用寄存器 R1 的比特位置 63 中。在 24 位或 31 位模式中, BRANCH AND SAVE AND SET MODE 将位 63 设置为 0, 并且 BRANCHAND SET MODE 保持其不变。
●某些指令在 24 位或 31 位寻址模式中保持通用寄存器的位 0-31 不变, 但在 64 位 寻址模式中放置或更新它们中的地址或长度信息。这些被列在页 7-7 上的编程说明 1 中, 并有时被称为模式指令。
对通用寄存器的位 0-31 的影响
通过两种类型的指令改变通用寄存器的位 0-31。第一种类型是当在 64 位寻址模 式中执行指令时的模式指令 ( 见前面的部分 )。第二种类型是独立于寻址模式而在单个通 用寄存器中具有 64 位结果操作数或者在偶 - 奇通用寄存器对中具有 128 位结果的指令。 大 部分第二种类型的指令在它们的助记符号中由 “G” 单独表示或者由 “GF” 中的 “G” 表示。所 有第二种类型的指令有时都被称为 “G 类型” 指令。如果程序不在 64 位寻址模式 ( 大 GPR 模式 ) 中执行并且不包括 G 类型指令, 则其无法改变任何通用寄存器的位 0-31( 小 GPR 模 式 )。在某些环境中, 应用程序的一部分可以在小 GPR 模式中, 而另一部分可以在大 GPR 模 式中。在实施例中, 某些指令可以是小 GPR 模式指令, 而其它指令可以是大 GPR 模式指令, 其中计算机的模式依赖于其正在执行小 GPR 模式指令还是大 GPR 模式指令。 参考图 4B, 典型地将用于执行分支指令的分支指令信息发送至分支单元 308, 分 支单元 308 通常采用诸如分支历史表 432 的分支预测算法来在其它条件操作完成之前预测 分支结果。将在条件操作完成之前取出并推测性地执行当前分支指令的目标。当条件操作 完成时, 基于条件操作的条件和所推测的结果, 完成或丢弃推测性地执行的分支指令。 典型 的分支指令可以测试条件码, 并且如果条件码满足分支指令的分支要求, 则分支到目标地 址, 例如, 可以基于包括在指令的寄存器字段或立即字段中发现的数的几个数, 计算目标地 址。分支单元 308 可以采用具有多个输入寄存器电路 427、 428、 429 以及输出寄存器电路 430 的 ALU 426。例如, 分支单元 308 可以与通用寄存器 309、 解码调度单元 306 或其它电路 425 通信。
可以由于各种原因 ( 例如包括由操作系统启动的上下文切换、 导致上下文切换的 程序异常或错误、 导致上下文切换的 I/O 中断信号、 或多个程序的多线程行为 ( 在多线程环 境中 )) 中断一组指令的执行。优选地, 上下文切换动作保存关于当前执行的程序的状态信 息并随后加载关于被调用的另一程序的状态信息。例如, 可以将状态信息保存在硬件寄存 器中或存储器中。 状态信息优选地包括指向下个要被执行的指令的程序计数器值、 条件码、 存储器转换信息和架构的寄存器内容。 上下文切换行为可以由硬件电路、 应用程序、 操作系 统程序或固件代码 ( 微代码、 微微代码或许可的内部代码 (LIC)) 单独或组合地实现。
处理器根据指令定义的方法访问操作数。 所述指令可以使用指令的一部分的值提 供立即操作数, 可以提供显性地指向通用寄存器或专用寄存器 ( 例如浮点寄存器 ) 的一个 或多个寄存器字段。所述指令可以利用由操作码字段识别的隐含的寄存器作为操作数。所 述指令可以利用存储器位置用于操作数。操作数的存储器位置可以由寄存器、 立即字段或 者寄存器和立即字段的组合而提供, 如 z/Architecture 长位移设施所例示的, 其中所述指 令定义基址寄存器、 索引寄存器和立即字段 ( 位移字段 ), 它们被加在一起例如提供存储器 中的操作数的地址。这里, 位置典型地隐含为主存储器 ( 主储存器 ) 中的位置, 除非另外表 示。
参考图 4C, 处理器使用加载 / 存储单元 310 访问存储器。加载 / 存储单元 310 可 以通过获得目标操作数在存储器 303 中的地址并将该操作数加载在寄存器 309 或另一存储 器 303 位置中来执行加载操作, 或者可以通过获得目标操作数在存储器 303 中的地址并将 从寄存器 309 或另一存储器 303 位置获得的数据存储在存储器 303 中的目标操作数位置中 来执行存储操作。加载 / 存储单元 310 可以是推测性的, 并且可以以相对于指令顺序无序 地 (out-of-order) 访问存储器, 然而, 加载 / 存储单元 310 必须向程序维持指令被按顺序 执行的表象。加载 / 存储单元 310 可以与通用寄存器 309、 解码 / 调度单元 306、 高速缓存 / 存储器接口 303 或其它元件 455 通信, 并且包括各种寄存器电路、 ALU458 和控制逻辑 463 以计算存储地址并提供流水线排序 (pipeline sequencing) 以保持操作有次序。某些操作 可能无序, 但是加载 / 存储单元提供使无序的操作对程序表现为已经被按次序执行的功能 性, 如本领域内所公知的。
优选地, 应用程序 “看见” 的地址通常称为虚拟地址。虚拟地址有时称为 “逻辑地 址” 和 “有效地址” 。 这些虚拟地址是虚拟的原因在于 : 它们通过各种动态地址转换 (DAT)312 技术之一而被重新定向至物理存储器位置, 所述动态地址转换 (DAT)312 技术包括但不限 于简单地用偏移值对虚拟地址加前缀 (prefixing)、 经由一个或多个转换表转换虚拟地址, 所述转换表优选地至少单独地或组合地包括段表和页表, 优选地, 段表具有指向页表的条 目 (entry)。 在 z/Architecture 中, 提供转换的层级结构, 其包括区域第一表、 区域第二表、 区域第三表、 段表和可选页表。通常通过利用包括将虚拟地址映射到关联的物理存储器位 置的条目的转换后备缓冲器 (TLB), 来增强地址转换的性能。 当 DAT 312 使用转换表转换虚 拟地址时, 创建所述条目。于是, 随后对虚拟地址的使用可以利用快速 TLB 的条目, 而非缓 慢的顺序转换表访问。TLB 内容可以由包括 LRU( 最久未使用 ) 的各种替换算法来管理。
在处理器是多处理器系统的处理器的情况下, 每个处理器具有为了一致性而保持 诸如 I/O、 高速缓存、 TLB 和存储器的共享资源互锁的责任。典型地, 将在维持高速缓存一致 性时利用 “窥探” 技术。在窥探环境中, 每个高速缓存行 (line) 可以被标记为处于共享状 态、 排他状态、 改变状态、 无效状态等的任何一个中, 以便促进共享。
I/O 单元 304 向处理器提供用于附接至外围设备 ( 例如包括磁带、 磁盘、 打印机、 显示器和网络 ) 的手段。通常通过软件驱动器将 I/O 单元呈现给计算机程序。在诸如来自 IBM 的 z/Series 的大型机中, 信道适配器和开放系统适配器是大型机的 I/O 单元, 其提供操 作系统与外围设备之间的通信。
下面依据 z/Architecture 操作原理的说明描述计算机系统的架构视图 :
存储器 :
计算机系统包括主存储器中的信息, 以及寻址、 保护以及引用和改变记录。 寻址的 一些方面包括地址的格式、 地址空间的概念、 地址的各种类型、 以及一种类型的地址转换为 另一种类型的地址的方式。一些主存储器包括永久分配的存储位置。主存储器向系统提供 对数据的直接可寻址的快速访问存储。数据和程序两者都必须在它们可以被处理之前 ( 从 输入设备 ) 加载到主存储器中。
主存储器可以包括一个或多个更小的、 更快访问的缓冲存储器, 有时称为高速缓 存。典型地, 高速缓存在物理上与 CPU 或 I/O 处理器关联。物理构造的效果 ( 除了对性能 的效果 ) 以及不同存储介质的使用通常不可被程序观察到。可以为指令和数据操作数维持独立的高速缓存。在被称作高速缓存块或高速缓 存行 ( 或者简称 “行” ) 的完整边界上以连续字节维持高速缓存内的信息。模型可以提供 EXTRACT CACHE ATTRIBUTE( 提取高速缓存属性 ) 指令, 其以字节为单位返回高速缓存行的 大小。 模型还可以提供 PREFETCH DATA( 预取出数据 ) 和 PREFETCH DATARELATIVE LONG( 预 取出数据相对长 ) 指令, 其导致存储器到数据或指令高速缓存中的预取出, 或者数据从高 速缓存的释放。
存储器被看作长的水平位串。对于大部分操作, 对存储器的访问以左至右的顺序 进行。位串被细分为 8 比特单位。8 比特单位被称为字节, 其是所有信息格式的基本构建 块。 存储器中的每个字节位置由唯一的非负整数标识, 该非负整数是该字节位置的地址, 或 者简单地是字节地址。相邻的字节位置具有连续地址, 其在左侧以 0 开始并以左至右的顺 序继续。地址是无符号二进制整数并且是 24、 31 或 64 位。
一次一个字节或一组字节地在存储器与 CPU 或信道子系统之间传送信息。除非另 外指明, 存储器中的一组字节由该组的最左侧字节寻址。该组中的字节数目由要执行的操 作隐含或显性地指定。当在 CPU 操作中使用时, 一组字节称为字段。在每组字节内, 以从左 至右的顺序对位编号。最左侧位有时称为 “高阶” 位, 而最右侧位称为 “低阶” 位。然而, 位 编号不是存储器地址。仅可以寻址字节。为了对存储器中的字节的各个单独位操作, 必须 访问整个字节。字节中的位从左到右被编号为 0 至 7。地址中的位对于 24 位地址可以被 编号为 8-31 或 40-63 ; 或者对于 31 位地址可以被编号为 1-31 或 33-63 ; 对于 64 位地址它 们被编号为 0-63。在任何其它固定长度格式的多字节内, 构成格式的位被从 0 开始连续编 号。 为了错误检测的目的, 并且优选地为了校正, 可以利用各个字节或一组字节传送一个或 多个校验位。这样的校验位由机器自动生成并且不能被程序直接控制。以字节的数目表示 存储器容量。当存储器 - 操作数字段的长度被指令的操作码隐含时, 该字段被认为具有固 定长度, 其可以是一个、 两个、 四个、 八个或十六个字节。对于某些指令, 可以隐含更大的字 段。当未隐含存储器 - 操作数字段的长度而是显性地表述其时, 该字段被认为具有可变长 度。可变长度操作数可以通过一字节的递增而改变长度。当将信息放置在存储器中时, 尽 管到存储器的物理路径的宽度可以大于被存储的字段的长度, 也仅替换包括在所指派的字 段中的那些字节位置的内容。
某些信息单位必须在存储器中的完整边界上。边界被称为针对单位信息完整是 当其存储地址是以字节为单位的单位长度的倍数时。将特殊名称赋予完整边界上的 2、 4、 8 和 16 字节的字段。半字是两字节边界上的两个连续字节的组, 且是指令的基本构建块。 字是四字节边界上的四个连续字节的组。双字是八字节边界上的八个连续字节的组。四字 (quadword) 是 16 字节边界上的 16 个连续字节的组。 当存储地址指派半字、 字、 双字和四字 时, 地址的二进制表示分别包括一个、 两个、 三个或四个最右侧 0 位。指令必须在两字节的 完整边界上。大部分指令的存储器操作数不具有边界对齐要求。
在为指令和数据操作数实施单独的高速缓存的模型上, 如果程序存储到随后从其 取出指令的高速缓存行中, 则不管该存储是否改变随后取出的指令, 都可能经历显著的延 迟。
指令 :
典型地, CPU 的操作由存储器中的指令控制, 按存储器地址的升序从左至右一次一个地顺序执行所述指令。可以通过分支、 LOAD PSW、 中断、 SIGNAL PROCESSOR( 向处理器发 信号 ) 命令或手动干预来导致顺序操作的改变。
优选地, 指令包括两个主要部分 :
●操作码 (Op Code), 其指定要执行的操作。
●可选地, 参与的操作数的指派 (designation)。
图 5A-5F 中示出了 z/Architecture 的指令格式。 指令可以简单地提供操作码 501、 或者操作码和各种字段, 包括立即操作数或寄存器指定符 (specifier), 用于将操作数定位 在寄存器或存储器中。 操作码可以向硬件指示要使用隐含的资源 ( 操作数等 ), 诸如一个或 多个特定的通用寄存器 (GPR)。操作数可以被分组为三个类别 : 位于寄存器中的操作数、 立 即操作数、 以及存储器中的操作数。操作数可以被显性地或隐性地指派。寄存器操作数可 以位于通用、 浮点、 访问或控制寄存器中, 其中寄存器的类型由操作码识别。通过在指令中 的四位字段 ( 称为 R 字段 ) 中标识寄存器来指定包含操作数的寄存器。对于某些指令, 操 作数位于隐性指派的寄存器中, 该寄存器被操作码隐含。 立即操作数包含在指令内, 并且包 含立即操作数的 8 位、 16 位或 32 位字段称为 I 字段。存储器中的操作数可以具有隐含的长 度; 由位掩码指定 ; 由指令中的四位或八位长度规范 ( 称为 L 字段 ) 来指定 ; 或者具有由通 用寄存器的内容指定的长度。 存储器中的操作数的地址通过使用通用寄存器的内容作为地 址的一部分的格式来指定。这使得可以 :
1. 通过使用缩写符号指定完整地址
2. 使用采用用于操作数的通用寄存器的指令执行地址操纵
3. 在不改变指令流的情况下通过程序手段修改地址
4. 通过直接使用从其它程序接收的地址, 独立于数据区域的位置而操作
用于引用存储器的地址包含在由指令中 R 字段指派的寄存器中, 或者从分别由指 令中的 B、 X 和 D 字段指定的基址、 索引和位移计算。当 CPU 在访问 - 寄存器模式中时, B或 R 字段除了被用于指定地址之外, 还可以指派访问寄存器。为了描述指令的执行, 优选地将 操作数指派为第一和第二操作数, 并且在某些情况下, 为第三和第四操作数。一般而言, 两 个操作数参与指令执行, 并且结果取代第一操作数。
指令在长度上是一个、 两个或三个半字, 并且必须位于半字边界上的存储器中。 参 考描绘指令格式的图 5A-5F, 每个指令是 25 个基本格式之一 : E501、 I 502、 RI 503 504、 RIE 505 551 552 553 554、 RIL 506 507、 RIS 555、 RR 510、 RRE 511、 RRF 512 513 514、 RRS、 RS 516 517、 RSI 520、 RSL 521、 RSY 522 523、 RX 524、 RXE 525、 RXF 526、 RXY 527、 S 530、 SI 531、 SIL556、 SIY 532、 SS 533 534 535 536 537、 SSE 541 和 SSF 542, 具有 RRF 的三个 变型、 RI、 RIL、 RS 和 RSY 的两个变型、 RIE 和 SS 的五个变型。
格式名称在通用术语中指示参与操作的操作数的类别和关于字段的一些细节 :
● RIS 表示寄存器 - 和 - 立即操作以及存储器操作。
● RRS 表示寄存器 - 和 - 寄存器操作以及存储器操作。
● SIL 表示存储器 - 和 - 立即操作, 具有 16 位立即字段。
在 I、 RR、 RS、 RSI、 RX、 SI 和 SS 格式中, 指令的第一个字节包含操作码。在 E、 RRE、 RRF、 S、 SIL 和 SSE 格式中, 指令的前两个字节包含操作码, 但以下除外 : 对于 S 格式中的一 些指令, 操作码仅在第一个字节中。在 RI 和 RIL 格式中, 操作码在指令的第一个字节和比特位置 12-15 中。在 RIE、 RIS、 RRS、 RSL、 RSY、 RXE、 RXF、 RXY 和 SIY 格式中, 操作码在指令 的第一个字节和第六个字节中。 操作码的第一个字节或唯一的字节的前两位指定指令的长 度和格式, 如下 :
在 RR、 RRE、 RRF、 RRR、 RX、 RXE、 RXF、 RXY、 RS、 RSY、 RSI、 RI、 RIE 和 RIL 格式中, 由 R1 字段指派的寄存器的内容称为第一操作数。包含第一操作数的寄存器有时称为 “第一操作 数位置” , 有时称为 “寄存器 R1” 。在 RR、 RRE、 RRF 和 RRR 格式中, R2 字段指派包含第二操作 数的寄存器, 并且 R2 字段可以指派与 R1 相同的寄存器。在 RRF、 RXF、 RS、 RSY、 RSI 和 RIE 格式中, R3 字段的使用依赖于指令。在 RS 和 RSY 格式中, R3 字段可以替代地为指定掩码的 M3 字段。R 字段在通用指令中指派通用或访问寄存器, 在控制指令中指派通用寄存器, 并且 在浮点指令中指派浮点寄存器或通用寄存器。 对于通用和控制寄存器, 依赖于指令, 寄存器 操作数在 64 位寄存器的比特位置 32-63 中, 或者占用整个寄存器。
在 I 格式中, 指令的八位立即数据字段 (I 字段 ) 的内容被直接用作操作数。在 SI 格式中, 指令的八位立即数据字段 (I2 字段 ) 的内容被直接用作第二操作数。B1 和 D1 字段 指定第一操作数, 其长度为一个字节。 在 SIY 格式中, 除了使用 DH1 和 DL1 字段代替 D1 字段 之外, 操作相同。在用于指令 ADD HALFWORD IMMEDIATE( 加半字立即 )、 COMPARE HALFWORD IMMEDIATE( 比 较 半 字 立 即 )、 LOAD HALFWORD IMMEDIATE( 加 载 半 字 立 即 ) 和 MULTIPLY HALFWORD IMMEDIATE( 乘半字立即 ) 的 RI 格式中, 指令的 16 位 I2 字段的内容被直接用作 带符号的二进制整数, 并且 R1 字段指定第一操作数, 依赖于指令, 其长度为 32 或 64 位。对 于指令 TEST UNDER MASK(TMHH, TMHL, TMLH, TMLL)( 掩码下测试 (TMHH, TMHL, TMLH, TMLL)), I2 字段的内容被用作掩码, 并且 R1 字段指定第一操作数, 其长度为 64 位。
对 于 指 令 INSERT IMMEDIATE( 插 入 立 即 )、 AND IMMEDIATE( 与 立 即 )、 OR IMMEDIATE( 或立即 ) 和 LOAD LOGICAL IMMEDIATE( 加载逻辑立即 ), I2 字段的内容被用作 无符号二进制整数或逻辑值, 并且 R1 字段指定第一操作数, 其长度为 64 位。对于 RI 和 RSI 格式中的相对分支指令, 16 位 I2 字段的内容被用作指派半字的数目的带符号二进制整数。 当该数目被加到分支指令的地址上时, 其指定分支地址。对于 RIL 格式中的相对分支指令, I2 字段是 32 位并且被以相同方式使用。
对于 RI 和 RSI 格式中的相对分支指令, 16 位 I2 字段的内容被用作指派半字的数 目的带符号二进制整数。 当该数目被加到分支指令的地址时, 其指定分支地址。 对于 RIL 格 式中的相对分支指令, I2 字段是 32 位并且被以相同方式使用。对于 RIE 格式指令 COMPARE IMMEDIATE AND BRANCH RELATIVE( 比较立即和分支相对 ) 和 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE( 比较逻辑立即和分支相对 ), 8 位 I2 字段的内容被直接用作第二操 作数。对于 RIE 格式指令 COMPARE IMMEDIATE AND BRANCH( 比较立即和分支 )、 COMPARE IMMEDIATE AND TRAP( 比较立即和捕获 )、 COMPARE LOGICAL IMMEDIATE AND BRANCH( 比 较逻辑立即和分支 ) 和 COMPARE LOGICAL IMMEDIATE AND TRAP( 比较逻辑立即和捕获 ), 16 位 I2 字段的内容被直接用作第二操作数。对于 RIE 格式指令 COMPARE AND BRANCH RELATIVE( 比较和分支相对 )、 COMPARE IMMEDIATE AND BRANCH RELATIVE( 比较立即和分 支相对 )、 COMPARE LOGICAL AND BRANCH RELATIVE( 比较逻辑和分支相对 ) 和 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE( 比较逻辑立即和分支相对 ), 16 位 I4 字段的内 容被用作指派被加到指令的地址上形成分支地址的半字的数目的带符号二进制整数。对 于 RIL 格 式 指 令 ADD IMMEDIATE( 加 立 即 )、 ADD LOGICAL IMMEDIATE( 加 逻 辑 立 即 )、 ADD LOGICAL WITH SIGNED IMMEDIATE( 带 有 符 号 的 立 即 的 加 逻 辑 )、 COMPARE IMMEDIATE( 比较立即 )、 COMPARE LOGICAL IMMEDIATE( 比较逻辑立即 )、 LOAD IMMEDIATE( 加载立即 ) 和 MULTIPLY SINGLE IMMEDIATE( 乘单个立即 ), 32 位 I2 字段的内 容被直接用作第二操作数。
对于 RIS 格式指令, 8 位 I2 字段的内容被直接用作第二操作数。在 SIL 格式中, 16 位 I2 字段的内容被直接用作第二操作数。B1 和 D1 字段指定第一操作数, 如下文所述。
在 RSL、 SI、 SIL、 SSE 和大部分 SS 格式中, 由 B1 字段指派的通用寄存器的内容被 加到 D1 字段的内容上, 以形成第一操作数地址。在 RS、 RSY、 S、 SIY、 SS 和 SSE 格式中, 由 B2 字段指派的通用寄存器的内容被加到 D2 字段或 DH2 和 DL2 字段的内容上, 以形成第二操作 数地址。在 RX、 RXE、 RXF 和 RXY 格式中, 由 X2 和 B2 字段指派的通用寄存器的内容被加到 D2 字段或 DH2 和 DL2 字段的内容上, 以形成第二操作数地址。在 RIS 和 RRS 格式中, 并在一 个 SS 格式中, 由 B4 字段指派的通用寄存器的内容被加到 D4 字段的内容上, 以形成第四操 作数地址。
在具有单个八位长度字段的 SS 格式中, 对于指令 AND( 与 )(NC)、 EXCLUSIVE OR( 异 或 )(XC)、 MOVE( 移动 )(MVC)、 MOVE NUMERICS ( 移动数值 )、 MOVE ZONES( 移动区域 ) 和 OR( 或 )(OC), L 指定附加至由第一操作数地址指派的字节的右侧的操作数字节的数目。因 此, 第一操作数的字节长度是 1-256, 对应于 L 中的长度码为 0-255。存储结果取代第一操 作数并从不存储在由地址和长度指定的字段之外。在此格式中, 第二操作数具有与第一操 作数相同的长度。存在先前定义应用于 EDIT( 编辑 )、 EDIT AND MARK( 编辑和标注 )、 PACK ASCII( 封装 ASCII)、 PACK UNICODE( 封装 UNICODE)、 TRANSLATE( 转换 )、 TRANSLATE AND TEST( 转换和测试 )、 UNPACK ASCII( 解封装 ASCII) 和 UNPACK UNICODE( 解封装 UNICODE) 的变型。
在具有两个长度字段的 SS 格式中, 并且在 RSL 格式中, L1 指定附加至由第一操作 数地址指派的字节的右侧的操作数字节的数目。 因此, 第一操作数的字节长度是 1-16, 对应 于 L1 中的长度码为 0-15。 类似地, L2 指定附加至由第二操作数地址指派的位置的右侧的操 作数字节的数目。结果取代第一操作数并从不存储在由地址和长度指定的字段之外。如果 第一操作数比第二操作数长, 则第二操作数在左侧用 0 扩展至第一操作数的长度。此扩展 不修改存储器中的第二操作数。 在具有两个 R 字段的 SS 格式中, 如由 MOVE TO PRIMARY( 移 动到初级 )、 MOVE TO SECONDARY( 移动到次级 ) 和 MOVE WITH KEY( 带键移动 ) 指令所使 用的, 由 R1 字段指定的通用寄存器的内容是 32 位无符号值, 称为实长。所述操作数两者均 具有称为有效长度的长度。有效长度等于实长或 256 中的较小者。指令设置条件码来帮助 对循环编程, 以移动由实长指定的总字节数目。具有两个 R 字段的 SS 格式还用于指定用于 LOAD MULTIPLE DISJOINT( 加载多重解体 ) 指令的寄存器和两个存储器操作数的范围, 以及 指定用于 PERFORM LOCKED OPERATION( 执行锁定的操作 ) 指令的一个或两个寄存器和一个 或两个存储器操作数。
B1、 B2、 X2 或 B4 字段中的任何一个中的 0 指示缺少对应的地址成分。对于缺少的 成分, 使用 0 告知中间和, 而不管通用寄存器 0 的内容。0 的位移没有特殊意义。
当前 PSW 的位 31 和 32 是寻址模式位。位 31 是扩展的寻址模式位, 位 32 是基本寻址模式位。这些位控制由地址生成所产生的有效地址的尺寸。当当前 PSW 的位 31 和 32 均为 0 时, CPU 在 24 位寻址模式中, 并且生成 24 位指令和操作数有效地址。当当前 PSW 的 位 31 是 0 而位 32 是 1 时, CPU 在 31 位寻址模式中, 并且生成 31 位指令和操作数有效地址。 当当前 PSW 的位 31 和 32 均是 1 时, CPU 在 64 位寻址模式中, 并且生成 64 位指令和操作数 有效地址。由 CPU 对指令的执行涉及指令和操作数的地址的生成。
当从由当前 PSW 指派的位置取出指令时, 指令地址增加指令中的字节数目, 并且 执行该指令。 随后通过使用指令地址的新值取出序列中的下个指令而重复相同步骤。 在 24 位寻址模式中, 指令地址回绕 (wrap around), 其中, 指令地址 224-2 处的半字之后跟着指 令地址 0 处的半字。因此, 在 24 位寻址模式中, 作为更新指令地址的结果, 从 PSW 比特位置 104 的任何进位输出丢失。在 31 位或 64 位寻址模式中, 指令地址类似地回绕, 其中指令地 址 231-2 或 264-2 处的半字之后分别跟随指令地址 0 处的半字。从 PSW 比特位置 97 或 64 的进位输出分别丢失。
引用存储器的操作数地址从中间值得到, 该中间值包含在由指令中的 R 字段指派 的寄存器中或者从三个二进制数字 ( 基址、 索引和位移 ) 的和计算。基址 (B) 是包含在由 指令中的称为 B 字段的四位字段中的程序指定的通用寄存器中的 64 位数。可以使用基址 作为独立寻址每个程序和数据区域的手段。 在阵列型计算中, 其可以指派阵列的位置, 并且 在记录型处理中, 其可以识别该记录。基址用于寻址整个存储器。基址还可以用于索引。
索引 (X) 是包含在由指令中的称为 X 字段的四位字段中的程序指派的通用寄存器 中的 64 位数。其仅包括在由 RX、 RXE 和 RXY 格式指令指定的地址中。RX、 RXE、 RXF 和 RXY 格式指令允许双索引 ; 即, 该索引可以用于提供阵列内的元素的地址。
位移 (D) 是在指令中的称为 D 字段的字段中包含的 12 位或 20 位数。12 位位移是 无符号的, 并用于在超过由基址指派的位置之外高达 4095 字节的相对寻址。 20 位位移是带 符号的, 并且用于在超过基址位置之外高达 524287 字节的相对寻址, 或者在基址位置之前 高达 524288 字节的相对寻址。在阵列型计算中, 位移可以用于指定与元素关联的许多项之 一。在记录的处理中, 位移可以用于识别记录内的项。12 位位移在某些格式的指令的比特 位置 20-31 中。在某些格式的指令中, 第二个 12 位位移也在该指令中, 在比特位置 36-47 中。
20 位位移仅在 RSY、 RXY 或 SIY 格式的指令中。在这些指令中, D 字段由比特位置 20-31 中的 DL( 低 ) 字段和比特位置 32-39 中的 DH( 高 ) 字段组成。当长位移设施被安装 时, 通过在 DL 字段的内容的左侧附加 DH 字段的内容, 而形成位移的数值。当未安装长位移 设施时, 通过在 DL 字段的内容的左侧附加八个 0 比特而形成位移的数值, 并且 DH 字段的内 容被忽略。
在形成中间和时, 基址和索引被处理为 64 位二进制整数。12 位位移被处理为 12 位无符号二进制整数, 并且 52 个 0 比特被附加在左侧。20 位位移被处理为 20 位带符号二 进制整数, 并且等于符号位的 44 个比特被附加在左侧。这三个被相加作为 64 位二进制数, 忽略溢出。和总是 64 位长, 并被用作形成所生成的地址的中间值。中间值的位被编号为 0-63。在 B1、 B2、 X2 或 B4 字段中的任何一个中的 0 指示缺少对应的地址成分。对于缺少的 成分, 在形成中间和时使用 0, 而不管通用寄存器 0 的内容。0 的位移没有特殊意义。
当指令描述指定由 R 字段指派的通用寄存器的内容用于寻址存储器中的操作数时, 寄存器内容用作 64 位中间值。
指令可以指派相同的通用寄存器用于地址计算以及作为操作数的位置。 在通过操 作改变寄存器 ( 如果存在 ) 之前, 完成地址计算。除非在各个单独的指令定义中另外指示, 所生成的操作数地址指派存储器中的操作数的最左侧字节。
所生成的操作数地址总是 64 位长, 并且所述位被编号为 0-63。 从中间值获得所生 成的地址的方式依赖于当前寻址模式。在 24 位寻址模式中, 忽略中间值的位 0-39, 所生成 的地址的位 0-39 被强制为 0, 并且中间值的位 40-63 成为所生成的地址的位 40-63。在 31 位寻址模式中, 忽略中间值的位 0-32, 所生成的地址的位 0-32 被强制为 0, 并且中间值的位 33-63 成为所生成的地址的位 33-63。在 64 位寻址模式中, 中间值的位 0-63 成为所生成的 地址的位 0-63。负值可以用在索引和基址寄存器中。在 31 位寻址模式中忽略这些值的位 0-32, 并且在 24 位寻址模式中忽略位 0-39。
对于分支指令, 当采取分支时要执行的下个指令的地址称为分支地址。依赖于分 支指令, 指令格式可以是 RR、 RRE、 RX、 RXY、 RS、 RSY、 RSI、 RI、 RIE 或 RIL。在 RS、 RSY、 RX 和 RXY 格式中, 由基址、 位移指定分支地址, 并且在 RX 和 RXY 格式中, 由索引指定分支地址。 在 这些格式中, 中间值的生成遵循与操作数地址中间值的生成相同的规则。在 RR 和 RRE 格式 中, 由 R2 字段指派的通用寄存器的内容用作中间值, 从该中间值形成分支地址。通用寄存 器 0 不能被指派为包含分支地址。R2 字段中的 0 值使得在不进行分支的情况下执行指令。
相对分支指令在 RSI、 RI、 RIE 和 RIL 格式中。在用于相对分支指令的 RSI、 RI 和 RIE 格式中, I2 字段的内容被处理为指派半字的数目的 16 位带符号二进制整数。在 RIL 格 式中, I2 字段的内容被处理为指派半字的数目的 32 位带符号二进制整数。分支地址是由 加到相对分支指令的地址上的 I2 字段指定的半字的数目。
用于 RSI、 RI、 RIE 或 RIL 格式中的相对分支指令的 64 位中间值是两个加数的和, 其中忽略从比特位置 0 的溢出。 在 RSI、 RI 或 RIE 格式中, 第一加数是 I2 字段的内容, 其中一 个 0 比特附加在右侧, 并且与内容的符号位相等的 47 个比特附加在左侧, 但以下情况除外 : 对于 COMPARE AND BRANCH RELATIVE、 COMPARE IMMEDIATE AND BRANCH RELATIVE、 COMPARE LOGICAL AND BRANCH RELATIVE 和 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE, 第 一加数是 I4 字段的内容, 其中如上面针对 I2 字段所描述地附加比特。在 RIL 格式中, 第一 加数是 I2 字段的内容, 其中一个 0 比特被附加在右侧, 并且与内容的符号位相等的 31 个比 特附加在左侧。在所有格式中, 第二加数是分支指令的 64 位地址。分支指令的地址是在 该地址被更新来寻址下个顺序指令之前在 PSW 中的指令地址, 或者其是在使用 EXECUTE( 执 行 ) 的情况下 EXECUTE 指令的目标的地址。如果在 24 位或 31 位寻址模式中使用 EXECUTE, 则分支指令的地址是目标地址, 其中分别将 40 个或 33 个 0 附加在左侧。
分支地址总是 64 位长, 其中所述位被编号为 0-63。分支地址取代当前 PSW 的位 64-127。从中间值获得分支地址的方式依赖于寻址模式。对于改变寻址模式的这些分支指 令, 使用新的寻址模式。 在 24 位寻址模式中, 忽略中间值的位 0-39, 使得分支地址的位 0-39 为 0, 并且中间值的位 40-63 成为分支地址的位 40-63。在 31 位寻址模式中, 忽略中间值的 位 0-32, 使得分支地址的位 0-32 为 0, 并且中间值的位 33-63 成为分支地址的位 33-63。在 64 位寻址模式中, 中间值的位 0-63 成为分支地址的位 0-63。
对于一些分支指令, 分支依赖于满足指定条件。当不满足该条件时, 不采取分支,继续正常的顺序指令执行, 并且不使用分支地址。当采取分支时, 分支地址的位 0-63 取代 当前 PSW 的位 64-127。分支地址不被用于访问存储器作为分支操作的一部分。由于奇数 (odd) 分支地址而导致的指定异常和由于取出在分支位置的指令而导致的访问异常不被辨 识为分支操作的一部分, 而是被辨识为与分支位置处的指令的执行关联的异常。
诸如 BRANCH AND SAVE 的分支指令可以指派相同的通用寄存器用于分支地址计算 和作为操作数的位置。在完成操作的剩余部分之前完成分支地址计算。
在第 4 章 “控制” 中描述的程序状态字 (PSW) 包含合适的程序执行所需的信息。 PSW 用于控制指令排序, 以及保持和指示与当前被执行的程序有关的 CPU 的状态。 活动的或 控制的 PSW 称为当前 PSW。分支指令执行进行判决、 循环控制和子例程联接的功能。分支指 令通过将新的指令地址引入当前 PSW 中来影响指令排序。具有 16 位 I2 字段的相对分支指 令允许分支到高达相对于分支指令的位置加 64K-2 个字节或减 64K 字节的偏移的位置, 而 不使用基址寄存器。具有 32 位 I2 字段的相对分支指令允许分支到高达相对于分支指令的 位置加 4G-2 个字节或减 4G 字节的偏移的位置, 而不使用基址寄存器。
通过 BRANCH ON CONDITION( 条件分支 )、 BRANCH RELATIVE ON CONDITION( 条件 分支相对 ) 和 BRANCH RELATIVE ON CONDITION LONG( 条件分支相对长 ) 指令提供用于进 行判决的设施。这些指令检查反映算术、 逻辑和 I/O 操作的大多数的结果的条件码。由两 位组成的条件码提供四个可能的条件码设置 : 0、 1、 2 和 3。
任何设置的具体含义依赖于设置条件码的操作。例如, 条件码反映诸如零、 非零、 第一操作数高、 相等、 溢出和子信道忙的条件。一旦被设置, 条件码保持不改变直到被导致 设置不同的条件码的指令修改为止。
可以通过使用 BRANCH ON CONDITION、 BRANCH RELATIVE ON CONDITION 和 BRANCH RELATIVE ON CONDITION LONG 来执行循环控制, 以测试地址算术和计数操作的结果。对于 算术和测试的一些特别频繁的组合, 提供 BRANCH ON COUNT( 计数分支 )、 BRANCH ON INDEX HIGH ( 索引高分支 ) 和 BRANCH ON INDEX LOW OR EQUAL( 索引低或相对分支 ), 并且还提 供这些指令的相对分支相当物。这些专门的分支对这些任务提供提高的性能。
通过 BRANCH AND LINK 和 BRANCH AND SAVE 指令提供当不需要改变寻址模式时 的子例程联接。( 对 BRANCH AND SAVE 的该讨论也适用于 BRANCH RELATIVE AND SAVE 和 BRANCH RELATIVE AND SAVE LONG。) 这两个指令均不仅允许引入新的指令地址, 而且还允 许保存返回地址和关联的信息。返回地址是跟在分支指令之后的指令在存储器中的地址, 除以下情况外 : 其是跟在具有分支指令作为其目标的 EXECUTE 指令之后的指令的地址。
BRANCH AND LINK 和 BRANCH AND SAVE 两者具有 R1 字段。 它们通过依赖于该指令 的字段形成分支地址。总结指令的操作如下 :
●在 24 位寻址模式中, 两个指令均将返回地址放置在通用寄存器 R1 的比特位置 40-63 中, 并且保持该寄存器的位 0-31 不变。BRANCHAND LINK 将用于指令的指令长度码、 条件码以及来自当前 PSW 的程序掩码放置在通用寄存器 R1 的比特位置 32-39 中。BRANCH AND SAVE 将 0 放置在这些比特位置中。
●在 31 位寻址模式中, 两个指令均将返回地址放置在通用寄存器 R1 的比特位置 33-63 中, 并且将 1 放置在通用寄存器 R1 的比特位置 32 中, 并且它们保持该寄存器的位 0-31 不变。●在 64 位寻址模式中, 两个指令均将返回地址放置在通用寄存器 R1 的比特位置 0-63 中。
●在任何寻址模式中, 两个指令均在当前寻址模式的控制下生成分支地址。所述 指令将分支地址的位 0-63 放置在 PSW 的比特位置 64-127 中。
在 RR 格式中, 如果指令的 R2 字段为 0, 则两个指令均不执行分支。 可以看出, 在 24 位或 31 位寻址模式中, BRANCH AND SAVE 将基本寻址模式位 (PSW 的位 32) 放置在通用寄 存器 R1 的比特位置 32 中。BRANCH AND LINK 在 31 位寻址模式中这样做。指令 BRANCHAND SAVEAND SET MODE 和 BRANCH AND SET MODE 用于当在联接期间需要改变寻址模式时使用。 这些指令具有 R1 和 R2 字段。总结指令的操作如下 :
● BRANCH AND SAVE AND SET MODE 设置通用寄存器 R1 的内容与 BRANCH AND SAVE 相同。此外, 所述指令将扩展的寻址模式位 (PSW 的位 31) 放置在寄存器的比特位置 63 中。
●如果 R1 为非零, 则 BRANCH AND SET MODE 如下执行。 在 24 或 31 位模式中, 其将 PSW 的位 32 放置在通用寄存器 R1 的比特位置 32 中, 并且其保持寄存器的位 0-31 和 33-63 不变。注意, 如果寄存器包含指令地址, 则寄存器的位 63 应当为 0。在 64 位模式中, 所述指 令将 PSW 的位 31(1) 放置在通用寄存器 R1 的比特位置 63 中, 并且其保持寄存器的位 0-62 不变。
●当 R2 为非零时, 两个指令均设置寻址模式并如下执行分支。通用寄存器 R2 的 位 63 被放置在 PSW 的比特位置 31 中。如果位 63 为 0, 则将寄存器的位 32 放置在 PSW 的 比特位置 32 中。如果位 63 为 1, 则将 PSW 的位 32 设置为 1。然后, 在新寻址模式的控制之 下, 除了寄存器的位 63 被处理为 0 之外, 从寄存器的内容生成分支地址。所述指令将分支 地址的位 0-63 放置在 PSW 的比特位置 64-127 中。通用寄存器 R2 的位 63 保持不变, 从而 其可以在进入被调用的程序时为 1。 如果 R2 与 R1 相同, 则所指派的通用寄存器中的结果与 为 R1 寄存器所指定的一样。
中断 ( 上下文切换 ) :
中断机构允许 CPU 由于配置外部、 配置内或 CPU 自身内的条件而改变其状态。为 了允许对高优先级的条件的快速响应以及对条件类型的立即识别, 中断条件被分组为六个 类别 : 外部、 输入 / 输出、 机器校验、 程序、 重启和管理程序调用 (supervisor call)。
中断包括存储当前 PSW 作为旧 PSW、 存储识别中断的原因的信息、 以及取出新 PSW。 处理如新 PSW 所指定地重新开始。中断时, 存储的旧 PSW 通常包含在中断不发生的情况下 接下来将被执行的指令的地址, 因此允许被中断的程序重新开始。对于程序和管理程序调 用中断, 所存储的信息还包含识别最后执行的指令的长度的代码, 因此允许程序响应于中 断的原因。在正常响应是重新执行导致中断的指令的某些程序条件的情况下, 指令地址直 接识别最后执行的指令。
除重启之外, 仅当 CPU 在操作状态中时才可以发生中断。对于在停止或操作状态 中的 CPU, 都可以发生重启中断。
任何访问异常被识别为该异常所关联的指令的执行的一部分。访问异常在 CPU 尝 试从不可用的位置进行预取出或检测到某些其它访问异常条件时不被辨识, 而是由分支指 令或中断改变指令顺序, 使得不执行中断。每个指令可以由于指令取出而使访问异常被辨 识。此外, 与指令执行关联的访问异常可由于对存储器中的操作数的访问而发生。当在不遭遇异常的情况下无法取出第一个指令半字时, 指示由于取出指令而导致的访问异常。当 指令的第一个半字没有访问异常时, 可以根据由指令的前两位指定的指令长度, 为附加的 半字指示访问异常 ; 然而, 当可以在不访问指令的第二或第三个半字的情况下执行操作时, 不可预测是否为未使用的部分指示访问异常。 因为为指令取出指示访问异常对于所有指令 是共同的, 其不涵盖在各个单独的指令定义中。
除了在各个单独的指令描述中另外指示外, 以下规则适用于与对操作数位置的访 问关联的异常。 对于取出型操作数, 仅必须为完成操作所需的操作数部分指示访问异常。 不 可预测是否为取出型操作数中那些完成操作所不需要的部分指示访问异常。
对于存储型操作数, 即使可以在不使用操作数的不可访问部分的情况下完成操 作, 也为整个操作数辨识访问异常。 在将存储型操作数的值定义为不可预测的情形中, 不可 预测是否指示访问异常。在对操作数位置的访问可以导致访问异常被辨识的任何时候, 在 指令的描述中的程序异常的列表中都包括字 “访问” 。 此条目还指示哪个操作数可以导致异 常被辨识以及是在对该操作数位置的取出访问还是存储访问上辨识出的异常。 仅针对各个 特定指令所定义的操作数的部分辨识访问异常。
当 CPU 尝试执行具有无效的操作码的指令时, 辨识操作异常。该操作码可以是未 分配的, 或者具有该操作码的指令不能被安装在 CPU 上。该操作被抑制。指令长度码为 1、 2 或 3。由十六进制的 0001( 或者, 在指示并发的 PER 事件的情况下为十六进制的 0081) 的 程序中断代码来指示该操作异常。
一些模型可以提供此公布中未描述的指令, 诸如用于辅助或作为特殊或自定义特 征的一部分而提供的指令。 因此, 在此公布中未描述的操作码不一定导致操作异常被辨识。 此外, 这些指令可以使操作模式被设立, 或者还可以改变机器以便影响后续指令的执行。 为 了避免导致这样的操作, 应当仅当期望与该操作码所关联的特定功能时才执行具有在此公 布中未描述的操作码的指令。
当下列中的任何一个为真时, 辨识出规范 (specification) 异常 :
1.1 被引入 PSW 的未分配比特位置中 ( 即, 比特位置 0、 2-4、 24-30 或 33-63 中的任 何一个 )。这被处理为早先的 PSW 规范异常。
2.1 被引入 PSW 的比特位置 12 中。这被处理为早先的 PSW 规范异常。
3.PSW 在下列任何一种方式中无效 : a.PSW 的位 31 为 1 并且位 32 为 0。b.PSW 的 位 31 和 32 为 0, 指示 24 位寻址模式, 并且 PSW 的位 64-103 不全为 0。c.PSW 的位 31 为 0 并且位 32 为 1, 指示 31 位寻址模式, 并且 PSW 的位 64-96 不全为 0。这被处理为早先的 PSW 规范异常。
4.PSW 包含奇数指令地址。
5. 操作数地址在需要完整边界指派的指令中不指派这样的完整边界。
6. 需要指派偶编号的寄存器的指令的 R 字段指定指派奇编号的通用寄存器。
7. 为扩展的操作数指派除 0、 1、 4、 5、 8、 9、 12 或 13 之外的浮点寄存器。
8. 十进制算术中的乘数或除数超过 15 位数字和符号。
9. 在十进制乘法或除法中, 第一操作数字段的长度小于或等于第二操作数字段的 长度。
10. 尝试 CIPHER MESSAGE( 密码消息 )、 CIPHER MESSAGE WITH CHAINING( 具有链的密码消息 )、 COMPUTE INTERMEDIATE MESSAGE DIGEST( 计算中间消息摘要 )、 COMPUTE LAST MESSAGE DIGEST( 计算最后的消息摘要 ) 或 COMPUTE MESSAGE AUTHENTICATION CODE( 计算 消息认证码 ) 的执行, 并且通用寄存器 0 的位 57-63 中的功能码包含未分配的或未安装的 功能码。
11. 尝试 CIPHER MESSAGE 或 CIPHER MESSAGE WITH CHAINING 的执行, 并且 R1 或 R2 字段指派奇编号的寄存器或通用寄存器 0。
12. 尝 试 CIPHER MESSAGE 、 CIPHER MESSAGE WITH CHAINING 、 COMPUTE INTERMEDIATE MESSAGE DIGEST 或 COMPUTE MESSAGE AUTHENTICATION CODE 的执行, 并且 第二操作数长度不是所指派的功能的数据块尺寸的倍数。 此规范异常条件不适用于询问功 能。
13. 尝试 COMPARE AND FORM CODEWORD( 比较和形成码字 ) 的执行, 并且通用寄存 器 1、 2 和 3 并非初始地包含偶值。
32. 尝试 COMPARE AND SWAP AND STORE( 比较和交换和存储 ) 的执行, 并且存在下 列条件中的任何一个 :
●功能码指定未分配的值。 ●存储特性指定未分配的值。
●功能码为 0, 并且未在字边界上指派第一操作数。
●功能码为 1, 并且未在双字边界上指派第一操作数。
●未在与存储值的尺寸一致的完整边界上指派第二操作数。
33. 尝试 COMPARE LOGICAL LONG UNICODE( 比较逻辑长 UNICODE) 或 MOVE LONG UNICODE( 移动长 UNICODE) 的执行, 并且通用寄存器 R1+1 或 R3+1 的内容不指定偶数个字 节。
34. 尝试 COMPARE LOGICAL STRING( 比较逻辑字符串 )、 MOVE STRING( 移动字符 串 ) 或 SEARCH STRING( 搜索字符串 ) 的执行, 并且通用寄存器 0 的位 32-55 不全为 0。
35. 尝试 COMPRESSION CALL( 压缩调用 ) 的执行, 并且通用寄存器 0 的位 48-51 具 有二进制值 0000 和 0110-1111 中的任何一个。
36. 尝试 COMPUTE INTERMEDIATE MESSAGE DIGEST、 COMPUTE LASTMESSAGE DIGEST 或 COMPUTE MESSAGE AUTHENTICATION CODE 的执行, 并且下列中的任一个为真 :
● R2 字段指派奇编号的寄存器或通用寄存器 0。
●通用寄存器 0 的位 56 不为 0。
37. 尝试 CONVERT HFP TO BFP( 将 HFP 转换为 BFP)、 CONVERT TO FIXED ( 转换 为固定的 )(BFP 或 HFP) 或 LOAD FP INTEGER( 加载 FP 整数 )(BFP) 的执行, 并且 M3 字段不 指派有效变址数 (modifier)。
38. 尝试 DIVIDE TO INTEGER( 分为整数 ) 的执行, 并且 M4 字段不指派有效变址 数。
39. 尝试 EXECUTE 的执行, 并且目标地址为奇数。
40. 尝试 EXTRACT STACKED STATE( 提取堆栈的状态 ) 的执行, 并且通用寄存器 R2 的比特位置 56-63 中的码在不安装 ASN 和 LX 重新使用 (ASN-and-LX-reuse) 设施时大于 4, 或者在安装该设施时大于 5。
41. 尝试 FIND LEFTMOST ONE( 发现最左一个 ) 的执行, 并且 R1 字段指派奇编号的寄存器。 42. 尝试 INVALIDATE DAT TABLE ENTRY( 无效 DAT 表条目 ) 的执行, 并且通用寄存 器 R2 的位 44-51 不全为 0。
43. 尝试 LOAD FPC 的执行, 并且第二操作数中与 FPC 寄存器中不支持的位对应的 一个或多个位为 1。
44. 尝试 LOAD PAGE-TABLE-ENTRY ADDRESS( 加载页面 - 表 - 条目地址 ) 的执行, 并且该指令的 M4 字段包含除二进制 0000-0100 之外的任何值。
45. 尝试 LOAD PSW 的执行, 并且第二操作数地址处的双字的位 12 是 0。此异常是 否被辨识到依赖于模型。
46. 尝试 MONITOR CALL( 监视调用 ) 的执行, 并且该指令的比特位置 8-11 不包含 0。
47. 尝试 MOVE PAGE( 移动页面 ) 的执行, 并且通用寄存器 0 的比特位置 48-51 不 包含 0, 或者该寄存器的位 52 和 53 均为 1。
48. 尝试 PACK ASCII 的执行, 并且 L2 字段大于 31。
49. 尝试 PACK UNICODE 的执行, 并且 L2 字段大于 63 或者为偶数。
50. 尝试 PERFORM FLOATING POINT OPERATION( 执行浮点操作 ) 的执行, 通用寄存 器 0 的位 32 为 0, 并且位 33-63 中的一个或多个字段无效或者指派未安装的功能。
51. 尝试 PERFORM LOCKED OPERATION( 执行锁定的操作 ) 的执行, 并且下列中的任 何一个为真 :
●通用寄存器 0 的 T 位 ( 位 55) 为 0, 并且该寄存器的位 56-63 中的功能码无效。
●通用寄存器 0 的位 32-54 不全为 0。
●在访问寄存器模式中, 对于导致使用包含 ALET 的参数列表的功能码, R3 字段为 0。
52. 尝试 PERFORM TIMING FACILITY FUNCTION( 执行定时设施功能 ) 的执行, 并且 下列中的任何一个为真 :
●通用寄存器 0 的位 56 不为 0。
●通用寄存器 0 的位 57-63 指定未分配或未安装的功能码。
53. 尝试 PROGRAM TRANSFER( 执行转移 ) 或 PROGRAM TRANSFER WITH INSTANCE( 执 行具有实例的转移 ) 的执行, 并且下列中的全部为真 :
● PSW 中的扩展的寻址模式位为 0。
●由该指令的 R2 字段指派的通用寄存器中的基本寻址模式位 ( 位 32) 为 0。
●相同寄存器中的指令地址的位 33-39 不全为 0。
54. 尝试 RESUME PROGRAM( 恢复程序 ) 的执行, 并且下列中的任一个为真 :
●对于当前 PSW 中的布置, 第二操作数中的 PSW 字段的位 31、 32 和 64-127 无效。 如果下列中的任何一个为真, 则辨识出该异常 :
- 位 31 和 32 均为 0, 并且位 64-103 不全为 0。
- 位 31 和 32 分别为 0 和 1, 并且位 64-96 不全为 0。
- 位 31 和 32 分别为 1 和 0。
- 位 127 为 1。
●参数列表的位 0-12 不全为 0。
55. 尝试 SEARCH STRING UNICODE( 搜索字符串 UNICODE) 的执行, 并且通用寄存器 0 的位 32-47 不全为 0。
56. 尝试 SET ADDRESS SPACE CONTROL( 设置地址空间控制 ) 或 SET ADDRESS SPACE CONTROL FAST( 快速设置地址空间控制 ) 的执行, 并且第二操作数地址的位 52 和 53 不都为 0。
57. 尝试 SET ADDRESSING MODE(SAM24) 的执行, 并且 PSW 中未更新的指令地址的 位 0-39(PSW 的位 64-103) 不全为 0。
58. 尝试 SET ADDRESSING MODE(SAM31) 的执行, 并且 PSW 中未更新的指令地址的 位 0-32(PSW 的位 64-96) 不全为 0。
59. 尝试 SET CLOCK PROGRAMMABLE FIELD( 设置时钟可编程字段 ) 的执行, 并且通 用寄存器 0 的位 32-47 不全为 0。
60. 尝试 SET FPC 的执行, 并且第一操作数中与 FPC 寄存器中的不支持的位对应的 一个或多个位为 1。
61. 尝试 STORE SYSTEM INFORMATION( 存储系统信息 ) 的执行, 通用寄存器 0 中的 功能码有效, 并且下列任一项为真 :
●通用寄存器 0 的位 36-55 以及通用寄存器 1 的位 32-47 不全为 0。
●第二操作数地址未在 4K 字节边界上对齐 (align)。
62. 尝试 TRANSLATE TWO TO ONE( 将 2 转变为 1) 或 TRANSLATE TWO TO TWO( 将 2 转变为 2) 的执行, 并且通用寄存器 R1+1 中的长度不指定偶数个字节。
63. 尝试 UNPACK ASCII 的执行, 并且 L1 字段大于 31。
64. 尝试 UNPACK UNICODE 的执行, 并且 L1 字段大于 63 或者是偶数。
65. 尝试 UPDATE TREE( 更新树 ) 的执行, 并且通用寄存器 4 和 5 的初始内容在 24 位或 31 位寻址模式中不是 8 的倍数, 或者在 64 位寻址模式中不是 16 的倍数。 抑制由旧 PSW 识别的指令的执行。然而, 对于早先的 PSW 规范异常 ( 原因 1-3), 完成引入新 PSW 的操作, 但是此后立即发生中断。优选地, 指令长度码 (ILC) 是 1、 2 或 3, 指示导致异常的指令的长 度。当指令地址是奇数时 (6-33 页上的原因 4), 不可预测 ILC 是 1、 2 还是 3。当由于早先的 PSW 规范异常 ( 原因 1-3) 而辨识出异常, 并且该异常已由 LOAD PSW、 LOAD PSW EXTENDED( 加 载 PSW 扩展 )、 PROGRAM RETURN( 程序返回 ) 或中断引入时, ILC 是 0。当由 SETADDRESSING MODE(SAM24, SAM31) 引入异常时, ILC 为 1, 或者如果 SET ADDRESSING MODE 是 EXECUTE 的 目标, 则 ILC 是 2。当由 SET SYSTEM MASK( 设置系统掩码 ) 或由 STORE THEN OR SYSTEM MASK( 然后存储或系统掩码 ) 引入异常时, ILC 是 2。
使用程序中断来报告在程序的执行期间发生的异常和事件。程序中断使得旧 PSW 被存储在实际位置 336-351 处, 并且使得从实际位置 464-479 取出新 PSW。 中断的原因由中 断代码标识。 中断码被放置在实际位置 142-143 处, 指令长度码被放置在实际位置 141 处的 字节的比特位置 5 和 6 中, 其中剩余位被设置为 0, 并且 0 被存储在实际位置 140 处。对于 某些原因, 将标识中断的原因的附加信息存储在实际位置 144-183 处。如果安装 PER-3 设 施, 则作为程序中断动作的一部分, 将阻断事件地址 (breaking-event-address) 寄存器的内容放置在实际存储位置 272-279 中。除 PER 事件和加密操作异常外, 通过放置在中断代 码的最右侧的七个比特位置中的编码的值来指示导致中断的条件。 一次仅可以指示一个条 件。将中断代码的位 0-7 设置为 0。通过将中断代码的位 8 设置为 1 来指示 PER 事件。当 这是唯一条件时, 位 0-7 和 9-15 也被设置为 0。当与另一程序中断条件并发地指示 PER 事 件时, 位 8 是 1, 并且对于另一条件设置位 0-7 和 9-15。通过十六进制 0119 的中断代码指 示加密操作异常, 或者, 如果也指示 PER 事件, 则是十六进制 0199。
当存在对应的掩码位时, 程序中断可以仅当该掩码位为 1 时发生。PSW 中的程序 掩码控制异常中的四个, FPC 寄存器中的 IEEE 掩码控制 IEEE 异常, 控制寄存器 0 中的位 33 控制 SET SYSTEM MASK 是否导致特殊操作异常, 控制寄存器 8 中的位 48-63 控制由于监控 事件导致的中断, 并且掩码的层级结构控制由于 PER 事件导致的中断。当任何控制掩码位 是 0 时, 忽略该条件 ; 该条件不保持未决。
当用于程序中断的新 PSW 具有 PSW 格式错误或者导致在指令取出的过程中辨识到 异常时, 会发生程序中断串。
被指示为程序异常的某些条件还可能被信道子系统辨识, 在该情况下, 在子信道 状态字或扩展的状态字中指示异常。
当数据异常导致程序中断时, 数据异常代码 (DXC) 被存储在位置 147 处, 并且 0 被 存储在位置 144-146 处。DXC 区分各种类型的数据异常条件。当 AFP 寄存器 ( 附加的浮点 寄存器 ) 控制位 ( 控制寄存器 0 的位 45) 为 1 时, 还将 DXC 放置在浮点控制 (FPC) 寄存器 的 DXC 字段中。当报告任何其它程序异常时, FPC 寄存器中的 DXC 字段保持不变。DXC 是 8 位代码, 其指示数据异常的具体原因。
DXC 2 和 3 互相排斥并且具有比任何其它 DXC 高的优先级。 因此, 例如, DXC 2(BFP 指令 ) 优先于任何 IEEE 异常 ; 并且 DXC 3(DFP 指令 ) 优先于任何 IEEE 异常或仿真的 IEEE 异常。作为另一示例, 如果存在针对 DXC 3(DFP 指令 ) 和 DXC 1(AFP 寄存器 ) 两者的条件, 则报告 DXC 3。当规范异常和 AFP 寄存器数据异常都适用时, 不可预测哪一个被报告。
当 CPU 尝试引用在配置中不可用的主存储器位置时, 寻址异常被辨识。当主存储 器位置未安装时, 当该存储器单元未在该配置中时, 或者当该存储器单元断电时, 该主存储 器位置在该配置中不可用。指派在配置中不可用的存储器位置的地址被称为无效。当指令 的地址无效时, 抑制操作。类似地, 当 EXECUTE 的目标指令的地址无效时, 抑制操作。而且, 当在访问表或表条目时遭遇寻址异常时, 抑制操作单元。适用该规则的表和表条目是可调 度单元控制 (dispatchable-unit-control) 表、 主 ASN 第二表条目、 以及访问列表、 区域第 一表、 区域第二表、 区域第三表、 段表、 页表、 联接表、 联接第一表、 联接第二表、 条目表、 ASN 第一表、 ASN 第二表、 权职 (authority) 表、 联接栈和踪迹表中的条目。 当在用于动态地址转 换的隐性引用和与 LOADPAGE-TABLE-ENTRY ADDRESS、 LOAD REAL ADDRESS( 加载实际地址 )、 STORE REAL ADDRESS( 存储实际地址 ) 和 TEST PROTECTION( 测试保护 ) 的执行关联的引 用两者中, 对于引用区域第一表、 区域第二表、 区域第三表、 段表和页表而遭遇寻址异常时, 该寻址异常导致抑制。类似地, 当在隐性地或作为 LOAD PAGE-TABLE-ENTRY ADDRESS、 LOAD REAL ADDRESS、 STORE REAL ADDRESS、 TEST ACCESS( 测试访问 ) 或 TEST PROTECTION( 测试 保护 ) 的一部分而完成的访问寄存器转换中遭遇访问可调度单元控制表、 主 ASN 第二表条 目、 访问列表、 ASN 第二表或权职表的寻址异常时, 它们导致抑制。除执行被抑制的一些特定指令外, 终止针对可以被转换但指派不可用位置的操作数地址的操作。 对于终止, 仅结果 字段会发生改变。在此上下文中, 术语 “结果字段” 包括条件码、 寄存器和任何所提供的且 被指派为由指令改变的存储器位置。
前述内容有益于理解一个计算机系统实施例的术语和结构。实施例不限于 z/ Architecture 或所提供的对其的描述。利用这里的教导, 实施例可以有利地应用于其它计 算机厂商的其它计算机架构。
不同的处理器架构提供有限数目的通用寄存器 (GR), 其被所架构的指令集的指令 显性地 ( 和 / 或隐性地 ) 识别。IBM z/Architecture 及其前身架构 ( 回溯至大约 1964 年 的原始系统 360) 为每个中央处理单元 (CPU) 提供 16 个通用寄存器 (GR)。GR 可以被处理 器 ( 中央处理单元 (CPU)) 的指令如下使用 :
●作为算术或逻辑运算的源操作数。
●作为算术或逻辑运算的目标操作数。
●作为存储器操作数的地址 ( 基址寄存器、 索引寄存器或者直接 )。
●作为存储器操作数的长度。
●其它使用, 诸如向和从指令提供功能码或其它信息。
直到在 2000 年引入 IBM z/Architecture 大型机为止, 大型机通用寄存器由 32 位 组成 ; 通过 z/Architecture 的引入, 通用寄存器由 64 位组成, 然而, 为了兼容性的原因, 许 多 z/Architecture 指令继续支持 32 位。
类似地, 其它架构 ( 诸如, 来自 的 x86) 例如提供兼容性模式, 使得具有例如 32 位寄存器的当前机器提供用于仅访问 32 位 GR 的前 8 位或 16 位的指令模式。
甚至在早期的 IBM 系统 360 环境中, 16 个寄存器 ( 例如由指令中的 4 位寄存器字 段识别 ) 被证实对于汇编程序员和编译器设计者来说使人畏缩。适度大小的程序可能需要 几个基址寄存器来寻址代码和数据, 从而限制可用于保持活动变量的寄存器数目。某些技 术已经被用于寻址有限数目的寄存器 :
●帮助最小化基址寄存器过度利用的程序设计 ( 与模块化编程一样简单 )。
●编译器已经使用诸如寄存器 “染色 (coloring)” 的技术来管理寄存器的动态再 分配。
●可如下减少基址寄存器的使用 :
●具有立即常量的较新的算术和逻辑指令 ( 在该指令内 )。
●具有相对立即操作数地址的较新指令。
●具有长位移的较新指令。
然而, 当存在比 CPU 中的寄存器的数目可容纳的活动变量和寻址范围更多的活动 变量和寻址范围时, 保持恒定的寄存器压力。
z/Architecture 提供三个程序可选寻址模式 : 24、 31 和 64 位寻址。然而, 对于既 不需要 64 位值也不采用 64 位存储器寻址的程序, 具有 64 位 GR 的益处有限。下面的公开 描述采用 64 位寄存器用于一般不使用 64 位寻址或变量的程序的技术。
在此公开内, 使用这样的约定 : 从左到右以升序对寄存器的比特位置进行编号 ( 大端 )。在 64 位寄存器中, 位 0( 最左侧位 ) 表示最高有效值 (263), 而位 63( 最右侧位 ) 0 表示最低有效值 (2 )。这样的寄存器的最左侧的 32 位 ( 位 0-31) 称为高字, 且寄存器的最右侧的 32 位 ( 位 32-63) 称为低字, 其中字是 32 位。
高字设施 :
当 CPU 在 32 位模式中时, 引入一套新的通用指令 ( 即, 可用于应用程序的指令 ) 来利用 64 位通用寄存器的高字 ( 最高有效的 32 位 )。在继续被限制于低字的旧指令之外, 程序还可以采用新指令来访问 GPR 的隐藏 ( 先前不可用的 ) 高字。
参考图 8, 写入到具有 16 或 32 位寄存器的架构中的程序可以运行在支持 64 位寄 存器的架构的较新版本上。所书写的用于例如 32 位模式的程序仅获知 32 位寄存器、 以及 典型地, 32 或更少的逻辑地址位。64 位架构的计算机系统中的操作系统 (OS)801 可以支持 为 64 位模式而书写的程序 803 以及为 32 位模式而书写的程序 802。这样的机器中的上下 文切换操作 804 无论应用程序 802、 803 是在 32 还是 64 位模式中, 都将当在程序和 / 或操 作系统之间切换时, 保存 (805)64 位寄存器以及程序状态字 (PSW)。 因此, 运行在 64 位操作 系统的控制下的 64 位机器上的 32 位模式中的 32 位程序将在某些上下文切换期间保存并 恢复其寄存器。即使经历上下文切换的程序正运行在 32 位模式中, 计算机系统和操作系统 也可以在上下文切换期间实际保存和恢复 805 通用寄存器的全部 64 位。因此, 程序仅看到 寄存器的一半, ( 仅每个寄存器的 64 位中的 32 位 )。所实施的寄存器的其它 32 位从 32 位 程序中 “隐藏” 。已知寄存器的 32 位可以用于寻址, 并且即使计算机系统支持 64 位寻址, OS 也可以经由动态地址转换来管理, 使得地址中的仅 32 位由 32 位模式中的 32 位程序操纵。 32 位模式可被看作低字模式, 因为程序仅利用双字 (64 位 ) 寄存器的低字 (32 位字 )。应 用程序在 OS 的控制下操作, 并且调用 OS 以便使 OS 执行特定功能。此 “调用” 通过保存应 用程序的状态并加载要被执行的 OS 的状态 805 的上下文切换 804 来执行, 其中 OS 在由上 下文切换提供的地址处开始执行。 OS 随后可以通过上下文切换 804 调用应用程序之一以允 许该应用程序运行。在一些应用中, 通过允许每个应用 ( 操作的时间片 ) 来支持资源的使 用, 并且上下文切换 804 被用于在逝去时间之后 “中断” 活动的程序, 以便允许 OS 为另一时 间片调度另一应用程序。
可以通过必须被设置为使能高字设施的机器中的位或字段来控制高字设施的可 用性。当高字设施被使能时, 32 位程序可以通过执行新的 “高字设施” 指令, 而利用寄存器 的 “隐藏” 部分。可以提供向使用低字寄存器的指令提供新功能的其它新 “高字设施” 指令。
在这些指令的大多数中, 仅操纵寄存器的高字。 在某些指令中, 提供变型来操纵一 个源寄存器的高字与另一源寄存器的低字, 结果被放置在目标寄存器 ( 例如, AHHLR) 的高 字中。RISBLG 提供类似于高字 RISBHG 指令的低字。RISBHG 和 RISBLG 在实施多个伪指令 ( 利用来自汇编程序的辅助 ) 中提供极大的灵活性。
如上所述, 处理器架构采用通用寄存器 (GPR), 其可用于架构的指令集。为了比数 据存储在较慢的主存储器 ( 其通常由复杂的动态地址转换机制实施 ) 中具有更快的性能, 程序可以利用可以在高速存储器 ( 诸如芯片上的嵌入式锁存 ) 中实施的 GPR 中的数据。在 诸如具有 64 个 GPR 的 x86 的某些架构中, 每个 GPR 的大小已经演进地从 8 位增加到 16 位、 32 位和当前的 64 位。然而, 可用于指令的 GPR 的数目 ((x86 为 64 个 ), 由指令内的 GPR 字 段的位的数目 (x86 为 6 个 ) 确定 ) 保持相同, 使得为例如具有 8 位 GPR 的旧指令书写的程 序仍然将运行在例如具有 32 位 GPR 的较新架构上。因此, 具有在 8 位模式中操作的 32 位 GPR 的机器将仅提供对每个 32 位 GPR 的低 8 位的访问。然而, 在上下文切换期间, 32 位操作系统 (OS) 将总是保存和恢复每个 GPR 的全部 32 位。
在 IBM z/Architecture 实施中, 机器可以具有 16 个 GPR, 每个 GPR 由 64 位 ( 位 0-63) 组成, 但可以运行为 32 位模式中的 32 位寄存器书写的应用程序。所述 32 位可以是 GPR 的低阶 32 位 ( 位 32-63), 其中高阶 32 位 ( 位 0-31) 在 32 位操作模式中不可用 ( 隐 藏 )。应用程序无法利用 GPR 的高阶 32 位, 因为它们对于程序是不可见的。在示例中, 可 能已经为仅具有 32 位寄存器且对存储器寻址 24 或 32 位的逻辑地址的前代机器的 32 位机 器书写了应用程序。32 位模式使得该示例的 32 位应用程序能够运行在较新的机器上, 该 较新的机器具有支持 64 位 GPR 的架构、 具有 64 位操作系统 (OS) 并支持 64 位模式中的 64 位应用程序。在为 32 位 GPR 定义的另一机器架构中, 可以提供对于应用程序不可见的一组 32 位的 “隐藏 GPR” 。
提供使得指令的子集能够访问隐藏的或高阶 GPR 的 “高字设施模式” , 同时剩余的 指令集可以访问架构的或低阶 GPR。
优选地, 在 “高字设施模式” 中, 指令的该子集在一个实施中可以仅访问高阶 GPR, 但在另一实施中, 指令的该子集可以将 GPR 字段定义为指向高阶 GPR 并且将另一 GPR 字段 定义为指向低阶 GPR。
在另一优选实施中, 在 “高字设施模式” 中, 可以仅使用低阶 GPR 用于生成主存储 器地址。
在实施中, 在 “高字设施模式” 中执行的应用可以与不在 “高字设施模式” 中执行 的应用共同存在。不在高字设施模式中的应用可以是 32 位 GPR 应用或 64 位 GPR 应用。在 此示例中, 用为利用 32 位的 GPR 书写的应用来利用具有 64 位的机器的 GPR, 然而, 本实施例 将提供如下优势 : 具有任意位数 (16、 24、 32、 48、 64、 128) 的机器的 GPR 运行为具有较少位数 (8、 16、 24、 32、 48、 64) 的 GPR 而书写的应用。此外, 高字设施模式隐藏的寄存器可以仅利用 隐藏 GPR 的指派的部分, 使得在前述示例的 32 位应用程序中, 在某些指令的高字设施模式 中可用的隐藏寄存器可以是 64 位 GPR 的高阶 32 位中的低阶 8 或 16 位, 而其它隐藏寄存器 可以是例如 65 位 GPR 的高阶 32 位中的高阶 8 或 16 位。使用 z/Architecture 和 / 或 x86 架构陈述实施例的教导, 然而, 根据这里的教导, 其它实施对于普通技术人员来说也是显然 易见的。
在示例 z/Architecture 实施例中, 对于所选的 32 位指令, 高字设施通过利用十六 个 64 位通用寄存器 ( 位 0-63) 的先前不可用的高阶位 0-31, 有效地提供十六个附加的 32 位 寄存器 ( 高字寄存器 )。 在实施例中, 高字设施可以利用指示功能的助记符号 ( 例如, AHHHR 用于 ADD HIGH( 加高 )) 来实现下列指令。
● ADD HIGH( 加高 )(AHHHR, AHHLR)
● ADD IMMEDIATE HIGH( 加立即高 )(AIH)
● ADD LOGICAL HIGH( 加逻辑高 )(ALHHHR, ALHHLR)
● ADD LOGICAL WITH SIGNED IMMEDIATE HIGH( 具有符号的立即高的加逻辑 ) (ALSIH, ALSIHN)
● BRANCH RELATIVE ON COUNT HIGH( 计数高分支相对 )(BRCTH)
● COMPARE HIGH( 比较高 )(CHHR, CHLR, CHF)
● COMPARE IMMEDIATE HIGH( 比较立即高 )(CIH)● COMPARE LOGICAL HIGH( 比较逻辑高 )(CLHHR, CLHLR, CLHF)
● COMPARE LOGICAL IMMEDIATE HIGH ( 比较逻辑立即高 )(CLIH)
● LOAD BYTE HIGH( 加载字节高 )(LBH)
● LOAD HALFWORD HIGH( 加载半字高 )(LHH)
● LOAD HIGH( 加载高 )(LFH)
● LOAD LOGICAL CHARACTER HIGH( 加载逻辑字符高 )(LLCH)
● LOAD LOGICAL HALFWORD HIGH( 加载逻辑半字高 )(LLHH)
● ROTATE THEN INSERT SELECTED BITS HIGH( 循环然后插入所选择的位高 ) (RISBHG)
● ROTATE THEN INSERT SELECTED BITS LOW( 循环然后插入所选择的位低 ) (RISBLG)
● STORE CHARACTER HIGH( 存储字符高 )(STCH)
● STORE HALFWORD HIGH( 存储半字高 )(STHH)
● STORE HIGH( 存储高 )(STFH)
● SUBTRACT HIGH( 减高 )(SHHHR, SHHLR)
● SUBTRACT LOGICAL HIGH( 减逻辑高 )(SLHHHR, SLHHLR)
下列附加的通用指令在互锁访问设施被安装时可能可用 :
● LOAD AND ADD( 加载和加 )(LAA, LAAG)
● LOAD AND ADD LOGICAL( 加载和加逻辑 )(LAAL, LAALG)
● LOAD AND AND( 加载和与 )(LAN, LANG)
● LOAD AND EXCLUSIVE OR( 加载和异或 )(LAX, LAXG)
● LOADAND OR ( 加载和或 )(LAO, LAOG)
● LOAD PAIR DISJOINT( 加载对解体 )(LPD, LPDG)
下列附加的通用指令在条件加载 / 存储 (load/store-on-condition) 设施被安装 时可能可用 :
● LOAD ON CONDITION( 条件加载 )(LOC, LGOC, LGROC, LROC)
● STORE ON CONDITION( 条件存储 )(STOC, STGOC)
下列附加的通用指令在独特操作数设施被安装时可能可用 :
● ADD(ARK, AGRK)
● ADD IMMEDIATE(AHIK, AGHIK)
● ADD LOGICAL(ALRK, ALGRK)
● ADD LOGICAL WITH SIGNED IMMEDIATE(ALHSIK, ALGHSIK)
● AND(NRK, NGRK)
● EXCLUSIVE OR(XRK, XGRK)
● OR(ORK, OGRK)
● SHIFT LEFT SINGLE( 左移单个 )(SLAK)
● SHIFT LEFT SINGLE LOGICAL( 左移单个逻辑 )(SLLK)
● SHIFT RIGHT SINGLE( 右移单个逻辑 )(SRAK)
● SHIFT RIGHT SINGLE LOGICAL( 右移单个逻辑 )(SRLK)● SUBTRACT( 减 )(SRK, SGRK)
● SUBTRACT LOGICAL( 减逻辑 )(SLRK, SLGRK)
示例高字指令 :
下面是可以采用高字设施的示例指令。
ADD HIGH(RRF 格式 )
当由计算机系统执行指令时, 第二操作数被加至第三操作数, 并且将和放置在第 一操作数位置。操作数以及和被处理为 32 位带符号二进制整数。第一和第二操作数分别 在通用寄存器 R1 和 R2 的位 0-31 中 ; 通用寄存器 R1 的位 32-63 不变, 并且忽略通用寄存器 R2 的位 32-63。对于 AHHHR 操作码, 第三操作数在通用寄存器 R3 的位 0-31 中 ; 忽略寄存器 的位 32-63。对于 AHHLR 操作码, 第三操作数在通用寄存器 R3 的位 32-63 中 ; 忽略寄存器 的位 0-31。当存在溢出时, 通过允许任何对符号比特位置的进位而忽略任何从符号比特位 置的进位输出而获得结果, 并且设置条件码 3。如果定点溢出掩码是 1, 则发生针对定点溢 出的程序中断。
结果条件码 :
0 结果零 ; 无溢出
1 结果小于零 ; 无溢出
2 结果大于零 ; 无溢出
3 溢出
程序异常 :
·定点溢出
·操作 ( 如果未安装高字设施 )
ADD IMMEDIATE HIGH(RIL 格式 )
当由计算机系统执行指令时, 第二操作数被加到第一操作数上, 并且将和放置在 第一操作数位置处。操作数以及和被处理为 32 位带符号二进制整数。第一操作数在通用 寄存器 R1 的位 0-31 中 ; 寄存器的位 32-63 不变。当存在溢出时, 通过允许任何对符号比特 位置的进位输入并忽略任何从符号比特位置的进位输出而获得结果, 并且设置条件码 3。 如 果定点溢出掩码是 1, 则发生针对定点溢出的程序中断。
结果条件码 :
0 结果零 ; 无溢出
1 结果小于零 ; 无溢出
2 结果大于零 ; 无溢出
3 溢出
程序异常 :
·定点溢出
·操作 ( 如果未安装高字设施 )
ADD LOGICAL HIGH(RRF 格式 )
当由计算机系统执行指令时, 第二操作数被加到第三操作数上, 并且将和放置在 第一操作数位置。操作数以及和被处理为 32 位无符号二进制整数。第一和第二操作数分 别在通用寄存器 R1 和 R2 的位 0-31 中 ; 通用寄存器 R1 的位 32-63 不变, 并且忽略通用寄存器 R2 的位 32-63。对于 ALHHHR 操作码, 第三操作数在通用寄存器 R3 的位 0-31 中 ; 忽略寄 存器的位 32-63。对于 ALHHLR 操作码, 第三操作数在通用寄存器 R3 的位 32-63 中 ; 忽略寄 存器的位 0-31。
结果条件码 :
0 结果零 ; 无进位
1 结果非零 ; 无进位
2 结果零 ; 进位
3 结果非零 ; 进位
程序异常 :
·操作 ( 如果未安装高字设施 )
ADD LOGICAL WITH SIGNED IMMEDIATE HIGH(RIL 格式 )
当由计算机系统执行指令时, 第二操作数被加到第一操作数上, 并且将和放置在 第一操作数位置。 第一操作数以及和被处理为 32 位无符号二进制整数。 第二操作数被处理 为 32 位带符号二进制整数。第一操作数在通用寄存器 R1 的位 0-31 中 ; 寄存器的位 32-63 不变。
结果条件码 :
对于 ALSIH, 如下设置该码 :
0 结果零 ; 无进位
1 结果非零 ; 无进位
2 结果零 ; 进位
3 结果非零 ; 进位
对于 ALSIHN, 该码保持不变。
程序异常 :
·操作 ( 如果未安装高字设施 )
BRANCH RELATIVE ON COUNT HIGH(RI、 RIL 格式 )
当由计算机系统执行指令时, 从第一操作数减去 1, 并且将结果放置在第一操作 位置。对于 BRANCH RELATIVE ON COUNT(BRCT 操作码 ), 第一操作数和结果被处理为通用 寄存器 R1 的位 32-63 中的 32 位二进制整数, 并且忽略溢出 ; 寄存器的位 0-31 不变。对于 BRANCH RELATIVE ON COUNT HIGH(BRCTH 操作码 ), 第一操作数和结果被处理为通用寄存器 R1 的位 0-31 中的 32 位二进制整数, 并且忽略溢出 ; 寄存器的位 32-63 不变。对于 BRANCH RELATIVE ON COUNT(BRCTG 操作码 ), 第一操作数和结果被处理为 64 位二进制整数, 并且忽 略溢出。当结果为 0 时, 利用更新的指令地址, 继续正常的指令排序。当结果为非零时, 当 前 PSW 中的指令地址被分支地址取代。I2 字段的内容是带符号二进制整数, 其指定被加到 指令的地址上以生成分支地址的半字数。
条件码 : 该码保持不变。
程序异常 :
·操作 ( 如果未安装高字设施, 则 BRCTH)
编程说明 :
1. 除了指定分支地址的手段之外, 该操作与 BRANCH ON COUNT 指令的操作相同。2. 可以将第一操作数和结果当作带符号或无符号的二进制整数, 因为二进制减法 的结果在两种情况下相同。
3.1 的初始计数产生 0, 且不发生分支 ; 0 的初始计数产生 -1, 且使得分支被执 行; -1 的初始计数产生 -2, 且使得分支被执行 ; 等等。 在循环中, 每次执行指令时发生分支, 直到结果再次为 0 为止。
注意, 对于 BRCT, 由于数的范围, -231 的初始计数产生正值 231-1, 或者, 对于 BRCTG, -263 的初始计数产生正值 263-1。4. 当指令是执行型指令的目标时, 分支相对于目 标地址。
COMPARE HIGH(RRE、 RXY 格式 )、 COMPARE IMMEDIATE HIGH(RIL 格式 )
当由计算机系统执行该指令时, 将第一操作数与第二操作数比较, 并且在条件码 中指示结果。操作数被处理为 32 位带符号二进制整数。第一操作数在通用寄存器 R1 的比 特位置 0-31 中 ; 忽略寄存器的比特位置 32-63。对于 COMPARE HIGH(CHHR 操作码 ), 第二操 作数在通用寄存器 R2 的比特位置 0-31 中 ; 忽略该寄存器的比特位置 32-63。对于 COMPARE HIGH(CHLR 操作码 ), 第二操作数在通用寄存器 R2 的比特位置 32-63 中 ; 忽略该寄存器的比 特位置 0-31。CHF 的位移被处理为 20 位带符号二进制整数。
结果条件码 : 0 操作数相等 1 第一操作数低 2 第一操作数高 3 -程序异常 : ·访问 ( 仅 CHF 的操作数 2) ·操作 ( 如果未安装高字设施 ) COMPARE LOGICAL HIGH(RRE、 RXY 格式 )、 COMPARE LOGICAL IMMEDIATE HIGH(RIL格式 ) 当由计算机系统执行该指令时, 将第一操作数与第二操作数比较, 并在条件码中 指示结果。操作数被处理为 32 位无符号二进制整数。第一操作数在通用寄存器 R1 的比特 位置 0-31 中 ; 忽略寄存器的比特位置 32-63。 对于 COMPARE LOGICAL HIGH(CLHHR 操作码 ), 第二操作数在通用寄存器 R2 的比特位置 0-31 中 ; 忽略该寄存器的比特位置 32-63。对于 COMPARE LOGICAL HIGH(CLHLR 操作码 ), 第二操作数在通用寄存器 R2 的比特位置 32-63 中 ; 忽略该寄存器的比特位置 0-31。CLHF 的位移被处理为 20 位带符号二进制整数。
结果条件码 :
0 操作数相等
1 第一操作数低
2 第一操作数高
3 -
程序异常 :
·访问 ( 仅 CLHF 的操作数 2)
·操作 ( 如果未安装高字设施 )
LOAD BYTE HIGH(RXY 格式 )
当由计算机系统执行该指令时, 第二操作数被符号扩展 (sign extended) 并被放 置在第一操作数位置。第二操作数的长度为 1 字节并且被处理为 8 位带符号二进制整数。 第一操作数被处理为通用寄存器 R1 的位 0-31 中的 32 位带符号二进制整数 ; 该寄存器的位 32-63 不变。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 取出, 操作数 2)
·操作 ( 如果未安装高字设施 )
LOAD HALFWORD HIGH(RXY 格式 )
当由计算机系统执行该指令时, 第二操作数被符号扩展并被放置在第一操作数位 置处。第二操作数的长度为 2 个字节并被处理为 16 位带符号二进制整数。第一操作数被 处理为通用寄存器 R1 的位 0-31 中的 32 位带符号二进制整数 ; 该寄存器的位 32-63 不变。 位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。 程序异常 :
·访问 ( 取出, 操作数 2)
·操作 ( 如果未安装高字设施 )
LOAD HIGH(RXY 格式 )
当由计算机系统执行该指令时, 第二操作数被未改变地放置在第一操作数位置 处。第二操作数是 32 位, 并且第一操作数在通用寄存器 R1 的位 0-31 中 ; 该寄存器的位 32-63 不变。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 取出, 操作数 2)
·操作 ( 如果未安装高字设施 )
LOAD LOGICAL CHARACTER HIGH(RXY 格式 )
当由计算机系统执行该指令时, 将 1 字节的第二操作数放置在通用寄存器 R1 的比 特位置 24-31 中, 并且将 0 放置在通用寄存器 R1 的比特位置 0-23 中 ; 通用寄存器 R1 的比 特位置 32-63 不变。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 取出, 操作数 2)
·操作 ( 如果未安装高字设施 )
LOAD LOGICAL HALFWORD HIGH(RXY 格式 )
当由计算机系统执行该指令时, 将 2 字节的第二操作数放置在通用寄存器 R1 的比 特位置 16-31 中, 并且将 0 放置在通用寄存器 R1 的比特位置 0-15 中 ; 通用寄存器 R1 的比 特位置 32-63 不变。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。程序异常 :
·访问 ( 取出, 操作数 2)
·操作 ( 如果未安装高字设施 )
ROTATE THEN INSERT SELECTED BITS HIGH(RIE 格 式 )、 ROTATE THEN INSERT SELECTED BITS LOW(RIE 格式 )
当由计算机系统执行该指令时, 将 64 位的第二操作数循环 (rotate) 左移第五操 作数中指定的位的数目。 从该操作数的最左侧比特位置移出的每个比特重新进入该操作数 的最右侧比特位置中。经循环的第二操作数的所选位取代第一操作数的对应比特位置的 内容。对于 ROTATE THEN INSERT SELECTED BITS HIGH, 第一操作数在通用寄存器 R1 的位 0-31 中, 且该寄存器的位 32-63 不变。对于 ROTATE THEN INSERT SELECTED BITS LOW, 第 一操作数在通用寄存器 R1 的位 32-63 中, 且该寄存器的位 0-31 不变。第二操作数在通用 寄存器 R2 中保持不变。对于 ROTATE THEN INSERT SELECTED BITS HIGH, I3 和 I4 字段的 位 3-7( 分别为指令的位 19-23 和 27-31) 与附加在每个字段左侧的二进制 0 一起形成 6 位 无符号二进制整数, 其指定第一操作数中和循环之后的第二操作数中的所选位范围的起始 和结束比特位置 ( 包括端点 )。当结束比特位置小于起始比特位置时, 所选位范围从位 31 向位 0 回绕。因此, 所选的位范围的起始和结束比特位置总在 0 与 31 之间。对于 ROTATE THEN INSERT SELECTED BITS LOW, I3 和 I4 字段的位 3-7 与附加在每个字段左侧的二进制 1 一起形成 6 位无符号二进制整数, 其指定第一操作数中和循环之后的第二操作数中的所 选位范围的起始和结束比特位置 ( 包括端点 )。 当结束比特位置小于起始比特位置时, 所选 位范围从位 63 向位 32 回绕。因此, 所选的位范围的起始和结束比特位置总在 32 与 63 之 间。I5 字段的位 2-7( 该指令的位 34-59) 包含指定第二操作数循环左移的位数目的无符 号二进制整数。I4 字段的位 0( 该指令的位 24) 包含零剩余位 (zero-remaining-bits) 控 制 (Z)。Z 位控制显示设置第一操作数的剩余位 ( 即, 在所指定范围之外的那些位 ( 如果存 在 ))。当 Z 位为 0 时, 第一操作数的剩余位不变。当 Z 位为 1 时, 第一操作数的剩余位被 设置为 0。刚刚描述的立即字段为如下 : I3 字段的位 0-2 和 I4 字段的位 1-2( 该指令的位 16-19 和 25-26) 被保留并应当包含 0 ; 否则, 程序未来可能无法兼容地操作。忽略 I5 字段 的位 0-1( 该指令的位 32-33)。
条件码 : 该码保持不变。
程序异常 :
·操作 ( 如果未安装高字设施 )
编程说明 :
1. 虽然将 I5 字段的位 2-7 定义为包含指定第二操作数循环左移的位数目的无符 号二进制整数, 但是可以编写有效地指定向右循环量的负值的码。
2. 总是以其未循环的形式使用第一操作数。当 R1 和 R2 字段指派相同寄存器时, 首先循环寄存器中所包含的值, 随后将经循环的值的所选位插入到未循环的寄存器内容的 对应位中。
3. 在汇编语法中, 包含循环量的 I5 操作数被认为是可选的。 当未编码 I5 字段时, 隐含循环量为 0。
4.I4 字段包含零剩余位控制 ( 在位 0 中 ) 和结束比特位置值 ( 在位 2-7 中 )。例如, 为了将寄存器 7 的位 40-43 插入寄存器 5 的对应位中 ( 无循环 ) 并且将 0 插入寄存器 5 的右半侧中的剩余位中, 程序员可进行编码 : X‘80’ 表示添加到结束比特位置以形成 I4 字段的零剩余位控制。高级汇编 (HLASM) 分别以 RISBHGZ 和 RISBLHZ 的形式为 RISBHG 和 RISBLG 的零剩余位版本提供替代的助记符号。所述助记符号的 “Z” 后缀指示 : 当生成对象 代码时, 所指定的 I4 字段是具有值 X’ 80’ 的 ORed。上面所示的使用 Z 后缀的助记符号的 示例的相当物如下 :
5. 在某些模型上, 可以通过将零剩余位控制设置为 1( 或者使用 Z 助记符号后缀 ) 实现 RISBHG 和 RISBLG 的增强性能。
6. 与 设 置 条 件 码 的 ROTATE THEN INSERT SELECTED BITS 不 同, ROTATE THEN INSERT SELECTED BITS HIGH 和 ROTATE THEN INSERT SELECTED BITS LOW 不设置条件码。
STORE CHARACTER HIGH(RXY 格式 )
当由计算机系统执行该指令时, 将通用寄存器 R1 的位 24-31 不改变地放置在第二 操作数位置处。第二操作数的长度为 1 字节。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 存储, 操作数 2)
·操作 ( 如果未安装高字设施 )
STORE HALFWORD HIGH(RXY 格式 )
当由计算机系统执行该指令时, 将通用寄存器 R1 的位 16-31 不改变地放置在第二 操作数位置处。第二操作数的长度为 2 字节。位移被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 存储, 操作数 2)
·操作 ( 如果未安装高字设施 )
STORE HIGH(RXY 格式 )
当由计算机系统执行该指令时, 将第一操作数不改变地放置在第二操作数位置 处。第一操作数在通用寄存器 R1 的位 0-31 中, 并且第二操作数在存储器中是 32 位。位移 被处理为 20 位带符号二进制整数。
条件码 : 该码保持不变。
程序异常 :
·访问 ( 存储, 操作数 2)
·操作 ( 如果未安装高字设施 )
SUBTRACT HIGH(RRF 格式 )
当由计算机系统执行该指令时, 从第二操作数中减去第三操作数, 并且将差放置 在第一操作数位置。操作数和差被处理为 32 位带符号二进制整数。第一和第二操作数分 别在通用寄存器 R1 和 R2 的位 0-31 中 ; 通用寄存器 R1 的位 32-63 不变, 并且忽略通用寄存 器 R2 的位 32-63。对于 SHHHR 操作码, 第三操作数在通用寄存器 R3 的位 0-31 中 ; 忽略寄 存器的位 32-63。对于 SHHLR 操作码, 第三操作数在通用寄存器 R3 的位 32-63 中 ; 忽略该 寄存器的位 0-31。当存在溢出时, 通过允许任何对符号比特位置的进位输入并忽略任何从符号比特位置的进位输出而获得结果, 并且设置条件码 3。如果定点溢出掩码是 1, 则发生 针对定点溢出的程序中断。
结果条件码 :
0 结果零 ; 无溢出
1 结果小于零 ; 无溢出
2 结果大于零 ; 无溢出
3 溢出
程序异常 :
·定点溢出
·操作 ( 如果未安装高字设施 )
SUBTRACT LOGICAL HIGH(RRF 格式 )
当由计算机系统执行该指令时, 从第二操作数中减去第三操作数, 并且将差放置 在第一操作数位置。操作数和差被处理为 32 位无符号二进制整数。第一和第二操作数分 别在通用寄存器 R1 和 R2 的位 0-31 中 ; 通用寄存器 R1 的位 32-63 不变, 并且忽略通用寄存 器 R2 的位 32-63。对于 SLHHHR 操作码, 第三操作数在通用寄存器 R3 的位 0-31 中 ; 忽略寄 存器的位 32-63。对于 SLHHLR 操作码, 第三操作数在通用寄存器 R3 的位 32-63 中 ; 忽略该 寄存器的位 0-31。
结果条件码 :
0 -
1 结果非零 ; 借位
2 结果零 ; 无借位
3 结果非零 ; 无借位
程序异常 :
·操作 ( 如果未安装高字设施 )
参考图 6, 示出了示例通用寄存器 (GPR), 其具有 16 个 GPR( 每个 GPR 在小 GPR 模 式中包括位 32-63, 并且在大 GPR 模式中包括位 0-63)。可以在具有第一数目 (16) 的大 GPR 的计算机中扩展可用于程序的指令的通用寄存器 (GPR) 的有效数目, 每个指令包括操作码 和用于指定对应的 GPR 的一个或多个 GPR 字段, 每个大 GPR 由第一部分 (31-63) 和第二部 分 (0-31) 组成。参考图 7A, 计算机取出用于执行的指令, 包括来自第一集 (set)701、 第二 集 702 或第三集 710 的指令。第一集仅访问任何 GPR 的第一部分, 第二集访问任何 GPR 的 第二部分, 第三集访问整个 GPR, 包括第一部分和第二部分。当 703 计算机在例如小 GPR 模 式中, 并正执行第一指令集的指令 707 用于访问第一部分时, 所述执行包括 708 基于所述小 GPR 生成用于访问存储器操作数的存储器地址或访问小 GPR 操作数, 其中每个所述小 GPR 由 所述第一部分组成 707。当 703 计算机在小 GPR 模式中时, 当 705 计算机正执行高字指令, 执行第二指令集的指令 706 时, 第二指令集用于访问指令指定的第二部分, 其中 708 所述执 行包括基于所述小 GPR 生成用于访问存储器操作数的存储器地址或访问小 GPR 操作数, 其 中小 GPR 由所述指令指定的第二部分组成。当 704 计算机在大 GPR 模式中时 ( 其中每个大 GPR 由第一部分和第二部分组成 ), 计算机执行第三指令集的指令, 所述执行包括基于所述 大 GPR 生成用于访问存储器操作数的存储器地址或访问大 GPR 操作数, 其中每个所述大 GPR由所述第一部分和所述第二部分组成。
响应于处于小 GPR 模式中的计算机, 该计算机可以生成 709 响应于执行第二指令 集的指令的操作异常。
第二指令集的指令的执行可以基于两个操作数执行 751 对应操作码定义的功能, 并且存储结果, 该对应的操作码定义的功能由两个操作数的 ADD( 加 ) 功能、 两个操作数的 COMPARE( 比较 ) 功能或两个操作数的 OR( 或 ) 功能组成 752。
第二指令集的指令的执行可以基于两个操作数执行对应操作码定义的功能, 并且 存储结果, 该对应的操作码定义的功能由从存储器 LOAD( 加载 ) 操作数的功能或将操作数 STORE( 存储 ) 到存储器的功能组成 753。
第二指令集的指令的执行可以基于两个操作数执行对应操作码定义的功能, 并且 存储结果, 该对应的操作码定义的功能是 ROTATE THEN INSERT SELECTED BITS( 循环然后 插入所选位 ) 功能 754, 其包括将源操作数循环指令指定的量, 然后将经循环的源操作数的 所选部分插入目标操作数的所选部分中。
虽然这里已经图示并描述了优选实施例, 但是应当理解, 所述实施例不限于这里 公开的准确构造, 而且保留所附权利要求限定的本发明的范围内的所有改变和修改的权 利。