在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。当我加载通行证时。
答案 0 :(得分:0)
fcmp
返回布尔结果的向量。您需要更改将其减少为布尔谓词的方式以进行分支。
对于您的情况,您希望将fcmp
的结果与零进行比较。
答案 1 :(得分:0)
我认为http://lists.llvm.org/pipermail/llvm-dev/2012-September/053046.html可能包含您问题的答案。 它可以概括为
对整数进行比较
%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
使用符号扩展,以便标准向量指令集的后端映射该指令而不切换向量大小。