1c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca/**************************************************************************
2c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
3c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * Copyright 2009 VMware, Inc.
4c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * All Rights Reserved.
5c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
6c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * copy of this software and associated documentation files (the
8c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * "Software"), to deal in the Software without restriction, including
9c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * the following conditions:
13c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
14c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * The above copyright notice and this permission notice (including the
15c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * next paragraph) shall be included in all copies or substantial portions
16c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * of the Software.
17c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
18c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
26c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca **************************************************************************/
27c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
28c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca/**
29c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * @file
30c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * Convenient representation of SIMD types.
31c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca *
32c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
33c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca */
34c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
35c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
36c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca#ifndef LP_BLD_TYPE_H
37c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca#define LP_BLD_TYPE_H
38c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
39c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
4071c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton#include "util/u_format.h"
41c86a499769d56fc59fa41b9c2d73ac181ab33e36Brian Paul#include "pipe/p_compiler.h"
420d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h"
43c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
4436ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis#ifdef __cplusplus
4536ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazisextern "C" {
4636ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis#endif
4736ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis
483469715a8a171512cf9b528702e70393f01c6041José Fonseca/**
493469715a8a171512cf9b528702e70393f01c6041José Fonseca * Native SIMD architecture width available at runtime.
503469715a8a171512cf9b528702e70393f01c6041José Fonseca *
513469715a8a171512cf9b528702e70393f01c6041José Fonseca * Using this width should give the best performance,
523469715a8a171512cf9b528702e70393f01c6041José Fonseca * and it determines the necessary alignment of vector variables.
533469715a8a171512cf9b528702e70393f01c6041José Fonseca */
543469715a8a171512cf9b528702e70393f01c6041José Fonsecaextern unsigned lp_native_vector_width;
55c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
563469715a8a171512cf9b528702e70393f01c6041José Fonseca/**
573469715a8a171512cf9b528702e70393f01c6041José Fonseca * Maximum supported vector width (not necessarily supported at run-time).
583469715a8a171512cf9b528702e70393f01c6041José Fonseca *
593469715a8a171512cf9b528702e70393f01c6041José Fonseca * Should only be used when lp_native_vector_width isn't available,
603469715a8a171512cf9b528702e70393f01c6041José Fonseca * i.e. sizing/alignment of non-malloced variables.
613469715a8a171512cf9b528702e70393f01c6041José Fonseca */
623469715a8a171512cf9b528702e70393f01c6041José Fonseca#define LP_MAX_VECTOR_WIDTH 256
63c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
64c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca/**
653469715a8a171512cf9b528702e70393f01c6041José Fonseca * Minimum vector alignment for static variable alignment
66b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca *
673469715a8a171512cf9b528702e70393f01c6041José Fonseca * It should always be a constant equal to LP_MAX_VECTOR_WIDTH/8.  An
683469715a8a171512cf9b528702e70393f01c6041José Fonseca * expression is non-portable.
69b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca */
703469715a8a171512cf9b528702e70393f01c6041José Fonseca#define LP_MIN_VECTOR_ALIGN 32
71b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
72b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca/**
73c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * Several functions can only cope with vectors of length up to this value.
74c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * You may need to increase that value if you want to represent bigger vectors.
75c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca */
763469715a8a171512cf9b528702e70393f01c6041José Fonseca#define LP_MAX_VECTOR_LENGTH (LP_MAX_VECTOR_WIDTH/8)
77c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
78c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca/**
79c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * The LLVM type system can't conveniently express all the things we care about
80c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * on the types used for intermediate computations, such as signed vs unsigned,
81c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca * normalized values, or fixed point.
82c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca */
83b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecastruct lp_type {
84b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
85b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * Floating-point. Cannot be used with fixed. Integer numbers are
86b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * represented by this zero.
87b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
88b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned floating:1;
89b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca
90b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
91b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * Fixed-point. Cannot be used with floating. Integer numbers are
92b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * represented by this zero.
93b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
94b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned fixed:1;
95b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca
96b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
97b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * Whether it can represent negative values or not.
98b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
99b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * If this is not set for floating point, it means that all values are
100b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * assumed to be positive.
101b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
102b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned sign:1;
103b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca
104b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
105b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * Whether values are normalized to fit [0, 1] interval, or [-1, 1]
106b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * interval for signed types.
107b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
108b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * For integer types it means the representable integer range should be
109b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * interpreted as the interval above.
110b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
111b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * For floating and fixed point formats it means the values should be
112b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * clamped to the interval above.
113b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
114b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned norm:1;
115b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca
116b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
117b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * Element width.
118b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
119b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * For fixed point values, the fixed point is assumed to be at half the
120b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * width.
121b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
122b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned width:14;
123b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca
124b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   /**
1252ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul    * Vector length.  If length==1, this is a scalar (float/int) type.
126b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
127b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * width*length should be a power of two greater or equal to eight.
128b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    *
129b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    * @sa LP_MAX_VECTOR_LENGTH
130b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca    */
131b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   unsigned length:14;
132c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca};
133c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
134c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
135f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca/**
136f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca * We need most of the information here in order to correctly and efficiently
137f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca * translate an arithmetic operation into LLVM IR. Putting it here avoids the
138f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca * trouble of passing it as parameters.
139f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca */
140f081bacc25fa62888f0983e8e9658325dc835e95José Fonsecastruct lp_build_context
141f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca{
142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   struct gallivm_state *gallivm;
143efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
144f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   /**
145f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca    * This not only describes the input/output LLVM types, but also whether
146f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca    * to normalize/clamp the results.
147f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca    */
148b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca   struct lp_type type;
149f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca
1507a08dbcf55d4c959907086a5e4851e0cab0b9f67José Fonseca   /** Same as lp_build_elem_type(type) */
15121a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca   LLVMTypeRef elem_type;
15221a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca
1537a08dbcf55d4c959907086a5e4851e0cab0b9f67José Fonseca   /** Same as lp_build_vec_type(type) */
15421a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca   LLVMTypeRef vec_type;
15521a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca
1567a08dbcf55d4c959907086a5e4851e0cab0b9f67José Fonseca   /** Same as lp_build_int_elem_type(type) */
15721a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca   LLVMTypeRef int_elem_type;
15821a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca
1597a08dbcf55d4c959907086a5e4851e0cab0b9f67José Fonseca   /** Same as lp_build_int_vec_type(type) */
16021a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca   LLVMTypeRef int_vec_type;
16121a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca
16221a6bf8624b64520645bcbe6e63cf192647feadcJosé Fonseca   /** Same as lp_build_undef(type) */
163f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   LLVMValueRef undef;
164f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca
165f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   /** Same as lp_build_zero(type) */
166f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   LLVMValueRef zero;
167f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca
168f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   /** Same as lp_build_one(type) */
169f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca   LLVMValueRef one;
170f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca};
171f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca
172f081bacc25fa62888f0983e8e9658325dc835e95José Fonseca
17371c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton/**
17471c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton * Converts a format description into an lp_type.
17571c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton *
17671c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton * Only works with "array formats".
17771c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton *
17871c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton * e.g. With PIPE_FORMAT_R32G32B32A32_FLOAT returns an lp_type with float[4]
17971c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton */
180a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
18171c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Bentonlp_type_from_format_desc(struct lp_type* type, const struct util_format_description *format_desc)
18271c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton{
1839f06061d50f90bf425a5337cea1b0adb94a46d25José Fonseca   assert(format_desc->is_array);
1849f06061d50f90bf425a5337cea1b0adb94a46d25José Fonseca   assert(!format_desc->is_mixed);
18571c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton
18671c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   memset(type, 0, sizeof(struct lp_type));
18771c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->floating = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT;
18871c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->fixed    = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FIXED;
18971c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->sign     = format_desc->channel[0].type != UTIL_FORMAT_TYPE_UNSIGNED;
19071c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->norm     = format_desc->channel[0].normalized;
19171c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->width    = format_desc->channel[0].size;
19271c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   type->length   = format_desc->nr_channels;
19371c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton}
19471c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton
19571c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton
196a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
19771c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Bentonlp_type_from_format(struct lp_type* type, enum pipe_format format)
19871c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton{
19971c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton   lp_type_from_format_desc(type, util_format_description(format));
20071c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton}
20171c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton
20271c6fe76c05aa7fc1300cb13e6507abbea5a1e19James Benton
203a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned
2043469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_width(struct lp_type type)
2053469715a8a171512cf9b528702e70393f01c6041José Fonseca{
2063469715a8a171512cf9b528702e70393f01c6041José Fonseca   return type.width * type.length;
2073469715a8a171512cf9b528702e70393f01c6041José Fonseca}
2083469715a8a171512cf9b528702e70393f01c6041José Fonseca
2093469715a8a171512cf9b528702e70393f01c6041José Fonseca
2102ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create scalar float type */
211a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
212b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonsecalp_type_float(unsigned width)
213b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
214b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
215b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
216b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
217b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.floating = TRUE;
218b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.sign = TRUE;
219b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
2202ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.length = 1;
2212ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2222ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   return res_type;
2232ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul}
2242ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2252ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2262ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create vector of float type */
227a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
2283469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_float_vec(unsigned width, unsigned total_width)
2292ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul{
2302ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   struct lp_type res_type;
2312ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2322ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   memset(&res_type, 0, sizeof res_type);
2332ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.floating = TRUE;
2342ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.sign = TRUE;
2352ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.width = width;
2363469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
237b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
238b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
239b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
240b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
241b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
2422ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create scalar int type */
243a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
244b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonsecalp_type_int(unsigned width)
245b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
246b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
247b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
248b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
249b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.sign = TRUE;
250b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
2512ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.length = 1;
2522ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2532ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   return res_type;
2542ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul}
2552ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2562ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2572ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create vector int type */
258a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
2593469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_int_vec(unsigned width, unsigned total_width)
2602ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul{
2612ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   struct lp_type res_type;
2622ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2632ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   memset(&res_type, 0, sizeof res_type);
2642ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.sign = TRUE;
2652ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.width = width;
2663469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
267b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
268b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
269b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
270b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
271b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
2722ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create scalar uint type */
273a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
274b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonsecalp_type_uint(unsigned width)
275b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
276b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
277b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
278b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
279b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
2802ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.length = 1;
2812ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2822ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   return res_type;
2832ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul}
2842ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2852ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2862ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul/** Create vector uint type */
287a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
2883469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_uint_vec(unsigned width, unsigned total_width)
2892ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul{
2902ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   struct lp_type res_type;
2912ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul
2922ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   memset(&res_type, 0, sizeof res_type);
2932ccae040a458ad0f95ee46916e2ea467d5cf9d02Brian Paul   res_type.width = width;
2943469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
295b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
296b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
297b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
298b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
299b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
300a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
3013469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_unorm(unsigned width, unsigned total_width)
302b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
303b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
304b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
305b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
306b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.norm = TRUE;
307b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
3083469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
309b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
310b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
311b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
312b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
313b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
314a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
3153469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_fixed(unsigned width, unsigned total_width)
316b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
317b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
318b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
319b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
320b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.sign = TRUE;
321b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.fixed = TRUE;
322b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
3233469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
324b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
325b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
326b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
327b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
328b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
329a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
3303469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_type_ufixed(unsigned width, unsigned total_width)
331b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca{
332b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   struct lp_type res_type;
333b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
334b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   memset(&res_type, 0, sizeof res_type);
335b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.fixed = TRUE;
336b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   res_type.width = width;
3373469715a8a171512cf9b528702e70393f01c6041José Fonseca   res_type.length = total_width / width;
338b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
339b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca   return res_type;
340b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca}
341b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
342b544ab72994a7eda1e8c17fa217213ff3713dd99José Fonseca
343c87fab0008453567b45dd5e5eb7dd5d026990071José FonsecaLLVMTypeRef
344efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_elem_type(struct gallivm_state *gallivm, struct lp_type type);
345c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
346c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
347c87fab0008453567b45dd5e5eb7dd5d026990071José FonsecaLLVMTypeRef
348efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_vec_type(struct gallivm_state *gallivm, struct lp_type type);
349c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
350c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
351c87fab0008453567b45dd5e5eb7dd5d026990071José Fonsecaboolean
352b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_check_elem_type(struct lp_type type, LLVMTypeRef elem_type);
353c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
354c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
355c87fab0008453567b45dd5e5eb7dd5d026990071José Fonsecaboolean
356b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_check_vec_type(struct lp_type type, LLVMTypeRef vec_type);
357c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
358c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
359c87fab0008453567b45dd5e5eb7dd5d026990071José Fonsecaboolean
360b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_check_value(struct lp_type type, LLVMValueRef val);
361c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
362c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca
363138428badea350a20f5afc652a4fa1850e1ec653José FonsecaLLVMTypeRef
364efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_int_elem_type(struct gallivm_state *gallivm, struct lp_type type);
365138428badea350a20f5afc652a4fa1850e1ec653José Fonseca
366138428badea350a20f5afc652a4fa1850e1ec653José Fonseca
367138428badea350a20f5afc652a4fa1850e1ec653José FonsecaLLVMTypeRef
368efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_int_vec_type(struct gallivm_state *gallivm, struct lp_type type);
369138428badea350a20f5afc652a4fa1850e1ec653José Fonseca
370138428badea350a20f5afc652a4fa1850e1ec653José Fonseca
371a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
3728d93f360c582297b9ced11c234ab4bd53103a8a6José Fonsecalp_float32_vec4_type(void)
3738d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca{
3748d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   struct lp_type type;
3758d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
3768d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   memset(&type, 0, sizeof(type));
3778d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.floating = TRUE;
3788d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.sign = TRUE;
3798d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.norm = FALSE;
3808d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.width = 32;
3818d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.length = 4;
3828d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
3838d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   return type;
3848d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca}
3858d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
3868d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
387a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
3888d93f360c582297b9ced11c234ab4bd53103a8a6José Fonsecalp_int32_vec4_type(void)
3898d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca{
3908d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   struct lp_type type;
3918d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
3928d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   memset(&type, 0, sizeof(type));
3938d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.floating = FALSE;
3948d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.sign = TRUE;
3958d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.norm = FALSE;
3968d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.width = 32;
3978d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.length = 4;
3988d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
3998d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   return type;
4008d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca}
4018d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
4028d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
403a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct lp_type
4048d93f360c582297b9ced11c234ab4bd53103a8a6José Fonsecalp_unorm8_vec4_type(void)
4058d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca{
4068d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   struct lp_type type;
4078d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
4088d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   memset(&type, 0, sizeof(type));
4098d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.floating = FALSE;
4108d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.sign = FALSE;
4118d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.norm = TRUE;
4128d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.width = 8;
4138d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   type.length = 4;
4148d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
4158d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca   return type;
4168d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca}
4178d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
4188d93f360c582297b9ced11c234ab4bd53103a8a6José Fonseca
419b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecastruct lp_type
420fb94747b6639ba976aaaaba5a37aa2fe56999310Brian Paullp_elem_type(struct lp_type type);
421fb94747b6639ba976aaaaba5a37aa2fe56999310Brian Paul
422fb94747b6639ba976aaaaba5a37aa2fe56999310Brian Paul
423fb94747b6639ba976aaaaba5a37aa2fe56999310Brian Paulstruct lp_type
42438110fd1c3a6c57d1ff089d546a3456ca1a78da8Brian Paullp_uint_type(struct lp_type type);
42538110fd1c3a6c57d1ff089d546a3456ca1a78da8Brian Paul
42638110fd1c3a6c57d1ff089d546a3456ca1a78da8Brian Paul
42738110fd1c3a6c57d1ff089d546a3456ca1a78da8Brian Paulstruct lp_type
428b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_int_type(struct lp_type type);
4290c2ea2433833d5eda8a4fefe1412bf0ea40b14bfJosé Fonseca
4300c2ea2433833d5eda8a4fefe1412bf0ea40b14bfJosé Fonseca
4314458695bdafb13eba639d986e2f20953f0f7445cJosé Fonsecastruct lp_type
4324458695bdafb13eba639d986e2f20953f0f7445cJosé Fonsecalp_wider_type(struct lp_type type);
4334458695bdafb13eba639d986e2f20953f0f7445cJosé Fonseca
4344458695bdafb13eba639d986e2f20953f0f7445cJosé Fonseca
43511b7c4b1ac0093781f6631c17a5441bea0be93d4Brian Paulunsigned
43611b7c4b1ac0093781f6631c17a5441bea0be93d4Brian Paullp_sizeof_llvm_type(LLVMTypeRef t);
43711b7c4b1ac0093781f6631c17a5441bea0be93d4Brian Paul
43811b7c4b1ac0093781f6631c17a5441bea0be93d4Brian Paul
4393dcb25364fc3b8570dfe240e5b1e6fa278bf0911Brian Paulconst char *
4403dcb25364fc3b8570dfe240e5b1e6fa278bf0911Brian Paullp_typekind_name(LLVMTypeKind t);
4413dcb25364fc3b8570dfe240e5b1e6fa278bf0911Brian Paul
4423dcb25364fc3b8570dfe240e5b1e6fa278bf0911Brian Paul
4439493260fdcef4a8238b9d9a9dc3e753dd89810feJosé Fonsecavoid
44445d6289fab1aa012f265e5b51a10c2a07c85679bBrian Paullp_dump_llvmtype(LLVMTypeRef t);
44545d6289fab1aa012f265e5b51a10c2a07c85679bBrian Paul
44645d6289fab1aa012f265e5b51a10c2a07c85679bBrian Paul
44745d6289fab1aa012f265e5b51a10c2a07c85679bBrian Paulvoid
4489493260fdcef4a8238b9d9a9dc3e753dd89810feJosé Fonsecalp_build_context_init(struct lp_build_context *bld,
449efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                      struct gallivm_state *gallivm,
450b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                      struct lp_type type);
4519493260fdcef4a8238b9d9a9dc3e753dd89810feJosé Fonseca
4529493260fdcef4a8238b9d9a9dc3e753dd89810feJosé Fonseca
4536cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonsecaunsigned
4541e9cbbb1c40b3df8443877410b5d34a2f12e9ab0Roland Scheideggerlp_build_count_ir_module(LLVMModuleRef module);
4556cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca
45636ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis#ifdef __cplusplus
45736ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis}
45836ad8265489fc66ab45b9b74dafa353a93bdb03bGeorge Kyriazis#endif
4596cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca
460c87fab0008453567b45dd5e5eb7dd5d026990071José Fonseca#endif /* !LP_BLD_TYPE_H */
461