mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-27 04:50:28 +00:00
Make improvements
This change progresses our AARCH64 support: - The AARCH64 build and tests are now passing - Add 128-bit floating-point support to printf() - Fix clone() so it initializes cosmo's x28 TLS register - Fix TLS memory layout issue with aarch64 _Alignas vars - Revamp microbenchmarking tools so they work on aarch64 - Make some subtle improvements to aarch64 crash reporting - Make kisdangerous() memory checks more accurate on aarch64 - Remove sys_open() since it's not available on Linux AARCH64 This change makes general improvements to Cosmo and Redbean: - Introduce GetHostIsa() function in Redbean - You can now feature check using pledge(0, 0) - You can now feature check using unveil("",0) - Refactor some more x86-specific asm comments - Refactor and write docs for some libm functions - Make the mmap() API behave more similar to Linux - Fix WIFSIGNALED() which wrongly returned true for zero - Rename some obscure cosmo keywords from noFOO to dontFOO
This commit is contained in:
parent
5655c9a4e7
commit
8f522cb702
116 changed files with 1194 additions and 1025 deletions
|
@ -27,6 +27,18 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.internal.h"
|
||||
|
||||
// Clears floating point exception status, e.g.
|
||||
//
|
||||
// feclearexcept(FE_ALL_EXCEPT);
|
||||
//
|
||||
// @param excepts may bitwise-or the following:
|
||||
// - `FE_INVALID`
|
||||
// - `FE_DIVBYZERO`
|
||||
// - `FE_OVERFLOW`
|
||||
// - `FE_UNDERFLOW`
|
||||
// - `FE_INEXACT`
|
||||
// - `FE_ALL_EXCEPT` (all of the above)
|
||||
// @return 0 on success, or nonzero on error
|
||||
feclearexcept:
|
||||
#ifdef __x86_64__
|
||||
// maintain exceptions in the sse mxcsr, clear x87 exceptions
|
||||
|
@ -53,9 +65,47 @@ feclearexcept:
|
|||
msr fpsr,x1
|
||||
mov w0,#0
|
||||
ret
|
||||
#else
|
||||
#error "unsupported architecture"
|
||||
#endif
|
||||
.endfn feclearexcept,globl
|
||||
|
||||
// Checks for floating point exception.
|
||||
//
|
||||
// This function may be used to check the thread-local
|
||||
// floating-point exception status bits, e.g.
|
||||
//
|
||||
// feclearexcept(FE_ALL_EXCEPT);
|
||||
// volatile double x = 0, y = 1 / x;
|
||||
// assert(fetestexcept(FE_ALL_EXCEPT) == FE_DIVBYZERO);
|
||||
//
|
||||
// @param excepts may bitwise-or the following:
|
||||
// - `FE_INVALID`
|
||||
// - `FE_DIVBYZERO`
|
||||
// - `FE_OVERFLOW`
|
||||
// - `FE_UNDERFLOW`
|
||||
// - `FE_INEXACT`
|
||||
// - `FE_ALL_EXCEPT` (all of the above)
|
||||
// @return mask of which exception status codes are currently set,
|
||||
// or zero if there aren't any floating point exceptions
|
||||
fetestexcept:
|
||||
#ifdef __x86_64__
|
||||
and $0x3f,%edi
|
||||
push %rax
|
||||
stmxcsr (%rsp)
|
||||
pop %rsi
|
||||
fnstsw %ax
|
||||
or %esi,%eax
|
||||
and %edi,%eax
|
||||
ret
|
||||
#elif defined(__aarch64__)
|
||||
and w0,w0,#0x1f
|
||||
mrs x1,fpsr
|
||||
and w0,w0,w1
|
||||
ret
|
||||
#endif
|
||||
.endfn fetestexcept,globl
|
||||
|
||||
feraiseexcept:
|
||||
#ifdef __x86_64__
|
||||
and $0x3f,%edi
|
||||
|
@ -159,21 +209,3 @@ fesetenv:
|
|||
ret
|
||||
#endif
|
||||
.endfn fesetenv,globl
|
||||
|
||||
fetestexcept:
|
||||
#ifdef __x86_64__
|
||||
and $0x3f,%edi
|
||||
push %rax
|
||||
stmxcsr (%rsp)
|
||||
pop %rsi
|
||||
fnstsw %ax
|
||||
or %esi,%eax
|
||||
and %edi,%eax
|
||||
ret
|
||||
#elif defined(__aarch64__)
|
||||
and w0,w0,#0x1f
|
||||
mrs x1,fpsr
|
||||
and w0,w0,w1
|
||||
ret
|
||||
#endif
|
||||
.endfn fetestexcept,globl
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue