Straw's B1og.

llvm IR常用指令一

字数统计: 773阅读时长: 4 min
2024/02/28

llvm IR常用指令一

终结指令

ret指令

ret < type> < value>;返回特定类型返回值的return指令

ret void;无返回值的return指令

1
2
3
4
Test:
ret i32 5;返回整数5
ret void;返回无符号
ret { i32 , i8 } { i32 4 , i8 2 };返回结构体

br指令

br i1 < cond>,label < iftrue>,label < iffalse>;有条件跳转

br label < dest>;无条件分支

1
2
3
4
5
6
7
Test:
%cond = icmp eq i32 %al,%b
br il %cond,label %IfEqual,label %IfUnequal
IfEqual:
ret i32 1
IfUnequal:
ret i32 0

icmp指令

< result> = icmp < cond> < ty> < op1> < op2>;比较两个ty类型的数是否满足条件cond

1
2
3
4
5
6
7
Test:
<result> = icmp eq i32 4,5 ;false eq=equal
<result> = icmp ne float* %X %X ;false ne=not equal
<result> = icmp ult i16 4, 5 ;true ult=unsigned less than
<result> = icmp sgt i16 4, 5 ;false sgt=signed greater than
<result> = icmp ule i16 -4, 5 ;false ule=unsigned less or equal
<result> = icmp sge i16 4, 5 ;false sge=signed greater or equal

fcmp指令

< result>= fcmp < cond> < ty> < op1> < op2>;比较两个浮点数是否满足条件cond

1
2
3
4
5
Test:
<result> = fcmp oeq float 4.0,5.0 ;false oeq=order and equal
<result> = fcmp one float 4.0,5.0 ;true
<result> = fcmp olt float 4.0,5.0 ;true
<result> = fcmp ueq double 1.0,2.0 ;false

switch指令

switch < intty> < value>, label < defaultdest> [ < intty> < val>,label < dest>…]

1
2
3
4
5
6
7
Test:
%Val = zext i1 %value to i32
switch i32 %Val,label %truedest[ i32 0,label %falsedest ];与条件跳转等效
switch i32 0,label %dest[ ];与非条件跳转等效
switch i32 %Val,label %otherwise [ i32 0, label %onzero
i32 1, label %onone
i32 2, label %ontwo];三条跳转

二元运算

add指令

< result> = add < ty> < op1>, < op2>

1
<result>=add i32 4,%var;4+%var

sub指令

< result> = sub < ty> < op1>, < op2>

mul指令

< result> = mul < ty> < op1>, < op2>

udiv指令

< result> = udiv < ty> < op1>, < op2>;无符号整除

< result> = udiv exact < ty> < op1>, < op2>;如果结果不是整数会报错

sdiv指令

< result> = sdiv < ty> < op1>, < op2>;有符号整除

< result> = sdiv exact < ty> < op1>, < op2>;如果结果不是整数会报错

urem指令

< result> = urem < ty> < op1>, < op2>;无符号取余

srem指令

< result> = srem < ty> < op1>, < op2>;有 符号取余

按位二元运算

shl指令

< result> = shl < ty> < op1>, < op2>;整数左移op1<<op2

lshr指令

< result> = lshr < ty> < op1>, < op2>;整数逻辑右移,会变为无符号类型

ashr指令

< result> = ashr < ty> < op1>, < op2>;整数算数右移

1
2
3
Difference:
<result>=lshr i8 -2,1 ;result=0x7F
<result>=ashr i8 -2,1 ;result=-1

and指令

< result> = and < ty> < op1>, < op2>;整数按位与

or指令

< result> = or < ty> < op1>, < op2>;整数按位或

xor指令

< result> = ashr < ty> < op1>, < op2>;整数按位异或

CATALOG
  1. 1. llvm IR常用指令一
    1. 1.0.1. 终结指令
      1. 1.0.1.1. ret指令
      2. 1.0.1.2. br指令
      3. 1.0.1.3. icmp指令
      4. 1.0.1.4. fcmp指令
      5. 1.0.1.5. switch指令
    2. 1.0.2. 二元运算
      1. 1.0.2.1. add指令
      2. 1.0.2.2. sub指令
      3. 1.0.2.3. mul指令
      4. 1.0.2.4. udiv指令
      5. 1.0.2.5. sdiv指令
      6. 1.0.2.6. urem指令
      7. 1.0.2.7. srem指令
    3. 1.0.3. 按位二元运算
      1. 1.0.3.1. shl指令
      2. 1.0.3.2. lshr指令
      3. 1.0.3.3. ashr指令
      4. 1.0.3.4. and指令
      5. 1.0.3.5. or指令
      6. 1.0.3.6. xor指令