164611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca/************************************************************************** 264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * Copyright 2009 VMware, Inc. 464611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * All Rights Reserved. 564611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * copy of this software and associated documentation files (the 864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * "Software"), to deal in the Software without restriction, including 964611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1064611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1164611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 1264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * the following conditions: 1364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 1464611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * The above copyright notice and this permission notice (including the 1564611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 1664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * of the Software. 1764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 1864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1964611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2064611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2164611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2464611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2564611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 2664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca **************************************************************************/ 2764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 2864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca/** 2964611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * @file 3064611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * Helper functions for constant building. 3164611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * 3264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 3364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca */ 3464611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 3564611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 3664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca#ifndef LP_BLD_CONST_H 3764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca#define LP_BLD_CONST_H 3864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 3964611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 40c86a499769d56fc59fa41b9c2d73ac181ab33e36Brian Paul#include "pipe/p_compiler.h" 410d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h" 42efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "gallivm/lp_bld_init.h" 4364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 44138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 4564611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 46ce98860012b10cc6cc124fd1ed6fa3a5e28712bbJosé Fonsecastruct lp_type; 4764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 4864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 49138428badea350a20f5afc652a4fa1850e1ec653José Fonsecaunsigned 50b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_mantissa(struct lp_type type); 5164cc71167f986f6cd29abb228295cf6441b07832José Fonseca 5264cc71167f986f6cd29abb228295cf6441b07832José Fonseca 5364cc71167f986f6cd29abb228295cf6441b07832José Fonsecaunsigned 54b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_shift(struct lp_type type); 55138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 56138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 57b441a0b658ac00a38bb41eec8b6f0e22cc3de018José Fonsecaunsigned 58b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_offset(struct lp_type type); 59b441a0b658ac00a38bb41eec8b6f0e22cc3de018José Fonseca 60b441a0b658ac00a38bb41eec8b6f0e22cc3de018José Fonseca 61138428badea350a20f5afc652a4fa1850e1ec653José Fonsecadouble 62b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_scale(struct lp_type type); 63138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 6464cc71167f986f6cd29abb228295cf6441b07832José Fonsecadouble 65b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_min(struct lp_type type); 6664cc71167f986f6cd29abb228295cf6441b07832José Fonseca 6764cc71167f986f6cd29abb228295cf6441b07832José Fonseca 6864cc71167f986f6cd29abb228295cf6441b07832José Fonsecadouble 69b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_max(struct lp_type type); 7064cc71167f986f6cd29abb228295cf6441b07832José Fonseca 71138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 7233ce51bc0d52dcfbfa481211dd1fe73a5ecb948fJosé Fonsecadouble 73b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecalp_const_eps(struct lp_type type); 7433ce51bc0d52dcfbfa481211dd1fe73a5ecb948fJosé Fonseca 7533ce51bc0d52dcfbfa481211dd1fe73a5ecb948fJosé Fonseca 7664611e086dbefa2003773ab541c0381b5713e18dJosé FonsecaLLVMValueRef 77efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_undef(struct gallivm_state *gallivm, struct lp_type type); 7864611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 7964611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 8064611e086dbefa2003773ab541c0381b5713e18dJosé FonsecaLLVMValueRef 81efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_zero(struct gallivm_state *gallivm, struct lp_type type); 8264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 8364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 8464611e086dbefa2003773ab541c0381b5713e18dJosé FonsecaLLVMValueRef 85efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_one(struct gallivm_state *gallivm, struct lp_type type); 8664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 8764611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 8864611e086dbefa2003773ab541c0381b5713e18dJosé FonsecaLLVMValueRef 89efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_elem(struct gallivm_state *gallivm, struct lp_type type, 90952d188c3c8ab90bd2919b88457c81b491fcc3c8José Fonseca double val); 91952d188c3c8ab90bd2919b88457c81b491fcc3c8José Fonseca 92952d188c3c8ab90bd2919b88457c81b491fcc3c8José FonsecaLLVMValueRef 93efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_vec(struct gallivm_state *gallivm, struct lp_type type, 94efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul double val); 95138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 96138428badea350a20f5afc652a4fa1850e1ec653José Fonseca 97138428badea350a20f5afc652a4fa1850e1ec653José FonsecaLLVMValueRef 98efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_int_vec(struct gallivm_state *gallivm, 99efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct lp_type type, long long val); 10064611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 10164611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca 1021dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé FonsecaLLVMValueRef 103efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_aos(struct gallivm_state *gallivm, struct lp_type type, 104138428badea350a20f5afc652a4fa1850e1ec653José Fonseca double r, double g, double b, double a, 105138428badea350a20f5afc652a4fa1850e1ec653José Fonseca const unsigned char *swizzle); 1061dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca 1071dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca 1081dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé FonsecaLLVMValueRef 109efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_mask_aos(struct gallivm_state *gallivm, 110efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct lp_type type, 1116ed726b8fc6210a41fe325591e1428d19f419108José Fonseca unsigned mask); 1121dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca 1131dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca 114c23fd547c060c4137eab0f878a1028c5903384ebJames BentonLLVMValueRef 115c23fd547c060c4137eab0f878a1028c5903384ebJames Bentonlp_build_const_mask_aos_swizzled(struct gallivm_state *gallivm, 116c23fd547c060c4137eab0f878a1028c5903384ebJames Benton struct lp_type type, 117c23fd547c060c4137eab0f878a1028c5903384ebJames Benton unsigned mask, 118c23fd547c060c4137eab0f878a1028c5903384ebJames Benton const unsigned char *swizzle); 119c23fd547c060c4137eab0f878a1028c5903384ebJames Benton 120c23fd547c060c4137eab0f878a1028c5903384ebJames Benton 121b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paulstatic INLINE LLVMValueRef 122efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_int32(struct gallivm_state *gallivm, int i) 123b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paul{ 124efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul return LLVMConstInt(LLVMInt32TypeInContext(gallivm->context), i, 0); 125b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paul} 126b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paul 127b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paul 128efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulstatic INLINE LLVMValueRef 129efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_const_float(struct gallivm_state *gallivm, float x) 130efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul{ 131efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul return LLVMConstReal(LLVMFloatTypeInContext(gallivm->context), x); 132efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul} 133efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 134b0636f78aa63aed2a68e86e7770c2a91c80bbb80Brian Paul 135ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul/** Return constant-valued pointer to int */ 136ee16e97ed1d0921c533c77688b278bef393d9922Brian Paulstatic INLINE LLVMValueRef 137ee16e97ed1d0921c533c77688b278bef393d9922Brian Paullp_build_const_int_pointer(struct gallivm_state *gallivm, const void *ptr) 138ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul{ 139ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul LLVMTypeRef int_type; 140ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul LLVMValueRef v; 141ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul 142ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul /* int type large enough to hold a pointer */ 143ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul int_type = LLVMIntTypeInContext(gallivm->context, 8 * sizeof(void *)); 144adaa310e399960b034aa1d7d16ab077dd964b59aVinson Lee v = LLVMConstInt(int_type, (uintptr_t) ptr, 0); 145ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul v = LLVMBuildIntToPtr(gallivm->builder, v, 146ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul LLVMPointerType(int_type, 0), 147ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul "cast int to ptr"); 148ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul return v; 149ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul} 150ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul 151ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul 1520005bd9da2b343accad423708eba36a00035c7eeJosé FonsecaLLVMValueRef 1530005bd9da2b343accad423708eba36a00035c7eeJosé Fonsecalp_build_const_string(struct gallivm_state *gallivm, 1540005bd9da2b343accad423708eba36a00035c7eeJosé Fonseca const char *str); 155ee16e97ed1d0921c533c77688b278bef393d9922Brian Paul 1566cd76b800bed70435f499c6c498a487a5056a731José Fonseca 1576cd76b800bed70435f499c6c498a487a5056a731José FonsecaLLVMValueRef 1586cd76b800bed70435f499c6c498a487a5056a731José Fonsecalp_build_const_func_pointer(struct gallivm_state *gallivm, 1596cd76b800bed70435f499c6c498a487a5056a731José Fonseca const void *ptr, 1606cd76b800bed70435f499c6c498a487a5056a731José Fonseca LLVMTypeRef ret_type, 1616cd76b800bed70435f499c6c498a487a5056a731José Fonseca LLVMTypeRef *arg_types, 1626cd76b800bed70435f499c6c498a487a5056a731José Fonseca unsigned num_args, 1636cd76b800bed70435f499c6c498a487a5056a731José Fonseca const char *name); 1646cd76b800bed70435f499c6c498a487a5056a731José Fonseca 1656cd76b800bed70435f499c6c498a487a5056a731José Fonseca 16664611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca#endif /* !LP_BLD_CONST_H */ 167