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 ******************************************************************************/
34 Constant
*C(uint8_t i
);
36 Constant
*C(int64_t i
);
37 Constant
*C(uint16_t i
);
38 Constant
*C(uint32_t i
);
42 Constant
*C(const std::initializer_list
<Ty
> &constList
)
44 std::vector
<Constant
*> vConsts
;
45 for(auto i
: constList
) {
47 vConsts
.push_back(C((Ty
)i
));
49 return ConstantVector::get(vConsts
);
52 Constant
*PRED(bool pred
);
53 Value
*VIMMED1(int i
);
54 Value
*VIMMED1(uint32_t i
);
55 Value
*VIMMED1(float i
);
56 Value
*VIMMED1(bool i
);
57 Value
*VUNDEF(Type
* t
);
59 #if USE_SIMD16_BUILDER
63 Value
*VUNDEF(Type
* ty
, uint32_t size
);
65 Value
*VBROADCAST(Value
*src
);
66 Value
*VRCP(Value
*va
);
67 Value
*VPLANEPS(Value
* vA
, Value
* vB
, Value
* vC
, Value
* &vX
, Value
* &vY
);
69 uint32_t IMMED(Value
* i
);
70 int32_t S_IMMED(Value
* i
);
72 Value
*GEP(Value
* ptr
, const std::initializer_list
<Value
*> &indexList
);
73 Value
*GEP(Value
* ptr
, const std::initializer_list
<uint32_t> &indexList
);
74 Value
*IN_BOUNDS_GEP(Value
* ptr
, const std::initializer_list
<Value
*> &indexList
);
75 Value
*IN_BOUNDS_GEP(Value
* ptr
, const std::initializer_list
<uint32_t> &indexList
);
77 CallInst
*CALL(Value
*Callee
, const std::initializer_list
<Value
*> &args
);
78 CallInst
*CALL(Value
*Callee
) { return CALLA(Callee
); }
79 CallInst
*CALL(Value
*Callee
, Value
* arg
);
80 CallInst
*CALL2(Value
*Callee
, Value
* arg1
, Value
* arg2
);
81 CallInst
*CALL3(Value
*Callee
, Value
* arg1
, Value
* arg2
, Value
* arg3
);
83 LoadInst
*LOAD(Value
*BasePtr
, const std::initializer_list
<uint32_t> &offset
, const llvm::Twine
& name
= "");
84 LoadInst
*LOADV(Value
*BasePtr
, const std::initializer_list
<Value
*> &offset
, const llvm::Twine
& name
= "");
85 StoreInst
*STORE(Value
*Val
, Value
*BasePtr
, const std::initializer_list
<uint32_t> &offset
);
86 StoreInst
*STOREV(Value
*Val
, Value
*BasePtr
, const std::initializer_list
<Value
*> &offset
);
88 Value
*VCMPPS_EQ(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_EQ_OQ
)); }
89 Value
*VCMPPS_LT(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_LT_OQ
)); }
90 Value
*VCMPPS_LE(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_LE_OQ
)); }
91 Value
*VCMPPS_ISNAN(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_UNORD_Q
)); }
92 Value
*VCMPPS_NEQ(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_NEQ_OQ
)); }
93 Value
*VCMPPS_GE(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_GE_OQ
)); }
94 Value
*VCMPPS_GT(Value
* a
, Value
* b
) { return VCMPPS(a
, b
, C((uint8_t)_CMP_GT_OQ
)); }
95 Value
*VCMPPS_NOTNAN(Value
* a
, Value
* b
){ return VCMPPS(a
, b
, C((uint8_t)_CMP_ORD_Q
)); }
97 Value
*MASK(Value
* vmask
);
98 Value
*VMASK(Value
* mask
);
100 //////////////////////////////////////////////////////////////////////////
101 /// @brief functions that build IR to call x86 intrinsics directly, or
102 /// emulate them with other instructions if not available on the host
103 //////////////////////////////////////////////////////////////////////////
105 #if USE_SIMD16_BUILDER
106 Value
*EXTRACT(Value
*a
, uint32_t imm
);
107 Value
*INSERT(Value
*a
, Value
*b
, uint32_t imm
);
110 Value
*MASKLOADD(Value
* src
, Value
* mask
);
112 void Gather4(const SWR_FORMAT format
, Value
* pSrcBase
, Value
* byteOffsets
,
113 Value
* mask
, Value
* vGatherComponents
[], bool bPackedOutput
);
115 Value
*GATHERPS(Value
* src
, Value
* pBase
, Value
* indices
, Value
* mask
, Value
* scale
);
116 void GATHER4PS(const SWR_FORMAT_INFO
&info
, Value
* pSrcBase
, Value
* byteOffsets
,
117 Value
* mask
, Value
* vGatherComponents
[], bool bPackedOutput
);
119 Value
*GATHERDD(Value
* src
, Value
* pBase
, Value
* indices
, Value
* mask
, Value
* scale
);
120 void GATHER4DD(const SWR_FORMAT_INFO
&info
, Value
* pSrcBase
, Value
* byteOffsets
,
121 Value
* mask
, Value
* vGatherComponents
[], bool bPackedOutput
);
123 Value
*GATHERPD(Value
* src
, Value
* pBase
, Value
* indices
, Value
* mask
, Value
* scale
);
125 void SCATTERPS(Value
* pDst
, Value
* vSrc
, Value
* vOffsets
, Value
* vMask
);
127 void Shuffle8bpcGather4(const SWR_FORMAT_INFO
&info
, Value
* vGatherInput
, Value
* vGatherOutput
[], bool bPackedOutput
);
128 void Shuffle16bpcGather4(const SWR_FORMAT_INFO
&info
, Value
* vGatherInput
[], Value
* vGatherOutput
[], bool bPackedOutput
);
130 Value
*PSHUFB(Value
* a
, Value
* b
);
131 Value
*PMOVSXBD(Value
* a
);
132 Value
*PMOVSXWD(Value
* a
);
133 Value
*PERMD(Value
* a
, Value
* idx
);
134 Value
*PERMPS(Value
* a
, Value
* idx
);
135 Value
*CVTPH2PS(Value
* a
);
136 Value
*CVTPS2PH(Value
* a
, Value
* rounding
);
137 Value
*PMAXSD(Value
* a
, Value
* b
);
138 Value
*PMINSD(Value
* a
, Value
* b
);
139 Value
*VABSPS(Value
* a
);
140 Value
*FMADDPS(Value
* a
, Value
* b
, Value
* c
);
142 // LLVM removed VPCMPGTD x86 intrinsic. This emulates that behavior
143 Value
*VPCMPGTD(Value
* a
, Value
* b
)
145 Value
* vIndexMask
= ICMP_UGT(a
,b
);
147 // need to set the high bit for x86 intrinsic masks
148 return S_EXT(vIndexMask
,VectorType::get(mInt32Ty
,JM()->mVWidth
));
151 Value
*ICLAMP(Value
* src
, Value
* low
, Value
* high
);
152 Value
*FCLAMP(Value
* src
, Value
* low
, Value
* high
);
153 Value
*FCLAMP(Value
* src
, float low
, float high
);
155 CallInst
*PRINT(const std::string
&printStr
);
156 CallInst
*PRINT(const std::string
&printStr
,const std::initializer_list
<Value
*> &printArgs
);
158 void STACKRESTORE(Value
* pSaved
);
160 Value
* POPCNT(Value
* a
);
163 Value
* INT3() { return DEBUGTRAP(); }
166 Value
*VEXTRACTI128(Value
* a
, Constant
* imm8
);
167 Value
*VINSERTI128(Value
* a
, Value
* b
, Constant
* imm8
);
169 // rdtsc buckets macros
170 void RDTSC_START(Value
* pBucketMgr
, Value
* pId
);
171 void RDTSC_STOP(Value
* pBucketMgr
, Value
* pId
);
173 Value
* CreateEntryAlloca(Function
* pFunc
, Type
* pType
);
174 Value
* CreateEntryAlloca(Function
* pFunc
, Type
* pType
, Value
* pArraySize
);
176 // Static stack allocations for scatter operations
177 Value
* pScatterStackSrc
{ nullptr };
178 Value
* pScatterStackOffsets
{ nullptr };
181 uint32_t GetTypeSize(Type
* pType
);