mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-04-15 04:08:47 +00:00
Workaround WSL misconfiguring the x87 FPU
This commit is contained in:
parent
f44d88707e
commit
d6ff4c754e
2 changed files with 26 additions and 19 deletions
|
@ -44,6 +44,32 @@ cosmo: push %rbp
|
||||||
mov %eax,%r12d
|
mov %eax,%r12d
|
||||||
#endif /* SYSDEBUG */
|
#endif /* SYSDEBUG */
|
||||||
|
|
||||||
|
// Windows always initializes FPU to douuble precision.
|
||||||
|
// WSL breaks Linux ABI by initializing FPU to double precision.
|
||||||
|
// This code makes long double long again.
|
||||||
|
//
|
||||||
|
// @see System V Application Binary Interface NexGen32e Architecture
|
||||||
|
// Processor Supplement, Version 1.0, December 5th, 2018
|
||||||
|
// Section 3.4.1: Initial Stack and Register State
|
||||||
|
fldcw 1f(%rip)
|
||||||
|
.rodata
|
||||||
|
.align 2
|
||||||
|
// 8087 FPU Control Word
|
||||||
|
// IM: Invalid Operation ───────────────┐
|
||||||
|
// DM: Denormal Operand ───────────────┐│
|
||||||
|
// ZM: Zero Divide ───────────────────┐││
|
||||||
|
// OM: Overflow ─────────────────────┐│││
|
||||||
|
// UM: Underflow ───────────────────┐││││
|
||||||
|
// PM: Precision ──────────────────┐│││││
|
||||||
|
// PC: Precision Control ───────┐ ││││││
|
||||||
|
// {float,∅,double,long double}│ ││││││
|
||||||
|
// RC: Rounding Control ──────┐ │ ││││││
|
||||||
|
// {even, →-∞, →+∞, →0} │┌┤ ││││││
|
||||||
|
// ┌┤││ ││││││
|
||||||
|
// d││││rr││││││
|
||||||
|
1: .short 0b00000000000000000001101111111
|
||||||
|
.previous
|
||||||
|
|
||||||
#ifdef __FAST_MATH__
|
#ifdef __FAST_MATH__
|
||||||
push %rax
|
push %rax
|
||||||
stmxcsr (%rsp)
|
stmxcsr (%rsp)
|
||||||
|
|
|
@ -76,24 +76,6 @@ static const short kConsoleModes[3] = {
|
||||||
kNtEnableVirtualTerminalProcessing,
|
kNtEnableVirtualTerminalProcessing,
|
||||||
};
|
};
|
||||||
|
|
||||||
forceinline void MakeLongDoubleLongAgain(void) {
|
|
||||||
/* 8087 FPU Control Word
|
|
||||||
IM: Invalid Operation ───────────────┐
|
|
||||||
DM: Denormal Operand ───────────────┐│
|
|
||||||
ZM: Zero Divide ───────────────────┐││
|
|
||||||
OM: Overflow ─────────────────────┐│││
|
|
||||||
UM: Underflow ───────────────────┐││││
|
|
||||||
PM: Precision ──────────────────┐│││││
|
|
||||||
PC: Precision Control ────────┐ ││││││
|
|
||||||
{float,∅,double,long double} │ ││││││
|
|
||||||
RC: Rounding Control ───────┐ │ ││││││
|
|
||||||
{even, →-∞, →+∞, →0} │┌┤ ││││││
|
|
||||||
┌┤││ ││││││
|
|
||||||
d││││rr││││││*/
|
|
||||||
int x87cw = 0b0000000000000000001101111111;
|
|
||||||
asm volatile("fldcw\t%0" : /* no outputs */ : "m"(x87cw));
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://nullprogram.com/blog/2022/02/18/
|
// https://nullprogram.com/blog/2022/02/18/
|
||||||
static inline char16_t *MyCommandLine(void) {
|
static inline char16_t *MyCommandLine(void) {
|
||||||
void *cmd;
|
void *cmd;
|
||||||
|
@ -259,7 +241,6 @@ __msabi textwindows int64_t WinMain(int64_t hInstance, int64_t hPrevInstance,
|
||||||
if (__strstr16(cmdline, u"--strace")) ++__strace;
|
if (__strstr16(cmdline, u"--strace")) ++__strace;
|
||||||
#endif
|
#endif
|
||||||
NTTRACE("WinMain()");
|
NTTRACE("WinMain()");
|
||||||
MakeLongDoubleLongAgain();
|
|
||||||
if (_weaken(WinSockInit)) _weaken(WinSockInit)();
|
if (_weaken(WinSockInit)) _weaken(WinSockInit)();
|
||||||
if (_weaken(WinMainForked)) _weaken(WinMainForked)();
|
if (_weaken(WinMainForked)) _weaken(WinMainForked)();
|
||||||
WinMainNew(cmdline);
|
WinMainNew(cmdline);
|
||||||
|
|
Loading…
Add table
Reference in a new issue