Changes between Version 2 and Version 3 of SIMDVectorExampleInLLVM


Ignore:
Timestamp:
Oct 25, 2011 5:55:08 PM (2 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