ccf42c8dab00a24fd710ff2c900d60843b03b202
1 /****************************************************************************
2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23 * @file builder_misc.h
25 * @brief miscellaneous builder functions
29 ******************************************************************************/
33 enum class JIT_MEM_CLIENT
37 GFX_MEM_CLIENT_SAMPLER
,
38 GFX_MEM_CLIENT_SHADER
,
39 GFX_MEM_CLIENT_STREAMOUT
43 virtual Value
* OFFSET_TO_NEXT_COMPONENT(Value
* base
, Constant
* offset
);
44 void AssertMemoryUsageParams(Value
* ptr
, JIT_MEM_CLIENT usage
);
47 virtual Value
* GEP(Value
* Ptr
, Value
* Idx
, Type
* Ty
= nullptr, const Twine
& Name
= "");
48 virtual Value
* GEP(Type
* Ty
, Value
* Ptr
, Value
* Idx
, const Twine
& Name
= "");
49 virtual Value
* GEP(Value
* ptr
, const std::initializer_list
<Value
*>& indexList
, Type
* Ty
= nullptr);
51 GEP(Value
* ptr
, const std::initializer_list
<uint32_t>& indexList
, Type
* Ty
= nullptr);
53 Value
* GEPA(Value
* Ptr
, ArrayRef
<Value
*> IdxList
, const Twine
& Name
= "");
54 Value
* GEPA(Type
* Ty
, Value
* Ptr
, ArrayRef
<Value
*> IdxList
, const Twine
& Name
= "");
56 Value
* IN_BOUNDS_GEP(Value
* ptr
, const std::initializer_list
<Value
*>& indexList
);
57 Value
* IN_BOUNDS_GEP(Value
* ptr
, const std::initializer_list
<uint32_t>& indexList
);
60 LOAD(Value
* Ptr
, const char* Name
, Type
* Ty
= nullptr, JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
61 virtual LoadInst
* LOAD(Value
* Ptr
,
62 const Twine
& Name
= "",
64 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
66 LOAD(Type
* Ty
, Value
* Ptr
, const Twine
& Name
= "", JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
67 virtual LoadInst
* LOAD(Value
* Ptr
,
69 const Twine
& Name
= "",
71 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
72 virtual LoadInst
* LOAD(Value
* BasePtr
,
73 const std::initializer_list
<uint32_t>& offset
,
74 const llvm::Twine
& Name
= "",
76 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
78 virtual CallInst
* MASKED_LOAD(Value
* Ptr
,
81 Value
* PassThru
= nullptr,
82 const Twine
& Name
= "",
84 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
)
86 return IRB()->CreateMaskedLoad(Ptr
, Align
, Mask
, PassThru
, Name
);
89 virtual StoreInst
* STORE(Value
*Val
, Value
*Ptr
, bool isVolatile
= false, Type
* Ty
= nullptr, JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
)
91 return IRB()->CreateStore(Val
, Ptr
, isVolatile
);
94 virtual StoreInst
* STORE(Value
* Val
, Value
* BasePtr
, const std::initializer_list
<uint32_t>& offset
, Type
* Ty
= nullptr, JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
96 virtual CallInst
* MASKED_STORE(Value
*Val
, Value
*Ptr
, unsigned Align
, Value
*Mask
, Type
* Ty
= nullptr, JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
)
98 return IRB()->CreateMaskedStore(Val
, Ptr
, Align
, Mask
);
101 LoadInst
* LOADV(Value
* BasePtr
, const std::initializer_list
<Value
*>& offset
, const llvm::Twine
& name
= "");
102 StoreInst
* STOREV(Value
* Val
, Value
* BasePtr
, const std::initializer_list
<Value
*>& offset
);
104 Value
* MEM_ADD(Value
* i32Incr
,
106 const std::initializer_list
<uint32_t>& indices
,
107 const llvm::Twine
& name
= "");
109 void Gather4(const SWR_FORMAT format
,
113 Value
* vGatherComponents
[],
115 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
117 virtual Value
* GATHERPS(Value
* src
,
122 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
124 void GATHER4PS(const SWR_FORMAT_INFO
& info
,
128 Value
* vGatherComponents
[],
130 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
132 virtual Value
* GATHERDD(Value
* src
,
137 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
139 void GATHER4DD(const SWR_FORMAT_INFO
& info
,
143 Value
* vGatherComponents
[],
145 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
147 Value
* GATHERPD(Value
* src
, Value
* pBase
, Value
* indices
, Value
* mask
, uint8_t scale
= 1);
149 Value
* GATHER_PTR(Value
* pVecSrcPtr
, Value
* pVecMask
, Value
* pVecPassthru
);
151 virtual void SCATTERPS(Value
* pDst
,
155 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
157 void Shuffle8bpcGather4(const SWR_FORMAT_INFO
& info
,
159 Value
* vGatherOutput
[],
161 void Shuffle16bpcGather4(const SWR_FORMAT_INFO
& info
,
162 Value
* vGatherInput
[],
163 Value
* vGatherOutput
[],
166 // Static stack allocations for scatter operations
167 Value
* pScatterStackSrc
{nullptr};
168 Value
* pScatterStackOffsets
{nullptr};