From 83ed8ebb22da6d77f8f15af43bf316bd14e93ed3 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 2 Dec 2024 10:50:21 +0100 Subject: Android Long Double handling (#2101) * [ANDROID] Try to handle LongDouble in vaarg correctly * [ANDROID] Try to enable test07 * [WRAPPED] Fixed Android long double handling (#2096) * [WRAPPED] Fixed Android long double handling * [WRAPPED] Force casting to uintptr_t * [WRAPPED] Fixed a typing issue, removed a warning in the CI --------- Co-authored-by: rajdakin --- src/libtools/myalign.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index d34e0b8e..599ce904 100644 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -123,6 +123,21 @@ void myStackAlign(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystac mystack++; memcpy(mystack, st, 16); st+=2; mystack+=2; + #elif defined(ANDROID) + // there is 128bits long double on native and x64 side + // need to align stacks to 128bits boundaries + if((((uintptr_t)mystack)&0xf)!=0) + mystack++; + if(xmm) { + memcpy(mystack, &emu->xmm[x++], 16); + st+=2; mystack+=2; + --xmm; + } else { + if((((uintptr_t)st)&0xf)!=0) + st++; + memcpy(mystack, st, 16); + st+=2; mystack+=2; + } #else // there is 128bits long double on ARM64, but they need 128bit alignment if((((uintptr_t)mystack)&0xf)!=0) @@ -366,6 +381,21 @@ void myStackAlignW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mysta mystack++; memcpy(mystack, st, 16); st+=2; mystack+=2; + #elif defined(ANDROID) + // there is 128bits long double on native and x64 side + // need to align stacks to 128bits boundaries + if((((uintptr_t)mystack)&0xf)!=0) + mystack++; + if(xmm) { + memcpy(mystack, &emu->xmm[x++], 16); + st+=2; mystack+=2; + --xmm; + } else { + if((((uintptr_t)st)&0xf)!=0) + st++; + memcpy(mystack, st, 16); + st+=2; mystack+=2; + } #else // there is 128bits long double on ARM64, but they need 128bit alignment if((((uintptr_t)mystack)&0xf)!=0) @@ -743,6 +773,20 @@ void myStackAlignValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_v mystack++; memcpy(mystack, st, 16); st+=2; mystack+=2; + #elif defined(ANDROID) + // there is 128bits long double on native and x64 side + // need to align stacks to 128bits boundaries + if((((uintptr_t)mystack)&0xf)!=0) + mystack++; + if(fprs