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