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