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