#define MCREG_Sp(mc) ((mc).sp)
#define MCREG_Pc(mc) ((mc).pc)
#define MCREG_Cpsr(mc) ((mc).pstate)
+
+
+inline
+fpsimd_context* GetNativeSigSimdContext(native_context_t *mc)
+{
+ size_t size = 0;
+
+ do
+ {
+ fpsimd_context* fp = reinterpret_cast<fpsimd_context *>(&mc->uc_mcontext.__reserved[size]);
+
+ if(fp->head.magic == FPSIMD_MAGIC)
+ {
+ _ASSERTE(fp->head.size >= sizeof(fpsimd_context));
+ _ASSERTE(size + fp->head.size <= sizeof(mc->uc_mcontext.__reserved));
+
+ return fp;
+ }
+
+ if (fp->head.size == 0)
+ {
+ break;
+ }
+
+ size += fp->head.size;
+ } while (size + sizeof(fpsimd_context) <= sizeof(mc->uc_mcontext.__reserved));
+
+ _ASSERTE(false);
+
+ return nullptr;
+}
+
+inline
+const fpsimd_context* GetConstNativeSigSimdContext(const native_context_t *mc)
+{
+ return GetNativeSigSimdContext(const_cast<native_context_t*>(mc));
+}
+
#else
// For FreeBSD, as found in x86/ucontext.h
#define MCREG_Rbp(mc) ((mc).mc_rbp)
{
FPREG_Xmm(native, i) = lpContext->FltSave.XmmRegisters[i];
}
+#elif defined(_ARM64_)
+ fpsimd_context* fp = GetNativeSigSimdContext(native);
+ if (fp)
+ {
+ fp->fpsr = lpContext->Fpsr;
+ fp->fpcr = lpContext->Fpcr;
+ for (int i = 0; i < 32; i++)
+ {
+ *(NEON128*) &fp->vregs[i] = lpContext->V[i];
+ }
+ }
#endif
}
{
lpContext->FltSave.XmmRegisters[i] = FPREG_Xmm(native, i);
}
+#elif defined(_ARM64_)
+ const fpsimd_context* fp = GetConstNativeSigSimdContext(native);
+ if (fp)
+ {
+ lpContext->Fpsr = fp->fpsr;
+ lpContext->Fpcr = fp->fpcr;
+ for (int i = 0; i < 32; i++)
+ {
+ lpContext->V[i] = *(NEON128*) &fp->vregs[i];
+ }
+ }
#endif
}