目录
程序的顺序执行需要由条件控制指令来控制,例如条件跳转、比较和分支跳转等,JVM常用指令中有一类控制指令,负责虚拟机有条件地或者无条件地从指定位置执行指令,使得程序按照我们希望的顺序执行。总的来说控制指令分为比较、跳转、比较跳转和有/无条件的分支跳转,同样控制程序执行的还有函数调用和返回指令,这篇日志就来总结这两部分常用的指令。
比较控制
比较指令
比较指令有fcmpg、fcmpl、dcmpg、dcmpl等,和上一篇日志里讲的指令类似,前面的f、d分别表示数据类型float和double,所以如果是long类型的数据则用lcmp。可以看到float和double类型的比较指令都有两个,xcmpg和xcmpl,两者的区别在于处理未定义或者不可表示的值(NaN)时,得到的结果不同,拿fcmpg和fcmpl举例,两条指令都是将栈中弹出两个元素作比较,如果进行比较的两个float值都不是NaN值,两个值相等时,fcmpg和fcmpl都会将“0”压栈,如果第一个值大于第二个值,压入“1”,第一个值小于第二个值,压入“-1”。当有一个或两个值为NaN时,也就是出现未定义或不可表示的值,此时两者无法比较,fcmpg会将“1”压栈,而f