如何生成llvm向量比较的指令

时间:2015-04-07 05:51:05

标签: vector comparison llvm

在LLVM中,我们可以轻松地为标量指令创建比较指令。例如,如果我们有:

%a = fsub double %1, %2
%b = fadd double %3, %4
%c = fcmp one double %a, %b

其中指令%c可以通过以下方式生成: c =新FCmpInst(insertAt,FCmpInst :: FCMP_ONE,%a,%b,instName)

我们可以方便地对矢量指令进行类似的比较吗?例如,如果%a和%b分别如下:

%a = fsub <2 x double>, %5, %6;      %5 and %6 are in vector type
%b = fadd <2 x double>, %7, %8

我们可以使用与标量版本类似的比较来检查%a和%b的等价性吗?

我实际上尝试了与上面相同的指令,但它产生以下错误&#34; void llvm :: BranchInst :: AssertOK():断言`getCondition() - &gt; getType() - &gt ; isIntegerTy(1)&amp;&amp; &#34;只能在布尔谓词上分支!&#34;&#39;失败&#34。当我加载通行证时。

2 个答案:

答案 0 :(得分:0)

向量的

fcmp返回布尔结果的向量。您需要更改将其减少为布尔谓词的方式以进行分支。

对于您的情况,您希望将fcmp的结果与零进行比较。

答案 1 :(得分:0)

我认为http://lists.llvm.org/pipermail/llvm-dev/2012-September/053046.html可能包含您问题的答案。 它可以概括为

  1. sign将您的布尔向量扩展为整数向量
  2. 将整数向量bitcast到相同大小的整数
  3. 对整数进行比较

    %a = fsub <2 x double>, %5, %6;     
    %b = fadd <2 x double>, %7, %8
    %c = fcmp one <2 x i1>, %a, %b
    %d = sext <2 x i1> %c to <2 x i64>
    %e = bitcast <2 x i64> %d to i128
    %f = icmp ne %e, 0
    br i1 %f, label %true1, label %false2
    
  4. 使用符号扩展,以便标准向量指令集的后端映射该指令而不切换向量大小。