Changes between Version 2 and Version 3 of SIMDVectorExampleInLLVM


Ignore:
Timestamp:
Oct 25, 2011 5:55:08 PM (4 years ago)
Author:
pmonday
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SIMDVectorExampleInLLVM

    v2 v3  
    99To demonstrate the vector instructions, we can start with a basic C program (just to illustrate ... remember, LLVM is not functional so starting in an imperative language makes a lot of sense):
    1010{{{
    11 #include <stdio.h>
    12 #include <stdlib.h>
     11int main()
     12{
     13   float x[4], y[4], z[4];
     14   x[0] = 1.0;
     15   x[1] = 2.0;
     16   x[2] = 3.0;
     17   x[3] = 4.0;
     18   y[0] = 10.0;
     19   y[1] = 20.0;
     20   y[2] = 30.0;
     21   y[3] = 40.0;
    1322
    14 int main() {
    15  float x1, x2, x3, x4, result;
    16  x1 = 1.0;
    17  x2 = 2.0;
    18  x3 = 3.0;
    19  x4 = 4.0;
    20  result = x1 + x2 + x3 + x4;
    21  printf("result = %f\n", result);
    22 }
     23   z[0] = x[0] + y[0];
     24   z[1] = x[1] + y[1];
     25   z[2] = x[2] + y[2];
     26   z[3] = x[3] + y[3];
     27}
    2328}}}
    2429
     
    2732This converts easily to LLVM human readable format (use the [http://llvm.org/demo/index.cgi online generator] if you'd like):
    2833{{{
    29 ; ModuleID = '/tmp/webcompile/_14760_0.bc'
     34; ModuleID = '/tmp/webcompile/_20751_0.bc'
    3035target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
    3136target triple = "x86_64-unknown-linux-gnu"
    3237
    33 @.str = private unnamed_addr constant [13 x i8] c"result = %f\0A\00"
    34 
    3538define i32 @main() nounwind {
    3639  %1 = alloca i32, align 4
    37   %x1 = alloca float, align 4
    38   %x2 = alloca float, align 4
    39   %x3 = alloca float, align 4
    40   %x4 = alloca float, align 4
    41   %result = alloca float, align 4
     40  %x = alloca [4 x float], align 16
     41  %y = alloca [4 x float], align 16
     42  %z = alloca [4 x float], align 16
    4243  store i32 0, i32* %1
    43   store float 1.000000e+00, float* %x1, align 4
    44   store float 2.000000e+00, float* %x2, align 4
    45   store float 3.000000e+00, float* %x3, align 4
    46   store float 4.000000e+00, float* %x4, align 4
    47   %2 = load float* %x1, align 4
    48   %3 = load float* %x2, align 4
    49   %4 = fadd float %2, %3
    50   %5 = load float* %x3, align 4
    51   %6 = fadd float %4, %5
    52   %7 = load float* %x4, align 4
    53   %8 = fadd float %6, %7
    54   store float %8, float* %result, align 4
    55   %9 = load float* %result, align 4
    56   %10 = fpext float %9 to double
    57   %11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0), double %10)
    58   %12 = load i32* %1
    59   ret i32 %12
     44  %2 = getelementptr inbounds [4 x float]* %x, i32 0, i64 0
     45  store float 1.000000e+00, float* %2
     46  %3 = getelementptr inbounds [4 x float]* %x, i32 0, i64 1
     47  store float 2.000000e+00, float* %3
     48  %4 = getelementptr inbounds [4 x float]* %x, i32 0, i64 2
     49  store float 3.000000e+00, float* %4
     50  %5 = getelementptr inbounds [4 x float]* %x, i32 0, i64 3
     51  store float 4.000000e+00, float* %5
     52  %6 = getelementptr inbounds [4 x float]* %y, i32 0, i64 0
     53  store float 1.000000e+01, float* %6
     54  %7 = getelementptr inbounds [4 x float]* %y, i32 0, i64 1
     55  store float 2.000000e+01, float* %7
     56  %8 = getelementptr inbounds [4 x float]* %y, i32 0, i64 2
     57  store float 3.000000e+01, float* %8
     58  %9 = getelementptr inbounds [4 x float]* %y, i32 0, i64 3
     59  store float 4.000000e+01, float* %9
     60  %10 = getelementptr inbounds [4 x float]* %x, i32 0, i64 0
     61  %11 = load float* %10
     62  %12 = getelementptr inbounds [4 x float]* %y, i32 0, i64 0
     63  %13 = load float* %12
     64  %14 = fadd float %11, %13
     65  %15 = getelementptr inbounds [4 x float]* %z, i32 0, i64 0
     66  store float %14, float* %15
     67  %16 = getelementptr inbounds [4 x float]* %x, i32 0, i64 1
     68  %17 = load float* %16
     69  %18 = getelementptr inbounds [4 x float]* %y, i32 0, i64 1
     70  %19 = load float* %18
     71  %20 = fadd float %17, %19
     72  %21 = getelementptr inbounds [4 x float]* %z, i32 0, i64 1
     73  store float %20, float* %21
     74  %22 = getelementptr inbounds [4 x float]* %x, i32 0, i64 2
     75  %23 = load float* %22
     76  %24 = getelementptr inbounds [4 x float]* %y, i32 0, i64 2
     77  %25 = load float* %24
     78  %26 = fadd float %23, %25
     79  %27 = getelementptr inbounds [4 x float]* %z, i32 0, i64 2
     80  store float %26, float* %27
     81  %28 = getelementptr inbounds [4 x float]* %x, i32 0, i64 3
     82  %29 = load float* %28
     83  %30 = getelementptr inbounds [4 x float]* %y, i32 0, i64 3
     84  %31 = load float* %30
     85  %32 = fadd float %29, %31
     86  %33 = getelementptr inbounds [4 x float]* %z, i32 0, i64 3
     87  store float %32, float* %33
     88  %34 = load i32* %1
     89  ret i32 %34
    6090}
    61 
    62 declare i32 @printf(i8*, ...)
    6391}}}
    6492