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)