<div dir="ltr">For example, I have the following IR code,<div><br><div><div>for.cond.preheader:                               ; preds = %if.end18</div><div>  %mul = mul i32 %12, %3</div><div>  %cmp21128 = icmp sgt i32 %mul, 0</div><div>  br i1 %cmp21128, label %for.body.preheader, label %return</div><div><br></div><div>for.body.preheader:                               ; preds = %for.cond.preheader</div><div>  %19 = mul i32 %12, %3</div><div>  %20 = add i32 %19, -1</div><div>  %21 = zext i32 %20 to i64</div><div>  %22 = add i64 %21, 1</div><div>  %end.idx = add i64 %21, 1</div><div>  %n.vec = and i64 %22, 8589934584</div><div>  %cmp.zero = icmp eq i64 %n.vec, 0</div><div>  br i1 %cmp.zero, label %middle.block, label %<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__vector.ph&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=F7pKdLAy1Ei28fyXY2J2C2b8nsc7AiLct8TRikb1mCo&s=3ZpVgxYhQLW9AvQNNN8x8z7wlxwKTZIJiUX6XgsKfvg&e=">vector.ph</a></div><div><br></div><div>The corresponding assembly code is:</div><div><div># BB#3:                                 # %for.cond.preheader                                       </div><div>    imull   %r9d, %ebx                                                                                </div><div>    testl   %ebx, %ebx                                                                              </div><div>    jle .LBB10_63                                                                                    </div><div># BB#4:                                 # %for.body.preheader                                       </div><div>    leal    -1(%rbx), %eax                                                                          </div><div>    incq    %rax                                                                                     </div><div>    xorl    %edx, %edx                                                                              </div><div>    movabsq $8589934584, %rcx       # imm = 0x1FFFFFFF8                                           </div><div>    andq    %rax, %rcx                                                                               </div><div>    je  .LBB10_8                                 </div></div><div><br></div><div>I changed all the scalar operands to <2 x ValueType> ones. The IR becomes the following</div><div><div>for.cond.preheader:                               ; preds = %if.end18</div><div>  %mulS44_D = mul <2 x i32> %splatLDS24_D.splat, %splatLDS7_D.splat</div><div>  %cmp21128S45_D = icmp sgt <2 x i32> %mulS44_D, zeroinitializer</div><div>  %sextS46_D = sext <2 x i1> %cmp21128S45_D to <2 x i64></div><div>  %BCS46_D = bitcast <2 x i64> %sextS46_D to i128</div><div>  %mskS46_D = icmp ne i128 %BCS46_D, 0</div><div>  br i1 %mskS46_D, label %for.body.preheader, label %return</div><div><br></div><div>for.body.preheader:                               ; preds = %for.cond.preheader</div><div>  %S47_D = mul <2 x i32> %splatLDS24_D.splat, %splatLDS7_D.splat</div><div>  %S48_D = add <2 x i32> %S47_D, <i32 -1, i32 -1></div><div>  %S49_D = zext <2 x i32> %S48_D to <2 x i64></div><div>  %S50_D = add <2 x i64> %S49_D, <i64 1, i64 1></div><div>  %end.idxS51_D = add <2 x i64> %S49_D, <i64 1, i64 1><br></div><div>  %n.vecS52_D = and <2 x i64> %S50_D, <i64 8589934584, i64 8589934584><br></div><div>  %cmp.zeroS53_D = icmp eq <2 x i64> %n.vecS52_D, zeroinitializer</div><div>  %sextS54_D = sext <2 x i1> %cmp.zeroS53_D to <2 x i64></div><div>  %BCS54_D = bitcast <2 x i64> %sextS54_D to i128</div><div>  %mskS54_D = icmp ne i128 %BCS54_D, 0</div><div>  br i1 %mskS54_D, label %middle.block, label %<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__vector.ph&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=F7pKdLAy1Ei28fyXY2J2C2b8nsc7AiLct8TRikb1mCo&s=3ZpVgxYhQLW9AvQNNN8x8z7wlxwKTZIJiUX6XgsKfvg&e=">vector.ph</a></div></div><div> </div><div>Now the assembly for the above IR code is:</div><div><div># BB#4:                                 # %for.cond.preheader</div><div>    vmovdqa 144(%rsp), %xmm0        # 16-byte Reload</div><div>    vpmuludq    %xmm7, %xmm0, %xmm2</div><div>    vpsrlq  $32, %xmm7, %xmm4</div><div>    vpmuludq    %xmm4, %xmm0, %xmm4</div><div>    vpsllq  $32, %xmm4, %xmm4</div><div>    vpaddq  %xmm4, %xmm2, %xmm2</div><div>    vpsrlq  $32, %xmm0, %xmm4</div><div>    vpmuludq    %xmm7, %xmm4, %xmm4</div><div>    vpsllq  $32, %xmm4, %xmm4</div><div>    vpaddq  %xmm4, %xmm2, %xmm2</div><div>    vpextrq $1, %xmm2, %rax</div><div>    cltq</div><div>    vmovq   %rax, %xmm4</div><div>    vmovq   %xmm2, %rax</div><div>    cltq</div><div>    vmovq   %rax, %xmm5</div><div>    vpunpcklqdq %xmm4, %xmm5, %xmm4 # xmm4 = xmm5[0],xmm4[0]</div><div>    vpcmpgtq    %xmm3, %xmm4, %xmm3</div><div>    vptest  %xmm3, %xmm3</div><div>    je  .LBB10_66</div><div># BB#5:                                 # %for.body.preheader</div><div>    vpaddq  %xmm15, %xmm2, %xmm3</div><div>    vpand   %xmm15, %xmm3, %xmm3</div><div>    vpaddq  .LCPI10_1(%rip), %xmm3, %xmm8</div><div>    vpand   .LCPI10_5(%rip), %xmm8, %xmm5</div><div>    vpxor   %xmm4, %xmm4, %xmm4</div><div>    vpcmpeqq    %xmm4, %xmm5, %xmm6</div><div>    vptest  %xmm6, %xmm6</div><div>    jne .LBB10_9</div></div><div><br></div><div>It turned out that the vector one is way more complicated than the scalar one. I was expecting that it would be not so tedious.</div><div><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 26, 2015 at 3:49 AM, suyog sarda <span dir="ltr"><<a href="mailto:sardask01@gmail.com" target="_blank">sardask01@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><p dir="ltr"><br>
><br>
> Is LLVM be able to generate code for the following code?<br>
><br>
> %mul = mul <2 x i32> %1, %2, where %1 > and %2 are <2 x i32> type.</p>
<p dir="ltr">> I am running it on a Haswell processor with LLVM-3.4.2. It seems that it will generates really complicated code with vpaddq, vpmuludq, vpsllq, vpsrlq. <br>
></p>
</span><p dir="ltr">Can you please elaborate more on what is your test case and what do you want to see the final output? It will be good if you can give test case you are running LLVM on.</p>
<p dir="ltr">Regards,<br>
Suyog Sarda<br>
</p>
</blockquote></div><br></div>