Merge remote branch 'origin/7.8'
[mesa.git] / src / gallium / auxiliary / draw / draw_llvm_translate.c
1 #include "draw_private.h"
2 #include "draw_context.h"
3
4 #include "draw_llvm.h"
5
6 #include "gallivm/lp_bld_arit.h"
7 #include "gallivm/lp_bld_interp.h"
8 #include "gallivm/lp_bld_struct.h"
9 #include "gallivm/lp_bld_type.h"
10 #include "gallivm/lp_bld_debug.h"
11
12 #include "util/u_memory.h"
13 #include "pipe/p_state.h"
14
15
16 #define DRAW_DBG 0
17
18 static LLVMValueRef
19 from_64_float(LLVMBuilderRef builder, LLVMValueRef val)
20 {
21 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
22 LLVMPointerType(LLVMDoubleType(), 0) , "");
23 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
24 return LLVMBuildFPTrunc(builder, l, LLVMFloatType(), "");
25 }
26
27 static LLVMValueRef
28 from_32_float(LLVMBuilderRef builder, LLVMValueRef val)
29 {
30 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
31 LLVMPointerType(LLVMFloatType(), 0) , "");
32 return LLVMBuildLoad(builder, bc, "");
33 }
34
35 static INLINE LLVMValueRef
36 from_8_uscaled(LLVMBuilderRef builder, LLVMValueRef val)
37 {
38 LLVMValueRef l = LLVMBuildLoad(builder, val, "");
39 return LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
40 }
41
42 static INLINE LLVMValueRef
43 from_16_uscaled(LLVMBuilderRef builder, LLVMValueRef val)
44 {
45 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
46 LLVMPointerType(LLVMIntType(16), 0) , "");
47 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
48 return LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
49 }
50
51 static INLINE LLVMValueRef
52 from_32_uscaled(LLVMBuilderRef builder, LLVMValueRef val)
53 {
54 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
55 LLVMPointerType(LLVMIntType(32), 0) , "");
56 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
57 return LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
58 }
59
60 static INLINE LLVMValueRef
61 from_8_sscaled(LLVMBuilderRef builder, LLVMValueRef val)
62 {
63 LLVMValueRef l = LLVMBuildLoad(builder, val, "");
64 return LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
65 }
66
67 static INLINE LLVMValueRef
68 from_16_sscaled(LLVMBuilderRef builder, LLVMValueRef val)
69 {
70 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
71 LLVMPointerType(LLVMIntType(16), 0) , "");
72 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
73 return LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
74 }
75
76 static INLINE LLVMValueRef
77 from_32_sscaled(LLVMBuilderRef builder, LLVMValueRef val)
78 {
79 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
80 LLVMPointerType(LLVMIntType(32), 0) , "");
81 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
82 return LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
83 }
84
85
86 static INLINE LLVMValueRef
87 from_8_unorm(LLVMBuilderRef builder, LLVMValueRef val)
88 {
89 LLVMValueRef l = LLVMBuildLoad(builder, val, "");
90 LLVMValueRef uscaled = LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
91 return LLVMBuildFDiv(builder, uscaled,
92 LLVMConstReal(LLVMFloatType(), 255.), "");
93 }
94
95 static INLINE LLVMValueRef
96 from_16_unorm(LLVMBuilderRef builder, LLVMValueRef val)
97 {
98 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
99 LLVMPointerType(LLVMIntType(16), 0) , "");
100 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
101 LLVMValueRef uscaled = LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
102 return LLVMBuildFDiv(builder, uscaled,
103 LLVMConstReal(LLVMFloatType(), 65535.), "");
104 }
105
106 static INLINE LLVMValueRef
107 from_32_unorm(LLVMBuilderRef builder, LLVMValueRef val)
108 {
109 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
110 LLVMPointerType(LLVMIntType(32), 0) , "");
111 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
112 LLVMValueRef uscaled = LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
113
114 return LLVMBuildFDiv(builder, uscaled,
115 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
116 }
117
118 static INLINE LLVMValueRef
119 from_8_snorm(LLVMBuilderRef builder, LLVMValueRef val)
120 {
121 LLVMValueRef l = LLVMBuildLoad(builder, val, "");
122 LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
123 return LLVMBuildFDiv(builder, uscaled,
124 LLVMConstReal(LLVMFloatType(), 127.0), "");
125 }
126
127 static INLINE LLVMValueRef
128 from_16_snorm(LLVMBuilderRef builder, LLVMValueRef val)
129 {
130 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
131 LLVMPointerType(LLVMIntType(16), 0) , "");
132 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
133 LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
134 return LLVMBuildFDiv(builder, uscaled,
135 LLVMConstReal(LLVMFloatType(), 32767.0f), "");
136 }
137
138 static INLINE LLVMValueRef
139 from_32_snorm(LLVMBuilderRef builder, LLVMValueRef val)
140 {
141 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
142 LLVMPointerType(LLVMIntType(32), 0) , "");
143 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
144 LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
145
146 return LLVMBuildFDiv(builder, uscaled,
147 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
148 }
149
150 static INLINE LLVMValueRef
151 from_32_fixed(LLVMBuilderRef builder, LLVMValueRef val)
152 {
153 LLVMValueRef bc = LLVMBuildBitCast(builder, val,
154 LLVMPointerType(LLVMIntType(32), 0) , "");
155 LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
156 LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
157
158 return LLVMBuildFDiv(builder, uscaled,
159 LLVMConstReal(LLVMFloatType(), 65536.0), "");
160 }
161
162 static LLVMValueRef
163 to_64_float(LLVMBuilderRef builder, LLVMValueRef fp)
164 {
165 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
166 return LLVMBuildFPExt(builder, l, LLVMDoubleType(), "");
167 }
168
169 static LLVMValueRef
170 to_32_float(LLVMBuilderRef builder, LLVMValueRef fp)
171 {
172 return LLVMBuildLoad(builder, fp, "");
173 }
174
175 static INLINE LLVMValueRef
176 to_8_uscaled(LLVMBuilderRef builder, LLVMValueRef fp)
177 {
178 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
179 return LLVMBuildFPToUI(builder, l, LLVMIntType(8), "");
180 }
181
182 static INLINE LLVMValueRef
183 to_16_uscaled(LLVMBuilderRef builder, LLVMValueRef fp)
184 {
185 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
186 return LLVMBuildFPToUI(builder, l, LLVMIntType(16), "");
187 }
188
189 static INLINE LLVMValueRef
190 to_32_uscaled(LLVMBuilderRef builder, LLVMValueRef fp)
191 {
192 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
193 return LLVMBuildFPToUI(builder, l, LLVMIntType(32), "");
194 }
195
196 static INLINE LLVMValueRef
197 to_8_sscaled(LLVMBuilderRef builder, LLVMValueRef fp)
198 {
199 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
200 return LLVMBuildFPToSI(builder, l, LLVMIntType(8), "");
201 }
202
203 static INLINE LLVMValueRef
204 to_16_sscaled(LLVMBuilderRef builder, LLVMValueRef fp)
205 {
206 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
207 return LLVMBuildFPToSI(builder, l, LLVMIntType(16), "");
208 }
209
210 static INLINE LLVMValueRef
211 to_32_sscaled(LLVMBuilderRef builder, LLVMValueRef fp)
212 {
213 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
214 return LLVMBuildFPToSI(builder, l, LLVMIntType(32), "");
215 }
216
217 static INLINE LLVMValueRef
218 to_8_unorm(LLVMBuilderRef builder, LLVMValueRef fp)
219 {
220 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
221 LLVMValueRef uscaled = LLVMBuildFPToUI(builder, l, LLVMIntType(8), "");
222 return LLVMBuildFMul(builder, uscaled,
223 LLVMConstReal(LLVMFloatType(), 255.), "");
224 }
225
226 static INLINE LLVMValueRef
227 to_16_unorm(LLVMBuilderRef builder, LLVMValueRef fp)
228 {
229 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
230 LLVMValueRef uscaled = LLVMBuildFPToUI(builder, l, LLVMIntType(32), "");
231 return LLVMBuildFMul(builder, uscaled,
232 LLVMConstReal(LLVMFloatType(), 65535.), "");
233 }
234
235 static INLINE LLVMValueRef
236 to_32_unorm(LLVMBuilderRef builder, LLVMValueRef fp)
237 {
238 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
239 LLVMValueRef uscaled = LLVMBuildFPToUI(builder, l, LLVMIntType(32), "");
240
241 return LLVMBuildFMul(builder, uscaled,
242 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
243 }
244
245 static INLINE LLVMValueRef
246 to_8_snorm(LLVMBuilderRef builder, LLVMValueRef val)
247 {
248 LLVMValueRef l = LLVMBuildLoad(builder, val, "");
249 LLVMValueRef uscaled = LLVMBuildFPToSI(builder, l, LLVMIntType(8), "");
250 return LLVMBuildFMul(builder, uscaled,
251 LLVMConstReal(LLVMFloatType(), 127.0), "");
252 }
253
254 static INLINE LLVMValueRef
255 to_16_snorm(LLVMBuilderRef builder, LLVMValueRef fp)
256 {
257 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
258 LLVMValueRef uscaled = LLVMBuildFPToSI(builder, l, LLVMIntType(16), "");
259 return LLVMBuildFMul(builder, uscaled,
260 LLVMConstReal(LLVMFloatType(), 32767.0f), "");
261 }
262
263 static INLINE LLVMValueRef
264 to_32_snorm(LLVMBuilderRef builder, LLVMValueRef fp)
265 {
266 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
267 LLVMValueRef uscaled = LLVMBuildFPToSI(builder, l, LLVMIntType(32), "");
268
269 return LLVMBuildFMul(builder, uscaled,
270 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
271 }
272
273 static INLINE LLVMValueRef
274 to_32_fixed(LLVMBuilderRef builder, LLVMValueRef fp)
275 {
276 LLVMValueRef l = LLVMBuildLoad(builder, fp, "");
277 LLVMValueRef uscaled = LLVMBuildFPToSI(builder, l, LLVMIntType(32), "");
278
279 return LLVMBuildFMul(builder, uscaled,
280 LLVMConstReal(LLVMFloatType(), 65536.0), "");
281 }
282
283 typedef LLVMValueRef (*from_func)(LLVMBuilderRef, LLVMValueRef);
284 typedef LLVMValueRef (*to_func)(LLVMBuilderRef, LLVMValueRef);
285
286 /* so that underneath can avoid function calls which are prohibited
287 * for static initialization we need this conversion */
288 enum ll_type {
289 LL_Double,
290 LL_Float,
291 LL_Int32,
292 LL_Int16,
293 LL_Int8
294 };
295
296 static INLINE LLVMTypeRef
297 ll_type_to_llvm(enum ll_type type)
298 {
299 switch (type) {
300 case LL_Double:
301 return LLVMDoubleType();
302 case LL_Float:
303 return LLVMFloatType();
304 case LL_Int32:
305 return LLVMInt32Type();
306 case LL_Int16:
307 return LLVMIntType(16);
308 case LL_Int8:
309 return LLVMIntType(8);
310 }
311 return LLVMIntType(8);
312 }
313
314 static INLINE int
315 ll_type_size(enum ll_type type)
316 {
317 switch (type) {
318 case LL_Double:
319 return 8;
320 case LL_Float:
321 return 4;
322 case LL_Int32:
323 return 4;
324 case LL_Int16:
325 return 2;
326 case LL_Int8:
327 return 1;
328 }
329 return 1;
330 }
331
332 struct draw_llvm_translate {
333 int format;
334 from_func from;
335 to_func to;
336 enum ll_type type;
337 int num_components;
338 } translates[] =
339 {
340 {PIPE_FORMAT_R64_FLOAT, from_64_float, to_64_float, LL_Double, 1},
341 {PIPE_FORMAT_R64G64_FLOAT, from_64_float, to_64_float, LL_Double, 2},
342 {PIPE_FORMAT_R64G64B64_FLOAT, from_64_float, to_64_float, LL_Double, 3},
343 {PIPE_FORMAT_R64G64B64A64_FLOAT, from_64_float, to_64_float, LL_Double, 4},
344 {PIPE_FORMAT_R32_FLOAT, from_32_float, to_32_float, LL_Float, 1},
345 {PIPE_FORMAT_R32G32_FLOAT, from_32_float, to_32_float, LL_Float, 2},
346 {PIPE_FORMAT_R32G32B32_FLOAT, from_32_float, to_32_float, LL_Float, 3},
347 {PIPE_FORMAT_R32G32B32A32_FLOAT, from_32_float, to_32_float, LL_Float, 4},
348
349 {PIPE_FORMAT_R32_UNORM, from_32_unorm, to_32_unorm, LL_Int32, 1},
350 {PIPE_FORMAT_R32G32_UNORM, from_32_unorm, to_32_unorm, LL_Int32, 2},
351 {PIPE_FORMAT_R32G32B32_UNORM, from_32_unorm, to_32_unorm, LL_Int32, 3},
352 {PIPE_FORMAT_R32G32B32A32_UNORM, from_32_unorm, to_32_unorm, LL_Int32, 4},
353
354 {PIPE_FORMAT_R32_USCALED, from_32_uscaled, to_32_uscaled, LL_Int32, 1},
355 {PIPE_FORMAT_R32G32_USCALED, from_32_uscaled, to_32_uscaled, LL_Int32, 2},
356 {PIPE_FORMAT_R32G32B32_USCALED, from_32_uscaled, to_32_uscaled, LL_Int32, 3},
357 {PIPE_FORMAT_R32G32B32A32_USCALED, from_32_uscaled, to_32_uscaled, LL_Int32, 4},
358
359 {PIPE_FORMAT_R32_SNORM, from_32_snorm, to_32_snorm, LL_Int32, 1},
360 {PIPE_FORMAT_R32G32_SNORM, from_32_snorm, to_32_snorm, LL_Int32, 2},
361 {PIPE_FORMAT_R32G32B32_SNORM, from_32_snorm, to_32_snorm, LL_Int32, 3},
362 {PIPE_FORMAT_R32G32B32A32_SNORM, from_32_snorm, to_32_snorm, LL_Int32, 4},
363
364 {PIPE_FORMAT_R32_SSCALED, from_32_sscaled, to_32_sscaled, LL_Int32, 1},
365 {PIPE_FORMAT_R32G32_SSCALED, from_32_sscaled, to_32_sscaled, LL_Int32, 2},
366 {PIPE_FORMAT_R32G32B32_SSCALED, from_32_sscaled, to_32_sscaled, LL_Int32, 3},
367 {PIPE_FORMAT_R32G32B32A32_SSCALED, from_32_sscaled, to_32_sscaled, LL_Int32, 4},
368
369 {PIPE_FORMAT_R16_UNORM, from_16_unorm, to_16_unorm, LL_Int16, 1},
370 {PIPE_FORMAT_R16G16_UNORM, from_16_unorm, to_16_unorm, LL_Int16, 2},
371 {PIPE_FORMAT_R16G16B16_UNORM, from_16_unorm, to_16_unorm, LL_Int16, 3},
372 {PIPE_FORMAT_R16G16B16A16_UNORM, from_16_unorm, to_16_unorm, LL_Int16, 4},
373
374 {PIPE_FORMAT_R16_USCALED, from_16_uscaled, to_16_uscaled, LL_Int16, 1},
375 {PIPE_FORMAT_R16G16_USCALED, from_16_uscaled, to_16_uscaled, LL_Int16, 2},
376 {PIPE_FORMAT_R16G16B16_USCALED, from_16_uscaled, to_16_uscaled, LL_Int16, 3},
377 {PIPE_FORMAT_R16G16B16A16_USCALED, from_16_uscaled, to_16_uscaled, LL_Int16, 4},
378
379 {PIPE_FORMAT_R16_SNORM, from_16_snorm, to_16_snorm, LL_Int16, 1},
380 {PIPE_FORMAT_R16G16_SNORM, from_16_snorm, to_16_snorm, LL_Int16, 2},
381 {PIPE_FORMAT_R16G16B16_SNORM, from_16_snorm, to_16_snorm, LL_Int16, 3},
382 {PIPE_FORMAT_R16G16B16A16_SNORM, from_16_snorm, to_16_snorm, LL_Int16, 4},
383
384 {PIPE_FORMAT_R16_SSCALED, from_16_sscaled, to_16_sscaled, LL_Int16, 1},
385 {PIPE_FORMAT_R16G16_SSCALED, from_16_sscaled, to_16_sscaled, LL_Int16, 2},
386 {PIPE_FORMAT_R16G16B16_SSCALED, from_16_sscaled, to_16_sscaled, LL_Int16, 3},
387 {PIPE_FORMAT_R16G16B16A16_SSCALED, from_16_sscaled, to_16_sscaled, LL_Int16, 4},
388
389 {PIPE_FORMAT_R8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 1},
390 {PIPE_FORMAT_R8G8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 2},
391 {PIPE_FORMAT_R8G8B8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 3},
392 {PIPE_FORMAT_R8G8B8A8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 4},
393
394 {PIPE_FORMAT_R8_USCALED, from_8_uscaled, to_8_uscaled, LL_Int8, 1},
395 {PIPE_FORMAT_R8G8_USCALED, from_8_uscaled, to_8_uscaled, LL_Int8, 2},
396 {PIPE_FORMAT_R8G8B8_USCALED, from_8_uscaled, to_8_uscaled, LL_Int8, 3},
397 {PIPE_FORMAT_R8G8B8A8_USCALED, from_8_uscaled, to_8_uscaled, LL_Int8, 4},
398
399 {PIPE_FORMAT_R8_SNORM, from_8_snorm, to_8_snorm, LL_Int8, 1},
400 {PIPE_FORMAT_R8G8_SNORM, from_8_snorm, to_8_snorm, LL_Int8, 2},
401 {PIPE_FORMAT_R8G8B8_SNORM, from_8_snorm, to_8_snorm, LL_Int8, 3},
402 {PIPE_FORMAT_R8G8B8A8_SNORM, from_8_snorm, to_8_snorm, LL_Int8, 4},
403
404 {PIPE_FORMAT_R8_SSCALED, from_8_sscaled, to_8_sscaled, LL_Int8, 1},
405 {PIPE_FORMAT_R8G8_SSCALED, from_8_sscaled, to_8_sscaled, LL_Int8, 2},
406 {PIPE_FORMAT_R8G8B8_SSCALED, from_8_sscaled, to_8_sscaled, LL_Int8, 3},
407 {PIPE_FORMAT_R8G8B8A8_SSCALED, from_8_sscaled, to_8_sscaled, LL_Int8, 4},
408
409 {PIPE_FORMAT_R32_FIXED, from_32_fixed, to_32_fixed, LL_Int32, 1},
410 {PIPE_FORMAT_R32G32_FIXED, from_32_fixed, to_32_fixed, LL_Int32, 2},
411 {PIPE_FORMAT_R32G32B32_FIXED, from_32_fixed, to_32_fixed, LL_Int32, 3},
412 {PIPE_FORMAT_R32G32B32A32_FIXED, from_32_fixed, to_32_fixed, LL_Int32, 4},
413
414 {PIPE_FORMAT_A8R8G8B8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 4},
415 {PIPE_FORMAT_B8G8R8A8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 4},
416 };
417
418
419 static LLVMValueRef
420 fetch(LLVMBuilderRef builder,
421 LLVMValueRef ptr, int val_size, int nr_components,
422 from_func func)
423 {
424 int i;
425 int offset = 0;
426 LLVMValueRef res = LLVMConstNull(
427 LLVMVectorType(LLVMFloatType(), 4));
428 LLVMValueRef defaults[4];
429
430 defaults[0] = LLVMConstReal(LLVMFloatType(), 0);
431 defaults[1] = LLVMConstReal(LLVMFloatType(), 0);
432 defaults[2] = LLVMConstReal(LLVMFloatType(), 0);
433 defaults[3] = LLVMConstReal(LLVMFloatType(), 1);
434
435 for (i = 0; i < nr_components; ++i) {
436 LLVMValueRef src_index = LLVMConstInt(LLVMInt32Type(), offset, 0);
437 LLVMValueRef dst_index = LLVMConstInt(LLVMInt32Type(), i, 0);
438 LLVMValueRef src_tmp;
439 LLVMValueRef component;
440
441 src_tmp = LLVMBuildGEP(builder, ptr, &src_index, 1, "src_tmp");
442
443 /* convert src_tmp to float */
444 component = func(builder, src_tmp);
445
446 /* vec.comp = component */
447 res = LLVMBuildInsertElement(builder,
448 res,
449 component,
450 dst_index, "");
451 offset += val_size;
452 }
453 for (; i < 4; ++i) {
454 LLVMValueRef dst_index = LLVMConstInt(LLVMInt32Type(), i, 0);
455 res = LLVMBuildInsertElement(builder,
456 res,
457 defaults[i],
458 dst_index, "");
459 }
460 return res;
461 }
462
463
464 LLVMValueRef
465 draw_llvm_translate_from(LLVMBuilderRef builder,
466 LLVMValueRef vbuffer,
467 enum pipe_format from_format)
468 {
469 int i;
470 for (i = 0; i < Elements(translates); ++i) {
471 if (translates[i].format == from_format) {
472 /*LLVMTypeRef type = ll_type_to_llvm(translates[i].type);*/
473 return fetch(builder,
474 vbuffer,
475 ll_type_size(translates[i].type),
476 translates[i].num_components,
477 translates[i].from);
478 }
479 }
480 return LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));
481 }