24 #include <BlackBone/Process/Process.h>
25 #include "impl/RMonoTypes.h"
45 inline void AsmGenGchandleGetTargetChecked(blackbone::IAsmHelper& a, blackbone::ptr_t rawAddr,
bool x64)
49 using namespace asmjit;
50 using namespace asmjit::host;
52 auto lSkip = a->newLabel();
54 static_assert(REMOTEMONO_GCHANDLE_INVALID == 0);
57 a->xor_(a->zax, a->zax);
60 a->jecxz(a->zcx, lSkip);
63 a->mov(a->zax, rawAddr);
93 inline void AsmGenGchandleNewChecked(blackbone::IAsmHelper& a, blackbone::ptr_t rawAddr,
bool x64)
97 using namespace asmjit;
98 using namespace asmjit::host;
100 auto lSkip = a->newLabel();
102 static_assert(REMOTEMONO_GCHANDLE_INVALID == 0);
105 a->xor_(a->zax, a->zax);
108 a->jecxz(a->zcx, lSkip);
111 a->mov(a->zax, rawAddr);
113 a->xor_(a->zdx, a->zdx);
121 a->add(a->zsp, 2*
sizeof(uint32_t));
129 inline void AsmGenIsValueTypeInstance (
130 blackbone::IAsmHelper& a,
131 blackbone::ptr_t objectGetClassAddr,
132 blackbone::ptr_t classIsValuetypeAddr,
139 using namespace asmjit;
140 using namespace asmjit::host;
142 auto lSkip = a->newLabel();
145 a->xor_(a->zax, a->zax);
148 a->jecxz(a->zcx, lSkip);
153 a->mov(a->zax, objectGetClassAddr);
155 a->mov(a->zcx, a->zax);
156 a->mov(a->zax, classIsValuetypeAddr);
161 a->mov(a->zax, objectGetClassAddr);
163 a->mov(ptr(a->zsp), a->zax);
164 a->mov(a->zax, classIsValuetypeAddr);
166 a->add(a->zsp,
sizeof(uint32_t));
174 inline void AsmGenObjectUnbox (
175 blackbone::IAsmHelper& a,
176 blackbone::ptr_t objectUnboxAddr,
183 using namespace asmjit;
184 using namespace asmjit::host;
189 a->mov(a->zax, objectUnboxAddr);
195 a->mov(a->zax, objectUnboxAddr);
197 a->add(a->zsp,
sizeof(uint32_t));