1.动机
从机器层面上来看,控制流类的跳转指令分为无条件跳转和有条件跳转,无条件跳转 JMP,有条件跳转 JEQ、JNE、JLT、JGT、JLE、JGE,这部分指令是需要通过检查 condition code (SW 寄存器)来决定跳转条件;J 类型指令依赖的 condition code 是通过比较指令(比如 CMP)的结果来设置的。如下图所示,JNE跳转指令通过检查SW寄存器的状态以决定是否发生跳转。因此,为了支持控制流功能,首先要打通比较功能。
2.LLVM IR 中的比较指令
LLVM IR提供的 int 类型比较指令为 icmp。其接受三个参数:比较方案以及两个比较参数。
%result = icmp ule i32 %a, %b
ule是比较方案,其中 u 为 unsigned int,le 为 lower than or equal,%a和%b就是用来比较的两个数,而icmp则返回一个i1类型的值,用来表示结果是否为真。
与ule类似的比较方案有多种,如:
等于与不等于:eq、ne;
无符号比较:ugt、uge、ult、ule, 分别对应无符号的大于、大于等于、小于、小于等于;
有符号比较:sgt、sge、slt、sle, 分别对应有符号的大于、大于等于、小于、小于等于。
3.实现比较功能的添加
3.1 定义format
class FA<bits<8> op, dag outs, dag ins, string asmStr,
list<dag> pattern, InstrItinClass itin>
: Cpu0Inst<outs, ins, asmStr, pattern, itin, FrmA>
{
bits<4> ra;
bits<4> rb;
bits<4> rc;
bits<12> shamt;
let Opcode = op;
let Ins