x86的指令集中有很多指令是自动生成条件码的,它们保存在EFLAGS寄存器中。完全的模拟这些条件码是十分费时的,还好我们并不常用到它们,所以可以采用惰性计算。
一、惰性计算
惰性计算就是在遇到产生条件码的指令时并不计算生成这些条件码,只保存生成条件码所必需的条件,在遇到需要使用条件码的指令时才会生成条件码。
1、需要保存的记录
opc op1 op2
2、如何维护记录
比较快的方法是保存的临时寄存器中,但是临时寄存器是珍贵的资源,是很有限的。
还有就是保存到内存中,节省了临时寄存器,但是会慢一些。
保存opc、op1、op2就需要3条内存指令。计算的时候又是3条内存指令。
问题:
如果保存ret,会有多大的性能提升?
3、EFLAGS优化
将所有的条件码先以整形保存到内存中,需要的时候再以位拼凑到EFLAGS寄存器中。
多数指令实际上只需要一个条件码,而生成许多个条件码是没有意义的,这样做的问题是需要为每一位条件码维护一个记录。
多数Jcc指令只用一位条件码,并且Jcc不影响条件码,所以可以优化为只生成需要的条件码。
使用目标指令集的条件码,硬件实现条件码计算