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 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
55 virtual LoadInst
* LOAD(Value
* Ptr
,
56 const Twine
& Name
= "",
58 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
59 virtual LoadInst
* LOAD(Value
* Ptr
,
61 const Twine
& Name
= "",
63 JIT_MEM_CLIENT usage
= JIT_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 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
71 virtual CallInst
* MASKED_LOAD(Value
* Ptr
,
74 Value
* PassThru
= nullptr,
75 const Twine
& Name
= "",
77 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
79 virtual StoreInst
* STORE(Value
*Val
, Value
*Ptr
, bool isVolatile
= false, Type
* Ty
= nullptr, JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
81 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
);
83 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
);
85 virtual Value
* GATHERPS(Value
* src
,
90 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
91 virtual Value
* GATHERDD(Value
* src
,
96 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
98 virtual void SCATTERPS(Value
* pDst
,
102 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
105 Value
* TranslateGfxAddressForRead(Value
* xpGfxAddress
,
106 Type
* PtrTy
= nullptr,
107 const Twine
& Name
= "",
108 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
109 Value
* TranslateGfxAddressForWrite(Value
* xpGfxAddress
,
110 Type
* PtrTy
= nullptr,
111 const Twine
& Name
= "",
112 JIT_MEM_CLIENT usage
= JIT_MEM_CLIENT::MEM_CLIENT_INTERNAL
);
116 void AssertGFXMemoryParams(Value
* ptr
, Builder::JIT_MEM_CLIENT usage
);
118 virtual void NotifyPrivateContextSet();
120 virtual Value
* OFFSET_TO_NEXT_COMPONENT(Value
* base
, Constant
* offset
);
122 Value
* TranslationHelper(Value
* Ptr
, Type
* Ty
);
123 void TrackerHelper(Value
* Ptr
, Type
* Ty
, JIT_MEM_CLIENT usage
, bool isRead
);
126 FunctionType
* GetTranslationFunctionType() { return mpTranslationFuncTy
; }
127 Value
* GetTranslationFunctionForRead() { return mpfnTranslateGfxAddressForRead
; }
128 Value
* GetTranslationFunctionForWrite() { return mpfnTranslateGfxAddressForWrite
; }
129 Value
* GetParamSimDC() { return mpParamSimDC
; }
135 FunctionType
* mpTranslationFuncTy
;
136 Value
* mpfnTranslateGfxAddressForRead
;
137 Value
* mpfnTranslateGfxAddressForWrite
;
139 FunctionType
* mpTrackMemAccessFuncTy
;
140 Value
* mpfnTrackMemAccess
;
142 } // namespace SwrJit