aboutsummaryrefslogtreecommitdiffstats
path: root/test/ExecutionEngine/test-interp-vec-loadstore.ll
blob: 6819724a3cff7aeec960ecce2da47da507e43af2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
; RUN: %lli -force-interpreter=true %s | FileCheck %s
; CHECK: int test passed
; CHECK: double test passed
; CHECK: float test passed

@msg_int = internal global [17 x i8] c"int test passed\0A\00"
@msg_double = internal global [20 x i8] c"double test passed\0A\00"
@msg_float = internal global [19 x i8] c"float test passed\0A\00"

declare i32 @printf(i8*, ...)

define i32 @main() {
  %a = alloca <4 x i32>, align 16
  %b = alloca <4 x double>, align 16
  %c = alloca <4 x float>, align 16
  %pint_0 = alloca i32
  %pint_1 = alloca i32
  %pint_2 = alloca i32
  %pint_3 = alloca i32
  %pdouble_0 = alloca double
  %pdouble_1 = alloca double
  %pdouble_2 = alloca double
  %pdouble_3 = alloca double
  %pfloat_0 = alloca float
  %pfloat_1 = alloca float
  %pfloat_2 = alloca float
  %pfloat_3 = alloca float

  ; store constants 1,2,3,4 as vector
  store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16
  ; store constants 1,2,3,4 as scalars
  store i32 1, i32* %pint_0
  store i32 2, i32* %pint_1
  store i32 3, i32* %pint_2
  store i32 4, i32* %pint_3
  
  ; load stored scalars
  %val_int0 = load i32, i32* %pint_0
  %val_int1 = load i32, i32* %pint_1
  %val_int2 = load i32, i32* %pint_2
  %val_int3 = load i32, i32* %pint_3

  ; load stored vector
  %val0 = load <4 x i32> , <4 x i32> *%a, align 16

  ; extract integers from the loaded vector
  %res_i32_0 = extractelement <4 x i32> %val0, i32 0
  %res_i32_1 = extractelement <4 x i32> %val0, i32 1
  %res_i32_2 = extractelement <4 x i32> %val0, i32 2
  %res_i32_3 = extractelement <4 x i32> %val0, i32 3

  ; compare extracted data with stored constants
  %test_result_int_0 = icmp eq i32 %res_i32_0, %val_int0
  %test_result_int_1 = icmp eq i32 %res_i32_1, %val_int1
  %test_result_int_2 = icmp eq i32 %res_i32_2, %val_int2
  %test_result_int_3 = icmp eq i32 %res_i32_3, %val_int3

  %test_result_int_4 = icmp eq i32 %res_i32_0, %val_int3
  %test_result_int_5 = icmp eq i32 %res_i32_1, %val_int2
  %test_result_int_6 = icmp eq i32 %res_i32_2, %val_int1
  %test_result_int_7 = icmp eq i32 %res_i32_3, %val_int0

  ; it should be TRUE
  %A_i = or i1 %test_result_int_0, %test_result_int_4
  %B_i = or i1 %test_result_int_1, %test_result_int_5
  %C_i = or i1 %test_result_int_2, %test_result_int_6
  %D_i = or i1 %test_result_int_3, %test_result_int_7
  %E_i = and i1 %A_i, %B_i
  %F_i = and i1 %C_i, %D_i
  %res_i = and i1 %E_i, %F_i

  ; if TRUE print message
  br i1 %res_i, label %Print_int, label %Double
Print_int:
  %ptr0 = getelementptr [17 x i8], [17 x i8]* @msg_int, i32 0, i32 0
  call i32 (i8*,...)* @printf(i8* %ptr0)
  br label %Double
Double:
  store <4 x double> <double 5.0, double 6.0, double 7.0, double 8.0>, <4 x double>* %b, align 16
  ; store constants as scalars
  store double 5.0, double* %pdouble_0
  store double 6.0, double* %pdouble_1
  store double 7.0, double* %pdouble_2
  store double 8.0, double* %pdouble_3

  ; load stored vector
  %val1 = load <4 x double> , <4 x double> *%b, align 16
  ; load stored scalars
  %val_double0 = load double, double* %pdouble_0
  %val_double1 = load double, double* %pdouble_1
  %val_double2 = load double, double* %pdouble_2
  %val_double3 = load double, double* %pdouble_3

  %res_double_0 = extractelement <4 x double> %val1, i32 0
  %res_double_1 = extractelement <4 x double> %val1, i32 1
  %res_double_2 = extractelement <4 x double> %val1, i32 2
  %res_double_3 = extractelement <4 x double> %val1, i32 3

  %test_result_double_0 = fcmp oeq double %res_double_0, %val_double0
  %test_result_double_1 = fcmp oeq double %res_double_1, %val_double1
  %test_result_double_2 = fcmp oeq double %res_double_2, %val_double2
  %test_result_double_3 = fcmp oeq double %res_double_3, %val_double3

  %test_result_double_4 = fcmp oeq double %res_double_0, %val_double3
  %test_result_double_5 = fcmp oeq double %res_double_1, %val_double2
  %test_result_double_6 = fcmp oeq double %res_double_2, %val_double1
  %test_result_double_7 = fcmp oeq double %res_double_3, %val_double0

  %A_double = or i1 %test_result_double_0, %test_result_double_4
  %B_double = or i1 %test_result_double_1, %test_result_double_5
  %C_double = or i1 %test_result_double_2, %test_result_double_6
  %D_double = or i1 %test_result_double_3, %test_result_double_7
  %E_double = and i1 %A_double, %B_double
  %F_double = and i1 %C_double, %D_double
  %res_double = and i1 %E_double, %F_double

  br i1 %res_double, label %Print_double, label %Float
Print_double:
  %ptr1 = getelementptr [20 x i8], [20 x i8]* @msg_double, i32 0, i32 0
  call i32 (i8*,...)* @printf(i8* %ptr1)
  br label %Float
Float:
  store <4 x float> <float 9.0, float 10.0, float 11.0, float 12.0>, <4 x float>* %c, align 16

  store float 9.0, float* %pfloat_0
  store float 10.0, float* %pfloat_1
  store float 11.0, float* %pfloat_2
  store float 12.0, float* %pfloat_3

  ; load stored vector
  %val2 = load <4 x float> , <4 x float> *%c, align 16
  ; load stored scalars
  %val_float0 = load float, float* %pfloat_0
  %val_float1 = load float, float* %pfloat_1
  %val_float2 = load float, float* %pfloat_2
  %val_float3 = load float, float* %pfloat_3

  %res_float_0 = extractelement <4 x float> %val2, i32 0
  %res_float_1 = extractelement <4 x float> %val2, i32 1
  %res_float_2 = extractelement <4 x float> %val2, i32 2
  %res_float_3 = extractelement <4 x float> %val2, i32 3

  %test_result_float_0 = fcmp oeq float %res_float_0, %val_float0
  %test_result_float_1 = fcmp oeq float %res_float_1, %val_float1
  %test_result_float_2 = fcmp oeq float %res_float_2, %val_float2
  %test_result_float_3 = fcmp oeq float %res_float_3, %val_float3

  %test_result_float_4 = fcmp oeq float %res_float_0, %val_float3
  %test_result_float_5 = fcmp oeq float %res_float_1, %val_float2
  %test_result_float_6 = fcmp oeq float %res_float_2, %val_float1
  %test_result_float_7 = fcmp oeq float %res_float_3, %val_float0

  %A_float = or i1 %test_result_float_0, %test_result_float_4
  %B_float = or i1 %test_result_float_1, %test_result_float_5
  %C_float = or i1 %test_result_float_2, %test_result_float_6
  %D_float = or i1 %test_result_float_3, %test_result_float_7
  %E_float = and i1 %A_float, %B_float
  %F_float = and i1 %C_float, %D_float
  %res_float = and i1 %E_float, %F_float

  br i1 %res_float, label %Print_float, label %Exit
Print_float:
  %ptr2 = getelementptr [19 x i8], [19 x i8]* @msg_float, i32 0, i32 0
  call i32 (i8*,...)* @printf(i8* %ptr2)
  br label %Exit
Exit:

  ret i32 0
}