summaryrefslogtreecommitdiff
path: root/src/pal/src/thread/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/src/thread/context.cpp')
-rw-r--r--src/pal/src/thread/context.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/pal/src/thread/context.cpp b/src/pal/src/thread/context.cpp
index 10b2db4ed0..cd2fe41bc4 100644
--- a/src/pal/src/thread/context.cpp
+++ b/src/pal/src/thread/context.cpp
@@ -465,6 +465,27 @@ void CONTEXTToNativeContext(CONST CONTEXT *lpContext, native_context_t *native)
{
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];
+ }
+ }
+#elif defined(_ARM_)
+ VfpSigFrame* fp = GetNativeSigSimdContext(native);
+ if (fp)
+ {
+ fp->Fpscr = lpContext->Fpscr;
+ for (int i = 0; i < 32; i++)
+ {
+ fp->D[i] = lpContext->D[i];
+ }
+ }
#endif
}
@@ -563,6 +584,33 @@ void CONTEXTFromNativeContext(const native_context_t *native, LPCONTEXT lpContex
{
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];
+ }
+ }
+#elif defined(_ARM_)
+ const VfpSigFrame* fp = GetConstNativeSigSimdContext(native);
+ if (fp)
+ {
+ lpContext->Fpscr = fp->Fpscr;
+ for (int i = 0; i < 32; i++)
+ {
+ lpContext->D[i] = fp->D[i];
+ }
+ }
+ else
+ {
+ // Floating point state is not valid
+ // Mark the context correctly
+ lpContext->ContextFlags &= ~(ULONG)CONTEXT_FLOATING_POINT;
+ }
#endif
}