Alpha体系结构倾向于实现高性能的指令集。为了这个目标,做了两个有争议性的决定:不精确的浮点异常;不支持按字节或者半字访问数据(即只支持按word访问数据)。
为了简化流水线执行, Alpha 的异常触发与常见的略有不同(通常,一般的体系结构 ,都要求在触发异常时,在异常指令前的所有指令都需要执行完,而之后的指令全部不执行)。它特别提供了 TRAPB 指令, TRAPB 指令可以等待到前面的算术指令执行完成为止。在最极端的情况下,在每个可能发生异常的指令后面都加上TRAPB会导致执行速度比精确异常还慢5倍。
如果代码里面没有带TRAPB的话,则程序执行的结果就可能不符合 IEEE 754 标准。这是因为 Alpha 用软件浮点实现了一部分标准(NaNs,infinities,以及非规格化数),当然很多其他微处理器也是这么做的。但是软件实现的这部分操作中,必须要用到精确异常。
当设计这个体系结构的时候,架构师认为字节读写会拖慢数据传输。字节的读,需要在数据传输路径上加一个额外的移位,而字节写入,则需要从内存中读出后再写入,并且需要重新计算ECC值。
为了减少获取字节数据的指令数, Alpha 精心设计了一些字节操作指令:对寄存器位域扩展和清零(EXTxx),插入位域(INSxx),掩码清零(MSKxx),零位域(ZAP),多字节比较(CMPGE)。
实际上,这版初始设计(只支持按word访问)反响很差。在第二版 Alpha 芯片(21164A)开始,字节和半字读写就加入了指令集中。
剩余的特有指令
- PAL码: 为了提供 VAX 微指令操作, Alpha 提供了一个关闭中断和虚拟地址映射的特权模式。 PAL(特权指令库)可以用作TLB管理,内存原子操作,以及操作系统原语。用CALL_PAL指令来调用PAL码。
- 没有除法: 不支持整数的除法
- 不对齐读写: LDQ_U 和 STQ_U 直接忽略地址的第3位,读写64位数据。然后通过提取指令来提取不对齐的word。这些指令与MIPS的LWL/R, SWL/R相似。
- 单精度浮点表示为双精度浮点: 单精度浮点以32位的格式保存在内存中,但是当读取到寄存器中时,会自动转换为64位。
- 浮点寄存器 F31 固定为0: 为了方便跟0做比较。
- VAX 浮点格式: 为了兼容 VAX 体系结构,在 IEEE 754 单精度和双精度格式外(称作S和T), Alpha还支持 VAX 单精度和双精度(称作F和G)。
- bit计数指令: 第三版体系结构添加了计算前导0(CTLZ), 计算尾部0(CTTZ),以及一个word中1的个数的指令(CTPOP)。这些指令最早出现在Cray计算机上面,用于加解密。