守卫处决是一种消除手段;至少部分是条件分支。这个想法是在架构中引入条件操作指令并使用它们来替换条件分支。条件操作指令称为保护指令。受保护的指令由两部分组成,称为保护的条件部分和作为传统指令的操作部分。例如,它可以表示为以下形式 -
(guard) instruction
受保护指令的执行取决于以下条件:如果指定的保护为真,则执行相关指令;如果守卫结果是假的,则指令的行为就像一个 NOP。
例如,α 架构提供了条件移动指令,这些指令是受保护的指令,具有以下语法和语义(DEC,1992) -
cmovxx ra.rq, rb.rq, rc.wq cmovxx ra.rq, #b.ib, rc.wq
在哪里
xx 表示条件
ra.rq 是存储在寄存器 ra 中的整数、只读 64 位操作数
rb.rq 是一个整数,只读的 64 位操作数,存储在寄存器 rb 中
rc.wq 是存储在寄存器 rc 中的整数、只写 64 位操作数
#b.ib 是一个整数 64 位文字
该指令操作如下。注册 ra 被测试。
指令助记符指定受保护执行的条件 -
cmoveq // cmove 如果寄存器 ra 的内容等于 0
cmovge // cmove 如果寄存器 ra 的内容大于或等于 0
cmovgt // cmove 如果寄存器 ra 的内容大于零
cmovlbc // 如果寄存器 ra 的低位清零则 cmov
cmovlbs // 如果设置了寄存器 ra 的低位,则 cmovlbs
cmovle // 如果寄存器 ra 的内容小于或等于 0,则 cmov
cmovlt // cmove 如果寄存器 ra 的内容小于零
cmovne // cmove 如果寄存器 ra 的内容不等于 0
通过使用具有在相应条件分支中指定的相反条件的受保护指令,可以消除前向条件分支。例如,考虑代码序列
beq ra, label // if (ra)=0 分支到“标签” or rb, rb, rc // else move (rb) into rc
SPARC V9 (1994) 也提供了一些类似的条件移动指令。HP Precision Architecture (1985) 以比 DEC α 更全面的方式引入了受保护的指令。这里,所有整数操作指令都是以下形式的保护指令
opcode.cond operands
给定的条件 (cond) 与操作的结果有关。如果指定条件为真,例如结果为正,则以下指令无效。
有两种类型的保护执行,例如完全保护和限制保护。在完全保护中,假定所有指令都受到保护,而在受限保护中,只有操作指令(ALU 指令)具有保护形式。
这种受限制的保护形式考虑到这样一个事实:在现有体系结构中,指令代码空间通常被压缩,并且在大多数情况下,只有少数额外位可用于指定保护条件。