lp_bld_type.c revision 6299f241e9fdd86e705d144a42d9b1979c13f9ad
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/************************************************************************** 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Copyright 2009 VMware, Inc. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * All Rights Reserved. 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * copy of this software and associated documentation files (the 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish, 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * the following conditions: 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * The above copyright notice and this permission notice (including the 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * of the Software. 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) **************************************************************************/ 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "util/u_debug.h" 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "lp_bld_type.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "lp_bld_const.h" 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "lp_bld_init.h" 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LLVMTypeRef 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)lp_build_elem_type(struct gallivm_state *gallivm, struct lp_type type) 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles){ 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (type.floating) { 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch(type.width) { 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case 32: 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return LLVMFloatTypeInContext(gallivm->context); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case 64: 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return LLVMDoubleTypeInContext(gallivm->context); 466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) break; 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) default: 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) assert(0); 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return LLVMFloatTypeInContext(gallivm->context); 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else { 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return LLVMIntTypeInContext(gallivm->context, type.width); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciLLVMTypeRef 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccilp_build_vec_type(struct gallivm_state *gallivm,struct lp_type type) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LLVMTypeRef elem_type = lp_build_elem_type(gallivm, type); 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (type.length == 1) 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return elem_type; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return LLVMVectorType(elem_type, type.length); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * This function is a mirror of lp_build_elem_type() above. 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * XXX: I'm not sure if it wouldn't be easier/efficient to just recreate the 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * type and check for identity. 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)boolean 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)lp_check_elem_type(struct lp_type type, LLVMTypeRef elem_type) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LLVMTypeKind elem_kind; 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) assert(elem_type); 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(!elem_type) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) elem_kind = LLVMGetTypeKind(elem_type); 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (type.floating) { 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) switch(type.width) { 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case 32: 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(elem_kind != LLVMFloatTypeKind) 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return FALSE; 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) break; 926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case 64: 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(elem_kind != LLVMDoubleTypeKind) 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return FALSE; 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) default: 976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) assert(0); 986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return FALSE; 996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else { 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if(elem_kind != LLVMIntegerTypeKind) 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FALSE; 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if(LLVMGetIntTypeWidth(elem_type) != type.width) 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return FALSE; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return TRUE; 1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)boolean 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)lp_check_vec_type(struct lp_type type, LLVMTypeRef vec_type) 1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles){ 1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) LLVMTypeRef elem_type; 1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) assert(vec_type); 1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(!vec_type) 1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return FALSE; 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (type.length == 1) 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return lp_check_elem_type(type, vec_type); 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(LLVMGetTypeKind(vec_type) != LLVMVectorTypeKind) 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return FALSE; 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if(LLVMGetVectorSize(vec_type) != type.length) 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) elem_type = LLVMGetElementType(vec_type); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return lp_check_elem_type(type, elem_type); 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)boolean 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)lp_check_value(struct lp_type type, LLVMValueRef val) 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LLVMTypeRef vec_type; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) assert(val); 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if(!val) 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return FALSE; 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) vec_type = LLVMTypeOf(val); 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return lp_check_vec_type(type, vec_type); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LLVMTypeRef 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)lp_build_int_elem_type(struct gallivm_state *gallivm, struct lp_type type) 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return LLVMIntTypeInContext(gallivm->context, type.width); 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LLVMTypeRef 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)lp_build_int_vec_type(struct gallivm_state *gallivm, struct lp_type type) 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LLVMTypeRef elem_type = lp_build_int_elem_type(gallivm, type); 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (type.length == 1) 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return elem_type; 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return LLVMVectorType(elem_type, type.length); 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Build int32[4] vector type 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LLVMTypeRef 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)lp_build_int32_vec4_type(struct gallivm_state *gallivm) 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){ 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct lp_type t; 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LLVMTypeRef type; 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) memset(&t, 0, sizeof(t)); 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) t.floating = FALSE; /* floating point values */ 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) t.sign = TRUE; /* values are signed */ 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) t.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */ 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) t.width = 32; /* 32-bit int */ 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) t.length = 4; /* 4 elements per vector */ 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) type = lp_build_int_elem_type(gallivm, t); 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return LLVMVectorType(type, t.length); 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Create element of vector type 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct lp_type 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)lp_elem_type(struct lp_type type) 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct lp_type res_type; 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) assert(type.length > 1); 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) res_type = type; 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) res_type.length = 1; 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return res_type; 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Create unsigned integer type variation of given type. 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct lp_type 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)lp_uint_type(struct lp_type type) 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){ 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct lp_type res_type; 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assert(type.length <= LP_MAX_VECTOR_LENGTH); 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) memset(&res_type, 0, sizeof res_type); 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) res_type.width = type.width; 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) res_type.length = type.length; 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return res_type; 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** 2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Create signed integer type variation of given type. 2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)struct lp_type 2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)lp_int_type(struct lp_type type) 2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){ 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct lp_type res_type; 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assert(type.length <= LP_MAX_VECTOR_LENGTH); 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) memset(&res_type, 0, sizeof res_type); 2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) res_type.width = type.width; 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) res_type.length = type.length; 2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) res_type.sign = 1; 2376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return res_type; 2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)/** 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Return the type with twice the bit width (hence half the number of elements). 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)struct lp_type 2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)lp_wider_type(struct lp_type type) 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct lp_type res_type; 2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) memcpy(&res_type, &type, sizeof res_type); 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) res_type.width *= 2; 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) res_type.length /= 2; 2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assert(res_type.length); 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return res_type; 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Return the size of the LLVMType in bits. 262 * XXX this function doesn't necessarily handle all LLVM types. 263 */ 264unsigned 265lp_sizeof_llvm_type(LLVMTypeRef t) 266{ 267 LLVMTypeKind k = LLVMGetTypeKind(t); 268 269 switch (k) { 270 case LLVMIntegerTypeKind: 271 return LLVMGetIntTypeWidth(t); 272 case LLVMFloatTypeKind: 273 return 8 * sizeof(float); 274 case LLVMDoubleTypeKind: 275 return 8 * sizeof(double); 276 case LLVMVectorTypeKind: 277 { 278 LLVMTypeRef elem = LLVMGetElementType(t); 279 unsigned len = LLVMGetVectorSize(t); 280 return len * lp_sizeof_llvm_type(elem); 281 } 282 break; 283 case LLVMArrayTypeKind: 284 { 285 LLVMTypeRef elem = LLVMGetElementType(t); 286 unsigned len = LLVMGetArrayLength(t); 287 return len * lp_sizeof_llvm_type(elem); 288 } 289 break; 290 default: 291 assert(0 && "Unexpected type in lp_get_llvm_type_size()"); 292 return 0; 293 } 294} 295 296 297/** 298 * Return string name for a LLVMTypeKind. Useful for debugging. 299 */ 300const char * 301lp_typekind_name(LLVMTypeKind t) 302{ 303 switch (t) { 304 case LLVMVoidTypeKind: 305 return "LLVMVoidTypeKind"; 306 case LLVMFloatTypeKind: 307 return "LLVMFloatTypeKind"; 308 case LLVMDoubleTypeKind: 309 return "LLVMDoubleTypeKind"; 310 case LLVMX86_FP80TypeKind: 311 return "LLVMX86_FP80TypeKind"; 312 case LLVMFP128TypeKind: 313 return "LLVMFP128TypeKind"; 314 case LLVMPPC_FP128TypeKind: 315 return "LLVMPPC_FP128TypeKind"; 316 case LLVMLabelTypeKind: 317 return "LLVMLabelTypeKind"; 318 case LLVMIntegerTypeKind: 319 return "LLVMIntegerTypeKind"; 320 case LLVMFunctionTypeKind: 321 return "LLVMFunctionTypeKind"; 322 case LLVMStructTypeKind: 323 return "LLVMStructTypeKind"; 324 case LLVMArrayTypeKind: 325 return "LLVMArrayTypeKind"; 326 case LLVMPointerTypeKind: 327 return "LLVMPointerTypeKind"; 328 case LLVMOpaqueTypeKind: 329 return "LLVMOpaqueTypeKind"; 330 case LLVMVectorTypeKind: 331 return "LLVMVectorTypeKind"; 332 case LLVMMetadataTypeKind: 333 return "LLVMMetadataTypeKind"; 334 /* Only in LLVM 2.7 and later??? 335 case LLVMUnionTypeKind: 336 return "LLVMUnionTypeKind"; 337 */ 338 default: 339 return "unknown LLVMTypeKind"; 340 } 341} 342 343 344/** 345 * Print an LLVMTypeRef. Like LLVMDumpValue(). For debugging. 346 */ 347void 348lp_dump_llvmtype(LLVMTypeRef t) 349{ 350 LLVMTypeKind k = LLVMGetTypeKind(t); 351 352 if (k == LLVMVectorTypeKind) { 353 LLVMTypeRef te = LLVMGetElementType(t); 354 LLVMTypeKind ke = LLVMGetTypeKind(te); 355 unsigned len = LLVMGetVectorSize(t); 356 if (ke == LLVMIntegerTypeKind) { 357 unsigned b = LLVMGetIntTypeWidth(te); 358 debug_printf("Vector [%u] of %u-bit Integer\n", len, b); 359 } 360 else { 361 debug_printf("Vector [%u] of %s\n", len, lp_typekind_name(ke)); 362 } 363 } 364 else if (k == LLVMArrayTypeKind) { 365 LLVMTypeRef te = LLVMGetElementType(t); 366 LLVMTypeKind ke = LLVMGetTypeKind(te); 367 unsigned len = LLVMGetArrayLength(t); 368 debug_printf("Array [%u] of %s\n", len, lp_typekind_name(ke)); 369 } 370 else if (k == LLVMIntegerTypeKind) { 371 unsigned b = LLVMGetIntTypeWidth(t); 372 debug_printf("%u-bit Integer\n", b); 373 } 374 else if (k == LLVMPointerTypeKind) { 375 LLVMTypeRef te = LLVMGetElementType(t); 376 debug_printf("Pointer to "); 377 lp_dump_llvmtype(te); 378 } 379 else { 380 debug_printf("%s\n", lp_typekind_name(k)); 381 } 382} 383 384 385void 386lp_build_context_init(struct lp_build_context *bld, 387 struct gallivm_state *gallivm, 388 struct lp_type type) 389{ 390 bld->gallivm = gallivm; 391 bld->type = type; 392 393 bld->int_elem_type = lp_build_int_elem_type(gallivm, type); 394 if (type.floating) 395 bld->elem_type = lp_build_elem_type(gallivm, type); 396 else 397 bld->elem_type = bld->int_elem_type; 398 399 if (type.length == 1) { 400 bld->int_vec_type = bld->int_elem_type; 401 bld->vec_type = bld->elem_type; 402 } 403 else { 404 bld->int_vec_type = LLVMVectorType(bld->int_elem_type, type.length); 405 bld->vec_type = LLVMVectorType(bld->elem_type, type.length); 406 } 407 408 bld->undef = LLVMGetUndef(bld->vec_type); 409 bld->zero = LLVMConstNull(bld->vec_type); 410 bld->one = lp_build_one(gallivm, type); 411} 412