有一类指令很有脾气,他们只在开心的时候才会执行. jxx和cmovqxx, 其中xx可为, [le, l, ne, e, g, ge], l为less than, g为greater than, e则是eq. 这些条件便是y86解决if statement的方式.
那么条件是哪里来的呢? 这些指令里也不像是213时会有一个register来和0做比较,那这里我们在比较什么呢?
答案是, 我们会在到达了Execute时去看CC的flags然后再判断要不要执行, 这时的CC其实是上一次算术运算时设置的. 这些flags包括zero flag(ZF), sign flag(SF), 和overflow flag(OF). OF在这里可以不去看, 我们只要考虑ZF和SF. 所谓flag, 其实是一个boolean, 设置一个flag意味将它的值变为1或true. 那么ZF便是在上次valE等于0时设置的, 而SF则是valE为负时设置. ex. 上一次运算valE = 20 - 18 = 2.这时便不会设置ZF和SF. 若valE = 10 - 15 = -5, 那么便只会设置SF. 做一个简单的排列会得出三种情况(1)ZF=0, SF=0, 正(2)ZF=1, SF=0, 零(3)ZF=0, SF=1, 负. 想想为什么没有第四种?
下面举个例子, 假说上一次运算的valE为负, 而这次的指令为je 0x12345678. 这时在Execute可以读取到ZF=0, SF=1, 然后结合指令中“e”这个条件, 可以判断条件不满足因为“e"期待的是valE为零的情况,即ZF=1. 如果这时的指令是cmovqle, 则指令会运行, 因为"le"希望valE <= 0. 最后,判断完成后会设置cnd这个register为0或1来表明是否会执行该指令.