lp_bld_type.c revision 6cf7245f6938e27c9b8a1742f27659aec017bbdc
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2009 VMware, Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **************************************************************************/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_debug.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lp_bld_type.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lp_bld_const.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lp_bld_init.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LLVMTypeRef
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_elem_type(struct gallivm_state *gallivm, struct lp_type type)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.floating) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch(type.width) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 32:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return LLVMFloatTypeInContext(gallivm->context);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 64:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return LLVMDoubleTypeInContext(gallivm->context);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assert(0);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return LLVMFloatTypeInContext(gallivm->context);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LLVMIntTypeInContext(gallivm->context, type.width);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LLVMTypeRef
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_vec_type(struct gallivm_state *gallivm,struct lp_type type)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeRef elem_type = lp_build_elem_type(gallivm, type);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.length == 1)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return elem_type;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LLVMVectorType(elem_type, type.length);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function is a mirror of lp_build_elem_type() above.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XXX: I'm not sure if it wouldn't be easier/efficient to just recreate the
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * type and check for identity.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_check_elem_type(struct lp_type type, LLVMTypeRef elem_type)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeKind elem_kind;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   assert(elem_type);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(!elem_type)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   elem_kind = LLVMGetTypeKind(elem_type);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.floating) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch(type.width) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 32:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if(elem_kind != LLVMFloatTypeKind)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return FALSE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 64:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if(elem_kind != LLVMDoubleTypeKind)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return FALSE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         assert(0);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return FALSE;
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if(elem_kind != LLVMIntegerTypeKind)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return FALSE;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if(LLVMGetIntTypeWidth(elem_type) != type.width)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return FALSE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_check_vec_type(struct lp_type type, LLVMTypeRef vec_type)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeRef elem_type;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(vec_type);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(!vec_type)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.length == 1)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return lp_check_elem_type(type, vec_type);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(LLVMGetTypeKind(vec_type) != LLVMVectorTypeKind)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(LLVMGetVectorSize(vec_type) != type.length)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   elem_type = LLVMGetElementType(vec_type);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return lp_check_elem_type(type, elem_type);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_check_value(struct lp_type type, LLVMValueRef val)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeRef vec_type;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(val);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(!val)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   vec_type = LLVMTypeOf(val);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return lp_check_vec_type(type, vec_type);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LLVMTypeRef
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_int_elem_type(struct gallivm_state *gallivm, struct lp_type type)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return LLVMIntTypeInContext(gallivm->context, type.width);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LLVMTypeRef
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_int_vec_type(struct gallivm_state *gallivm, struct lp_type type)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeRef elem_type = lp_build_int_elem_type(gallivm, type);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.length == 1)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return elem_type;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LLVMVectorType(elem_type, type.length);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build int32[4] vector type
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LLVMTypeRef
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)lp_build_int32_vec4_type(struct gallivm_state *gallivm)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct lp_type t;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   LLVMTypeRef type;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&t, 0, sizeof(t));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t.floating = FALSE; /* floating point values */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t.sign = TRUE;      /* values are signed */
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t.norm = FALSE;     /* values are not limited to [0,1] or [-1,1] */
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t.width = 32;       /* 32-bit int */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t.length = 4;       /* 4 elements per vector */
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   type = lp_build_int_elem_type(gallivm, t);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return LLVMVectorType(type, t.length);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create element of vector type
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct lp_type
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)lp_elem_type(struct lp_type type)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   struct lp_type res_type;
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(type.length > 1);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type = type;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.length = 1;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return res_type;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create unsigned integer type variation of given type.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct lp_type
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_uint_type(struct lp_type type)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct lp_type res_type;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(type.length <= LP_MAX_VECTOR_LENGTH);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&res_type, 0, sizeof res_type);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.width = type.width;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.length = type.length;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return res_type;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create signed integer type variation of given type.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct lp_type
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)lp_int_type(struct lp_type type)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct lp_type res_type;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(type.length <= LP_MAX_VECTOR_LENGTH);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&res_type, 0, sizeof res_type);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.width = type.width;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.length = type.length;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.sign = 1;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return res_type;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the type with twice the bit width (hence half the number of elements).
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct lp_type
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_wider_type(struct lp_type type)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct lp_type res_type;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memcpy(&res_type, &type, sizeof res_type);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.width *= 2;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   res_type.length /= 2;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(res_type.length);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return res_type;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the size of the LLVMType in bits.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XXX this function doesn't necessarily handle all LLVM types.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_sizeof_llvm_type(LLVMTypeRef t)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeKind k = LLVMGetTypeKind(t);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (k) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMIntegerTypeKind:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LLVMGetIntTypeWidth(t);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMFloatTypeKind:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 8 * sizeof(float);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMDoubleTypeKind:
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 8 * sizeof(double);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMVectorTypeKind:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         LLVMTypeRef elem = LLVMGetElementType(t);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unsigned len = LLVMGetVectorSize(t);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return len * lp_sizeof_llvm_type(elem);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMArrayTypeKind:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         LLVMTypeRef elem = LLVMGetElementType(t);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unsigned len = LLVMGetArrayLength(t);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return len * lp_sizeof_llvm_type(elem);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(0 && "Unexpected type in lp_get_llvm_type_size()");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return string name for a LLVMTypeKind.  Useful for debugging.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_typekind_name(LLVMTypeKind t)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (t) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMVoidTypeKind:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMVoidTypeKind";
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMFloatTypeKind:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMFloatTypeKind";
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMDoubleTypeKind:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMDoubleTypeKind";
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMX86_FP80TypeKind:
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMX86_FP80TypeKind";
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMFP128TypeKind:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMFP128TypeKind";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMPPC_FP128TypeKind:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMPPC_FP128TypeKind";
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   case LLVMLabelTypeKind:
317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return "LLVMLabelTypeKind";
318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   case LLVMIntegerTypeKind:
319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return "LLVMIntegerTypeKind";
320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   case LLVMFunctionTypeKind:
321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return "LLVMFunctionTypeKind";
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMStructTypeKind:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMStructTypeKind";
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMArrayTypeKind:
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "LLVMArrayTypeKind";
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMPointerTypeKind:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMPointerTypeKind";
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if HAVE_LLVM < 0x0300
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMOpaqueTypeKind:
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMOpaqueTypeKind";
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMVectorTypeKind:
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMVectorTypeKind";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMMetadataTypeKind:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMMetadataTypeKind";
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if HAVE_LLVM == 0x0207
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case LLVMUnionTypeKind:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "LLVMUnionTypeKind";
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "unknown LLVMTypeKind";
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print an LLVMTypeRef.  Like LLVMDumpValue().  For debugging.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_dump_llvmtype(LLVMTypeRef t)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMTypeKind k = LLVMGetTypeKind(t);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (k == LLVMVectorTypeKind) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMTypeRef te = LLVMGetElementType(t);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMTypeKind ke = LLVMGetTypeKind(te);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned len = LLVMGetVectorSize(t);
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (ke == LLVMIntegerTypeKind) {
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         unsigned b = LLVMGetIntTypeWidth(te);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         debug_printf("Vector [%u] of %u-bit Integer\n", len, b);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      else {
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         debug_printf("Vector [%u] of %s\n", len, lp_typekind_name(ke));
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   }
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   else if (k == LLVMArrayTypeKind) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMTypeRef te = LLVMGetElementType(t);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMTypeKind ke = LLVMGetTypeKind(te);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned len = LLVMGetArrayLength(t);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug_printf("Array [%u] of %s\n", len, lp_typekind_name(ke));
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (k == LLVMIntegerTypeKind) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned b = LLVMGetIntTypeWidth(t);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug_printf("%u-bit Integer\n", b);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (k == LLVMPointerTypeKind) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMTypeRef te = LLVMGetElementType(t);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug_printf("Pointer to ");
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lp_dump_llvmtype(te);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug_printf("%s\n", lp_typekind_name(k));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_context_init(struct lp_build_context *bld,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      struct gallivm_state *gallivm,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      struct lp_type type)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->gallivm = gallivm;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->type = type;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->int_elem_type = lp_build_int_elem_type(gallivm, type);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type.floating)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bld->elem_type = lp_build_elem_type(gallivm, type);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bld->elem_type = bld->int_elem_type;
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (type.length == 1) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bld->int_vec_type = bld->int_elem_type;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bld->vec_type = bld->elem_type;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   else {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bld->int_vec_type = LLVMVectorType(bld->int_elem_type, type.length);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bld->vec_type = LLVMVectorType(bld->elem_type, type.length);
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->undef = LLVMGetUndef(bld->vec_type);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->zero = LLVMConstNull(bld->vec_type);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   bld->one = lp_build_one(gallivm, type);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Count the number of instructions in a function.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lp_build_count_instructions(LLVMValueRef function)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned num_instrs = 0;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   LLVMBasicBlockRef block;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   block = LLVMGetFirstBasicBlock(function);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   while (block) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LLVMValueRef instr;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instr = LLVMGetFirstInstruction(block);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (instr) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++num_instrs;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         instr = LLVMGetNextInstruction(instr);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block = LLVMGetNextBasicBlock(block);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return num_instrs;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)