[llvm-dev] VBROADCAST Implementation Issues

hameeza ahmed via llvm-dev llvm-dev at lists.llvm.org
Sat Aug 5 10:50:43 PDT 2017


Hello,

i have a c code which multiplies vector with constant something like this;
float con=0.2;
   for (k = 0; k < N; k++) {
       for (i = 1; i <= N-2; i++)
           for (j = 1; j <= N-2; j++)
        b[i][j] = con * (a[i][j] + a[i-1][j] + a[i+1][j] + a[i][j-1] +
a[i][j+1]);


now in LLVM IR I m getting;

 %22 = fmul <64 x float> %21, <float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000,
float 0x3FC99999A0000000, float 0x3FC99999A0000000, float
0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000>

but its assembly in x86 gives;
.LCPI0_0:
.long 1045220557              # float 0.200000003

vbroadcastss zmm1, dword ptr [rip + .LCPI0_0]

vmulps zmm2, zmm2, zmm1

how does it lowered the above IR code into vbroadcastss?

What would be the pattern here to match?

I want to implement similar broadcast for vector of 64 elements.

i tried the following code;

def BROADCAST_DWORD : I<0x60, MRMSrcMem, (outs VREGG:$dst), (ins
immem:$src),
                    "BROADCAST_DWORD\t{$src, $dst|$dst, $src}",
                    [(set VREGG:$dst, (v64i32 (vbroadcast addr:$src)))],
                    IIC_MOV_MEM>, TA;

Please help me. I am stuck at this point.

Thank You
Regards
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170805/af6f09c5/attachment.html>


More information about the llvm-dev mailing list