1 /****************************************************************************
2 * Copyright (C) 2014-2018 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_gfx_mem.h
25 * @brief Definition of the builder to support different translation types for gfx memory access
29 ******************************************************************************/
38 class BuilderGfxMem
: public Builder
41 BuilderGfxMem(JitManager
* pJitMgr
);
42 virtual ~BuilderGfxMem() {}
44 virtual Value
* GEP(Value
* Ptr
, Value
* Idx
, Type
* Ty
= nullptr, const Twine
& Name
= "");
45 virtual Value
* GEP(Type
* Ty
, Value
* Ptr
, Value
* Idx
, const Twine
& Name
= "");
47 GEP(Value
* Ptr
, const std::initializer_list
<Value
*>& indexList
, Type
* Ty
= nullptr);
49 GEP(Value
* Ptr
, const std::initializer_list
<uint32_t>& indexList
, Type
* Ty
= nullptr);
51 virtual LoadInst
* LOAD(Value
* Ptr
,
54 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
55 virtual LoadInst
* LOAD(Value
* Ptr
,
56 const Twine
& Name
= "",
58 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
59 virtual LoadInst
* LOAD(Value
* Ptr
,
61 const Twine
& Name
= "",
63 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
64 virtual LoadInst
* LOAD(Value
* BasePtr
,
65 const std::initializer_list
<uint32_t>& offset
,
66 const llvm::Twine
& Name
= "",
68 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
70 virtual CallInst
* MASKED_LOAD(Value
* Ptr
,
73 Value
* PassThru
= nullptr,
74 const Twine
& Name
= "",
76 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
78 virtual StoreInst
* STORE(Value
*Val
, Value
*Ptr
, bool isVolatile
= false, Type
* Ty
= nullptr, MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
80 virtual StoreInst
* STORE(Value
* Val
, Value
* BasePtr
, const std::initializer_list
<uint32_t>& offset
, Type
* Ty
= nullptr, MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
82 virtual CallInst
* MASKED_STORE(Value
*Val
, Value
*Ptr
, unsigned Align
, Value
*Mask
, Type
* Ty
= nullptr, MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
84 virtual Value
* GATHERPS(Value
* src
,
89 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
90 virtual Value
* GATHERDD(Value
* src
,
95 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
97 virtual void SCATTERPS(Value
* pDst
,
101 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
103 Value
* TranslateGfxAddressForRead(Value
* xpGfxAddress
,
104 Type
* PtrTy
= nullptr,
105 const Twine
& Name
= "",
106 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
107 Value
* TranslateGfxAddressForWrite(Value
* xpGfxAddress
,
108 Type
* PtrTy
= nullptr,
109 const Twine
& Name
= "",
110 MEM_CLIENT usage
= MEM_CLIENT::MEM_CLIENT_INTERNAL
);
113 void AssertGFXMemoryParams(Value
* ptr
, MEM_CLIENT usage
);
115 virtual void NotifyPrivateContextSet();
117 virtual Value
* OFFSET_TO_NEXT_COMPONENT(Value
* base
, Constant
* offset
);
119 Value
* TranslationHelper(Value
* Ptr
, Type
* Ty
);
120 void TrackerHelper(Value
* Ptr
, Type
* Ty
, MEM_CLIENT usage
, bool isRead
);
122 FunctionType
* GetTranslationFunctionType() { return mpTranslationFuncTy
; }
123 Value
* GetTranslationFunctionForRead() { return mpfnTranslateGfxAddressForRead
; }
124 Value
* GetTranslationFunctionForWrite() { return mpfnTranslateGfxAddressForWrite
; }
125 Value
* GetParamSimDC() { return mpParamSimDC
; }
130 FunctionType
* mpTranslationFuncTy
;
131 Value
* mpfnTranslateGfxAddressForRead
;
132 Value
* mpfnTranslateGfxAddressForWrite
;
134 FunctionType
* mpTrackMemAccessFuncTy
;
135 Value
* mpfnTrackMemAccess
;
137 } // namespace SwrJit