diff options
Diffstat (limited to 'src/pal/src/thread/context.cpp')
-rw-r--r-- | src/pal/src/thread/context.cpp | 48 |
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 } |