Merge remote-tracking branch 'upstream/master' into 'main'

Change-Id: I8929be69e78e964b1c6e57e171eb70a09095d756
diff --git a/OWNERS b/OWNERS
index 670f88d..3818b1d 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,6 +1,7 @@
 enh@google.com
 
 cferris@google.com
+chiahungduan@google.com
 danalbert@google.com
 rprichard@google.com
 yabinc@google.com
diff --git a/README.md b/README.md
index 85c8190..8d8e583 100644
--- a/README.md
+++ b/README.md
@@ -246,6 +246,7 @@
 
 ### Debugging tips
 1. Key error for a new codename in libc/libc.map.txt
+
 e.g. what you add in libc/libc.map.txt is:
 
 ```
@@ -271,6 +272,7 @@
 Solution: Ask in the team and wait for the update.
 
 2. Use of undeclared identifier of the new system call in the test
+
 Possible Solution: Check everything ready in the files mentioned above first.
 Maybe glibc matters. Follow the example and try #if defined(__GLIBC__).
 
@@ -323,7 +325,7 @@
 
 Note that we use our own custom gtest runner that offers a superset of the
 options documented at
-<https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#running-test-programs-advanced-options>,
+<https://github.com/google/googletest/blob/main/docs/advanced.md#running-test-programs-advanced-options>,
 in particular for test isolation and parallelism (both on by default).
 
 ### Device tests via CTS
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 18e8bbc..f56e16a 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -83,5 +83,10 @@
     {
       "name": "toybox-tests"
     }
+  ],
+  "kernel-presubmit": [
+    {
+      "name": "CtsBionicTestCases"
+    }
   ]
 }
diff --git a/android-changes-for-ndk-developers.md b/android-changes-for-ndk-developers.md
index 13c8911..8ffd96f 100644
--- a/android-changes-for-ndk-developers.md
+++ b/android-changes-for-ndk-developers.md
@@ -107,7 +107,7 @@
 ## Correct soname/path handling (Available in API level >= 23)
 
 The dynamic linker now understands the difference
-between a library’s soname and its path  (public bug
+between a library’s soname and its path (public bug
 https://code.google.com/p/android/issues/detail?id=6670). API level 23
 is the first release where search by soname is implemented. Earlier
 releases would assume that the basename of the library was the soname,
@@ -326,12 +326,12 @@
 
 ## Missing SONAME (Enforced for API level >= 23)
 
-Each ELF shared object (“native library”) must have a SONAME (Shared
-Object Name) attribute. The NDK toolchain adds this attribute by default,
-so its absence indicates either a misconfigured alternative toolchain
-or a misconfiguration in your build system. A missing SONAME may lead
-to runtime issues such as the wrong library being loaded: the filename
-is used instead when this attribute is missing.
+Each ELF shared object (“native library”) must have a SONAME
+(Shared Object Name) attribute. The NDK build systems add this
+attribute by default, so its absence (or an incorrect soname) indicates
+a misconfiguration in your build system. A missing SONAME may lead to
+runtime issues such as the wrong library being loaded: the filename is
+used instead when this attribute is missing.
 
 ```
 $ readelf --dynamic libWithSoName.so | grep SONAME
@@ -346,7 +346,7 @@
 *Resolution*: the current NDK generates the correct SONAME by
 default. Ensure you're using the current NDK and that you haven't
 configured your build system to generate incorrect SONAME entries (using
-the -soname linker option).
+the `-soname` linker option).
 
 ## `__register_atfork` (Available in API level >= 23)
 
@@ -475,3 +475,7 @@
 There are no plans to remove support for ELF files using the older
 OS private use constants for RELR, nor for ELF files using packed
 relocations.
+
+You can read more about relative relocations
+and their long and complicated history at
+https://maskray.me/blog/2021-10-31-relative-relocations-and-relr.
diff --git a/apex/Android.bp b/apex/Android.bp
index 90a14b2..6201ad1 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -41,6 +41,11 @@
         "libc_malloc_debug",
         "libc_malloc_hooks",
     ],
+    arch: {
+        arm64: {
+            native_shared_libs: ["libc_hwasan", "libclang_rt.hwasan"],
+        },
+    },
     binaries: [
         "linkerconfig",
     ],
diff --git a/benchmarks/Android.bp b/benchmarks/Android.bp
index 5dfc38f..17d2d68 100644
--- a/benchmarks/Android.bp
+++ b/benchmarks/Android.bp
@@ -156,3 +156,23 @@
     ],
     data: ["test_suites/*"],
 }
+
+cc_binary {
+    name: "malloc-rss-benchmark",
+    srcs: [
+        "malloc_rss_benchmark.cpp",
+    ],
+
+    shared_libs: [
+        "libbase",
+    ],
+
+    target: {
+        android: {
+            static_libs: [
+                "libmeminfo",
+                "libprocinfo",
+            ],
+        },
+    },
+}
diff --git a/benchmarks/NOTICE b/benchmarks/NOTICE
index f720e23..e46a624 100644
--- a/benchmarks/NOTICE
+++ b/benchmarks/NOTICE
@@ -178,3 +178,31 @@
 
 -------------------------------------------------------------------
 
+Copyright (C) 2022 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
diff --git a/benchmarks/linker_relocation/include/linker_reloc_bench_asm.h b/benchmarks/linker_relocation/include/linker_reloc_bench_asm.h
index 2ff3d81..885e47f 100644
--- a/benchmarks/linker_relocation/include/linker_reloc_bench_asm.h
+++ b/benchmarks/linker_relocation/include/linker_reloc_bench_asm.h
@@ -42,6 +42,15 @@
 #define DATA_WORD(val) .quad val
 #define MAIN .globl main; main: mov w0, wzr; ret
 
+#elif defined(__riscv)
+
+// No `lga` in clang unless https://reviews.llvm.org/D107278 lands.
+// `la` is equivalent when using PIC (which we do) though.
+#define GOT_RELOC(sym) la a0, sym
+#define CALL(sym) call sym@plt
+#define DATA_WORD(val) .quad val
+#define MAIN .globl main; main: li a0, 0; ret
+
 #elif defined(__i386__)
 
 #define GOT_RELOC(sym) .long sym@got
diff --git a/benchmarks/malloc_benchmark.cpp b/benchmarks/malloc_benchmark.cpp
index 18ba523..e733cd0 100644
--- a/benchmarks/malloc_benchmark.cpp
+++ b/benchmarks/malloc_benchmark.cpp
@@ -36,11 +36,11 @@
 
 #if defined(__BIONIC__)
 
-static void BM_mallopt_purge(benchmark::State& state) {
+static void RunMalloptPurge(benchmark::State& state, int purge_value) {
   static size_t sizes[] = {8, 16, 32, 64, 128, 1024, 4096, 16384, 65536, 131072, 1048576};
   static int pagesize = getpagesize();
   mallopt(M_DECAY_TIME, 1);
-  mallopt(M_PURGE, 0);
+  mallopt(M_PURGE_ALL, 0);
   for (auto _ : state) {
     state.PauseTiming();
     std::vector<void*> ptrs;
@@ -63,10 +63,19 @@
     ptrs.clear();
     state.ResumeTiming();
 
-    mallopt(M_PURGE, 0);
+    mallopt(purge_value, 0);
   }
   mallopt(M_DECAY_TIME, 0);
 }
+
+static void BM_mallopt_purge(benchmark::State& state) {
+  RunMalloptPurge(state, M_PURGE);
+}
 BIONIC_BENCHMARK(BM_mallopt_purge);
 
+static void BM_mallopt_purge_all(benchmark::State& state) {
+  RunMalloptPurge(state, M_PURGE_ALL);
+}
+BIONIC_BENCHMARK(BM_mallopt_purge_all);
+
 #endif
diff --git a/benchmarks/malloc_map_benchmark.cpp b/benchmarks/malloc_map_benchmark.cpp
index ba4d62c..5757325 100644
--- a/benchmarks/malloc_map_benchmark.cpp
+++ b/benchmarks/malloc_map_benchmark.cpp
@@ -69,7 +69,7 @@
   for (auto _ : state) {
 #if defined(__BIONIC__)
     state.PauseTiming();
-    mallopt(M_PURGE, 0);
+    mallopt(M_PURGE_ALL, 0);
     uint64_t rss_bytes_before = 0;
     Gather(&rss_bytes_before);
     state.ResumeTiming();
@@ -80,7 +80,7 @@
     }
 #if defined(__BIONIC__)
     state.PauseTiming();
-    mallopt(M_PURGE, 0);
+    mallopt(M_PURGE_ALL, 0);
     Gather(&rss_bytes);
     // Try and record only the memory used in the map.
     rss_bytes -= rss_bytes_before;
diff --git a/benchmarks/malloc_rss_benchmark.cpp b/benchmarks/malloc_rss_benchmark.cpp
new file mode 100644
index 0000000..4b34e72
--- /dev/null
+++ b/benchmarks/malloc_rss_benchmark.cpp
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <malloc.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <algorithm>
+#include <chrono>
+#include <iostream>
+#include <memory>
+#include <random>
+#include <thread>
+#include <vector>
+
+#include <android-base/strings.h>
+#if defined(__BIONIC__)
+#include <malloc.h>
+#include <meminfo/procmeminfo.h>
+#include <procinfo/process_map.h>
+#endif
+
+constexpr size_t kMaxThreads = 8;
+// The max number of bytes that can be allocated by a thread. Note that each
+// allocator may have its own limitation on each size allocation. For example,
+// Scudo has a 256 MB limit for each size-class in the primary allocator. The
+// amount of memory allocated should not exceed the limit in each allocator.
+constexpr size_t kMaxBytes = 1 << 24;
+constexpr size_t kMaxLen = kMaxBytes;
+void* MemPool[kMaxThreads][kMaxLen];
+
+void dirtyMem(void* ptr, size_t bytes) {
+  memset(ptr, 1U, bytes);
+}
+
+void ThreadTask(int id, size_t allocSize) {
+  // In the following, we will first allocate blocks with kMaxBytes of memory
+  // and release all of them in random order. In the end, we will do another
+  // round of allocations until it reaches 1/10 kMaxBytes.
+
+  // Total number of blocks
+  const size_t maxCounts = kMaxBytes / allocSize;
+  // The number of blocks in the end
+  const size_t finalCounts = maxCounts / 10;
+
+  for (size_t i = 0; i < maxCounts; ++i) {
+    MemPool[id][i] = malloc(allocSize);
+    if (MemPool[id][i] == 0) {
+      std::cout << "Allocation failure."
+                   "Please consider reducing the number of threads"
+                << std::endl;
+      exit(1);
+    }
+    dirtyMem(MemPool[id][i], allocSize);
+  }
+
+  // Each allocator may apply different strategies to manage the free blocks and
+  // each strategy may have different impacts on future memory usage. For
+  // example, managing free blocks in simple FIFO list may have its memory usage
+  // highly correlated with the blocks releasing pattern. Therefore, release the
+  // blocks in random order to observe the impact of free blocks handling.
+  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
+  std::shuffle(MemPool[id], MemPool[id] + maxCounts, std::default_random_engine(seed));
+  for (size_t i = 0; i < maxCounts; ++i) {
+    free(MemPool[id][i]);
+    MemPool[id][i] = nullptr;
+  }
+
+  for (size_t i = 0; i < finalCounts; ++i) {
+    MemPool[id][i] = malloc(allocSize);
+    dirtyMem(MemPool[id][i], allocSize);
+  }
+}
+
+void StressSizeClass(size_t numThreads, size_t allocSize) {
+  // We would like to see the minimum memory usage under aggressive page
+  // releasing.
+  mallopt(M_DECAY_TIME, 0);
+
+  std::thread* threads[kMaxThreads];
+  for (size_t i = 0; i < numThreads; ++i) threads[i] = new std::thread(ThreadTask, i, allocSize);
+
+  for (size_t i = 0; i < numThreads; ++i) {
+    threads[i]->join();
+    delete threads[i];
+  }
+
+  // Do an explicit purge to ensure we will be more likely to get the actual
+  // in-use memory.
+  mallopt(M_PURGE_ALL, 0);
+
+  android::meminfo::ProcMemInfo proc_mem(getpid());
+  const std::vector<android::meminfo::Vma>& maps = proc_mem.MapsWithoutUsageStats();
+  uint64_t rss_bytes = 0;
+  uint64_t vss_bytes = 0;
+
+  for (auto& vma : maps) {
+    if (vma.name == "[anon:libc_malloc]" || android::base::StartsWith(vma.name, "[anon:scudo:") ||
+        android::base::StartsWith(vma.name, "[anon:GWP-ASan")) {
+      android::meminfo::Vma update_vma(vma);
+      if (!proc_mem.FillInVmaStats(update_vma)) {
+        std::cout << "Failed to parse VMA" << std::endl;
+        exit(1);
+      }
+      rss_bytes += update_vma.usage.rss;
+      vss_bytes += update_vma.usage.vss;
+    }
+  }
+
+  std::cout << "RSS: " << rss_bytes / (1024.0 * 1024.0) << " MB" << std::endl;
+  std::cout << "VSS: " << vss_bytes / (1024.0 * 1024.0) << " MB" << std::endl;
+
+  for (size_t i = 0; i < numThreads; ++i) {
+    for (size_t j = 0; j < kMaxLen; ++j) free(MemPool[i][j]);
+  }
+}
+
+int main(int argc, char* argv[]) {
+  if (argc != 3) {
+    std::cerr << "usage: " << argv[0] << " $NUM_THREADS $ALLOC_SIZE" << std::endl;
+    return 1;
+  }
+
+  size_t numThreads = atoi(argv[1]);
+  size_t allocSize = atoi(argv[2]);
+
+  if (numThreads == 0 || allocSize == 0) {
+    std::cerr << "Please provide valid $NUM_THREADS and $ALLOC_SIZE" << std::endl;
+    return 1;
+  }
+
+  if (numThreads > kMaxThreads) {
+    std::cerr << "The max number of threads is " << kMaxThreads << std::endl;
+    return 1;
+  }
+
+  StressSizeClass(numThreads, allocSize);
+
+  return 0;
+}
diff --git a/docs/elf-tls.md b/docs/elf-tls.md
index 4a62793..d408b3f 100644
--- a/docs/elf-tls.md
+++ b/docs/elf-tls.md
@@ -101,9 +101,9 @@
 `R_TLS_DTPOFF` is a dynamic relocation to the offset of `tls_var` within its module's `PT_TLS`
 segment.
 
-`__tls_get_addr` looks up `TlsIndex::module`'s entry in the DTV and adds `TlsIndex::offset` to the
-module's TLS block. Before it can do this, it ensures that the module's TLS block is allocated. A
-simple approach is to allocate memory lazily:
+`__tls_get_addr` looks up `TlsIndex::module_id`'s entry in the DTV and adds `TlsIndex::offset` to
+the module's TLS block. Before it can do this, it ensures that the module's TLS block is allocated.
+A simple approach is to allocate memory lazily:
 
 1. If the current thread's DTV generation count is less than the current global TLS generation, then
    `__tls_get_addr` may reallocate the DTV or free blocks for unloaded modules.
diff --git a/docs/status.md b/docs/status.md
index ef60ce2..411b140 100644
--- a/docs/status.md
+++ b/docs/status.md
@@ -36,13 +36,17 @@
   * `<monetary.h>`. See
     [discussion](https://github.com/android/ndk/issues/1182).
   * `<wordexp.h>`
+  * Locales. Although bionic contains the various `_l()` functions, the only
+    locale supported is a UTF-8 C/POSIX locale. Most of the POSIX APIs are
+    insufficient to support the wide range of languages used by Android users,
+    and apps should use icu4c (or do their i18n work in Java) instead.
+  * Robust mutexes. See
+    [discussion](https://github.com/android/ndk/issues/1181).
   * Thread cancellation (`pthread_cancel`). Unlikely to ever be implemented
     because of the difficulty and cost of implementing it, and the difficulty
     of using it correctly. See
     [This is why we can't have safe cancellation points](https://lwn.net/Articles/683118/)
     for more about thread cancellation.
-  * Robust mutexes. See
-    [discussion](https://github.com/android/ndk/issues/1181).
 
 Run `./libc/tools/check-symbols-glibc.py` in bionic/ for the current
 list of POSIX functions implemented by glibc but not by bionic.
@@ -51,14 +55,23 @@
 
 Current libc symbols: https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt
 
+New libc functions in V (API level 35):
+  * `timespec_getres` (C23 addition).
+
 New libc functions in U (API level 34):
   * `close_range` and `copy_file_range` (Linux-specific GNU extensions).
   * `memset_explicit` in <string.h> (C23 addition).
+  * `__freadahead` in <stdio_ext.h> (in musl but not glibc).
+  * `posix_spawn_file_actions_addchdir_np` and
+    `posix_spawn_file_actions_addfchdir_np` in <spawn.h> (in musl/glibc
+    and macOS, but not iOS).
 
 New libc behavior in U (API level 34):
   * Support for `%b` and `%B` in the printf/wprintf family, `%b` in the
     scanf/wscanf family, and `0b` prefixes with base 0 in the strtol/wcstol
     family.
+  * Support for `wN` length modifiers in the printf/wprintf family.
+  * tmpfile() now respects $TMPDIR.
 
 New libc functions in T (API level 33):
   * `backtrace`, `backtrace_symbols`, `backtrace_symbols_fd` (`<execinfo.h>`).
diff --git a/libc/Android.bp b/libc/Android.bp
index d985c81..ecabb06 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -197,6 +197,9 @@
         arm64: {
             srcs: ["arch-arm64/bionic/__set_tls.c"],
         },
+        riscv64: {
+            srcs: ["arch-riscv64/bionic/__set_tls.c"],
+        },
         x86: {
             srcs: [
                 "arch-x86/bionic/__libc_init_sysinfo.cpp",
@@ -245,10 +248,14 @@
 cc_library_static {
 
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "tzcode/**/*.c",
         "tzcode/bionic.cpp",
-        "upstream-openbsd/lib/libc/time/wcsftime.c", // tzcode doesn't include wcsftime, so we use the OpenBSD one.
+        // tzcode doesn't include strptime or wcsftime, so we use the OpenBSD
+        // code (with some local changes in the strptime case).
+        "upstream-openbsd/lib/libc/locale/_def_time.c",
+        "upstream-openbsd/lib/libc/time/wcsftime.c",
     ],
 
     cflags: [
@@ -288,6 +295,7 @@
 cc_library_static {
 
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "dns/**/*.c*",
 
@@ -323,6 +331,7 @@
 
 cc_library_static {
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-freebsd/lib/libc/gen/ldexp.c",
         "upstream-freebsd/lib/libc/stdlib/getopt_long.c",
@@ -360,11 +369,6 @@
         "upstream-freebsd/lib/libc/string/wmemset.c",
     ],
     arch: {
-        arm64: {
-            exclude_srcs: [
-                "upstream-freebsd/lib/libc/string/wmemmove.c",
-            ],
-        },
         x86: {
             exclude_srcs: [
                 "upstream-freebsd/lib/libc/string/wcschr.c",
@@ -394,6 +398,7 @@
 
 cc_library_static {
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-freebsd/lib/libc/gen/glob.c",
     ],
@@ -421,6 +426,7 @@
 cc_library_static {
 
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-netbsd/common/lib/libc/stdlib/random.c",
         "upstream-netbsd/lib/libc/gen/nice.c",
@@ -478,6 +484,7 @@
 cc_library_static {
     name: "libc_openbsd_ndk",
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-openbsd/lib/libc/gen/alarm.c",
         "upstream-openbsd/lib/libc/gen/ctype_.c",
@@ -596,6 +603,7 @@
 cc_library_static {
     name: "libc_openbsd_large_stack",
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "stdio/vfprintf.cpp",
         "stdio/vfwprintf.cpp",
@@ -625,6 +633,7 @@
 // automatically included.
 cc_library_static {
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         // These two depend on getentropy, which isn't in libc_ndk.a.
         "upstream-openbsd/lib/libc/crypt/arc4random.c",
@@ -661,6 +670,16 @@
                 "upstream-openbsd/lib/libc/string/strncmp.c",
             ],
         },
+        riscv64: {
+            srcs: [
+                "upstream-freebsd/lib/libc/string/memcmp.c",
+                "upstream-freebsd/lib/libc/string/memcpy.c",
+                "upstream-freebsd/lib/libc/string/memmove.c",
+                "upstream-freebsd/lib/libc/string/memset.c",
+                "upstream-openbsd/lib/libc/string/strcmp.c",
+                "upstream-openbsd/lib/libc/string/strlen.c",
+            ],
+        },
         x86: {
             exclude_srcs: [
                 "upstream-openbsd/lib/libc/string/memchr.c",
@@ -713,6 +732,7 @@
 
 cc_library_static {
     defaults: ["libc_defaults"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-openbsd/android/gdtoa_support.cpp",
         "upstream-openbsd/lib/libc/gdtoa/dmisc.c",
@@ -754,7 +774,7 @@
 }
 
 // ========================================================
-// libc_fortify.a - container for our FORITFY
+// libc_fortify.a - container for our FORTIFY
 // implementation details
 // ========================================================
 cc_library_static {
@@ -773,7 +793,6 @@
     arch: {
         arm: {
             cflags: [
-                "-DNO___MEMCPY_CHK",
                 "-DRENAME___STRCAT_CHK",
                 "-DRENAME___STRCPY_CHK",
             ],
@@ -800,9 +819,15 @@
             ],
         },
         arm64: {
-            cflags: ["-DNO___MEMCPY_CHK"],
             srcs: [
-                "arch-arm64/generic/bionic/__memcpy_chk.S",
+                "arch-arm64/string/__memcpy_chk.S",
+                "arch-arm64/string/__memset_chk.S",
+            ],
+        },
+        riscv64: {
+            srcs: [
+               "arch-riscv64/string/__memset_chk.S",
+               "arch-riscv64/string/__memcpy_chk.S",
             ],
         },
     },
@@ -886,11 +911,6 @@
         },
         arm64: {
             srcs: [
-                "arch-arm64/generic/bionic/memcpy.S",
-                "arch-arm64/generic/bionic/memmove.S",
-                "arch-arm64/generic/bionic/memset.S",
-                "arch-arm64/generic/bionic/wmemmove.S",
-
                 "arch-arm64/bionic/__bionic_clone.S",
                 "arch-arm64/bionic/_exit_with_stack_teardown.S",
                 "arch-arm64/bionic/setjmp.S",
@@ -898,7 +918,6 @@
                 "arch-arm64/bionic/vfork.S",
             ],
             exclude_srcs: [
-                "bionic/__memcpy_chk.cpp",
                 "bionic/strchr.cpp",
                 "bionic/strchrnul.cpp",
                 "bionic/strnlen.c",
@@ -906,6 +925,16 @@
             ],
         },
 
+        riscv64: {
+            srcs: [
+                "arch-riscv64/bionic/__bionic_clone.S",
+                "arch-riscv64/bionic/_exit_with_stack_teardown.S",
+                "arch-riscv64/bionic/setjmp.S",
+                "arch-riscv64/bionic/syscall.S",
+                "arch-riscv64/bionic/vfork.S",
+            ],
+        },
+
         x86: {
             srcs: [
                 "arch-x86/generic/string/memcmp.S",
@@ -1064,7 +1093,6 @@
         "bionic/ffs.cpp",
         "bionic/fgetxattr.cpp",
         "bionic/flistxattr.cpp",
-        "bionic/flockfile.cpp",
         "bionic/fpclassify.cpp",
         "bionic/fsetxattr.cpp",
         "bionic/ftruncate.cpp",
@@ -1177,7 +1205,8 @@
         "bionic/termios.cpp",
         "bionic/thread_private.cpp",
         "bionic/threads.cpp",
-        "bionic/timespec_get.cpp",
+        "bionic/time.cpp",
+        "bionic/time_l.cpp",
         "bionic/tmpfile.cpp",
         "bionic/umount.cpp",
         "bionic/unlink.cpp",
@@ -1289,47 +1318,43 @@
 // ========================================================
 
 genrule {
-    name: "syscalls-arm.S",
+    name: "syscalls-arm",
     out: ["syscalls-arm.S"],
     srcs: ["SYSCALLS.TXT"],
     tools: ["gensyscalls"],
     cmd: "$(location gensyscalls) arm $(in) > $(out)",
-    bazel_module: {
-        bp2build_available: true,
-    }
 }
 
 genrule {
-    name: "syscalls-arm64.S",
+    name: "syscalls-arm64",
     out: ["syscalls-arm64.S"],
     srcs: ["SYSCALLS.TXT"],
     tools: ["gensyscalls"],
     cmd: "$(location gensyscalls) arm64 $(in) > $(out)",
-    bazel_module: {
-        bp2build_available: true,
-    },
 }
 
 genrule {
-    name: "syscalls-x86.S",
+    name: "syscalls-riscv64",
+    out: ["syscalls-riscv64.S"],
+    srcs: ["SYSCALLS.TXT"],
+    tools: ["gensyscalls"],
+    cmd: "$(location gensyscalls) riscv64 $(in) > $(out)",
+}
+
+genrule {
+    name: "syscalls-x86",
     out: ["syscalls-x86.S"],
     srcs: ["SYSCALLS.TXT"],
     tools: ["gensyscalls"],
     cmd: "$(location gensyscalls) x86 $(in) > $(out)",
-    bazel_module: {
-        bp2build_available: true,
-    },
 }
 
 genrule {
-    name: "syscalls-x86_64.S",
+    name: "syscalls-x86_64",
     out: ["syscalls-x86_64.S"],
     srcs: ["SYSCALLS.TXT"],
     tools: ["gensyscalls"],
     cmd: "$(location gensyscalls) x86_64 $(in) > $(out)",
-    bazel_module: {
-        bp2build_available: true,
-    },
 }
 
 cc_library_static {
@@ -1337,16 +1362,19 @@
     srcs: ["bionic/__set_errno.cpp"],
     arch: {
         arm: {
-            srcs: [":syscalls-arm.S"],
+            srcs: [":syscalls-arm"],
         },
         arm64: {
-            srcs: [":syscalls-arm64.S"],
+            srcs: [":syscalls-arm64"],
+        },
+        riscv64: {
+            srcs: [":syscalls-riscv64"],
         },
         x86: {
-            srcs: [":syscalls-x86.S"],
+            srcs: [":syscalls-x86"],
         },
         x86_64: {
-            srcs: [":syscalls-x86_64.S"],
+            srcs: [":syscalls-x86_64"],
         },
     },
     name: "libc_syscalls",
@@ -1420,6 +1448,7 @@
 
     whole_static_libs: [
         "gwp_asan",
+        "gwp_asan_crash_handler",
         "libarm-optimized-routines-string",
         "libasync_safe",
         "libc_bionic_ndk",
@@ -1622,7 +1651,6 @@
         "bionic/NetdClient.cpp",
         "arch-common/bionic/crtend_so.S",
     ],
-    bazel_module: { bp2build_available: true },
 }
 
 filegroup {
@@ -1633,7 +1661,6 @@
         "bionic/malloc_common.cpp",
         "bionic/malloc_limit.cpp",
     ],
-    bazel_module: { bp2build_available: true },
 }
 
 filegroup {
@@ -1642,19 +1669,17 @@
         "arch-arm/bionic/exidx_dynamic.c",
         "arch-arm/bionic/atexit_legacy.c",
     ],
-    bazel_module: { bp2build_available: true },
 }
 
 // ========================================================
 // libc.a + libc.so
 // ========================================================
-cc_library {
+cc_defaults {
     defaults: [
         "libc_defaults",
         "libc_native_allocator_defaults",
     ],
-    name: "libc",
-    static_ndk_lib: true,
+    name: "libc_library_defaults",
     product_variables: {
         platform_sdk_version: {
             asflags: ["-DPLATFORM_SDK_VERSION=%d"],
@@ -1665,6 +1690,7 @@
         cflags: ["-DLIBC_STATIC"],
         whole_static_libs: [
             "gwp_asan",
+            "gwp_asan_crash_handler",
             "libc_init_static",
             "libc_common_static",
             "libc_unwind_static",
@@ -1674,6 +1700,7 @@
         srcs: [ ":libc_sources_shared" ],
         whole_static_libs: [
             "gwp_asan",
+            "gwp_asan_crash_handler",
             "libc_init_dynamic",
             "libc_common_shared",
             "libunwind-exported",
@@ -1740,6 +1767,15 @@
                 keep_symbols: true,
             },
         },
+        riscv64: {
+            version_script: ":libc.riscv64.map",
+
+            // Leave the symbols in the shared library so that stack unwinders can produce
+            // meaningful name resolution.
+            strip: {
+                keep_symbols: true,
+            },
+        },
         x86: {
             // TODO: This is to work around b/24465209. Remove after root cause is fixed.
             pack_relocations: false,
@@ -1770,20 +1806,7 @@
         },
     },
 
-    stubs: {
-        symbol_file: "libc.map.txt",
-        versions: [
-            "29",
-            "R",
-            "current",
-        ],
-    },
-    llndk: {
-        symbol_file: "libc.map.txt",
-        export_headers_as_system: true,
-        export_preprocessed_headers: ["include"],
-        export_llndk_headers: ["libc_llndk_headers"],
-    },
+
     apex_available: [
         "//apex_available:platform",
         "com.android.runtime",
@@ -1798,40 +1821,93 @@
     },
 }
 
+cc_library {
+    name: "libc",
+      defaults: [
+        "libc_library_defaults",
+    ],
+    stubs: {
+        symbol_file: "libc.map.txt",
+        versions: [
+            "29",
+            "R",
+            "current",
+        ],
+    },
+    static_ndk_lib: true,
+    llndk: {
+        symbol_file: "libc.map.txt",
+        export_headers_as_system: true,
+        export_preprocessed_headers: ["include"],
+        export_llndk_headers: ["libc_llndk_headers"],
+    },
+}
+
+cc_library {
+    name: "libc_hwasan",
+      defaults: [
+        "libc_library_defaults",
+    ],
+    sanitize: {
+        hwaddress: true,
+    },
+    enabled: false,
+    target: {
+        android_arm64: {
+            enabled: true,
+        },
+    },
+    stem: "libc",
+    relative_install_path: "hwasan",
+    // We don't really need the stubs, but this needs to stay to trigger the
+    // symlink logic in soong.
+    stubs: {
+        symbol_file: "libc.map.txt",
+    },
+    native_bridge_supported: false,
+    // It is never correct to depend on this directly. This is only
+    // needed for the runtime apex, and in base_system.mk.
+    visibility: ["//bionic/apex"],
+}
+
 genrule {
     name: "libc.arm.map",
-    out: ["libc.arm.map"],
+    out: ["libc.arm.map.txt"],
     srcs: ["libc.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm $(in) $(out)",
-    bazel_module: { bp2build_available: true },
 }
 
 genrule {
     name: "libc.arm64.map",
-    out: ["libc.arm64.map"],
+    out: ["libc.arm64.map.txt"],
     srcs: ["libc.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm64 $(in) $(out)",
-    bazel_module: { bp2build_available: true },
+}
+
+genrule {
+    name: "libc.riscv64.map",
+    out: ["libc.riscv64.map.txt"],
+    srcs: ["libc.map.txt"],
+    tools: ["generate-version-script"],
+    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
 }
 
 genrule {
     name: "libc.x86.map",
-    out: ["libc.x86.map"],
+    out: ["libc.x86.map.txt"],
     srcs: ["libc.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86 $(in) $(out)",
-    bazel_module: { bp2build_available: true },
 }
 
 genrule {
     name: "libc.x86_64.map",
-    out: ["libc.x86_64.map"],
+    out: ["libc.x86_64.map.txt"],
     srcs: ["libc.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
-    bazel_module: { bp2build_available: true },
 }
 
 // Headers that only other parts of the platform can include.
@@ -1871,7 +1947,6 @@
         "//apex_available:platform",
         "//apex_available:anyapex",
     ],
-    bazel_module: { bp2build_available: true },
 }
 
 cc_library_headers {
@@ -1921,6 +1996,9 @@
         arm64: {
             export_system_include_dirs: ["kernel/uapi/asm-arm64"],
         },
+        riscv64: {
+            export_system_include_dirs: ["kernel/uapi/asm-riscv"],
+        },
         x86: {
             export_system_include_dirs: ["kernel/uapi/asm-x86"],
         },
@@ -1928,7 +2006,6 @@
             export_system_include_dirs: ["kernel/uapi/asm-x86"],
         },
     },
-    bazel_module: { bp2build_available: true },
 }
 
 cc_library_headers {
@@ -1976,7 +2053,6 @@
             export_header_lib_headers: ["libc_llndk_headers"],
         },
     },
-    bazel_module: { bp2build_available: true },
 }
 
 // ========================================================
@@ -2017,6 +2093,9 @@
         arm64: {
             version_script: ":libstdc++.arm64.map",
         },
+        riscv64: {
+            version_script: ":libstdc++.riscv64.map",
+        },
         x86: {
             pack_relocations: false,
             ldflags: ["-Wl,--hash-style=both"],
@@ -2030,7 +2109,7 @@
 
 genrule {
     name: "libstdc++.arm.map",
-    out: ["libstdc++.arm.map"],
+    out: ["libstdc++.arm.map.txt"],
     srcs: ["libstdc++.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm $(in) $(out)",
@@ -2038,15 +2117,23 @@
 
 genrule {
     name: "libstdc++.arm64.map",
-    out: ["libstdc++.arm64.map"],
+    out: ["libstdc++.arm64.map.txt"],
     srcs: ["libstdc++.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm64 $(in) $(out)",
 }
 
 genrule {
+    name: "libstdc++.riscv64.map",
+    out: ["libstdc++.riscv64.map.txt"],
+    srcs: ["libstdc++.map.txt"],
+    tools: ["generate-version-script"],
+    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
+}
+
+genrule {
     name: "libstdc++.x86.map",
-    out: ["libstdc++.x86.map"],
+    out: ["libstdc++.x86.map.txt"],
     srcs: ["libstdc++.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86 $(in) $(out)",
@@ -2054,7 +2141,7 @@
 
 genrule {
     name: "libstdc++.x86_64.map",
-    out: ["libstdc++.x86_64.map"],
+    out: ["libstdc++.x86_64.map.txt"],
     srcs: ["libstdc++.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
@@ -2127,8 +2214,8 @@
     srcs: ["arch-common/bionic/crtbrand.S"],
 
     defaults: ["crt_so_defaults"],
-
-    bazel_module: { bp2build_available: true },
+    // crtbrand is an intermediate artifact, not a final CRT object.
+    exclude_from_ndk_sysroot: true,
 }
 
 cc_object {
@@ -2140,8 +2227,6 @@
     objs: [
         "crtbrand",
     ],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2153,8 +2238,6 @@
     srcs: ["arch-common/bionic/crtend_so.S"],
 
     defaults: ["crt_so_defaults"],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2172,8 +2255,6 @@
     defaults: ["crt_defaults"],
     // When using libc.a, we're using the latest library regardless of target API level.
     min_sdk_version: "current",
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2196,8 +2277,6 @@
         },
     },
     defaults: ["crt_defaults"],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2211,8 +2290,6 @@
     srcs: ["arch-common/bionic/crtend.S"],
 
     defaults: ["crt_defaults"],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_library_static {
@@ -2240,6 +2317,53 @@
 }
 
 // ========================================================
+// libc dependencies for baremetal Rust projects.
+// ========================================================
+
+// This library contains the following unresolved symbols:
+//     __errno
+//     abort
+//     async_safe_fatal_va_list
+cc_library_static {
+    name: "librust_baremetal",
+    header_libs: ["libc_headers"],
+    include_dirs: [
+        "bionic/libc/async_safe/include",
+        "bionic/libc/platform",
+    ],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    srcs: [
+        "bionic/fortify.cpp",
+        "bionic/strtol.cpp",
+    ],
+    arch: {
+        arm64: {
+            srcs: [
+                "arch-arm64/string/__memcpy_chk.S",
+            ],
+        },
+        riscv64: {
+            srcs: [
+               "arch-riscv64/string/__memcpy_chk.S",
+            ],
+        },
+    },
+    whole_static_libs: [
+        "libarm-optimized-routines-mem",
+        "libc_netbsd",
+    ],
+    system_shared_libs: [],
+    nocrt: true,
+    stl: "none",
+    visibility: [
+        "//packages/modules/Virtualization/vmbase",
+    ],
+}
+
+// ========================================================
 // NDK headers.
 // ========================================================
 
@@ -2302,6 +2426,14 @@
 }
 
 ndk_headers {
+    name: "libc_asm_riscv64",
+    from: "kernel/uapi/asm-riscv",
+    to: "riscv64-linux-android",
+    srcs: ["kernel/uapi/asm-riscv/**/*.h"],
+    license: "NOTICE",
+}
+
+ndk_headers {
     name: "libc_asm_x86",
     from: "kernel/uapi/asm-x86",
     to: "i686-linux-android",
@@ -2330,6 +2462,7 @@
         "libc_kernel_android_scsi",
         "libc_asm_arm",
         "libc_asm_arm64",
+        "libc_asm_riscv64",
         "libc_asm_x86",
         "libc_asm_x86_64",
     ],
@@ -2348,7 +2481,6 @@
         "kernel/uapi/linux/input.h",
         "kernel/uapi/linux/input-event-codes.h",
     ],
-    bazel_module: { bp2build_available: true },
 }
 
 // Generate a syscall name / number mapping. These objects are text files
@@ -2374,8 +2506,6 @@
         "kernel/uapi/asm-arm",
         "kernel/uapi",
     ],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2385,8 +2515,15 @@
         "kernel/uapi/asm-arm64",
         "kernel/uapi",
     ],
+}
 
-    bazel_module: { bp2build_available: true },
+cc_object {
+    name: "libseccomp_gen_syscall_nrs_riscv64",
+    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
+    local_include_dirs: [
+        "kernel/uapi/asm-riscv",
+        "kernel/uapi",
+    ],
 }
 
 cc_object {
@@ -2398,8 +2535,6 @@
         "kernel/uapi/asm-x86",
         "kernel/uapi",
     ],
-
-    bazel_module: { bp2build_available: true },
 }
 
 cc_object {
@@ -2411,14 +2546,11 @@
         "kernel/uapi/asm-x86",
         "kernel/uapi",
     ],
-
-    bazel_module: { bp2build_available: true },
 }
 
 filegroup {
     name: "all_kernel_uapi_headers",
     srcs: ["kernel/uapi/**/*.h"],
-    bazel_module: { bp2build_available: true },
 }
 
 
@@ -2431,12 +2563,38 @@
 
     srcs: [
         "SYSCALLS.TXT",
-        ":libseccomp_gen_syscall_nrs_arm",
-        ":libseccomp_gen_syscall_nrs_arm64",
-        ":libseccomp_gen_syscall_nrs_x86",
-        ":libseccomp_gen_syscall_nrs_x86_64",
     ],
 
+    arch: {
+        arm: {
+            srcs: [
+                ":libseccomp_gen_syscall_nrs_arm",
+                ":libseccomp_gen_syscall_nrs_arm64",
+            ],
+        },
+        arm64: {
+            srcs: [
+                ":libseccomp_gen_syscall_nrs_arm",
+                ":libseccomp_gen_syscall_nrs_arm64",
+            ],
+        },
+        riscv64: {
+            srcs: [":libseccomp_gen_syscall_nrs_riscv64"],
+        },
+        x86: {
+            srcs: [
+                ":libseccomp_gen_syscall_nrs_x86",
+                ":libseccomp_gen_syscall_nrs_x86_64",
+            ],
+        },
+        x86_64: {
+            srcs: [
+                ":libseccomp_gen_syscall_nrs_x86",
+                ":libseccomp_gen_syscall_nrs_x86_64",
+            ],
+        },
+    },
+
     out: [
         "func_to_syscall_nrs.h",
     ],
@@ -2450,13 +2608,8 @@
     cmd: "grep -v '^int[ \t]*setresgid' $(in) > $(out)",
 }
 
-cc_genrule {
-    name: "libseccomp_policy_app_zygote_sources",
-    recovery_available: true,
-    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
-
-    tools: [ "genseccomp" ],
-
+filegroup {
+    name: "seccomp_syscalls_sources_zygote",
     srcs: [
         "SYSCALLS.TXT",
         "SECCOMP_ALLOWLIST_COMMON.TXT",
@@ -2464,27 +2617,11 @@
         "SECCOMP_BLOCKLIST_COMMON.TXT",
         "SECCOMP_PRIORITY.TXT",
         ":generate_app_zygote_blocklist",
-        ":libseccomp_gen_syscall_nrs_arm",
-        ":libseccomp_gen_syscall_nrs_arm64",
-        ":libseccomp_gen_syscall_nrs_x86",
-        ":libseccomp_gen_syscall_nrs_x86_64",
-    ],
-
-    out: [
-        "arm64_app_zygote_policy.cpp",
-        "arm_app_zygote_policy.cpp",
-        "x86_64_app_zygote_policy.cpp",
-        "x86_app_zygote_policy.cpp",
     ],
 }
 
-cc_genrule {
-    name: "libseccomp_policy_app_sources",
-    recovery_available: true,
-    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
-
-    tools: [ "genseccomp" ],
-
+filegroup {
+    name: "seccomp_syscalls_sources_app",
     srcs: [
         "SYSCALLS.TXT",
         "SECCOMP_ALLOWLIST_COMMON.TXT",
@@ -2492,56 +2629,242 @@
         "SECCOMP_BLOCKLIST_COMMON.TXT",
         "SECCOMP_BLOCKLIST_APP.TXT",
         "SECCOMP_PRIORITY.TXT",
-        ":libseccomp_gen_syscall_nrs_arm",
-        ":libseccomp_gen_syscall_nrs_arm64",
-        ":libseccomp_gen_syscall_nrs_x86",
-        ":libseccomp_gen_syscall_nrs_x86_64",
-    ],
-
-    out: [
-        "arm64_app_policy.cpp",
-        "arm_app_policy.cpp",
-        "x86_64_app_policy.cpp",
-        "x86_app_policy.cpp",
     ],
 }
 
-cc_genrule {
-    name: "libseccomp_policy_system_sources",
-    recovery_available: true,
-    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
-
-    tools: [ "genseccomp" ],
-
+filegroup {
+    name: "seccomp_syscalls_sources_system",
     srcs: [
         "SYSCALLS.TXT",
         "SECCOMP_ALLOWLIST_COMMON.TXT",
         "SECCOMP_ALLOWLIST_SYSTEM.TXT",
         "SECCOMP_BLOCKLIST_COMMON.TXT",
         "SECCOMP_PRIORITY.TXT",
-        ":libseccomp_gen_syscall_nrs_arm",
-        ":libseccomp_gen_syscall_nrs_arm64",
+    ],
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_zygote_sources_x86",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_zygote",
         ":libseccomp_gen_syscall_nrs_x86",
         ":libseccomp_gen_syscall_nrs_x86_64",
     ],
-
     out: [
-        "arm64_system_policy.cpp",
-        "arm_system_policy.cpp",
-        "x86_64_system_policy.cpp",
-        "x86_system_policy.cpp",
+        "x86_app_zygote_policy.cpp",
+        "x86_64_app_zygote_policy.cpp",
     ],
+    enabled: false,
+    arch: {
+        x86: { enabled: true },
+        x86_64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_zygote_sources_arm",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_zygote",
+        ":libseccomp_gen_syscall_nrs_arm",
+        ":libseccomp_gen_syscall_nrs_arm64",
+    ],
+    out: [
+        "arm_app_zygote_policy.cpp",
+        "arm64_app_zygote_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        arm: { enabled: true },
+        arm64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_zygote_sources_riscv64",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_zygote",
+        ":libseccomp_gen_syscall_nrs_riscv64",
+    ],
+    out: [
+        "riscv64_app_zygote_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        riscv64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_sources_x86",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_app",
+        ":libseccomp_gen_syscall_nrs_x86",
+        ":libseccomp_gen_syscall_nrs_x86_64",
+    ],
+    out: [
+        "x86_app_policy.cpp",
+        "x86_64_app_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        x86: { enabled: true },
+        x86_64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_sources_arm",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_app",
+        ":libseccomp_gen_syscall_nrs_arm",
+        ":libseccomp_gen_syscall_nrs_arm64",
+    ],
+    out: [
+        "arm_app_policy.cpp",
+        "arm64_app_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        arm: { enabled: true },
+        arm64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_app_sources_riscv64",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_app",
+        ":libseccomp_gen_syscall_nrs_riscv64",
+    ],
+    out: [
+        "riscv64_app_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        riscv64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_system_sources_x86",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_system",
+        ":libseccomp_gen_syscall_nrs_x86",
+        ":libseccomp_gen_syscall_nrs_x86_64",
+    ],
+    out: [
+        "x86_system_policy.cpp",
+        "x86_64_system_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        x86: { enabled: true },
+        x86_64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_system_sources_arm",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_system",
+        ":libseccomp_gen_syscall_nrs_arm",
+        ":libseccomp_gen_syscall_nrs_arm64",
+    ],
+    out: [
+        "arm_system_policy.cpp",
+        "arm64_system_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        arm: { enabled: true },
+        arm64: { enabled: true },
+    },
+}
+
+cc_genrule {
+    name: "libseccomp_policy_system_sources_riscv64",
+    recovery_available: true,
+    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
+    tools: [ "genseccomp" ],
+    srcs: [
+        ":seccomp_syscalls_sources_system",
+        ":libseccomp_gen_syscall_nrs_riscv64",
+    ],
+    out: [
+        "riscv64_system_policy.cpp",
+    ],
+    enabled: false,
+    arch: {
+        riscv64: { enabled: true },
+    },
 }
 
 cc_library {
     name: "libseccomp_policy",
     recovery_available: true,
     generated_headers: ["func_to_syscall_nrs"],
-    generated_sources: [
-        "libseccomp_policy_app_sources",
-        "libseccomp_policy_app_zygote_sources",
-        "libseccomp_policy_system_sources",
-    ],
+
+    arch: {
+        arm: {
+            generated_sources: [
+               "libseccomp_policy_app_sources_arm",
+               "libseccomp_policy_app_zygote_sources_arm",
+               "libseccomp_policy_system_sources_arm",
+            ],
+        },
+        arm64: {
+            generated_sources: [
+               "libseccomp_policy_app_sources_arm",
+               "libseccomp_policy_app_zygote_sources_arm",
+               "libseccomp_policy_system_sources_arm",
+            ],
+        },
+        riscv64: {
+            generated_sources: [
+               "libseccomp_policy_app_sources_riscv64",
+               "libseccomp_policy_app_zygote_sources_riscv64",
+               "libseccomp_policy_system_sources_riscv64",
+            ],
+        },
+        x86: {
+            generated_sources: [
+               "libseccomp_policy_app_sources_x86",
+               "libseccomp_policy_app_zygote_sources_x86",
+               "libseccomp_policy_system_sources_x86",
+            ],
+        },
+        x86_64: {
+            generated_sources: [
+               "libseccomp_policy_app_sources_x86",
+               "libseccomp_policy_app_zygote_sources_x86",
+               "libseccomp_policy_system_sources_x86",
+            ],
+        },
+    },
 
     srcs: [
         "seccomp/seccomp_policy.cpp",
@@ -2562,6 +2885,7 @@
 
 cc_library_host_static {
     name: "libfts",
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "bionic/fts.c",
         "upstream-openbsd/lib/libc/stdlib/recallocarray.c",
@@ -2604,6 +2928,7 @@
 cc_library_host_static {
     name: "libb64",
     visibility: ["//external/musl"],
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: ["upstream-openbsd/lib/libc/net/base64.c"],
     export_include_dirs: ["b64/include"],
     local_include_dirs: [
@@ -2712,3 +3037,53 @@
     tools: ["soong_zip"],
     cmd: "includes=($(in)) && $(location soong_zip) -o $(out) -P include/asm -j -D $$(dirname $${includes[0]})",
 }
+
+cc_genrule {
+    name: "bionic_sysroot_crt_objects",
+    visibility: ["//visibility:private"],
+    out: ["bionic_sysroot_crt_objects.zip"],
+    tools: ["soong_zip"],
+    srcs: [
+        ":crtbegin_dynamic",
+        ":crtbegin_so",
+        ":crtbegin_static",
+        ":crtend_android",
+        ":crtend_so",
+    ],
+    cmd: "$(location soong_zip) -o $(out) -j " +
+        "-f $(location :crtbegin_dynamic) " +
+        "-f $(location :crtbegin_so) " +
+        "-f $(location :crtbegin_static) " +
+        "-f $(location :crtend_android) " +
+        "-f $(location :crtend_so)",
+    dist: {
+        targets: ["bionic_sysroot_crt_objects"],
+    },
+    arch: {
+        arm: {
+            dist: {
+                suffix: "_arm",
+            },
+        },
+        arm64: {
+            dist: {
+                suffix: "_arm64",
+            },
+        },
+        riscv64: {
+            dist: {
+                suffix: "_riscv64",
+            },
+        },
+        x86: {
+            dist: {
+                suffix: "_x86",
+            },
+        },
+        x86_64: {
+            dist: {
+                suffix: "_x86_64",
+            },
+        },
+    },
+}
diff --git a/libc/BUILD b/libc/BUILD
index e26c026..1777ae9 100644
--- a/libc/BUILD
+++ b/libc/BUILD
@@ -27,16 +27,16 @@
 load("//build/bazel/rules/apis:cc_api_contribution.bzl", "cc_api_contribution")
 
 cc_api_contribution(
-  name="libc_contributions",
-  library_name="libc",
-  api=":libc.map.txt",
-  hdrs=[
-    "//bionic/libc/kernel/android:libc_kernel_android_uapi_headers",
-    "//bionic/libc/kernel/android:libc_kernel_android_scsi_headers",
-    "//bionic/libc/kernel/uapi:libc_kernel_uapi_headers",
-    "//bionic/libc/kernel/uapi:libc_kernal_uapi_asm_arm_headers", #arm
-    "//bionic/libc/kernel/uapi:libc_kernal_uapi_asm_arm64_headers", #arm64
-    "//bionic/libc/kernel/uapi:libc_kernal_uapi_asm_x86_headers", #x86
-    "//bionic/libc/kernel/uapi:libc_kernal_uapi_asm_x86_64_headers", #x86_64
-  ],
+    name = "libc_contributions",
+    hdrs = [
+        "//bionic/libc/kernel/android:libc_kernel_android_scsi_headers",
+        "//bionic/libc/kernel/android:libc_kernel_android_uapi_headers",
+        "//bionic/libc/kernel/uapi:libc_kernel_uapi_asm_arm64_headers",  #arm64
+        "//bionic/libc/kernel/uapi:libc_kernel_uapi_asm_arm_headers",  #arm
+        "//bionic/libc/kernel/uapi:libc_kernel_uapi_asm_x86_64_headers",  #x86_64
+        "//bionic/libc/kernel/uapi:libc_kernel_uapi_asm_x86_headers",  #x86
+        "//bionic/libc/kernel/uapi:libc_kernel_uapi_headers",
+    ],
+    api = ":libc.map.txt",
+    library_name = "libc",
 )
diff --git a/libc/NOTICE b/libc/NOTICE
index fa3dd2c..4d3a108 100644
--- a/libc/NOTICE
+++ b/libc/NOTICE
@@ -894,6 +894,34 @@
 
 -------------------------------------------------------------------
 
+Copyright (C) 2023 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
 Copyright (c) 1980, 1983, 1988, 1993
    The Regents of the University of California.  All rights reserved.
 
@@ -2052,6 +2080,38 @@
 
 Copyright (c) 1990, 1993
    The Regents of the University of California.  All rights reserved.
+
+This code is derived from software contributed to Berkeley by
+Mike Hibler and Chris Torek.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 1990, 1993
+   The Regents of the University of California.  All rights reserved.
 (c) UNIX System Laboratories, Inc.
 All or some portions of this file are derived from material licensed
 to the University of California by American Telephone and Telegraph
@@ -2407,9 +2467,15 @@
 
 -------------------------------------------------------------------
 
+Copyright (c) 1992, 1993, 1994 Henry Spencer.
 Copyright (c) 1992, 1993, 1994
    The Regents of the University of California.  All rights reserved.
 
+Copyright (c) 2011 The FreeBSD Foundation
+All rights reserved.
+Portions of this software were developed by David Chisnall
+under sponsorship from the FreeBSD Foundation.
+
 This code is derived from software contributed to Berkeley by
 Henry Spencer.
 
@@ -2440,6 +2506,8 @@
 -------------------------------------------------------------------
 
 Copyright (c) 1992, 1993, 1994 Henry Spencer.
+Copyright (c) 1992, 1993, 1994
+   The Regents of the University of California.  All rights reserved.
 
 This code is derived from software contributed to Berkeley by
 Henry Spencer.
@@ -2452,11 +2520,7 @@
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
-   must display the following acknowledgement:
-   This product includes software developed by the University of
-   California, Berkeley and its contributors.
-4. Neither the name of the University nor the names of its contributors
+3. Neither the name of the University nor the names of its contributors
    may be used to endorse or promote products derived from this software
    without specific prior written permission.
 
@@ -2543,6 +2607,36 @@
 
 -------------------------------------------------------------------
 
+Copyright (c) 1994 Winning Strategies, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+     This product includes software developed by Winning Strategies, Inc.
+4. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
 Copyright (c) 1996 by Internet Software Consortium.
 
 Permission to use, copy, modify, and distribute this software for any
@@ -2743,41 +2837,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
-All rights reserved.
-
-This code was contributed to The NetBSD Foundation by Klaus Klein.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
-   must display the following acknowledgement:
-       This product includes software developed by the NetBSD
-       Foundation, Inc. and its contributors.
-4. Neither the name of The NetBSD Foundation nor the names of its
-   contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
 Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc.
 All rights reserved.
 
@@ -2843,6 +2902,34 @@
 
 -------------------------------------------------------------------
 
+Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code was contributed to The NetBSD Foundation by Klaus Klein.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
 Copyright (c) 1997, 2005 Todd C. Miller <Todd.Miller@courtesan.com>
 
 Permission to use, copy, modify, and distribute this software for any
@@ -3400,32 +3487,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
 Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
 Copyright (c) 1995,1999 by Internet Software Consortium.
 
@@ -4266,33 +4327,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 2012-2013, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-
--------------------------------------------------------------------
-
 Copyright (c) 2012-2014 ARM Ltd
 All rights reserved.
 
@@ -4394,33 +4428,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 2013, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-
--------------------------------------------------------------------
-
 Copyright (c) 2014, Intel Corporation
 All rights reserved.
 
@@ -4451,62 +4458,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 2014, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
-Copyright (c) 2015 ARM Ltd
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. The name of the company may not be used to endorse or promote
-   products derived from this software without specific prior written
-   permission.
-
-THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
 Copyright (c) 2015 Joerg Sonnenberger <joerg@NetBSD.org>.
 All rights reserved.
 
@@ -4561,6 +4512,34 @@
 
 -------------------------------------------------------------------
 
+Copyright (c) 2017, 2018 Dell EMC
+Copyright (c) 2000, 2001, 2008, 2011, David E. O'Brien
+Copyright (c) 1998 John D. Polstra.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
 Copyright (c)1999 Citrus Project,
 All rights reserved.
 
diff --git a/libc/SECCOMP_ALLOWLIST_APP.TXT b/libc/SECCOMP_ALLOWLIST_APP.TXT
index ba40b60..7e1ecde 100644
--- a/libc/SECCOMP_ALLOWLIST_APP.TXT
+++ b/libc/SECCOMP_ALLOWLIST_APP.TXT
@@ -56,3 +56,7 @@
 
 # b/62090571
 int mkdir(const char *pathname, mode_t mode)	lp32
+
+# Not used by bionic in U because riscv64 doesn't have it, but still
+# used by legacy apps (http://b/254179267).
+int renameat(int, const char*, int, const char*)  arm,x86,arm64,x86_64
diff --git a/libc/SECCOMP_ALLOWLIST_COMMON.TXT b/libc/SECCOMP_ALLOWLIST_COMMON.TXT
index a4218ee..efbf28b 100644
--- a/libc/SECCOMP_ALLOWLIST_COMMON.TXT
+++ b/libc/SECCOMP_ALLOWLIST_COMMON.TXT
@@ -3,60 +3,60 @@
 #
 # This file is processed by a python script named genseccomp.py.
 
-# syscalls needed to boot android
-int	pivot_root:pivot_root(const char *new_root, const char *put_old)	lp64
-int	ioprio_get:ioprio_get(int which, int who)	lp64
-int	ioprio_set:ioprio_set(int which, int who, int ioprio)	lp64
-pid_t	gettid:gettid()	all
-int	futex:futex(int *uaddr, int futex_op, int val, const struct timespec *timeout, int *uaddr2, int val3)	all
-int	clone:clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ..) all
-int	sigreturn:sigreturn(unsigned long __unused)	lp32
-int	rt_sigreturn:rt_sigreturn(unsigned long __unused)	all
-int	rt_tgsigqueueinfo:int rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *uinfo)	all
-int	restart_syscall:int restart_syscall()	all
+# Syscalls needed to boot android
+int	pivot_root(const char*, const char*)	lp64
+int	ioprio_get(int, int)	lp64
+int	ioprio_set(int, int, int)	lp64
 
-# vfork is used by java.lang.ProcessBuilder
-pid_t	vfork:vfork()	arm,x86,x86_64
+# Syscalls used internally by bionic, but not exposed directly.
+pid_t	gettid()	all
+int	futex(int*, int, int, const timespec*, int*, int)	all
+int	clone(int (*)(void*), void*, int, void*, ...) all
+int	sigreturn(unsigned long)	lp32
+int	rt_sigreturn(unsigned long)	all
+int	rt_tgsigqueueinfo(pid_t, pid_t, int, siginfo_t*)	all
+int	restart_syscall()	all
 
-# Needed for performance tools
-int	perf_event_open:perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags)	all
+# vfork is used by bionic (and java.lang.ProcessBuilder) on some
+# architectures. (The others use clone(2) directly instead.)
+pid_t	vfork()	arm,x86,x86_64
 
-# Needed for strace
-int	tkill:tkill(int tid, int sig)	all
+# Needed for performance tools.
+int	perf_event_open(perf_event_attr*, pid_t, int, int, unsigned long)	all
 
-# b/34763393
-int	seccomp:seccomp(unsigned int operation, unsigned int flags, void *args)	all
+# Needed for strace.
+int	tkill(int, int)	all
 
-# Needed by sanitizers (b/34606909, b/136777266).
-int open:open(const char*, int, ...)  arm,x86,x86_64
-int stat64:stat64(const char*, struct stat64*)  arm,x86
-ssize_t readlink:readlink(const char*, char*, size_t)  arm,x86,x86_64
-# Needed by ubsan in T? (http://b/229989971)
-int stat(const char*, struct stat*)  arm,x86,x86_64
+# Needed for a CTS test of seccomp (b/34763393).
+int	seccomp(unsigned, unsigned, void*)	all
+
+# TODO: remove these now we've updated the toolchain (http://b/229989971).
+int open(const char*, int, ...)  arm,x86,x86_64
+int stat64(const char*, stat64*)  arm,x86
+ssize_t readlink(const char*, char*, size_t)  arm,x86,x86_64
+int stat(const char*, stat*)  arm,x86,x86_64
 
 #
-# Useful new syscalls which we don't yet use in bionic.
+# (Potentially) useful new syscalls which we don't yet use in bionic.
 #
 
 # Since Linux 2.5, not in glibc.
-int io_setup(unsigned nr, aio_context_t *ctxp) all
-int io_destroy(aio_context_t ctx) all
-int io_submit(aio_context_t ctx, long nr,  struct iocb **iocbpp) all
-int io_getevents(aio_context_t ctx, long min_nr, long max_nr, struct io_event *events, struct timespec *timeout) all
-int io_cancel(aio_context_t ctx, struct iocb *, struct io_event *result) all
+int io_setup(unsigned, aio_context_t*) all
+int io_destroy(aio_context_t) all
+int io_submit(aio_context_t, long,  iocb**) all
+int io_getevents(aio_context_t, long, long, io_event*, timespec*) all
+int io_cancel(aio_context_t, iocb*, io_event*) all
 # Since Linux 3.14, not in glibc.
-int sched_getattr(pid_t pid, struct sched_attr* attr, unsigned int flags) all
-int sched_setattr(pid_t pid, struct sched_attr* attr, unsigned int size, unsigned int flags) all
+int sched_getattr(pid_t, sched_attr*, unsigned) all
+int sched_setattr(pid_t, sched_attr*, unsigned, unsigned) all
 # Since Linux 3.19, not in glibc (and not really needed to implement fexecve).
-int execveat(int dirfd, const char* pathname, char* const* argv, char* const* envp, int flags)  all
+int execveat(int, const char*, char* const*, char* const*, int)  all
 # Since Linux 4.3, not in glibc. Probed for and conditionally used by ART.
-int membarrier(int cmd, int flags) all
-# Since Linux 4.5, glibc 2.27.
-ssize_t copy_file_range(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags) all
-# Since Linux 4.6, glibc 2.26.
-ssize_t preadv2(int fd, const struct iovec* iov, int iovcnt, off_t offset, int flags) all
-ssize_t pwritev2(int fd, const struct iovec* iov, int iovcnt, off_t offset, int flags) all
-# Since Linux 5.1, not in glibc.
+int membarrier(int, int) all
+# Since Linux 5.1, not in glibc. Not used by bionic, and not likely ever
+# to be (because the last thing anyone needs is a new 32-bit ABI in the
+# 2020s!) but http://b/138781460 showed cuttlefish needed at least the
+# clock_gettime64 syscall.
 int clock_gettime64(clockid_t, timespec64*) lp32
 int clock_settime64(clockid_t, const timespec64*) lp32
 int clock_adjtime64(clockid_t, timex64*) lp32
@@ -70,7 +70,6 @@
 int pselect6_time64(int, fd_set*, fd_set*, timespec64*, void*) lp32
 int ppoll_time64(pollfd*, unsigned int, timespec64*, const sigset64_t*, size_t) lp32
 int recvmmsg_time64(int, mmsghdr*, unsigned int, int, const timespec64*) lp32
-int semtimedop_time64(int, sembuf*, size_t, const timespec64*) lp32
 int rt_sigtimedwait_time64(const sigset64_t*, siginfo_t*, const timespec64*, size_t) lp32
 int futex_time64(int*, int, int, const timespec64*, int*, int) lp32
 int sched_rr_get_interval_time64(pid_t, timespec64*) lp32
diff --git a/libc/SECCOMP_BLOCKLIST_APP.TXT b/libc/SECCOMP_BLOCKLIST_APP.TXT
index f14e11c..049d577 100644
--- a/libc/SECCOMP_BLOCKLIST_APP.TXT
+++ b/libc/SECCOMP_BLOCKLIST_APP.TXT
@@ -22,8 +22,10 @@
 int     setresgid:setresgid32(gid_t, gid_t, gid_t)   lp32
 int     setresgid:setresgid(gid_t, gid_t, gid_t)     lp64
 # setresuid is explicitly allowed, see above.
-int     setfsgid(gid_t)  all
-int     setfsuid(uid_t)  all
+int     setfsgid:setfsgid32(gid_t) lp32
+int     setfsgid:setfsgid(gid_t)   lp64
+int     setfsuid:setfsuid32(uid_t) lp32
+int     setfsuid:setfsuid(uid_t)   lp64
 int     setgroups:setgroups32(int, const gid_t*)   lp32
 int     setgroups:setgroups(int, const gid_t*)     lp64
 
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index 9aeb07c..08017f1 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -7,7 +7,7 @@
 # where:
 #       arch_list ::= "all" | arches
 #       arches    ::= arch |  arch "," arches
-#       arch      ::= "arm" | "arm64" | "x86" | "x86_64" | "lp32" | "lp64"
+#       arch      ::= "arm" | "arm64" | "riscv64" | "x86" | "x86_64" | "lp32" | "lp64"
 #
 # Note:
 #      - syscall_name corresponds to the name of the syscall, which may differ from
@@ -26,41 +26,47 @@
 # This file is processed by a python script named gensyscalls.py, run via
 # genrules in Android.bp.
 
-int     __execve:execve(const char*, char* const*, char* const*)  all
+# Calls that have historical 16-bit variants camping on the best names (CONFIG_UID16).
+uid_t getuid:getuid32()   lp32
+uid_t getuid:getuid()     lp64
+gid_t getgid:getgid32()   lp32
+gid_t getgid:getgid()     lp64
+uid_t geteuid:geteuid32() lp32
+uid_t geteuid:geteuid()   lp64
+gid_t getegid:getegid32() lp32
+gid_t getegid:getegid()   lp64
+uid_t getresuid:getresuid32(uid_t* ruid, uid_t* euid, uid_t* suid) lp32
+uid_t getresuid:getresuid(uid_t* ruid, uid_t* euid, uid_t* suid)   lp64
+gid_t getresgid:getresgid32(gid_t* rgid, gid_t* egid, gid_t* sgid) lp32
+gid_t getresgid:getresgid(gid_t* rgid, gid_t* egid, gid_t* sgid)   lp64
+int getgroups:getgroups32(int, gid_t*) lp32
+int getgroups:getgroups(int, gid_t*)   lp64
+int setgid:setgid32(gid_t) lp32
+int setgid:setgid(gid_t)   lp64
+int setuid:setuid32(uid_t) lp32
+int setuid:setuid(uid_t)   lp64
+int setreuid:setreuid32(uid_t, uid_t) lp32
+int setreuid:setreuid(uid_t, uid_t)   lp64
+int setresuid:setresuid32(uid_t, uid_t, uid_t) lp32
+int setresuid:setresuid(uid_t, uid_t, uid_t)   lp64
+int setresgid:setresgid32(gid_t, gid_t, gid_t) lp32
+int setresgid:setresgid(gid_t, gid_t, gid_t)   lp64
+int setfsgid:setfsgid32(gid_t) lp32
+int setfsgid:setfsgid(gid_t)   lp64
+int setfsuid:setfsuid32(uid_t) lp32
+int setfsuid:setfsuid(uid_t)   lp64
 
-uid_t   getuid:getuid32()         lp32
-uid_t   getuid:getuid()           lp64
-gid_t   getgid:getgid32()         lp32
-gid_t   getgid:getgid()           lp64
-uid_t   geteuid:geteuid32()       lp32
-uid_t   geteuid:geteuid()         lp64
-gid_t   getegid:getegid32()       lp32
-gid_t   getegid:getegid()         lp64
-uid_t   getresuid:getresuid32(uid_t* ruid, uid_t* euid, uid_t* suid)   lp32
-uid_t   getresuid:getresuid(uid_t* ruid, uid_t* euid, uid_t* suid)     lp64
-gid_t   getresgid:getresgid32(gid_t* rgid, gid_t* egid, gid_t* sgid)   lp32
-gid_t   getresgid:getresgid(gid_t* rgid, gid_t* egid, gid_t* sgid)     lp64
-ssize_t readahead(int, off64_t, size_t)     all
-int     getgroups:getgroups32(int, gid_t*)    lp32
-int     getgroups:getgroups(int, gid_t*)      lp64
-pid_t   getpgid(pid_t)             all
-pid_t   getppid()                  all
-pid_t   getsid(pid_t)              all
-pid_t   setsid()                   all
-int     setgid:setgid32(gid_t)     lp32
-int     setgid:setgid(gid_t)       lp64
-int     setuid:setuid32(uid_t)    lp32
-int     setuid:setuid(uid_t)      lp64
-int     setreuid:setreuid32(uid_t, uid_t)   lp32
-int     setreuid:setreuid(uid_t, uid_t)     lp64
-int     setresuid:setresuid32(uid_t, uid_t, uid_t)   lp32
-int     setresuid:setresuid(uid_t, uid_t, uid_t)     lp64
-int     setresgid:setresgid32(gid_t, gid_t, gid_t)   lp32
-int     setresgid:setresgid(gid_t, gid_t, gid_t)     lp64
-void*   __brk:brk(void*)           all
-int     kill(pid_t, int)           all
-int     tgkill(pid_t tgid, pid_t tid, int sig)  all
-int     __ptrace:ptrace(int request, int pid, void* addr, void* data)  all
+ssize_t readahead(int, off64_t, size_t) all
+pid_t getpgid(pid_t) all
+pid_t getppid() all
+pid_t getsid(pid_t) all
+pid_t setsid() all
+int kill(pid_t, int) all
+int tgkill(pid_t tgid, pid_t tid, int sig) all
+
+void* __brk:brk(void*) all
+int __execve:execve(const char*, char* const*, char* const*)  all
+int __ptrace:ptrace(int request, int pid, void* addr, void* data) all
 
 # <sys/resource.h>
 int getrusage(int, struct rusage*)  all
@@ -156,7 +162,6 @@
 int mkdirat(int, const char*, mode_t)  all
 int mknodat(int, const char*, mode_t, dev_t)  all
 int readlinkat(int, const char*, char*, size_t)  all
-int renameat(int, const char*, int, const char*)  all
 int renameat2(int, const char*, int, const char*, unsigned)  all
 int symlinkat(const char*, int, const char*)  all
 int unlinkat(int, const char*, int)   all
@@ -337,9 +342,6 @@
 
 int __set_tid_address:set_tid_address(int*)  all
 
-int setfsgid(gid_t)  all
-int setfsuid(uid_t)  all
-
 int setdomainname(const char*, size_t)  all
 int sethostname(const char*, size_t)  all
 
@@ -353,6 +355,9 @@
 int     __set_tls:__ARM_NR_set_tls(void*)                                 arm
 int     cacheflush:__ARM_NR_cacheflush(long start, long end, long flags)  arm
 
+# riscv64-specific
+int _flush_icache:riscv_flush_icache(void*, void*, unsigned long) riscv64
+
 # x86-specific
 int     __set_thread_area:set_thread_area(void*) x86
 
diff --git a/libc/arch-arm64/bionic/setjmp.S b/libc/arch-arm64/bionic/setjmp.S
index 8e00b56..d787a56 100644
--- a/libc/arch-arm64/bionic/setjmp.S
+++ b/libc/arch-arm64/bionic/setjmp.S
@@ -46,8 +46,6 @@
 // 0      sigflag/cookie  setjmp cookie in top 31 bits, signal mask flag in low bit
 // 1      sigmask         signal mask (not used with _setjmp / _longjmp)
 // 2      core_base       base of core registers (x18-x30, sp)
-//                        (We only store the low bits of x18 to avoid leaking the
-//                        shadow call stack address into memory.)
 // 16     float_base      base of float registers (d8-d15)
 // 24     checksum        checksum of core registers
 // 25     reserved        reserved entries (room to grow)
@@ -68,8 +66,6 @@
 #define _JB_D8_D9       (_JB_D10_D11 + 2)
 #define _JB_CHECKSUM    (_JB_D8_D9 + 2)
 
-#define SCS_MASK (SCS_SIZE - 1)
-
 .macro m_mangle_registers reg, sp_reg
   eor x3, x3, \reg
   eor x19, x19, \reg
@@ -155,6 +151,9 @@
   bic x1, x1, #1
 
   // Mask off the high bits of the shadow call stack pointer.
+  // We only store the low bits of x18 to avoid leaking the
+  // shadow call stack address into memory.
+  // See the SCS commentary in pthread_internal.h for more detail.
   and x3, x18, #SCS_MASK
 
   // Save core registers.
diff --git a/libc/arch-arm64/bionic/vfork.S b/libc/arch-arm64/bionic/vfork.S
index 9878e8d..9eb82d8 100644
--- a/libc/arch-arm64/bionic/vfork.S
+++ b/libc/arch-arm64/bionic/vfork.S
@@ -29,10 +29,7 @@
 #include <platform/bionic/tls_defines.h>
 #include <private/bionic_asm.h>
 #include <asm/signal.h>
-
-// Must match the defines in linux/sched.h
-#define CLONE_VM 0x00000100
-#define CLONE_VFORK 0x00004000
+#include <linux/sched.h>
 
 ENTRY(vfork)
 __BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(vfork)
diff --git a/libc/arch-arm64/dynamic_function_dispatch.cpp b/libc/arch-arm64/dynamic_function_dispatch.cpp
index 83e5ca4..cd55311 100644
--- a/libc/arch-arm64/dynamic_function_dispatch.cpp
+++ b/libc/arch-arm64/dynamic_function_dispatch.cpp
@@ -41,13 +41,34 @@
     }
 }
 
+typedef void* memcmp_func(void*, const void*, size_t);
+DEFINE_IFUNC_FOR(memcmp) {
+    // TODO: enable the SVE version.
+    RETURN_FUNC(memcmp_func, __memcmp_aarch64);
+}
+
+typedef void* memcpy_func(void*, const void*, size_t);
+DEFINE_IFUNC_FOR(memcpy) {
+    if (arg->_hwcap & HWCAP_ASIMD) {
+        RETURN_FUNC(memcpy_func, __memcpy_aarch64_simd);
+    } else {
+        RETURN_FUNC(memcpy_func, __memcpy_aarch64);
+    }
+}
+
+typedef void* memmove_func(void*, const void*, size_t);
+DEFINE_IFUNC_FOR(memmove) {
+    if (arg->_hwcap & HWCAP_ASIMD) {
+        RETURN_FUNC(memmove_func, __memmove_aarch64_simd);
+    } else {
+        RETURN_FUNC(memmove_func, __memmove_aarch64);
+    }
+}
+
 typedef int stpcpy_func(char*, const char*);
 DEFINE_IFUNC_FOR(stpcpy) {
-    if (arg->_hwcap2 & HWCAP2_MTE) {
-        RETURN_FUNC(stpcpy_func, __stpcpy_aarch64_mte);
-    } else {
-        RETURN_FUNC(stpcpy_func, __stpcpy_aarch64);
-    }
+    // TODO: enable the SVE version.
+    RETURN_FUNC(stpcpy_func, __stpcpy_aarch64);
 }
 
 typedef char* strchr_func(const char*, int);
@@ -70,20 +91,14 @@
 
 typedef int strcmp_func(const char*, const char*);
 DEFINE_IFUNC_FOR(strcmp) {
-    if (arg->_hwcap2 & HWCAP2_MTE) {
-        RETURN_FUNC(strcmp_func, __strcmp_aarch64_mte);
-    } else {
-        RETURN_FUNC(strcmp_func, __strcmp_aarch64);
-    }
+    // TODO: enable the SVE version.
+    RETURN_FUNC(strcmp_func, __strcmp_aarch64);
 }
 
 typedef int strcpy_func(char*, const char*);
 DEFINE_IFUNC_FOR(strcpy) {
-    if (arg->_hwcap2 & HWCAP2_MTE) {
-        RETURN_FUNC(strcpy_func, __strcpy_aarch64_mte);
-    } else {
-        RETURN_FUNC(strcpy_func, __strcpy_aarch64);
-    }
+    // TODO: enable the SVE version.
+    RETURN_FUNC(strcpy_func, __strcpy_aarch64);
 }
 
 typedef size_t strlen_func(const char*);
@@ -97,11 +112,14 @@
 
 typedef int strncmp_func(const char*, const char*, int);
 DEFINE_IFUNC_FOR(strncmp) {
-    if (arg->_hwcap2 & HWCAP2_MTE) {
-        RETURN_FUNC(strncmp_func, __strncmp_aarch64_mte);
-    } else {
-        RETURN_FUNC(strncmp_func, __strncmp_aarch64);
-    }
+    // TODO: enable the SVE version.
+    RETURN_FUNC(strncmp_func, __strncmp_aarch64);
+}
+
+typedef size_t strnlen_func(const char*);
+DEFINE_IFUNC_FOR(strnlen) {
+    // TODO: enable the SVE version.
+    RETURN_FUNC(strnlen_func, __strnlen_aarch64);
 }
 
 typedef char* strrchr_func(const char*, int);
diff --git a/libc/arch-arm64/generic/bionic/memcpy_base.S b/libc/arch-arm64/generic/bionic/memcpy_base.S
deleted file mode 100644
index f850624..0000000
--- a/libc/arch-arm64/generic/bionic/memcpy_base.S
+++ /dev/null
@@ -1,217 +0,0 @@
-/* Copyright (c) 2012-2013, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
-
-/*
- * Copyright (c) 2015 ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* Assumptions:
- *
- * ARMv8-a, AArch64, unaligned accesses.
- *
- */
-
-#include <private/bionic_asm.h>
-
-#define dstin	x0
-#define src	x1
-#define count	x2
-#define dst	x3
-#define srcend	x4
-#define dstend	x5
-#define A_l	x6
-#define A_lw	w6
-#define A_h	x7
-#define A_hw	w7
-#define B_l	x8
-#define B_lw   w8
-#define B_h	x9
-#define C_l	x10
-#define C_h	x11
-#define D_l	x12
-#define D_h	x13
-#define E_l	src
-#define E_h	count
-#define F_l	srcend
-#define F_h	dst
-#define tmp1	x9
-
-#define L(l) .L ## l
-
-/* Copies are split into 3 main cases: small copies of up to 16 bytes,
-   medium copies of 17..96 bytes which are fully unrolled. Large copies
-   of more than 96 bytes align the destination and use an unrolled loop
-   processing 64 bytes per iteration.
-   Small and medium copies read all data before writing, allowing any
-   kind of overlap, and memmove tailcalls memcpy for these cases as
-   well as non-overlapping copies.
-*/
-
-	prfm    PLDL1KEEP, [src]
-	add	srcend, src, count
-	add	dstend, dstin, count
-        cmp     count, 16
-        b.ls    L(copy16)
-	cmp	count, 96
-	b.hi	L(copy_long)
-
-	/* Medium copies: 17..96 bytes.  */
-	sub	tmp1, count, 1
-	ldp	A_l, A_h, [src]
-	tbnz	tmp1, 6, L(copy96)
-	ldp	D_l, D_h, [srcend, -16]
-	tbz	tmp1, 5, 1f
-	ldp	B_l, B_h, [src, 16]
-	ldp	C_l, C_h, [srcend, -32]
-	stp	B_l, B_h, [dstin, 16]
-	stp	C_l, C_h, [dstend, -32]
-1:
-	stp	A_l, A_h, [dstin]
-	stp	D_l, D_h, [dstend, -16]
-	ret
-
-	.p2align 4
-
-	/* Small copies: 0..16 bytes.  */
-L(copy16):
-	cmp	count, 8
-	b.lo	1f
-	ldr	A_l, [src]
-	ldr	A_h, [srcend, -8]
-	str	A_l, [dstin]
-	str	A_h, [dstend, -8]
-	ret
-	.p2align 4
-1:
-	tbz	count, 2, 1f
-	ldr	A_lw, [src]
-	ldr	A_hw, [srcend, -4]
-	str	A_lw, [dstin]
-	str	A_hw, [dstend, -4]
-	ret
-
-	/* Copy 0..3 bytes.  Use a branchless sequence that copies the same
-	   byte 3 times if count==1, or the 2nd byte twice if count==2.  */
-1:
-	cbz	count, 2f
-	lsr	tmp1, count, 1
-	ldrb	A_lw, [src]
-	ldrb	A_hw, [srcend, -1]
-	ldrb	B_lw, [src, tmp1]
-	strb	A_lw, [dstin]
-	strb	B_lw, [dstin, tmp1]
-	strb	A_hw, [dstend, -1]
-2:	ret
-
-	.p2align 4
-	/* Copy 64..96 bytes.  Copy 64 bytes from the start and
-	   32 bytes from the end.  */
-L(copy96):
-	ldp	B_l, B_h, [src, 16]
-	ldp	C_l, C_h, [src, 32]
-	ldp	D_l, D_h, [src, 48]
-	ldp	E_l, E_h, [srcend, -32]
-	ldp	F_l, F_h, [srcend, -16]
-	stp	A_l, A_h, [dstin]
-	stp	B_l, B_h, [dstin, 16]
-	stp	C_l, C_h, [dstin, 32]
-	stp	D_l, D_h, [dstin, 48]
-	stp	E_l, E_h, [dstend, -32]
-	stp	F_l, F_h, [dstend, -16]
-	ret
-
-	/* Align DST to 16 byte alignment so that we don't cross cache line
-	   boundaries on both loads and stores.	 There are at least 96 bytes
-	   to copy, so copy 16 bytes unaligned and then align.	The loop
-	   copies 64 bytes per iteration and prefetches one iteration ahead.  */
-
-	.p2align 4
-L(copy_long):
-	and	tmp1, dstin, 15
-	bic	dst, dstin, 15
-	ldp	D_l, D_h, [src]
-	sub	src, src, tmp1
-	add	count, count, tmp1	/* Count is now 16 too large.  */
-	ldp	A_l, A_h, [src, 16]
-	stp	D_l, D_h, [dstin]
-	ldp	B_l, B_h, [src, 32]
-	ldp	C_l, C_h, [src, 48]
-	ldp	D_l, D_h, [src, 64]!
-	subs	count, count, 128 + 16	/* Test and readjust count.  */
-	b.ls	2f
-1:
-	stp	A_l, A_h, [dst, 16]
-	ldp	A_l, A_h, [src, 16]
-	stp	B_l, B_h, [dst, 32]
-	ldp	B_l, B_h, [src, 32]
-	stp	C_l, C_h, [dst, 48]
-	ldp	C_l, C_h, [src, 48]
-	stp	D_l, D_h, [dst, 64]!
-	ldp	D_l, D_h, [src, 64]!
-	subs	count, count, 64
-	b.hi	1b
-
-	/* Write the last full set of 64 bytes.	 The remainder is at most 64
-	   bytes, so it is safe to always copy 64 bytes from the end even if
-	   there is just 1 byte left.  */
-2:
-	ldp	E_l, E_h, [srcend, -64]
-	stp	A_l, A_h, [dst, 16]
-	ldp	A_l, A_h, [srcend, -48]
-	stp	B_l, B_h, [dst, 32]
-	ldp	B_l, B_h, [srcend, -32]
-	stp	C_l, C_h, [dst, 48]
-	ldp	C_l, C_h, [srcend, -16]
-	stp	D_l, D_h, [dst, 64]
-	stp	E_l, E_h, [dstend, -64]
-	stp	A_l, A_h, [dstend, -48]
-	stp	B_l, B_h, [dstend, -32]
-	stp	C_l, C_h, [dstend, -16]
-	ret
diff --git a/libc/arch-arm64/generic/bionic/memmove.S b/libc/arch-arm64/generic/bionic/memmove.S
deleted file mode 100644
index 0f752ea..0000000
--- a/libc/arch-arm64/generic/bionic/memmove.S
+++ /dev/null
@@ -1,157 +0,0 @@
-/* Copyright (c) 2013, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
-
-/*
- * Copyright (c) 2015 ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* Assumptions:
- *
- * ARMv8-a, AArch64, unaligned accesses, wchar_t is 4 bytes
- */
-
-#include <private/bionic_asm.h>
-
-/* Parameters and result.  */
-#define dstin	x0
-#define src	x1
-#define count	x2
-#define srcend	x3
-#define dstend	x4
-#define tmp1	x5
-#define A_l	x6
-#define A_h	x7
-#define B_l	x8
-#define B_h	x9
-#define C_l	x10
-#define C_h	x11
-#define D_l	x12
-#define D_h	x13
-#define E_l	count
-#define E_h	tmp1
-
-/* All memmoves up to 96 bytes are done by memcpy as it supports overlaps.
-   Larger backwards copies are also handled by memcpy. The only remaining
-   case is forward large copies.  The destination is aligned, and an
-   unrolled loop processes 64 bytes per iteration.
-*/
-
-#if defined(WMEMMOVE)
-ENTRY(wmemmove)
-	lsl	count, count, #2
-#else
-ENTRY(memmove)
-#endif
-	sub	tmp1, dstin, src
-	cmp	count, 96
-	ccmp	tmp1, count, 2, hi
-	b.hs	__memcpy
-
-	cbz	tmp1, 3f
-	add	dstend, dstin, count
-	add	srcend, src, count
-
-	/* Align dstend to 16 byte alignment so that we don't cross cache line
-	   boundaries on both loads and stores.	 There are at least 96 bytes
-	   to copy, so copy 16 bytes unaligned and then align.	The loop
-	   copies 64 bytes per iteration and prefetches one iteration ahead.  */
-
-	and	tmp1, dstend, 15
-	ldp	D_l, D_h, [srcend, -16]
-	sub	srcend, srcend, tmp1
-	sub	count, count, tmp1
-	ldp	A_l, A_h, [srcend, -16]
-	stp	D_l, D_h, [dstend, -16]
-	ldp	B_l, B_h, [srcend, -32]
-	ldp	C_l, C_h, [srcend, -48]
-	ldp	D_l, D_h, [srcend, -64]!
-	sub	dstend, dstend, tmp1
-	subs	count, count, 128
-	b.ls	2f
-	nop
-1:
-	stp	A_l, A_h, [dstend, -16]
-	ldp	A_l, A_h, [srcend, -16]
-	stp	B_l, B_h, [dstend, -32]
-	ldp	B_l, B_h, [srcend, -32]
-	stp	C_l, C_h, [dstend, -48]
-	ldp	C_l, C_h, [srcend, -48]
-	stp	D_l, D_h, [dstend, -64]!
-	ldp	D_l, D_h, [srcend, -64]!
-	subs	count, count, 64
-	b.hi	1b
-
-	/* Write the last full set of 64 bytes.	 The remainder is at most 64
-	   bytes, so it is safe to always copy 64 bytes from the start even if
-	   there is just 1 byte left.  */
-2:
-	ldp	E_l, E_h, [src, 48]
-	stp	A_l, A_h, [dstend, -16]
-	ldp	A_l, A_h, [src, 32]
-	stp	B_l, B_h, [dstend, -32]
-	ldp	B_l, B_h, [src, 16]
-	stp	C_l, C_h, [dstend, -48]
-	ldp	C_l, C_h, [src]
-	stp	D_l, D_h, [dstend, -64]
-	stp	E_l, E_h, [dstin, 48]
-	stp	A_l, A_h, [dstin, 32]
-	stp	B_l, B_h, [dstin, 16]
-	stp	C_l, C_h, [dstin]
-3:	ret
-
-#if defined(WMEMMOVE)
-END(wmemmove)
-#else
-END(memmove)
-
-ALIAS_SYMBOL(memcpy, memmove)
-#endif
-
-NOTE_GNU_PROPERTY()
diff --git a/libc/arch-arm64/generic/bionic/memset.S b/libc/arch-arm64/generic/bionic/memset.S
deleted file mode 100644
index 19d3510..0000000
--- a/libc/arch-arm64/generic/bionic/memset.S
+++ /dev/null
@@ -1,253 +0,0 @@
-/* Copyright (c) 2012-2013, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
-
-/*
- * Copyright (c) 2015 ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* Assumptions:
- *
- * ARMv8-a, AArch64, unaligned accesses
- *
- */
-
-#include <private/bionic_asm.h>
-
-/* By default we assume that the DC instruction can be used to zero
-   data blocks more efficiently.  In some circumstances this might be
-   unsafe, for example in an asymmetric multiprocessor environment with
-   different DC clear lengths (neither the upper nor lower lengths are
-   safe to use).
-
-   If code may be run in a virtualized environment, then define
-   MAYBE_VIRT.  This will cause the code to cache the system register
-   values rather than re-reading them each call.  */
-
-#define dstin		x0
-#define val		x1
-#define valw		w1
-#define count		x2
-#define dst 		x3
-#define dstend		x4
-#define tmp1		x5
-#define tmp1w		w5
-#define tmp2		x6
-#define tmp2w		w6
-#define zva_len		x7
-#define zva_lenw	w7
-
-#define L(l) .L ## l
-
-ENTRY(__memset_chk)
-  cmp count, dst
-  bls memset
-
-  // Preserve for accurate backtrace.
-  stp x29, x30, [sp, -16]!
-  .cfi_def_cfa_offset 16
-  .cfi_rel_offset x29, 0
-  .cfi_rel_offset x30, 8
-
-  bl __memset_chk_fail
-END(__memset_chk)
-
-ENTRY(memset)
-
-	dup	v0.16B, valw
-	add	dstend, dstin, count
-
-	cmp	count, 96
-	b.hi	L(set_long)
-	cmp	count, 16
-	b.hs	L(set_medium)
-	mov	val, v0.D[0]
-
-	/* Set 0..15 bytes.  */
-	tbz	count, 3, 1f
-	str	val, [dstin]
-	str	val, [dstend, -8]
-	ret
-	nop
-1:	tbz	count, 2, 2f
-	str	valw, [dstin]
-	str	valw, [dstend, -4]
-	ret
-2:	cbz	count, 3f
-	strb	valw, [dstin]
-	tbz	count, 1, 3f
-	strh	valw, [dstend, -2]
-3:	ret
-
-	/* Set 17..96 bytes.  */
-L(set_medium):
-	str	q0, [dstin]
-	tbnz	count, 6, L(set96)
-	str	q0, [dstend, -16]
-	tbz	count, 5, 1f
-	str	q0, [dstin, 16]
-	str	q0, [dstend, -32]
-1:	ret
-
-	.p2align 4
-	/* Set 64..96 bytes.  Write 64 bytes from the start and
-	   32 bytes from the end.  */
-L(set96):
-	str	q0, [dstin, 16]
-	stp	q0, q0, [dstin, 32]
-	stp	q0, q0, [dstend, -32]
-	ret
-
-	.p2align 3
-	nop
-L(set_long):
-	and	valw, valw, 255
-	bic	dst, dstin, 15
-	str	q0, [dstin]
-	cmp	count, 256
-	ccmp	valw, 0, 0, cs
-	b.eq	L(try_zva)
-L(no_zva):
-	sub	count, dstend, dst	/* Count is 16 too large.  */
-	add	dst, dst, 16
-	sub	count, count, 64 + 16	/* Adjust count and bias for loop.  */
-1:	stp	q0, q0, [dst], 64
-	stp	q0, q0, [dst, -32]
-L(tail64):
-	subs	count, count, 64
-	b.hi	1b
-2:	stp	q0, q0, [dstend, -64]
-	stp	q0, q0, [dstend, -32]
-	ret
-
-	.p2align 3
-L(try_zva):
-	mrs	tmp1, dczid_el0
-	tbnz	tmp1w, 4, L(no_zva)
-	and	tmp1w, tmp1w, 15
-	cmp	tmp1w, 4	/* ZVA size is 64 bytes.  */
-	b.ne	 L(zva_128)
-
-	/* Write the first and last 64 byte aligned block using stp rather
-	   than using DC ZVA.  This is faster on some cores.
-	 */
-L(zva_64):
-	str	q0, [dst, 16]
-	stp	q0, q0, [dst, 32]
-	bic	dst, dst, 63
-	stp	q0, q0, [dst, 64]
-	stp	q0, q0, [dst, 96]
-	sub	count, dstend, dst	/* Count is now 128 too large.	*/
-	sub	count, count, 128+64+64	/* Adjust count and bias for loop.  */
-	add	dst, dst, 128
-	nop
-1:	dc	zva, dst
-	add	dst, dst, 64
-	subs	count, count, 64
-	b.hi	1b
-	stp	q0, q0, [dst, 0]
-	stp	q0, q0, [dst, 32]
-	stp	q0, q0, [dstend, -64]
-	stp	q0, q0, [dstend, -32]
-	ret
-
-	.p2align 3
-L(zva_128):
-	cmp	tmp1w, 5	/* ZVA size is 128 bytes.  */
-	b.ne	L(zva_other)
-
-	str	q0, [dst, 16]
-	stp	q0, q0, [dst, 32]
-	stp	q0, q0, [dst, 64]
-	stp	q0, q0, [dst, 96]
-	bic	dst, dst, 127
-	sub	count, dstend, dst	/* Count is now 128 too large.	*/
-	sub	count, count, 128+128	/* Adjust count and bias for loop.  */
-	add	dst, dst, 128
-1:	dc	zva, dst
-	add	dst, dst, 128
-	subs	count, count, 128
-	b.hi	1b
-	stp	q0, q0, [dstend, -128]
-	stp	q0, q0, [dstend, -96]
-	stp	q0, q0, [dstend, -64]
-	stp	q0, q0, [dstend, -32]
-	ret
-
-L(zva_other):
-	mov	tmp2w, 4
-	lsl	zva_lenw, tmp2w, tmp1w
-	add	tmp1, zva_len, 64	/* Max alignment bytes written.	 */
-	cmp	count, tmp1
-	blo	L(no_zva)
-
-	sub	tmp2, zva_len, 1
-	add	tmp1, dst, zva_len
-	add	dst, dst, 16
-	subs	count, tmp1, dst	/* Actual alignment bytes to write.  */
-	bic	tmp1, tmp1, tmp2	/* Aligned dc zva start address.  */
-	beq	2f
-1:	stp	q0, q0, [dst], 64
-	stp	q0, q0, [dst, -32]
-	subs	count, count, 64
-	b.hi	1b
-2:	mov	dst, tmp1
-	sub	count, dstend, tmp1	/* Remaining bytes to write.  */
-	subs	count, count, zva_len
-	b.lo	4f
-3:	dc	zva, dst
-	add	dst, dst, zva_len
-	subs	count, count, zva_len
-	b.hs	3b
-4:	add	count, count, zva_len
-	b	L(tail64)
-
-END(memset)
-
-NOTE_GNU_PROPERTY()
diff --git a/libc/arch-arm64/generic/bionic/wmemmove.S b/libc/arch-arm64/generic/bionic/wmemmove.S
deleted file mode 100644
index b130530..0000000
--- a/libc/arch-arm64/generic/bionic/wmemmove.S
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (c) 2014, Linaro Limited
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are met:
-       * Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-       * Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in the
-         documentation and/or other materials provided with the distribution.
-       * Neither the name of the Linaro nor the
-         names of its contributors may be used to endorse or promote products
-         derived from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#define WMEMMOVE
-#include "memmove.S"
-#undef WMEMMOVE
-
-NOTE_GNU_PROPERTY()
diff --git a/libc/arch-arm64/static_function_dispatch.S b/libc/arch-arm64/static_function_dispatch.S
index 161ece8..c7557f8 100644
--- a/libc/arch-arm64/static_function_dispatch.S
+++ b/libc/arch-arm64/static_function_dispatch.S
@@ -34,13 +34,17 @@
 END(name)
 
 FUNCTION_DELEGATE(memchr, __memchr_aarch64_mte)
-FUNCTION_DELEGATE(stpcpy, __stpcpy_aarch64_mte)
+FUNCTION_DELEGATE(memcmp, __memcmp_aarch64)
+FUNCTION_DELEGATE(memcpy, __memcpy_aarch64)
+FUNCTION_DELEGATE(memmove, __memmove_aarch64)
+FUNCTION_DELEGATE(stpcpy, __stpcpy_aarch64)
 FUNCTION_DELEGATE(strchr, __strchr_aarch64_mte)
 FUNCTION_DELEGATE(strchrnul, __strchrnul_aarch64_mte)
-FUNCTION_DELEGATE(strcmp, __strcmp_aarch64_mte)
-FUNCTION_DELEGATE(strcpy, __strcpy_aarch64_mte)
+FUNCTION_DELEGATE(strcmp, __strcmp_aarch64)
+FUNCTION_DELEGATE(strcpy, __strcpy_aarch64)
 FUNCTION_DELEGATE(strlen, __strlen_aarch64_mte)
 FUNCTION_DELEGATE(strrchr, __strrchr_aarch64_mte)
-FUNCTION_DELEGATE(strncmp, __strncmp_aarch64_mte)
+FUNCTION_DELEGATE(strncmp, __strncmp_aarch64)
+FUNCTION_DELEGATE(strnlen, __strnlen_aarch64)
 
 NOTE_GNU_PROPERTY()
diff --git a/libc/arch-arm64/generic/bionic/__memcpy_chk.S b/libc/arch-arm64/string/__memcpy_chk.S
similarity index 100%
rename from libc/arch-arm64/generic/bionic/__memcpy_chk.S
rename to libc/arch-arm64/string/__memcpy_chk.S
diff --git a/libc/arch-arm64/generic/bionic/memcpy.S b/libc/arch-arm64/string/__memset_chk.S
similarity index 78%
copy from libc/arch-arm64/generic/bionic/memcpy.S
copy to libc/arch-arm64/string/__memset_chk.S
index bc1945c..e1e29d0 100644
--- a/libc/arch-arm64/generic/bionic/memcpy.S
+++ b/libc/arch-arm64/string/__memset_chk.S
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,12 +26,22 @@
  * SUCH DAMAGE.
  */
 
-// Prototype: void *memcpy (void *dst, const void *src, size_t count).
-
 #include <private/bionic_asm.h>
 
-ENTRY(__memcpy)
-  #include "memcpy_base.S"
-END(__memcpy)
+ENTRY(__memset_chk)
+  cmp x2, x3
+  // Direct b.ls memcpy may not have enough range
+  b.hi .L_memset_chk_fail
+  b memset
+
+.L_memset_chk_fail:
+  // Preserve for accurate backtrace.
+  stp x29, x30, [sp, -16]!
+  .cfi_def_cfa_offset 16
+  .cfi_rel_offset x29, 0
+  .cfi_rel_offset x30, 8
+
+  bl __memset_chk_fail
+END(__memset_chk)
 
 NOTE_GNU_PROPERTY()
diff --git a/libc/arch-common/bionic/crtbegin.c b/libc/arch-common/bionic/crtbegin.c
index 9b8ad4e..b87db64 100644
--- a/libc/arch-common/bionic/crtbegin.c
+++ b/libc/arch-common/bionic/crtbegin.c
@@ -56,6 +56,8 @@
 __asm__(PRE
         "xorl %ebp,%ebp; movl %esp,%eax; andl $~0xf,%esp; subl $12,%esp; pushl %eax;"
         "call _start_main" POST);
+#elif defined(__riscv)
+__asm__(PRE "li fp,0; li ra,0; mv a0,sp; tail _start_main" POST);
 #elif defined(__x86_64__)
 __asm__(PRE "xorl %ebp, %ebp; movq %rsp,%rdi; andq $~0xf,%rsp; callq _start_main" POST);
 #else
diff --git a/libc/arch-common/bionic/crtend.S b/libc/arch-common/bionic/crtend.S
index 9676db8..49c729f 100644
--- a/libc/arch-common/bionic/crtend.S
+++ b/libc/arch-common/bionic/crtend.S
@@ -46,11 +46,10 @@
 	ASM_ALIGN_TO_PTR_SIZE
 	ASM_PTR_SIZE(0)
 
-#if defined(__linux__) && defined(__ELF__)
-	.section .note.GNU-stack,"",%progbits
-#endif
+	.section .note.GNU-stack, "", %progbits
+
 #if !defined(__arm__)
-	.section	.eh_frame,"a",@progbits
+	.section .eh_frame, "a", @progbits
 	.balign 4
 	.type	__FRAME_END__, @object
 	.size	__FRAME_END__, 4
diff --git a/libc/arch-common/bionic/crtend_so.S b/libc/arch-common/bionic/crtend_so.S
index 5875acb..bc4bfb6 100644
--- a/libc/arch-common/bionic/crtend_so.S
+++ b/libc/arch-common/bionic/crtend_so.S
@@ -32,11 +32,10 @@
 __bionic_asm_custom_note_gnu_section()
 #endif
 
-#if defined(__linux__) && defined(__ELF__)
-	.section .note.GNU-stack,"",%progbits
-#endif
+	.section .note.GNU-stack, "", %progbits
+
 #if !defined(__arm__)
-	.section	.eh_frame,"a",@progbits
+	.section .eh_frame, "a", @progbits
 	.balign 4
 	.type	__FRAME_END__, @object
 	.size	__FRAME_END__, 4
diff --git a/libc/arch-riscv64/bionic/__bionic_clone.S b/libc/arch-riscv64/bionic/__bionic_clone.S
new file mode 100644
index 0000000..2827857
--- /dev/null
+++ b/libc/arch-riscv64/bionic/__bionic_clone.S
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+
+// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg);
+
+ENTRY_PRIVATE(__bionic_clone)
+  # Push 'fn' and 'arg' onto the child stack.
+  addi a1, a1, -16
+  sd a5, 0(a1)
+  sd a6, 8(a1)
+
+  # Make the system call.
+  li a7, __NR_clone
+  ecall
+
+  # Are we the child?
+  beqz a0, .L_bc_child
+
+  # Did the clone(2) fail?
+  bltz a0, .L_bc_failure
+  # Nope, we're the parent, and our work here is done.
+  ret
+
+.L_bc_failure:
+  # Set errno if something went wrong.
+  neg a0, a0
+  tail __set_errno_internal
+
+.L_bc_child:
+  # We're in the child now. Set the end of the frame record chain.
+  li fp, 0
+  # Setting ra to 0 will make the unwinder stop at __start_thread.
+  li ra, 0
+  # Call __start_thread with the 'fn' and 'arg' we stored on the child stack.
+  ld a0, 0(sp)
+  ld a1, 8(sp)
+  addi sp, sp, 16
+  tail __start_thread
+END(__bionic_clone)
diff --git a/libc/bionic/timespec_get.cpp b/libc/arch-riscv64/bionic/__set_tls.c
similarity index 86%
copy from libc/bionic/timespec_get.cpp
copy to libc/arch-riscv64/bionic/__set_tls.c
index 7fc2182..57383ab 100644
--- a/libc/bionic/timespec_get.cpp
+++ b/libc/arch-riscv64/bionic/__set_tls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,8 +26,8 @@
  * SUCH DAMAGE.
  */
 
-#include <time.h>
+#include <sys/cdefs.h>
 
-int timespec_get(timespec* ts, int base) {
-  return (base == TIME_UTC && clock_gettime(CLOCK_REALTIME, ts) != -1) ? base : 0;
+__LIBC_HIDDEN__ void __set_tls(void* tls) {
+  asm("mv tp, %0" : : "r"(tls));
 }
diff --git a/libc/arch-arm64/generic/bionic/memcpy.S b/libc/arch-riscv64/bionic/_exit_with_stack_teardown.S
similarity index 78%
copy from libc/arch-arm64/generic/bionic/memcpy.S
copy to libc/arch-riscv64/bionic/_exit_with_stack_teardown.S
index bc1945c..f7bf58b 100644
--- a/libc/arch-arm64/generic/bionic/memcpy.S
+++ b/libc/arch-riscv64/bionic/_exit_with_stack_teardown.S
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,12 +26,16 @@
  * SUCH DAMAGE.
  */
 
-// Prototype: void *memcpy (void *dst, const void *src, size_t count).
-
 #include <private/bionic_asm.h>
 
-ENTRY(__memcpy)
-  #include "memcpy_base.S"
-END(__memcpy)
+// void _exit_with_stack_teardown(void* stackBase, size_t stackSize)
+ENTRY_PRIVATE(_exit_with_stack_teardown)
+  li a7, __NR_munmap
+  ecall
+  // If munmap failed, we ignore the failure and exit anyway.
 
-NOTE_GNU_PROPERTY()
+  li a0, 0
+  li a7, __NR_exit
+  ecall
+  // The exit syscall does not return.
+END(_exit_with_stack_teardown)
diff --git a/libc/arch-riscv64/bionic/setjmp.S b/libc/arch-riscv64/bionic/setjmp.S
new file mode 100644
index 0000000..26f7ec9
--- /dev/null
+++ b/libc/arch-riscv64/bionic/setjmp.S
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+#include <private/bionic_constants.h>
+
+// The internal structure of a jmp_buf is totally private.
+// Current layout (changes from release to release):
+//
+// word   name            description
+// 0      sigflag/cookie  setjmp cookie in top 31 bits, signal mask flag in low bit
+// 1      sigmask         64-bit signal mask
+// 2      ra
+// 3      sp
+// 4      gp
+// 5      s0
+// ......
+// 16     s11
+// 17     fs0
+// ......
+// 28     fs11
+// 29     checksum
+// _JBLEN: defined in bionic/libc/include/setjmp.h
+
+#define _JB_SIGFLAG   0
+#define _JB_SIGMASK   1 * 8
+#define _JB_RA        2 * 8
+#define _JB_SP        3 * 8
+#define _JB_GP        4 * 8
+#define _JB_S0        5 * 8
+#define _JB_S1        6 * 8
+#define _JB_S2        7 * 8
+#define _JB_S3        8 * 8
+#define _JB_S4        9 * 8
+#define _JB_S5       10 * 8
+#define _JB_S6       11 * 8
+#define _JB_S7       12 * 8
+#define _JB_S8       13 * 8
+#define _JB_S9       14 * 8
+#define _JB_S10      15 * 8
+#define _JB_S11      16 * 8
+#define _JB_FS0      17 * 8
+#define _JB_FS1      18 * 8
+#define _JB_FS2      19 * 8
+#define _JB_FS3      20 * 8
+#define _JB_FS4      21 * 8
+#define _JB_FS5      22 * 8
+#define _JB_FS6      23 * 8
+#define _JB_FS7      24 * 8
+#define _JB_FS8      25 * 8
+#define _JB_FS9      26 * 8
+#define _JB_FS10     27 * 8
+#define _JB_FS11     28 * 8
+#define _JB_CHECKSUM 29 * 8
+
+.macro m_mangle_registers reg, sp_reg
+  xor s0, s0, \reg
+  xor s1, s1, \reg
+  xor s2, s2, \reg
+  xor s3, s3, \reg
+  xor s4, s4, \reg
+  xor s5, s5, \reg
+  xor s6, s6, \reg
+  xor s7, s7, \reg
+  xor s8, s8, \reg
+  xor s9, s9, \reg
+  xor s10, s10, \reg
+  xor s11, s11, \reg
+  xor a4, a4, \reg  // a4 is the masked gp (x3) for SCS.
+  xor \sp_reg, \sp_reg, \reg
+.endm
+
+.macro m_calculate_checksum dst, src, scratch
+  li \dst, 0
+  .irp i,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
+    ld \scratch, (\i * 8)(\src)
+    xor \dst, \dst, \scratch
+  .endr
+.endm
+
+.macro m_unmangle_registers reg, sp_reg
+  m_mangle_registers \reg, sp_reg=\sp_reg
+.endm
+
+ENTRY(setjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(setjmp)
+  li a1, 1
+  tail sigsetjmp
+END(setjmp)
+
+ENTRY(_setjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(_setjmp)
+  li a1, 0
+  tail sigsetjmp
+END(_setjmp)
+
+// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
+ENTRY(sigsetjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(sigsetjmp)
+  addi sp, sp, -24
+  sd a0, 0(sp)
+  sd a1, 8(sp)
+  sd ra, 16(sp)
+
+  // Get the cookie and store it along with the signal flag.
+  mv a0, a1
+  call __bionic_setjmp_cookie_get
+  mv a1, a0
+  ld a0, 0(sp)
+  sd a1, _JB_SIGFLAG(a0)
+
+  // Do we need to save the signal mask?
+  andi a1, a1, 1
+  beqz a1, 1f
+
+  // Save current signal mask.
+  // The 'how'/a0 argument is ignored if set is NULL.
+  li a1, 0 // NULL
+  addi a2, a0, _JB_SIGMASK // old_mask.
+  call sigprocmask
+
+1:
+  // Restore original a0/ra.
+  ld a0, 0(sp)
+  ld ra, 16(sp)
+  addi sp, sp, 24
+
+  // Get the cookie.
+  ld a1, _JB_SIGFLAG(a0)
+  andi a1, a1, -2
+
+  // Mask off the high bits of the shadow call stack pointer.
+  // We only store the low bits of gp to avoid leaking the
+  // shadow call stack address into memory.
+  // See the SCS commentary in pthread_internal.h for more detail.
+  li a4, SCS_MASK
+  and a4, a4, gp
+
+  // Save core registers.
+  mv a2, sp
+  m_mangle_registers a1, sp_reg=a2
+  sd ra,  _JB_RA(a0)
+  sd a4,  _JB_GP(a0)  // a4 is the masked gp (x3) for SCS.
+  sd a2,  _JB_SP(a0)
+  sd s0,  _JB_S0(a0)
+  sd s1,  _JB_S1(a0)
+  sd s2,  _JB_S2(a0)
+  sd s3,  _JB_S3(a0)
+  sd s4,  _JB_S4(a0)
+  sd s5,  _JB_S5(a0)
+  sd s6,  _JB_S6(a0)
+  sd s7,  _JB_S7(a0)
+  sd s8,  _JB_S8(a0)
+  sd s9,  _JB_S9(a0)
+  sd s10, _JB_S10(a0)
+  sd s11, _JB_S11(a0)
+  m_unmangle_registers a1, sp_reg=a2
+
+  // Save floating point registers.
+  fsd fs0,  _JB_FS0(a0)
+  fsd fs1,  _JB_FS1(a0)
+  fsd fs2,  _JB_FS2(a0)
+  fsd fs3,  _JB_FS3(a0)
+  fsd fs4,  _JB_FS4(a0)
+  fsd fs5,  _JB_FS5(a0)
+  fsd fs6,  _JB_FS6(a0)
+  fsd fs7,  _JB_FS7(a0)
+  fsd fs8,  _JB_FS8(a0)
+  fsd fs9,  _JB_FS9(a0)
+  fsd fs10, _JB_FS10(a0)
+  fsd fs11, _JB_FS11(a0)
+
+  // Calculate the checksum and save it.
+  m_calculate_checksum t0, a0, t1
+  sd t0, _JB_CHECKSUM(a0)
+
+  li a0, 0
+  ret
+END(sigsetjmp)
+
+// void siglongjmp(sigjmp_buf env, int value);
+ENTRY(siglongjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(siglongjmp)
+  // Check the checksum before doing anything.
+  m_calculate_checksum t0, a0, t1
+  ld t1, _JB_CHECKSUM(a0)
+  bne t0, t1, 3f
+
+  // Do we need to restore the signal mask?
+  ld a2, _JB_SIGFLAG(a0)
+  andi a3, a2, 1
+  beqz a3, 1f
+
+  addi sp, sp, -16
+  sd a0, 0(sp)
+  sd ra, 8(sp)
+
+  // Restore the signal mask.
+  mv t0, a1 // Save 'value'.
+
+  mv a2, a0
+  li a0, 2 // SIG_SETMASK
+  addi a1, a2, _JB_SIGMASK // new_mask
+  li a2, 0 // NULL
+  call sigprocmask
+  mv a1, t0 // Restore 'value'.
+
+  // Restore original a0 and ra.
+  ld a0, 0(sp)
+  ld ra, 8(sp)
+  addi sp, sp, 16
+
+  ld a2, _JB_SIGFLAG(a0)
+1:
+  // Restore core registers.
+  andi a2, a2, -2
+  ld ra,  _JB_RA(a0)
+  ld a4,  _JB_GP(a0)  // Don't clobber the upper bits of gp (x3) used for SCS yet.
+  ld s0,  _JB_S0(a0)
+  ld s1,  _JB_S1(a0)
+  ld s2,  _JB_S2(a0)
+  ld s3,  _JB_S3(a0)
+  ld s4,  _JB_S4(a0)
+  ld s5,  _JB_S5(a0)
+  ld s6,  _JB_S6(a0)
+  ld s7,  _JB_S7(a0)
+  ld s8,  _JB_S8(a0)
+  ld s9,  _JB_S9(a0)
+  ld s10, _JB_S10(a0)
+  ld s11, _JB_S11(a0)
+  ld a3,  _JB_SP(a0)
+  m_unmangle_registers a2, sp_reg=a3
+  mv sp, a3
+
+  // Restore the low bits of the shadow call stack pointer.
+  li a5, ~SCS_MASK
+  and gp, gp, a5
+  or gp, gp, a4
+
+  addi sp, sp, -24
+  sd   ra, 0(sp)
+  sd   a0, 8(sp)
+  sd   a1, 16(sp)
+  ld   a0, _JB_SIGFLAG(a0)
+  call __bionic_setjmp_cookie_check
+  ld   ra, 0(sp)
+  ld   a0, 8(sp)
+  ld   a1, 16(sp)
+  addi sp, sp, 24
+
+  // Restore floating point registers.
+  fld fs0,  _JB_FS0(a0)
+  fld fs1,  _JB_FS1(a0)
+  fld fs2,  _JB_FS2(a0)
+  fld fs3,  _JB_FS3(a0)
+  fld fs4,  _JB_FS4(a0)
+  fld fs5,  _JB_FS5(a0)
+  fld fs6,  _JB_FS6(a0)
+  fld fs7,  _JB_FS7(a0)
+  fld fs8,  _JB_FS8(a0)
+  fld fs9,  _JB_FS9(a0)
+  fld fs10, _JB_FS10(a0)
+  fld fs11, _JB_FS11(a0)
+
+  // Set return value.
+  beqz a1, 2f
+  li a0, 1
+2:
+  mv a0, a1
+  ret
+
+3:
+  call __bionic_setjmp_checksum_mismatch
+END(siglongjmp)
+
+ALIAS_SYMBOL(longjmp, siglongjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(longjmp)
+ALIAS_SYMBOL(_longjmp, siglongjmp)
+__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(_longjmp)
diff --git a/libc/arch-arm64/generic/bionic/memcpy.S b/libc/arch-riscv64/bionic/syscall.S
similarity index 79%
copy from libc/arch-arm64/generic/bionic/memcpy.S
copy to libc/arch-riscv64/bionic/syscall.S
index bc1945c..1a6e60a 100644
--- a/libc/arch-arm64/generic/bionic/memcpy.S
+++ b/libc/arch-riscv64/bionic/syscall.S
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2020 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,12 +26,28 @@
  * SUCH DAMAGE.
  */
 
-// Prototype: void *memcpy (void *dst, const void *src, size_t count).
-
 #include <private/bionic_asm.h>
 
-ENTRY(__memcpy)
-  #include "memcpy_base.S"
-END(__memcpy)
+ENTRY(syscall)
+  // Move the syscall number up.
+  mv a7, a0
 
-NOTE_GNU_PROPERTY()
+  // Shuffle the arguments down.
+  mv a0, a1
+  mv a1, a2
+  mv a2, a3
+  mv a3, a4
+  mv a4, a5
+  mv a5, a6
+
+  ecall
+
+  // Did it fail?
+  li a7, -MAX_ERRNO
+  bgtu a0, a7, 1f
+
+  ret
+1:
+  neg a0, a0
+  tail __set_errno_internal
+END(syscall)
diff --git a/libc/arch-riscv64/bionic/vfork.S b/libc/arch-riscv64/bionic/vfork.S
new file mode 100644
index 0000000..29ab405
--- /dev/null
+++ b/libc/arch-riscv64/bionic/vfork.S
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <platform/bionic/tls_defines.h>
+#include <private/bionic_asm.h>
+#include <asm/signal.h>
+#include <linux/sched.h>
+
+ENTRY(vfork)
+  // t0 = __get_tls()[TLS_SLOT_THREAD_ID]
+  mv      t0, tp
+  ld      t0, TLS_SLOT_THREAD_ID * 8(t0)
+
+  // Set cached_pid_ to 0, vforked_ to 1, and stash the previous value.
+  li      t1, 0x80000000
+  lw      t2, 20(t0)
+  sw      t1, 20(t0)
+
+  li      a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
+  li      a1, 0 //uses a duplicate of the parent's stack
+  li      a2, 0
+  li      a3, 0
+  li      a4, 0
+
+  li      a7, __NR_clone
+  ecall
+
+  // if (rc == 0) we're the child, and finished...
+  beqz    a0, .L_success
+
+  // else if (rc != 0): reset cached_pid_ and vforked_...
+  sw      t2, 20(t0)
+  // ...and work out whether we succeeded or failed.
+  bltz    a0, .L_failure
+.L_success:
+  ret
+
+.L_failure:
+  neg     a0, a0
+  tail    __set_errno_internal
+END(vfork)
diff --git a/libc/arch-riscv64/string/__memcpy_chk.S b/libc/arch-riscv64/string/__memcpy_chk.S
new file mode 100644
index 0000000..4a2d13d
--- /dev/null
+++ b/libc/arch-riscv64/string/__memcpy_chk.S
@@ -0,0 +1,9 @@
+#include <private/bionic_asm.h>
+
+ENTRY(__memcpy_chk)
+  bleu a2, a3, 1f
+  call __memcpy_chk_fail
+
+1:
+   tail memcpy
+END(__memcpy_chk)
diff --git a/libc/arch-riscv64/string/__memset_chk.S b/libc/arch-riscv64/string/__memset_chk.S
new file mode 100644
index 0000000..a5562cb
--- /dev/null
+++ b/libc/arch-riscv64/string/__memset_chk.S
@@ -0,0 +1,10 @@
+#include <private/bionic_asm.h>
+
+ENTRY(__memset_chk)
+    bleu    a2, a3, 1f
+    call    __memset_chk_fail
+
+1:
+    tail   memset
+END(__memset_chk)
+
diff --git a/libc/async_safe/async_safe_log.cpp b/libc/async_safe/async_safe_log.cpp
index 2380e68..420560f 100644
--- a/libc/async_safe/async_safe_log.cpp
+++ b/libc/async_safe/async_safe_log.cpp
@@ -254,7 +254,7 @@
     bool alternate = false;
     size_t bytelen = sizeof(int);
     int slen;
-    char buffer[32]; /* temporary buffer used to format numbers */
+    char buffer[64];  // temporary buffer used to format numbers/format errno string
 
     char c;
 
@@ -359,8 +359,7 @@
       buffer[1] = 'x';
       format_integer(buffer + 2, sizeof(buffer) - 2, value, 'x');
     } else if (c == 'm') {
-      char buf[256];
-      str = strerror_r(errno, buf, sizeof(buf));
+      strerror_r(errno, buffer, sizeof(buffer));
     } else if (c == 'd' || c == 'i' || c == 'o' || c == 'u' || c == 'x' || c == 'X') {
       /* integers - first read value from stack */
       uint64_t value;
diff --git a/libc/bionic/__libc_current_sigrtmax.cpp b/libc/bionic/__libc_current_sigrtmax.cpp
index 32179bb..328ede1 100644
--- a/libc/bionic/__libc_current_sigrtmax.cpp
+++ b/libc/bionic/__libc_current_sigrtmax.cpp
@@ -28,8 +28,6 @@
 
 #include <signal.h>
 
-int __libc_current_sigrtmax(void) {
-  // If you change this, also change __ndk_legacy___libc_current_sigrtmax
-  // in <android/legacy_signal_inlines.h> to match.
+int __libc_current_sigrtmax() {
   return __SIGRTMAX;
 }
diff --git a/libc/bionic/android_profiling_dynamic.cpp b/libc/bionic/android_profiling_dynamic.cpp
index 3460a6d..8c9127e 100644
--- a/libc/bionic/android_profiling_dynamic.cpp
+++ b/libc/bionic/android_profiling_dynamic.cpp
@@ -204,12 +204,14 @@
   auto ret = -ENOSYS;
   ucontext_t* ctx = reinterpret_cast<ucontext_t*>(void_context);
 
-#if defined(__arm__)
+#if defined(__aarch64__)
+  ctx->uc_mcontext.regs[0] = ret;
+#elif defined(__arm__)
   ctx->uc_mcontext.arm_r0 = ret;
-#elif defined(__aarch64__)
-  ctx->uc_mcontext.regs[0] = ret;  // x0
 #elif defined(__i386__)
   ctx->uc_mcontext.gregs[REG_EAX] = ret;
+#elif defined(__riscv)
+  ctx->uc_mcontext.__gregs[REG_A0] = ret;
 #elif defined(__x86_64__)
   ctx->uc_mcontext.gregs[REG_RAX] = ret;
 #else
diff --git a/libc/bionic/android_unsafe_frame_pointer_chase.cpp b/libc/bionic/android_unsafe_frame_pointer_chase.cpp
index a1cb3c6..1a59718 100644
--- a/libc/bionic/android_unsafe_frame_pointer_chase.cpp
+++ b/libc/bionic/android_unsafe_frame_pointer_chase.cpp
@@ -72,7 +72,13 @@
 
   size_t num_frames = 0;
   while (1) {
+#if defined(__riscv)
+    // Frame addresses seem to have been implemented incorrectly for RISC-V.
+    // See https://reviews.llvm.org/D87579.
+    auto* frame = reinterpret_cast<frame_record*>(begin - 16);
+#else
     auto* frame = reinterpret_cast<frame_record*>(begin);
+#endif
     if (num_frames < num_entries) {
       buf[num_frames] = __bionic_clear_pac_bits(frame->return_addr);
     }
diff --git a/libc/bionic/bionic_elf_tls.cpp b/libc/bionic/bionic_elf_tls.cpp
index d5fb05a..79893e3 100644
--- a/libc/bionic/bionic_elf_tls.cpp
+++ b/libc/bionic/bionic_elf_tls.cpp
@@ -137,6 +137,15 @@
   offset_bionic_tcb_ = reserve(sizeof(bionic_tcb), max_align);
   return offset_bionic_tcb_ - exe_size;
 
+#elif defined(__riscv)
+
+  // First reserve enough space for the TCB before the executable segment.
+  offset_bionic_tcb_ = reserve(sizeof(bionic_tcb), 1);
+
+  // Then reserve the segment itself.
+  const size_t exe_size = round_up_with_overflow_check(exe_segment->size, exe_segment->alignment);
+  return reserve(exe_size, 1);
+
 #else
 #error "Unrecognized architecture"
 #endif
@@ -312,7 +321,7 @@
     }
   }
 
-  return static_cast<char*>(mod_ptr) + ti->offset;
+  return static_cast<char*>(mod_ptr) + ti->offset + TLS_DTV_OFFSET;
 }
 
 // Returns the address of a thread's TLS memory given a module ID and an offset
@@ -332,7 +341,7 @@
   if (__predict_true(generation == dtv->generation)) {
     void* mod_ptr = dtv->modules[__tls_module_id_to_idx(ti->module_id)];
     if (__predict_true(mod_ptr != nullptr)) {
-      return static_cast<char*>(mod_ptr) + ti->offset;
+      return static_cast<char*>(mod_ptr) + ti->offset + TLS_DTV_OFFSET;
     }
   }
 
diff --git a/libc/bionic/fcntl.cpp b/libc/bionic/fcntl.cpp
index c508131..754277b 100644
--- a/libc/bionic/fcntl.cpp
+++ b/libc/bionic/fcntl.cpp
@@ -30,21 +30,29 @@
 #include <fcntl.h>
 
 #include "private/bionic_fdtrack.h"
-
-#if defined(__LP64__)
+#include "private/bionic_fortify.h"
 
 extern "C" int __fcntl(int fd, int cmd, ...);
+extern "C" int __fcntl64(int, int, ...);
 
 int fcntl(int fd, int cmd, ...) {
   va_list args;
   va_start(args, cmd);
-
-  // This is a bit sketchy, especially because arg can be an int, but all of our
-  // supported 64-bit ABIs pass arg in a register.
+  // This is a bit sketchy for LP64, especially because arg can be an int,
+  // but all of our supported 64-bit ABIs pass the argument in a register.
   void* arg = va_arg(args, void*);
   va_end(args);
 
+  if (cmd == F_SETFD && (reinterpret_cast<uintptr_t>(arg) & ~FD_CLOEXEC) != 0) {
+    __fortify_fatal("fcntl(F_SETFD) passed non-FD_CLOEXEC flag: %p", arg);
+  }
+
+#if defined(__LP64__)
   int rc = __fcntl(fd, cmd, arg);
+#else
+  // For LP32 we use the fcntl64 system call to signal that we're using struct flock64.
+  int rc = __fcntl64(fd, cmd, arg);
+#endif
   if (cmd == F_DUPFD) {
     return FDTRACK_CREATE_NAME("F_DUPFD", rc);
   } else if (cmd == F_DUPFD_CLOEXEC) {
@@ -52,25 +60,3 @@
   }
   return rc;
 }
-
-#else
-
-extern "C" int __fcntl64(int, int, ...);
-
-// For fcntl we use the fcntl64 system call to signal that we're using struct flock64.
-int fcntl(int fd, int cmd, ...) {
-  va_list ap;
-
-  va_start(ap, cmd);
-  void* arg = va_arg(ap, void*);
-  va_end(ap);
-
-  if (cmd == F_DUPFD) {
-    return FDTRACK_CREATE_NAME("F_DUPFD", __fcntl64(fd, cmd, arg));
-  } else if (cmd == F_DUPFD_CLOEXEC) {
-    return FDTRACK_CREATE_NAME("F_DUPFD_CLOEXEC", __fcntl64(fd, cmd, arg));
-  }
-  return __fcntl64(fd, cmd, arg);
-}
-
-#endif
diff --git a/libc/bionic/fdsan.cpp b/libc/bionic/fdsan.cpp
index f7f4d31..6433b59 100644
--- a/libc/bionic/fdsan.cpp
+++ b/libc/bionic/fdsan.cpp
@@ -101,7 +101,7 @@
   }
 
   size_t offset = idx - inline_fds;
-  if (local_overflow->len < offset) {
+  if (local_overflow->len <= offset) {
     return nullptr;
   }
   return &local_overflow->entries[offset];
diff --git a/libc/bionic/flockfile.cpp b/libc/bionic/flockfile.cpp
deleted file mode 100644
index db53828..0000000
--- a/libc/bionic/flockfile.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <errno.h>
-#include <stdio.h>
-
-#include "local.h"
-
-// We can't use the OpenBSD implementation which uses kernel-specific
-// APIs not available on Linux. Instead we use a pthread_mutex_t within
-// struct __sfileext (see fileext.h).
-
-void flockfile(FILE* fp) {
-  if (fp != nullptr) {
-    pthread_mutex_lock(&_FLOCK(fp));
-  }
-}
-
-int ftrylockfile(FILE* fp) {
-  // The specification for ftrylockfile() says it returns 0 on success,
-  // or non-zero on error. So return an errno code directly on error.
-  if (fp == nullptr) {
-    return EINVAL;
-  }
-
-  return pthread_mutex_trylock(&_FLOCK(fp));
-}
-
-void funlockfile(FILE* fp) {
-  if (fp != nullptr) {
-    pthread_mutex_unlock(&_FLOCK(fp));
-  }
-}
diff --git a/libc/bionic/fortify.cpp b/libc/bionic/fortify.cpp
index 88ae477..7dee5e3 100644
--- a/libc/bionic/fortify.cpp
+++ b/libc/bionic/fortify.cpp
@@ -489,14 +489,15 @@
   return strcpy(dst, src);
 }
 
-#if !defined(NO___MEMCPY_CHK)
+#if !defined(__arm__) && !defined(__aarch64__) && !defined(__riscv)
 // Runtime implementation of __memcpy_chk (used directly by compiler, not in headers).
+// arm32,arm64,riscv have assembler implementations, and don't need this C fallback.
 extern "C" void* __memcpy_chk(void* dst, const void* src, size_t count, size_t dst_len) {
   __check_count("memcpy", "count", count);
   __check_buffer_access("memcpy", "write into", count, dst_len);
   return memcpy(dst, src, count);
 }
-#endif // NO___MEMCPY_CHK
+#endif
 
 // Runtime implementation of __mempcpy_chk (used directly by compiler, not in headers).
 extern "C" void* __mempcpy_chk(void* dst, const void* src, size_t count, size_t dst_len) {
diff --git a/libc/bionic/gwp_asan_wrappers.cpp b/libc/bionic/gwp_asan_wrappers.cpp
index fc59c88..fab29ef 100644
--- a/libc/bionic/gwp_asan_wrappers.cpp
+++ b/libc/bionic/gwp_asan_wrappers.cpp
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <sys/types.h>
 
+#include "gwp_asan/crash_handler.h"
 #include "gwp_asan/guarded_pool_allocator.h"
 #include "gwp_asan/options.h"
 #include "gwp_asan_wrappers.h"
@@ -189,6 +190,7 @@
 }
 
 bool GwpAsanInitialized = false;
+bool GwpAsanRecoverable = false;
 
 // The probability (1 / SampleRate) that an allocation gets chosen to be put
 // into the special GWP-ASan pool.
@@ -222,8 +224,32 @@
 static const char* kMaxAllocsTargetedSyspropPrefix = "libc.debug.gwp_asan.max_allocs.";
 static const char* kMaxAllocsEnvVar = "GWP_ASAN_MAX_ALLOCS";
 
+static const char* kRecoverableSystemSysprop = "libc.debug.gwp_asan.recoverable.system_default";
+static const char* kRecoverableAppSysprop = "libc.debug.gwp_asan.recoverable.app_default";
+static const char* kRecoverableTargetedSyspropPrefix = "libc.debug.gwp_asan.recoverable.";
+static const char* kRecoverableEnvVar = "GWP_ASAN_RECOVERABLE";
+
 static const char kPersistPrefix[] = "persist.";
 
+bool NeedsGwpAsanRecovery(void* fault_ptr) {
+  fault_ptr = untag_address(fault_ptr);
+  return GwpAsanInitialized && GwpAsanRecoverable &&
+         __gwp_asan_error_is_mine(GuardedAlloc.getAllocatorState(),
+                                  reinterpret_cast<uintptr_t>(fault_ptr));
+}
+
+void GwpAsanPreCrashHandler(void* fault_ptr) {
+  fault_ptr = untag_address(fault_ptr);
+  if (!NeedsGwpAsanRecovery(fault_ptr)) return;
+  GuardedAlloc.preCrashReport(fault_ptr);
+}
+
+void GwpAsanPostCrashHandler(void* fault_ptr) {
+  fault_ptr = untag_address(fault_ptr);
+  if (!NeedsGwpAsanRecovery(fault_ptr)) return;
+  GuardedAlloc.postCrashReportRecoverableOnly(fault_ptr);
+}
+
 void SetDefaultGwpAsanOptions(Options* options, unsigned* process_sample_rate,
                               const android_mallopt_gwp_asan_options_t& mallopt_options) {
   options->Enabled = true;
@@ -236,14 +262,17 @@
   *process_sample_rate = 1;
   if (mallopt_options.desire == Action::TURN_ON_WITH_SAMPLING) {
     *process_sample_rate = kDefaultProcessSampling;
+  } else if (mallopt_options.desire == Action::TURN_ON_FOR_APP_SAMPLED_NON_CRASHING) {
+    *process_sample_rate = kDefaultProcessSampling;
+    options->Recoverable = true;
+    GwpAsanRecoverable = true;
   }
 }
 
-bool GetGwpAsanOption(unsigned long long* result,
-                      const android_mallopt_gwp_asan_options_t& mallopt_options,
-                      const char* system_sysprop, const char* app_sysprop,
-                      const char* targeted_sysprop_prefix, const char* env_var,
-                      const char* descriptive_name) {
+bool GetGwpAsanOptionImpl(char* value_out,
+                          const android_mallopt_gwp_asan_options_t& mallopt_options,
+                          const char* system_sysprop, const char* app_sysprop,
+                          const char* targeted_sysprop_prefix, const char* env_var) {
   const char* basename = "";
   if (mallopt_options.program_name) basename = __gnu_basename(mallopt_options.program_name);
 
@@ -278,17 +307,27 @@
     sysprop_names[3] = persist_default_sysprop;
   }
 
-  char settings_buf[PROP_VALUE_MAX];
-  if (!get_config_from_env_or_sysprops(env_var, sysprop_names, arraysize(sysprop_names),
-                                       settings_buf, PROP_VALUE_MAX)) {
+  // TODO(mitchp): Log overrides using this.
+  const char* source;
+  return get_config_from_env_or_sysprops(env_var, sysprop_names, arraysize(sysprop_names),
+                                         value_out, PROP_VALUE_MAX, &source);
+}
+
+bool GetGwpAsanIntegerOption(unsigned long long* result,
+                             const android_mallopt_gwp_asan_options_t& mallopt_options,
+                             const char* system_sysprop, const char* app_sysprop,
+                             const char* targeted_sysprop_prefix, const char* env_var,
+                             const char* descriptive_name) {
+  char buffer[PROP_VALUE_MAX];
+  if (!GetGwpAsanOptionImpl(buffer, mallopt_options, system_sysprop, app_sysprop,
+                            targeted_sysprop_prefix, env_var)) {
     return false;
   }
-
   char* end;
-  unsigned long long value = strtoull(settings_buf, &end, 10);
+  unsigned long long value = strtoull(buffer, &end, 10);
   if (value == ULLONG_MAX || *end != '\0') {
     warning_log("Invalid GWP-ASan %s: \"%s\". Using default value instead.", descriptive_name,
-                settings_buf);
+                buffer);
     return false;
   }
 
@@ -296,6 +335,33 @@
   return true;
 }
 
+bool GetGwpAsanBoolOption(bool* result, const android_mallopt_gwp_asan_options_t& mallopt_options,
+                          const char* system_sysprop, const char* app_sysprop,
+                          const char* targeted_sysprop_prefix, const char* env_var,
+                          const char* descriptive_name) {
+  char buffer[PROP_VALUE_MAX] = {};
+  if (!GetGwpAsanOptionImpl(buffer, mallopt_options, system_sysprop, app_sysprop,
+                            targeted_sysprop_prefix, env_var)) {
+    return false;
+  }
+
+  if (strncasecmp(buffer, "1", PROP_VALUE_MAX) == 0 ||
+      strncasecmp(buffer, "true", PROP_VALUE_MAX) == 0) {
+    *result = true;
+    return true;
+  } else if (strncasecmp(buffer, "0", PROP_VALUE_MAX) == 0 ||
+             strncasecmp(buffer, "false", PROP_VALUE_MAX) == 0) {
+    *result = false;
+    return true;
+  }
+
+  warning_log(
+      "Invalid GWP-ASan %s: \"%s\". Using default value \"%s\" instead. Valid values are \"true\", "
+      "\"1\", \"false\", or \"0\".",
+      descriptive_name, buffer, *result ? "true" : "false");
+  return false;
+}
+
 // Initialize the GWP-ASan options structure in *options, taking into account whether someone has
 // asked for specific GWP-ASan settings. The order of priority is:
 //  1. Environment variables.
@@ -310,22 +376,23 @@
   bool had_overrides = false;
 
   unsigned long long buf;
-  if (GetGwpAsanOption(&buf, mallopt_options, kSampleRateSystemSysprop, kSampleRateAppSysprop,
-                       kSampleRateTargetedSyspropPrefix, kSampleRateEnvVar, "sample rate")) {
+  if (GetGwpAsanIntegerOption(&buf, mallopt_options, kSampleRateSystemSysprop,
+                              kSampleRateAppSysprop, kSampleRateTargetedSyspropPrefix,
+                              kSampleRateEnvVar, "sample rate")) {
     options->SampleRate = buf;
     had_overrides = true;
   }
 
-  if (GetGwpAsanOption(&buf, mallopt_options, kProcessSamplingSystemSysprop,
-                       kProcessSamplingAppSysprop, kProcessSamplingTargetedSyspropPrefix,
-                       kProcessSamplingEnvVar, "process sampling rate")) {
+  if (GetGwpAsanIntegerOption(&buf, mallopt_options, kProcessSamplingSystemSysprop,
+                              kProcessSamplingAppSysprop, kProcessSamplingTargetedSyspropPrefix,
+                              kProcessSamplingEnvVar, "process sampling rate")) {
     *process_sample_rate = buf;
     had_overrides = true;
   }
 
-  if (GetGwpAsanOption(&buf, mallopt_options, kMaxAllocsSystemSysprop, kMaxAllocsAppSysprop,
-                       kMaxAllocsTargetedSyspropPrefix, kMaxAllocsEnvVar,
-                       "maximum simultaneous allocations")) {
+  if (GetGwpAsanIntegerOption(&buf, mallopt_options, kMaxAllocsSystemSysprop, kMaxAllocsAppSysprop,
+                              kMaxAllocsTargetedSyspropPrefix, kMaxAllocsEnvVar,
+                              "maximum simultaneous allocations")) {
     options->MaxSimultaneousAllocations = buf;
     had_overrides = true;
   } else if (had_overrides) {
@@ -337,6 +404,16 @@
     options->MaxSimultaneousAllocations =
         /* default */ kDefaultMaxAllocs / frequency_multiplier;
   }
+
+  bool recoverable = false;
+  if (GetGwpAsanBoolOption(&recoverable, mallopt_options, kRecoverableSystemSysprop,
+                           kRecoverableAppSysprop, kRecoverableTargetedSyspropPrefix,
+                           kRecoverableEnvVar, "recoverable")) {
+    options->Recoverable = recoverable;
+    GwpAsanRecoverable = recoverable;
+    had_overrides = true;
+  }
+
   return had_overrides;
 }
 
@@ -396,6 +473,9 @@
 
   __libc_shared_globals()->gwp_asan_state = GuardedAlloc.getAllocatorState();
   __libc_shared_globals()->gwp_asan_metadata = GuardedAlloc.getMetadataRegion();
+  __libc_shared_globals()->debuggerd_needs_gwp_asan_recovery = NeedsGwpAsanRecovery;
+  __libc_shared_globals()->debuggerd_gwp_asan_pre_crash_report = GwpAsanPreCrashHandler;
+  __libc_shared_globals()->debuggerd_gwp_asan_post_crash_report = GwpAsanPostCrashHandler;
 
   return true;
 }
diff --git a/libc/bionic/jemalloc_wrapper.cpp b/libc/bionic/jemalloc_wrapper.cpp
index ef488ee..ce3f314 100644
--- a/libc/bionic/jemalloc_wrapper.cpp
+++ b/libc/bionic/jemalloc_wrapper.cpp
@@ -102,7 +102,7 @@
       }
     }
     return 1;
-  } else if (param == M_PURGE) {
+  } else if (param == M_PURGE || param == M_PURGE_ALL) {
     // Only clear the current thread cache since there is no easy way to
     // clear the caches of other threads.
     // This must be done first so that cleared allocations get purged
diff --git a/libc/bionic/libc_init_common.cpp b/libc/bionic/libc_init_common.cpp
index 5d5ecac..59b2ddb 100644
--- a/libc/bionic/libc_init_common.cpp
+++ b/libc/bionic/libc_init_common.cpp
@@ -289,6 +289,7 @@
       "LD_DEBUG",
       "LD_DEBUG_OUTPUT",
       "LD_DYNAMIC_WEAK",
+      "LD_HWASAN",
       "LD_LIBRARY_PATH",
       "LD_ORIGIN_PATH",
       "LD_PRELOAD",
diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp
index 16ebb7a..0935cd6 100644
--- a/libc/bionic/libc_init_static.cpp
+++ b/libc/bionic/libc_init_static.cpp
@@ -76,33 +76,12 @@
   }
 }
 
-#if defined(__aarch64__) || defined(__x86_64__)
-extern __LIBC_HIDDEN__ __attribute__((weak)) ElfW(Rela) __rela_iplt_start[], __rela_iplt_end[];
-
-static void call_ifunc_resolvers() {
-  if (__rela_iplt_start == nullptr || __rela_iplt_end == nullptr) {
-    // These symbols are not emitted by gold. Gold has code to do so, but for
-    // whatever reason it is not being run. In these cases ifuncs cannot be
-    // resolved, so we do not support using ifuncs in static executables linked
-    // with gold.
-    //
-    // Since they are weak, they will be non-null when linked with bfd/lld and
-    // null when linked with gold.
-    return;
-  }
-
-  for (ElfW(Rela) *r = __rela_iplt_start; r != __rela_iplt_end; ++r) {
-    ElfW(Addr)* offset = reinterpret_cast<ElfW(Addr)*>(r->r_offset);
-    ElfW(Addr) resolver = r->r_addend;
-    *offset = __bionic_call_ifunc_resolver(resolver);
-  }
-}
-#else
+#if defined(__arm__) || defined(__i386__)  // Legacy architectures used REL...
 extern __LIBC_HIDDEN__ __attribute__((weak)) ElfW(Rel) __rel_iplt_start[], __rel_iplt_end[];
 
 static void call_ifunc_resolvers() {
   if (__rel_iplt_start == nullptr || __rel_iplt_end == nullptr) {
-    // These symbols are not emitted by gold. Gold has code to do so, but for
+    // These symbols were not emitted by gold. Gold has code to do so, but for
     // whatever reason it is not being run. In these cases ifuncs cannot be
     // resolved, so we do not support using ifuncs in static executables linked
     // with gold.
@@ -112,12 +91,33 @@
     return;
   }
 
-  for (ElfW(Rel) *r = __rel_iplt_start; r != __rel_iplt_end; ++r) {
+  for (ElfW(Rel)* r = __rel_iplt_start; r != __rel_iplt_end; ++r) {
     ElfW(Addr)* offset = reinterpret_cast<ElfW(Addr)*>(r->r_offset);
     ElfW(Addr) resolver = *offset;
     *offset = __bionic_call_ifunc_resolver(resolver);
   }
 }
+#else  // ...but modern architectures use RELA instead.
+extern __LIBC_HIDDEN__ __attribute__((weak)) ElfW(Rela) __rela_iplt_start[], __rela_iplt_end[];
+
+static void call_ifunc_resolvers() {
+  if (__rela_iplt_start == nullptr || __rela_iplt_end == nullptr) {
+    // These symbols were not emitted by gold. Gold has code to do so, but for
+    // whatever reason it is not being run. In these cases ifuncs cannot be
+    // resolved, so we do not support using ifuncs in static executables linked
+    // with gold.
+    //
+    // Since they are weak, they will be non-null when linked with bfd/lld and
+    // null when linked with gold.
+    return;
+  }
+
+  for (ElfW(Rela)* r = __rela_iplt_start; r != __rela_iplt_end; ++r) {
+    ElfW(Addr)* offset = reinterpret_cast<ElfW(Addr)*>(r->r_offset);
+    ElfW(Addr) resolver = r->r_addend;
+    *offset = __bionic_call_ifunc_resolver(resolver);
+  }
+}
 #endif
 
 static void apply_gnu_relro() {
@@ -217,16 +217,13 @@
 // Returns true if there's an environment setting (either sysprop or env var)
 // that should overwrite the ELF note, and places the equivalent heap tagging
 // level into *level.
-static bool get_environment_memtag_setting(HeapTaggingLevel* level) {
+static bool get_environment_memtag_setting(const char* basename, HeapTaggingLevel* level) {
   static const char kMemtagPrognameSyspropPrefix[] = "arm64.memtag.process.";
   static const char kMemtagGlobalSysprop[] = "persist.arm64.memtag.default";
   static const char kMemtagOverrideSyspropPrefix[] =
       "persist.device_config.memory_safety_native.mode_override.process.";
 
-  const char* progname = __libc_shared_globals()->init_progname;
-  if (progname == nullptr) return false;
-
-  const char* basename = __gnu_basename(progname);
+  if (basename == nullptr) return false;
 
   char options_str[PROP_VALUE_MAX];
   char sysprop_name[512];
@@ -237,8 +234,9 @@
                            kMemtagOverrideSyspropPrefix, basename);
   const char* sys_prop_names[] = {sysprop_name, remote_sysprop_name, kMemtagGlobalSysprop};
 
+  const char* source = nullptr;
   if (!get_config_from_env_or_sysprops("MEMTAG_OPTIONS", sys_prop_names, arraysize(sys_prop_names),
-                                       options_str, sizeof(options_str))) {
+                                       options_str, sizeof(options_str), &source)) {
     return false;
   }
 
@@ -249,27 +247,35 @@
   } else if (strcmp("off", options_str) == 0) {
     *level = M_HEAP_TAGGING_LEVEL_TBI;
   } else {
-    async_safe_format_log(
-        ANDROID_LOG_ERROR, "libc",
-        "unrecognized memtag level: \"%s\" (options are \"sync\", \"async\", or \"off\").",
-        options_str);
+    async_safe_format_log(ANDROID_LOG_ERROR, "libc",
+                          "%s: unrecognized memtag level in %s: \"%s\" (options are \"sync\", "
+                          "\"async\", or \"off\").",
+                          basename, source, options_str);
     return false;
   }
-
+  async_safe_format_log(ANDROID_LOG_DEBUG, "libc", "%s: chose memtag level \"%s\" from %s.",
+                        basename, options_str, source);
   return true;
 }
 
+static void log_elf_memtag_level(const char* basename, const char* level) {
+  async_safe_format_log(ANDROID_LOG_DEBUG, "libc", "%s: chose memtag level \"%s\" from ELF note",
+                        basename ?: "<unknown>", level);
+}
+
 // Returns the initial heap tagging level. Note: This function will never return
 // M_HEAP_TAGGING_LEVEL_NONE, if MTE isn't enabled for this process we enable
 // M_HEAP_TAGGING_LEVEL_TBI.
 static HeapTaggingLevel __get_heap_tagging_level(const void* phdr_start, size_t phdr_ct,
                                                  uintptr_t load_bias, bool* stack) {
+  const char* progname = __libc_shared_globals()->init_progname;
+  const char* basename = progname ? __gnu_basename(progname) : nullptr;
   unsigned note_val =
       __get_memtag_note(reinterpret_cast<const ElfW(Phdr)*>(phdr_start), phdr_ct, load_bias);
   *stack = note_val & NT_MEMTAG_STACK;
 
   HeapTaggingLevel level;
-  if (get_environment_memtag_setting(&level)) return level;
+  if (get_environment_memtag_setting(basename, &level)) return level;
 
   // Note, previously (in Android 12), any value outside of bits [0..3] resulted
   // in a check-fail. In order to be permissive of further extensions, we
@@ -284,14 +290,17 @@
       // by anyone, but we note it (heh) here for posterity, in case the zero
       // level becomes meaningful, and binaries with this note can be executed
       // on Android 12 devices.
+      log_elf_memtag_level(basename, "off");
       return M_HEAP_TAGGING_LEVEL_TBI;
     case NT_MEMTAG_LEVEL_ASYNC:
+      log_elf_memtag_level(basename, "async");
       return M_HEAP_TAGGING_LEVEL_ASYNC;
     case NT_MEMTAG_LEVEL_SYNC:
     default:
       // We allow future extensions to specify mode 3 (currently unused), with
       // the idea that it might be used for ASYMM mode or something else. On
       // this version of Android, it falls back to SYNC mode.
+      log_elf_memtag_level(basename, "sync");
       return M_HEAP_TAGGING_LEVEL_SYNC;
   }
 }
diff --git a/libc/bionic/malloc_common_dynamic.cpp b/libc/bionic/malloc_common_dynamic.cpp
index 97e8d15..802a94f 100644
--- a/libc/bionic/malloc_common_dynamic.cpp
+++ b/libc/bionic/malloc_common_dynamic.cpp
@@ -371,6 +371,7 @@
 extern "C" const char* __scudo_get_stack_depot_addr();
 extern "C" const char* __scudo_get_region_info_addr();
 extern "C" const char* __scudo_get_ring_buffer_addr();
+extern "C" size_t __scudo_get_ring_buffer_size();
 
 // Initializes memory allocation framework once per process.
 static void MallocInitImpl(libc_globals* globals) {
@@ -383,6 +384,7 @@
   __libc_shared_globals()->scudo_stack_depot = __scudo_get_stack_depot_addr();
   __libc_shared_globals()->scudo_region_info = __scudo_get_region_info_addr();
   __libc_shared_globals()->scudo_ring_buffer = __scudo_get_ring_buffer_addr();
+  __libc_shared_globals()->scudo_ring_buffer_size = __scudo_get_ring_buffer_size();
 #endif
 
   // Prefer malloc debug since it existed first and is a more complete
diff --git a/libc/bionic/pthread_cond.cpp b/libc/bionic/pthread_cond.cpp
index 793dcd9..f444676 100644
--- a/libc/bionic/pthread_cond.cpp
+++ b/libc/bionic/pthread_cond.cpp
@@ -249,15 +249,18 @@
 }
 
 #if !defined(__LP64__)
-// TODO: this exists only for backward binary compatibility on 32 bit platforms.
+// This exists only for backward binary compatibility on 32 bit platforms.
+// (This is actually a _new_ function in API 28 that we could only implement for LP64.)
 extern "C" int pthread_cond_timedwait_monotonic(pthread_cond_t* cond_interface,
                                                 pthread_mutex_t* mutex,
                                                 const timespec* abs_timeout) {
   return pthread_cond_timedwait_monotonic_np(cond_interface, mutex, abs_timeout);
 }
+#endif
 
-// Force this function using CLOCK_MONOTONIC because it was always using
-// CLOCK_MONOTONIC in history.
+#if !defined(__LP64__)
+// This exists only for backward binary compatibility on 32 bit platforms.
+// (This function never existed for LP64.)
 extern "C" int pthread_cond_timedwait_relative_np(pthread_cond_t* cond_interface,
                                                   pthread_mutex_t* mutex,
                                                   const timespec* rel_timeout) {
@@ -269,11 +272,15 @@
   }
   return __pthread_cond_timedwait(__get_internal_cond(cond_interface), mutex, false, abs_timeout);
 }
+#endif
 
+#if !defined(__LP64__)
+// This exists only for backward binary compatibility on 32 bit platforms.
+// (This function never existed for LP64.)
 extern "C" int pthread_cond_timeout_np(pthread_cond_t* cond_interface,
                                        pthread_mutex_t* mutex, unsigned ms) {
   timespec ts;
   timespec_from_ms(ts, ms);
   return pthread_cond_timedwait_relative_np(cond_interface, mutex, &ts);
 }
-#endif // !defined(__LP64__)
+#endif
diff --git a/libc/bionic/pthread_create.cpp b/libc/bionic/pthread_create.cpp
index 417ce76..7bf9b40 100644
--- a/libc/bionic/pthread_create.cpp
+++ b/libc/bionic/pthread_create.cpp
@@ -116,14 +116,14 @@
 }
 
 static void __init_shadow_call_stack(pthread_internal_t* thread __unused) {
-#ifdef __aarch64__
+#if defined(__aarch64__) || defined(__riscv)
   // Allocate the stack and the guard region.
   char* scs_guard_region = reinterpret_cast<char*>(
       mmap(nullptr, SCS_GUARD_REGION_SIZE, 0, MAP_PRIVATE | MAP_ANON, -1, 0));
   thread->shadow_call_stack_guard_region = scs_guard_region;
 
   // The address is aligned to SCS_SIZE so that we only need to store the lower log2(SCS_SIZE) bits
-  // in jmp_buf.
+  // in jmp_buf. See the SCS commentary in pthread_internal.h for more detail.
   char* scs_aligned_guard_region =
       reinterpret_cast<char*>(align_up(reinterpret_cast<uintptr_t>(scs_guard_region), SCS_SIZE));
 
@@ -133,11 +133,15 @@
   size_t scs_offset =
       (getpid() == 1) ? 0 : (arc4random_uniform(SCS_GUARD_REGION_SIZE / SCS_SIZE - 1) * SCS_SIZE);
 
-  // Make the stack readable and writable and store its address in register x18. This is
-  // deliberately the only place where the address is stored.
-  char *scs = scs_aligned_guard_region + scs_offset;
+  // Make the stack read-write, and store its address in the register we're using as the shadow
+  // stack pointer. This is deliberately the only place where the address is stored.
+  char* scs = scs_aligned_guard_region + scs_offset;
   mprotect(scs, SCS_SIZE, PROT_READ | PROT_WRITE);
+#if defined(__aarch64__)
   __asm__ __volatile__("mov x18, %0" ::"r"(scs));
+#elif defined(__riscv)
+  __asm__ __volatile__("mv gp, %0" ::"r"(scs));
+#endif
 #endif
 }
 
diff --git a/libc/bionic/pthread_exit.cpp b/libc/bionic/pthread_exit.cpp
index bde95ec..f584b27 100644
--- a/libc/bionic/pthread_exit.cpp
+++ b/libc/bionic/pthread_exit.cpp
@@ -117,7 +117,7 @@
     __rt_sigprocmask(SIG_BLOCK, &set, nullptr, sizeof(sigset64_t));
   }
 
-#ifdef __aarch64__
+#if defined(__aarch64__) || defined(__riscv)
   // Free the shadow call stack and guard pages.
   munmap(thread->shadow_call_stack_guard_region, SCS_GUARD_REGION_SIZE);
 #endif
diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h
index 7222b62..106f3ed 100644
--- a/libc/bionic/pthread_internal.h
+++ b/libc/bionic/pthread_internal.h
@@ -105,9 +105,14 @@
 
   void* alternate_signal_stack;
 
-  // The start address of the shadow call stack's guard region (arm64 only).
+  // The start address of the shadow call stack's guard region (arm64/riscv64).
+  // This region is SCS_GUARD_REGION_SIZE bytes large, but only SCS_SIZE bytes
+  // are actually used.
+  //
   // This address is only used to deallocate the shadow call stack on thread
-  // exit; the address of the stack itself is stored only in the x18 register.
+  // exit; the address of the stack itself is stored only in the register used
+  // as the shadow stack pointer (x18 on arm64, gp on riscv64).
+  //
   // Because the protection offered by SCS relies on the secrecy of the stack
   // address, storing the address here weakens the protection, but only
   // slightly, because it is relatively easy for an attacker to discover the
@@ -115,13 +120,24 @@
   // to other allocations), but not the stack itself, which is <0.1% of the size
   // of the guard region.
   //
+  // longjmp()/setjmp() don't store all the bits of the shadow stack pointer,
+  // only the bottom bits covered by SCS_MASK. Since longjmp()/setjmp() between
+  // different threads is undefined behavior (and unsupported on Android), we
+  // can retrieve the high bits of the shadow stack pointer from the current
+  // value in the register --- all the jmp_buf needs to store is where exactly
+  // the shadow stack pointer is *within* the thread's shadow stack: the bottom
+  // bits of the register.
+  //
   // There are at least two other options for discovering the start address of
   // the guard region on thread exit, but they are not as simple as storing in
   // TLS.
-  // 1) Derive it from the value of the x18 register. This is only possible in
-  //    processes that do not contain legacy code that might clobber x18,
-  //    therefore each process must declare early during process startup whether
-  //    it might load legacy code.
+  //
+  // 1) Derive it from the current value of the shadow stack pointer. This is
+  //    only possible in processes that do not contain legacy code that might
+  //    clobber x18 on arm64, therefore each process must declare early during
+  //    process startup whether it might load legacy code.
+  //    TODO: riscv64 has no legacy code, so we can actually go this route
+  //    there, but hopefully we'll actually get the Zisslpcfi extension instead.
   // 2) Mark the guard region as such using prctl(PR_SET_VMA_ANON_NAME) and
   //    discover its address by reading /proc/self/maps. One issue with this is
   //    that reading /proc/self/maps can race with allocations, so we may need
diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp
index a15e981..9b37225 100644
--- a/libc/bionic/pthread_mutex.cpp
+++ b/libc/bionic/pthread_mutex.cpp
@@ -945,6 +945,8 @@
 }
 
 #if !defined(__LP64__)
+// This exists only for backward binary compatibility on 32 bit platforms.
+// (This function never existed for LP64.)
 extern "C" int pthread_mutex_lock_timeout_np(pthread_mutex_t* mutex_interface, unsigned ms) {
     timespec ts;
     timespec_from_ms(ts, ms);
diff --git a/libc/bionic/rename.cpp b/libc/bionic/rename.cpp
index 8295559..89786f7 100644
--- a/libc/bionic/rename.cpp
+++ b/libc/bionic/rename.cpp
@@ -30,5 +30,9 @@
 #include <stdio.h>
 
 int rename(const char* old_path, const char* new_path) {
-  return renameat(AT_FDCWD, old_path, AT_FDCWD, new_path);
+  return renameat2(AT_FDCWD, old_path, AT_FDCWD, new_path, 0);
+}
+
+int renameat(int old_dir_fd, const char* old_path, int new_dir_fd, const char* new_path) {
+  return renameat2(old_dir_fd, old_path, new_dir_fd, new_path, 0);
 }
diff --git a/libc/bionic/scandir.cpp b/libc/bionic/scandir.cpp
index f528286..0acef36 100644
--- a/libc/bionic/scandir.cpp
+++ b/libc/bionic/scandir.cpp
@@ -69,11 +69,8 @@
   }
 
   void Sort(int (*comparator)(const dirent**, const dirent**)) {
-    // If we have entries and a comparator, sort them.
-    if (size_ > 0 && comparator != nullptr) {
-      qsort(names_, size_, sizeof(dirent*),
-            reinterpret_cast<int (*)(const void*, const void*)>(comparator));
-    }
+    qsort(names_, size_, sizeof(dirent*),
+          reinterpret_cast<int (*)(const void*, const void*)>(comparator));
   }
 
  private:
@@ -120,7 +117,9 @@
     names.Add(entry);
   }
 
-  names.Sort(comparator);
+  if (comparator != nullptr) {
+    names.Sort(comparator);
+  }
 
   size_t size = names.size();
   *name_list = names.release();
diff --git a/libc/bionic/spawn.cpp b/libc/bionic/spawn.cpp
index 7e80ef6..5d76f77 100644
--- a/libc/bionic/spawn.cpp
+++ b/libc/bionic/spawn.cpp
@@ -68,7 +68,9 @@
 enum Action {
   kOpen,
   kClose,
-  kDup2
+  kDup2,
+  kChdir,
+  kFchdir,
 };
 
 struct __posix_spawn_file_action {
@@ -93,6 +95,10 @@
     } else if (what == kClose) {
       // Failure to close is ignored.
       close(fd);
+    } else if (what == kChdir) {
+      if (chdir(path) == -1) _exit(127);
+    } else if (what == kFchdir) {
+      if (fchdir(fd) == -1) _exit(127);
     } else {
       // It's a dup2.
       if (fd == new_fd) {
@@ -340,7 +346,7 @@
   if (action == nullptr) return errno;
 
   action->next = nullptr;
-  if (path != nullptr) {
+  if (what == kOpen || what == kChdir) {
     action->path = strdup(path);
     if (action->path == nullptr) {
       free(action);
@@ -380,3 +386,12 @@
   if (fd < 0 || new_fd < 0) return EBADF;
   return posix_spawn_add_file_action(actions, kDup2, fd, new_fd, nullptr, 0, 0);
 }
+
+int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t* actions, const char* path) {
+  return posix_spawn_add_file_action(actions, kChdir, -1, -1, path, 0, 0);
+}
+
+int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t* actions, int fd) {
+  if (fd < 0) return EBADF;
+  return posix_spawn_add_file_action(actions, kFchdir, fd, -1, nullptr, 0, 0);
+}
diff --git a/libc/bionic/strtol.cpp b/libc/bionic/strtol.cpp
index ec72b09..05b4b53 100644
--- a/libc/bionic/strtol.cpp
+++ b/libc/bionic/strtol.cpp
@@ -208,9 +208,6 @@
   return StrToI<long long, LLONG_MIN, LLONG_MAX, wchar_t>(s, end, base);
 }
 
-// Public API since L, but not in any header.
-__strong_alias(strtoq, strtoll);
-
 unsigned long strtoul(const char* s, char** end, int base) {
   return StrToU<unsigned long, ULONG_MAX, char>(s, end, base);
 }
@@ -234,6 +231,3 @@
 uintmax_t wcstoumax(const wchar_t* s, wchar_t** end, int base) {
   return StrToU<uintmax_t, UINTMAX_MAX, wchar_t>(s, end, base);
 }
-
-// Public API since L, but not in any header.
-__strong_alias(strtouq, strtoull);
diff --git a/libc/bionic/sys_statvfs.cpp b/libc/bionic/sys_statvfs.cpp
index ef5dc57..b3a0aca 100644
--- a/libc/bionic/sys_statvfs.cpp
+++ b/libc/bionic/sys_statvfs.cpp
@@ -14,17 +14,36 @@
  * limitations under the License.
  */
 
+#include <sys/statfs.h>
 #include <sys/statvfs.h>
 
-// libc++ uses statvfs (for Darwin compatibility), but on Linux statvfs is
-// just another name for statfs, so it didn't arrive until API level 19. We
-// make the implementation available as inlines to support std::filesystem
-// for NDK users (see https://github.com/android-ndk/ndk/issues/609).
+static __inline void __bionic_statfs_to_statvfs(const struct statfs* src, struct statvfs* dst) {
+  dst->f_bsize = src->f_bsize;
+  dst->f_frsize = src->f_frsize;
+  dst->f_blocks = src->f_blocks;
+  dst->f_bfree = src->f_bfree;
+  dst->f_bavail = src->f_bavail;
+  dst->f_files = src->f_files;
+  dst->f_ffree = src->f_ffree;
+  dst->f_favail = src->f_ffree;
+  dst->f_fsid = src->f_fsid.__val[0] | static_cast<uint64_t>(src->f_fsid.__val[1]) << 32;
+  dst->f_flag = src->f_flags;
+  dst->f_namemax = src->f_namelen;
+}
 
-#define __BIONIC_SYS_STATVFS_INLINE /* Out of line. */
-#define __BIONIC_NEED_STATVFS_INLINES
-#undef __BIONIC_NEED_STATVFS64_INLINES
-#include <bits/sys_statvfs_inlines.h>
+int statvfs(const char* path, struct statvfs* result) {
+  struct statfs tmp;
+  if (statfs(path, &tmp) == -1) return -1;
+  __bionic_statfs_to_statvfs(&tmp, result);
+  return 0;
+}
+
+int fstatvfs(int fd, struct statvfs* result) {
+  struct statfs tmp;
+  if (fstatfs(fd, &tmp) == -1) return -1;
+  __bionic_statfs_to_statvfs(&tmp, result);
+  return 0;
+}
 
 // Historically we provided actual symbols for statvfs64 and fstatvfs64.
 // They're not particularly useful, but we can't take them away.
diff --git a/libc/bionic/sysconf.cpp b/libc/bionic/sysconf.cpp
index dd6b129..1c06c9e 100644
--- a/libc/bionic/sysconf.cpp
+++ b/libc/bionic/sysconf.cpp
@@ -88,7 +88,7 @@
     case _SC_PAGESIZE:
     case _SC_PAGE_SIZE:
       // _SC_PAGESIZE and _SC_PAGE_SIZE are distinct, but return the same value.
-      return static_cast<long>(getauxval(AT_PAGESZ));
+      return getpagesize();
 
     case _SC_PHYS_PAGES:        return get_phys_pages();
 
diff --git a/libc/bionic/syslog.cpp b/libc/bionic/syslog.cpp
index 6b17d26..a459c6b 100644
--- a/libc/bionic/syslog.cpp
+++ b/libc/bionic/syslog.cpp
@@ -18,18 +18,22 @@
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
+#include <unistd.h>
 
 #include <async_safe/log.h>
 
 static const char* syslog_log_tag = nullptr;
 static int syslog_priority_mask = 0xff;
+static int syslog_options = 0;
 
 void closelog() {
   syslog_log_tag = nullptr;
+  syslog_options = 0;
 }
 
-void openlog(const char* log_tag, int /*options*/, int /*facility*/) {
+void openlog(const char* log_tag, int options, int /*facility*/) {
   syslog_log_tag = log_tag;
+  syslog_options = options;
 }
 
 int setlogmask(int new_mask) {
@@ -73,10 +77,16 @@
     android_log_priority = ANDROID_LOG_DEBUG;
   }
 
-  // We can't let async_safe_format_log do the formatting because it doesn't support
-  // all the printf functionality.
+  // We can't let async_safe_format_log do the formatting because it doesn't
+  // support all the printf functionality.
   char log_line[1024];
-  vsnprintf(log_line, sizeof(log_line), fmt, args);
+  int n = vsnprintf(log_line, sizeof(log_line), fmt, args);
+  if (n < 0) return;
 
   async_safe_format_log(android_log_priority, log_tag, "%s", log_line);
+  if ((syslog_options & LOG_PERROR) != 0) {
+    bool have_newline =
+        (n > 0 && n < static_cast<int>(sizeof(log_line)) && log_line[n - 1] == '\n');
+    dprintf(STDERR_FILENO, "%s: %s%s", log_tag, log_line, have_newline ? "" : "\n");
+  }
 }
diff --git a/libc/bionic/sysprop_helpers.cpp b/libc/bionic/sysprop_helpers.cpp
index 5627034..2051330 100644
--- a/libc/bionic/sysprop_helpers.cpp
+++ b/libc/bionic/sysprop_helpers.cpp
@@ -57,18 +57,22 @@
 }
 
 bool get_config_from_env_or_sysprops(const char* env_var_name, const char* const* sys_prop_names,
-                                     size_t sys_prop_names_size, char* options,
-                                     size_t options_size) {
+                                     size_t sys_prop_names_size, char* options, size_t options_size,
+                                     const char** chosen_source) {
   const char* env = getenv(env_var_name);
   if (env && *env != '\0') {
     strncpy(options, env, options_size);
     options[options_size - 1] = '\0';  // Ensure null-termination.
+    *chosen_source = env_var_name;
     return true;
   }
 
   for (size_t i = 0; i < sys_prop_names_size; ++i) {
     if (sys_prop_names[i] == nullptr) continue;
-    if (get_property_value(sys_prop_names[i], options, options_size)) return true;
+    if (get_property_value(sys_prop_names[i], options, options_size)) {
+      *chosen_source = sys_prop_names[i];
+      return true;
+    }
   }
   return false;
 }
diff --git a/libc/bionic/sysprop_helpers.h b/libc/bionic/sysprop_helpers.h
index a02c2dc..84e7af1 100644
--- a/libc/bionic/sysprop_helpers.h
+++ b/libc/bionic/sysprop_helpers.h
@@ -36,10 +36,13 @@
 //   2. System properties, in the order they're specified in sys_prop_names.
 // If neither of these options are specified (or they're both an empty string),
 // this function returns false. Otherwise, it returns true, and the presiding
-// options string is written to the `options` buffer of size `size`. If this
-// function returns true, `options` is guaranteed to be null-terminated.
+// options string is written to the `options` buffer of size `size`. It will
+// store a pointer to either env_var_name, or into the relevant entry of
+// sys_prop_names into choicen_source, indiciating which value was used. If
+// this function returns true, `options` is guaranteed to be null-terminated.
 // `options_size` should be at least PROP_VALUE_MAX.
 __LIBC_HIDDEN__ bool get_config_from_env_or_sysprops(const char* env_var_name,
                                                      const char* const* sys_prop_names,
                                                      size_t sys_prop_names_size, char* options,
-                                                     size_t options_size);
+                                                     size_t options_size,
+                                                     const char** chosen_source);
diff --git a/libc/bionic/timespec_get.cpp b/libc/bionic/time.cpp
similarity index 89%
rename from libc/bionic/timespec_get.cpp
rename to libc/bionic/time.cpp
index 7fc2182..800395e 100644
--- a/libc/bionic/timespec_get.cpp
+++ b/libc/bionic/time.cpp
@@ -29,5 +29,9 @@
 #include <time.h>
 
 int timespec_get(timespec* ts, int base) {
-  return (base == TIME_UTC && clock_gettime(CLOCK_REALTIME, ts) != -1) ? base : 0;
+  return (clock_gettime(base - 1, ts) != -1) ? base : 0;
+}
+
+int timespec_getres(timespec* ts, int base) {
+  return (clock_getres(base - 1, ts) != -1) ? base : 0;
 }
diff --git a/libc/bionic/timespec_get.cpp b/libc/bionic/time_l.cpp
similarity index 87%
copy from libc/bionic/timespec_get.cpp
copy to libc/bionic/time_l.cpp
index 7fc2182..e5fa9a5 100644
--- a/libc/bionic/timespec_get.cpp
+++ b/libc/bionic/time_l.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,8 @@
  */
 
 #include <time.h>
+//#include <xlocale.h>
 
-int timespec_get(timespec* ts, int base) {
-  return (base == TIME_UTC && clock_gettime(CLOCK_REALTIME, ts) != -1) ? base : 0;
+char* strptime_l(const char* buf, const char* fmt, struct tm* tm, locale_t) {
+  return strptime(buf, fmt, tm);
 }
diff --git a/libc/bionic/tmpfile.cpp b/libc/bionic/tmpfile.cpp
index 3d04610..4d6a1fb 100644
--- a/libc/bionic/tmpfile.cpp
+++ b/libc/bionic/tmpfile.cpp
@@ -51,6 +51,9 @@
   return nullptr;
 }
 
+// O_TMPFILE isn't available until Linux 3.11, so we fall back to this on
+// older kernels. AOSP was on a new enough kernel in the Lollipop timeframe,
+// so this code should be obsolete by 2025.
 static FILE* __tmpfile_dir_legacy(const char* tmp_dir) {
   char* path = nullptr;
   if (asprintf(&path, "%s/tmp.XXXXXXXXXX", tmp_dir) == -1) {
@@ -79,25 +82,18 @@
   return __fd_to_fp(fd);
 }
 
-static FILE* __tmpfile_dir(const char* tmp_dir) {
-  int fd = open(tmp_dir, O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
-  if (fd == -1) return __tmpfile_dir_legacy(tmp_dir);
-  return __fd_to_fp(fd);
+const char* __get_TMPDIR() {
+  // Use $TMPDIR if set, or fall back to /data/local/tmp otherwise.
+  // Useless for apps, but good enough for the shell.
+  const char* tmpdir = getenv("TMPDIR");
+  return (tmpdir == nullptr) ? "/data/local/tmp" : tmpdir;
 }
 
 FILE* tmpfile() {
-  // TODO: get this app's temporary directory from the framework ("/data/data/app/cache").
-
-  // $EXTERNAL_STORAGE turns out not to be very useful because it doesn't support hard links.
-  // This means we can't do the usual trick of calling unlink before handing the file back.
-
-  FILE* fp = __tmpfile_dir("/data/local/tmp");
-  if (fp == nullptr) {
-    // P_tmpdir is "/tmp/", but POSIX explicitly says that tmpdir(3) should try P_tmpdir before
-    // giving up. This is potentially useful for bionic on the host anyway.
-    fp = __tmpfile_dir(P_tmpdir);
-  }
-  return fp;
+  const char* tmpdir = __get_TMPDIR();
+  int fd = open(tmpdir, O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
+  if (fd == -1) return __tmpfile_dir_legacy(tmpdir);
+  return __fd_to_fp(fd);
 }
 __strong_alias(tmpfile64, tmpfile);
 
@@ -107,7 +103,7 @@
   // since we can't easily remove it...
 
   // $TMPDIR overrides any directory passed in.
-  char* tmpdir = getenv("TMPDIR");
+  const char* tmpdir = getenv("TMPDIR");
   if (tmpdir != nullptr) dir = tmpdir;
 
   // If we still have no directory, we'll give you a default.
@@ -136,12 +132,7 @@
   static char buf[L_tmpnam];
   if (s == nullptr) s = buf;
 
-  // Use $TMPDIR if set, or fall back to /data/local/tmp otherwise.
-  // Useless for apps, but good enough for the shell.
-  const char* dir = getenv("TMPDIR");
-  if (dir == nullptr) dir = "/data/local/tmp";
-
   // Make up a mktemp(3) template and defer to it for the real work.
-  snprintf(s, L_tmpnam, "%s/tmpnam.XXXXXXXXXX", dir);
+  snprintf(s, L_tmpnam, "%s/tmpnam.XXXXXXXXXX", __get_TMPDIR());
   return mktemp(s);
 }
diff --git a/libc/include/android/api-level.h b/libc/include/android/api-level.h
index 79085d1..6602e5d 100644
--- a/libc/include/android/api-level.h
+++ b/libc/include/android/api-level.h
@@ -162,9 +162,15 @@
  */
 #define __ANDROID_API_T__ 33
 
-/** Names the "U" API level (34), for comparison against `__ANDROID_API__`. */
+/**
+ * Names the Android 14 (aka "U" or "UpsideDownCake") API level (34),
+ * for comparison against `__ANDROID_API__`.
+ */
 #define __ANDROID_API_U__ 34
 
+/** Names the "V" API level (35), for comparison against `__ANDROID_API__`. */
+#define __ANDROID_API_V__ 35
+
 /* This file is included in <features.h>, and might be used from .S files. */
 #if !defined(__ASSEMBLY__)
 
diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h
index f0b731c..f216aab 100644
--- a/libc/include/android/dlext.h
+++ b/libc/include/android/dlext.h
@@ -157,7 +157,7 @@
   uint64_t flags;
 
   /** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */
-  void*   reserved_addr;
+  void*   _Nullable reserved_addr;
   /** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */
   size_t  reserved_size;
 
@@ -170,7 +170,7 @@
   off64_t library_fd_offset;
 
   /** Used by `ANDROID_DLEXT_USE_NAMESPACE`. */
-  struct android_namespace_t* library_namespace;
+  struct android_namespace_t* _Nullable library_namespace;
 } android_dlextinfo;
 
 /**
@@ -180,7 +180,7 @@
  *
  * Available since API level 21.
  */
-void* android_dlopen_ext(const char* __filename, int __flags, const android_dlextinfo* __info)
+void* _Nullable android_dlopen_ext(const char* _Nullable __filename, int __flags, const android_dlextinfo* _Nullable __info)
   __INTRODUCED_IN(21);
 
 __END_DECLS
diff --git a/libc/include/android/fdsan.h b/libc/include/android/fdsan.h
index 59ce133..3de0649 100644
--- a/libc/include/android/fdsan.h
+++ b/libc/include/android/fdsan.h
@@ -159,7 +159,7 @@
  *
  * The return value points to memory with static lifetime, do not attempt to modify it.
  */
-const char* android_fdsan_get_tag_type(uint64_t tag) __INTRODUCED_IN(29);
+const char* _Nonnull android_fdsan_get_tag_type(uint64_t tag) __INTRODUCED_IN(29);
 
 /*
  * Get an owner tag's value, with the type masked off.
diff --git a/libc/include/android/legacy_fenv_inlines_arm.h b/libc/include/android/legacy_fenv_inlines_arm.h
deleted file mode 100644
index 92caa72..0000000
--- a/libc/include/android/legacy_fenv_inlines_arm.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-/**
- * @file legacy_fenv_inlines_arm.h
- * @brief Inline ARM-specific definitions of fenv for old API levels.
- */
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21 && defined(__arm__)
-
-#define __BIONIC_FENV_INLINE static __inline
-#include <bits/fenv_inlines_arm.h>
-
-#endif
diff --git a/libc/include/android/legacy_signal_inlines.h b/libc/include/android/legacy_signal_inlines.h
deleted file mode 100644
index f2bdcf6..0000000
--- a/libc/include/android/legacy_signal_inlines.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
-#include <signal.h>
-#include <string.h>
-
-__BEGIN_DECLS
-
-sighandler_t bsd_signal(int __signal, sighandler_t __handler) __REMOVED_IN(21);
-
-/* These weren't introduced until L. */
-int __libc_current_sigrtmax() __attribute__((__weak__)) __VERSIONER_NO_GUARD;
-int __libc_current_sigrtmin() __attribute__((__weak__)) __VERSIONER_NO_GUARD;
-
-static __inline int __ndk_legacy___libc_current_sigrtmax() {
-  /*
-   * The NDK doesn't use libclang_rt.builtins yet (https://github.com/android/ndk/issues/1231) so it
-   * can't use __builtin_available, but the platform builds with -Werror=unguarded-availability so
-   * it requires __builtin_available.
-   */
-#if defined(__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__)
-  if (__builtin_available(android 21, *)) {
-#else
-  if (__libc_current_sigrtmax) {
-#endif
-    return __libc_current_sigrtmax();
-  }
-  return __SIGRTMAX; /* Should match __libc_current_sigrtmax. */
-}
-
-static __inline int __ndk_legacy___libc_current_sigrtmin() {
-  /*
-   * The NDK doesn't use libclang_rt.builtins yet (https://github.com/android/ndk/issues/1231) so it
-   * can't use __builtin_available, but the platform builds with -Werror=unguarded-availability so
-   * it requires __builtin_available.
-   */
-#if defined(__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__)
-  if (__builtin_available(android 21, *)) {
-#else
-  if (__libc_current_sigrtmin) {
-#endif
-    return __libc_current_sigrtmin();
-  }
-  return __SIGRTMIN + 7; /* Should match __libc_current_sigrtmin. */
-}
-
-#undef SIGRTMAX
-#define SIGRTMAX __ndk_legacy___libc_current_sigrtmax()
-#undef SIGRTMIN
-#define SIGRTMIN __ndk_legacy___libc_current_sigrtmin()
-
-static __inline int sigismember(const sigset_t *set, int signum) {
-  /* Signal numbers start at 1, but bit positions start at 0. */
-  int bit = signum - 1;
-  const unsigned long *local_set = (const unsigned long *)set;
-  if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  return (int)((local_set[bit / (8 * sizeof(long))] >> (bit % (8 * sizeof(long)))) & 1);
-}
-
-static __inline int sigaddset(sigset_t *set, int signum) {
-  /* Signal numbers start at 1, but bit positions start at 0. */
-  int bit = signum - 1;
-  unsigned long *local_set = (unsigned long *)set;
-  if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / (8 * sizeof(long))] |= 1UL << (bit % (8 * sizeof(long)));
-  return 0;
-}
-
-static __inline int sigdelset(sigset_t *set, int signum) {
-  /* Signal numbers start at 1, but bit positions start at 0. */
-  int bit = signum - 1;
-  unsigned long *local_set = (unsigned long *)set;
-  if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / (8 * sizeof(long))] &= ~(1UL << (bit % (8 * sizeof(long))));
-  return 0;
-}
-
-static __inline int sigemptyset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, 0, sizeof(sigset_t));
-  return 0;
-}
-
-static __inline int sigfillset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, ~0, sizeof(sigset_t));
-  return 0;
-}
-
-static __inline sighandler_t signal(int s, sighandler_t f) {
-  return bsd_signal(s, f);
-}
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/android/legacy_stdlib_inlines.h b/libc/include/android/legacy_stdlib_inlines.h
index 6903536..f0985fe 100644
--- a/libc/include/android/legacy_stdlib_inlines.h
+++ b/libc/include/android/legacy_stdlib_inlines.h
@@ -30,61 +30,6 @@
 
 #include <sys/cdefs.h>
 
-#if __ANDROID_API__ < 19
-
-__BEGIN_DECLS
-
-static __inline int abs(int __n) { return (__n < 0) ? -__n : __n; }
-
-static __inline long labs(long __n) { return (__n < 0L) ? -__n : __n; }
-
-static __inline long long llabs(long long __n) {
-  return (__n < 0LL) ? -__n : __n;
-}
-
-__END_DECLS
-
-#endif
-
-
-
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
-#include <float.h>
-#include <stdlib.h>
-
-__BEGIN_DECLS
-
-static __inline float strtof(const char* nptr, char** endptr) {
-  // N.B. Double-rounding makes this function incorrect for some inputs.
-  double d = strtod(nptr, endptr);
-  if (__builtin_isfinite(d) && __builtin_fabs(d) > FLT_MAX) {
-    errno = ERANGE;
-    return __builtin_copysign(__builtin_huge_valf(), d);
-  }
-  return __BIONIC_CAST(static_cast, float, d);
-}
-
-static __inline double atof(const char *nptr) { return (strtod(nptr, NULL)); }
-
-static __inline int rand(void) { return (int)lrand48(); }
-
-static __inline void srand(unsigned int __s) { srand48(__s); }
-
-static __inline long random(void) { return lrand48(); }
-
-static __inline void srandom(unsigned int __s) { srand48(__s); }
-
-static __inline int grantpt(int __fd __attribute((unused))) {
-  return 0; /* devpts does this all for us! */
-}
-
-__END_DECLS
-
-#endif
-
-
 
 #if __ANDROID_API__ < 26
 
@@ -93,15 +38,15 @@
 
 __BEGIN_DECLS
 
-static __inline double strtod_l(const char* __s, char** __end_ptr, locale_t __l) {
+static __inline double strtod_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) {
   return strtod(__s, __end_ptr);
 }
 
-static __inline float strtof_l(const char* __s, char** __end_ptr, locale_t __l) {
+static __inline float strtof_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) {
   return strtof(__s, __end_ptr);
 }
 
-static __inline long strtol_l(const char* __s, char** __end_ptr, int __base, locale_t __l) {
+static __inline long strtol_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) {
   return strtol(__s, __end_ptr, __base);
 }
 
diff --git a/libc/include/android/legacy_sys_mman_inlines.h b/libc/include/android/legacy_sys_mman_inlines.h
deleted file mode 100644
index 04b3e97..0000000
--- a/libc/include/android/legacy_sys_mman_inlines.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-__BEGIN_DECLS
-
-/*
- * While this was never an inline, this function alone has caused most of the
- * bug reports related to _FILE_OFFSET_BITS=64. Providing an inline for it
- * should allow a lot more code to build with _FILE_OFFSET_BITS=64 when
- * targeting pre-L.
- */
-static __inline void* mmap64(void* __addr, size_t __size, int __prot, int __flags, int __fd,
-                             off64_t __offset) __RENAME(mmap64);
-static __inline void* mmap64(void* __addr, size_t __size, int __prot, int __flags, int __fd,
-                             off64_t __offset) {
-  const int __mmap2_shift = 12; // 2**12 == 4096
-  if (__offset < 0 || (__offset & ((1UL << __mmap2_shift) - 1)) != 0) {
-    errno = EINVAL;
-    return MAP_FAILED;
-  }
-
-  // prevent allocations large enough for `end - start` to overflow
-  size_t __rounded = __BIONIC_ALIGN(__size, PAGE_SIZE);
-  if (__rounded < __size || __rounded > PTRDIFF_MAX) {
-    errno = ENOMEM;
-    return MAP_FAILED;
-  }
-
-  extern void* __mmap2(void* __addr, size_t __size, int __prot, int __flags, int __fd,
-                       size_t __offset);
-  return __mmap2(__addr, __size, __prot, __flags, __fd, __offset >> __mmap2_shift);
-}
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/android/legacy_sys_stat_inlines.h b/libc/include/android/legacy_sys_stat_inlines.h
deleted file mode 100644
index d42ac01..0000000
--- a/libc/include/android/legacy_sys_stat_inlines.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#include <sys/stat.h>
-
-__BEGIN_DECLS
-
-static __inline int mkfifo(const char* __path, mode_t __mode) {
-  return mknod(__path, (__mode & ~S_IFMT) | S_IFIFO, (dev_t)0);
-}
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/android/legacy_sys_statvfs_inlines.h b/libc/include/android/legacy_sys_statvfs_inlines.h
deleted file mode 100644
index 369e6a2..0000000
--- a/libc/include/android/legacy_sys_statvfs_inlines.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-/**
- * @file legacy_sys_statvfs_inlines.h
- * @brief Inline definitions of statvfs/fstatvfs for old API levels.
- */
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#define __BIONIC_NEED_STATVFS64_INLINES
-#if __ANDROID_API__ < 19
-#define __BIONIC_NEED_STATVFS_INLINES
-#endif
-
-#define __BIONIC_SYS_STATVFS_INLINE static __inline
-#include <bits/sys_statvfs_inlines.h>
-
-#endif
diff --git a/libc/include/android/legacy_sys_wait_inlines.h b/libc/include/android/legacy_sys_wait_inlines.h
deleted file mode 100644
index eadc752..0000000
--- a/libc/include/android/legacy_sys_wait_inlines.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 18
-
-#include <sys/syscall.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-__BEGIN_DECLS
-
-static __inline pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage) {
-  return __BIONIC_CAST(static_cast, pid_t, syscall(__NR_wait4, pid, status, options, rusage));
-}
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/android/set_abort_message.h b/libc/include/android/set_abort_message.h
index 5d8d8ee..2be01a9 100644
--- a/libc/include/android/set_abort_message.h
+++ b/libc/include/android/set_abort_message.h
@@ -46,6 +46,6 @@
  *
  * Available since API level 21.
  */
-void android_set_abort_message(const char* __msg) __INTRODUCED_IN(21);
+void android_set_abort_message(const char* _Nullable __msg) __INTRODUCED_IN(21);
 
 __END_DECLS
diff --git a/libc/include/assert.h b/libc/include/assert.h
index 79e7b86..8db970b 100644
--- a/libc/include/assert.h
+++ b/libc/include/assert.h
@@ -75,12 +75,12 @@
  * __assert() is called by assert() on failure. Most users want assert()
  * instead, but this can be useful for reporting other failures.
  */
-void __assert(const char* __file, int __line, const char* __msg) __noreturn;
+void __assert(const char* _Nonnull __file, int __line, const char* _Nonnull __msg) __noreturn;
 
 /**
  * __assert2() is called by assert() on failure. Most users want assert()
  * instead, but this can be useful for reporting other failures.
  */
-void __assert2(const char* __file, int __line, const char* __function, const char* __msg) __noreturn;
+void __assert2(const char* _Nonnull __file, int __line, const char* _Nonnull __function, const char* _Nonnull __msg) __noreturn;
 
 __END_DECLS
diff --git a/libc/include/bits/ctype_inlines.h b/libc/include/bits/ctype_inlines.h
index 744eb91..089a642 100644
--- a/libc/include/bits/ctype_inlines.h
+++ b/libc/include/bits/ctype_inlines.h
@@ -61,7 +61,7 @@
 __BEGIN_DECLS
 
 /** Internal implementation detail. Do not use. */
-extern const char* _ctype_;
+extern const char* _Nonnull _ctype_;
 
 /** Returns true if `ch` is in `[A-Za-z0-9]`. */
 __BIONIC_CTYPE_INLINE int isalnum(int __ch) {
@@ -175,33 +175,33 @@
 
 #if __ANDROID_API__ >= 21
 /** Like isalnum but with an ignored `locale_t`. */
-int isalnum_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isalnum_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isalpha but with an ignored `locale_t`. */
-int isalpha_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isalpha_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isblank but with an ignored `locale_t`. */
-int isblank_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isblank_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like iscntrl but with an ignored `locale_t`. */
-int iscntrl_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int iscntrl_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isdigit but with an ignored `locale_t`. */
-int isdigit_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isdigit_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isgraph but with an ignored `locale_t`. */
-int isgraph_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isgraph_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like islower but with an ignored `locale_t`. */
-int islower_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int islower_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isprint but with an ignored `locale_t`. */
-int isprint_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isprint_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like ispunct but with an ignored `locale_t`. */
-int ispunct_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int ispunct_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isspace but with an ignored `locale_t`. */
-int isspace_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isspace_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isupper but with an ignored `locale_t`. */
-int isupper_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isupper_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like isxdigit but with an ignored `locale_t`. */
-int isxdigit_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int isxdigit_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like tolower but with an ignored `locale_t`. */
-int tolower_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int tolower_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 /** Like toupper but with an ignored `locale_t`. */
-int toupper_l(int __ch, locale_t __l) __INTRODUCED_IN(21);
+int toupper_l(int __ch, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 #else
 // Implemented as static inlines in libc++ before 21.
 #endif
diff --git a/libc/include/bits/elf_arm.h b/libc/include/bits/elf_arm.h
deleted file mode 100644
index 08fe1d5..0000000
--- a/libc/include/bits/elf_arm.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*	$NetBSD: elf_machdep.h,v 1.17 2014/02/25 19:20:09 matt Exp $	*/
-
-#ifndef _ARM_ELF_MACHDEP_H_
-#define _ARM_ELF_MACHDEP_H_
-
-/* Android-added. */
-#define R_ARM_IRELATIVE		160
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_ARM_RELEXEC		0x00000001
-#define EF_ARM_HASENTRY		0x00000002
-#define EF_ARM_INTERWORK	0x00000004 /* GNU binutils 000413 */
-#define EF_ARM_SYMSARESORTED	0x00000004 /* ARM ELF A08 */
-#define EF_ARM_APCS_26		0x00000008 /* GNU binutils 000413 */
-#define EF_ARM_DYNSYMSUSESEGIDX	0x00000008 /* ARM ELF B01 */
-#define EF_ARM_APCS_FLOAT	0x00000010 /* GNU binutils 000413 */
-#define EF_ARM_MAPSYMSFIRST	0x00000010 /* ARM ELF B01 */
-#define EF_ARM_PIC		0x00000020
-#define EF_ARM_ALIGN8		0x00000040 /* 8-bit structure alignment.  */
-#define EF_ARM_NEW_ABI		0x00000080
-#define EF_ARM_OLD_ABI		0x00000100
-#define EF_ARM_SOFT_FLOAT	0x00000200
-#define EF_ARM_BE8		0x00800000
-#define EF_ARM_EABIMASK		0xff000000
-#define	EF_ARM_EABI_VER1	0x01000000
-#define	EF_ARM_EABI_VER2	0x02000000
-#define	EF_ARM_EABI_VER3	0x03000000
-#define	EF_ARM_EABI_VER4	0x04000000
-#define	EF_ARM_EABI_VER5	0x05000000
-
-/* Processor specific relocation types */
-
-#define R_ARM_NONE		0
-#define R_ARM_PC24		1
-#define R_ARM_ABS32		2
-#define R_ARM_REL32		3
-#define R_ARM_PC13		4
-#define R_ARM_ABS16		5
-#define R_ARM_ABS12		6
-#define R_ARM_THM_ABS5		7
-#define R_ARM_ABS8		8
-#define R_ARM_SBREL32		9
-#define R_ARM_THM_PC22		10
-#define R_ARM_THM_PC8		11
-#define R_ARM_AMP_VCALL9	12
-#define R_ARM_SWI24		13	/* obsolete static relocation */
-#define R_ARM_TLS_DESC		13	/* dynamic relocation */
-#define R_ARM_THM_SWI8		14
-#define R_ARM_XPC25		15
-#define R_ARM_THM_XPC22		16
-
-/* TLS relocations */
-#define R_ARM_TLS_DTPMOD32	17	/* ID of module containing symbol */
-#define R_ARM_TLS_DTPOFF32	18	/* Offset in TLS block */
-#define R_ARM_TLS_TPOFF32	19	/* Offset in static TLS block */
-
-/* 20-31 are reserved for ARM Linux. */
-#define R_ARM_COPY		20
-#define R_ARM_GLOB_DAT		21
-#define	R_ARM_JUMP_SLOT		22
-#define R_ARM_RELATIVE		23
-#define	R_ARM_GOTOFF		24
-#define R_ARM_GOTPC		25
-#define R_ARM_GOT32		26
-#define R_ARM_PLT32		27
-#define R_ARM_CALL		28
-#define R_ARM_JUMP24		29
-#define R_ARM_THM_JUMP24	30
-#define R_ARM_BASE_ABS		31
-#define R_ARM_ALU_PCREL_7_0	32
-#define R_ARM_ALU_PCREL_15_8	33
-#define R_ARM_ALU_PCREL_23_15	34
-#define R_ARM_ALU_SBREL_11_0	35
-#define R_ARM_ALU_SBREL_19_12	36
-#define R_ARM_ALU_SBREL_27_20	37	// depcreated
-#define R_ARM_TARGET1		38
-#define R_ARM_SBREL31		39	// deprecated
-#define R_ARM_V4BX		40
-#define R_ARM_TARGET2		41
-#define R_ARM_PREL31		42
-#define R_ARM_MOVW_ABS_NC	43
-#define R_ARM_MOVT_ABS		44
-#define R_ARM_MOVW_PREL_NC	45
-#define R_ARM_MOVT_PREL		46
-#define R_ARM_THM_MOVW_ABS_NC	47
-#define R_ARM_THM_MOVT_ABS	48
-#define R_ARM_THM_MOVW_PREL_NC	49
-#define R_ARM_THM_MOVT_PREL	50
-
-/* 96-111 are reserved to G++. */
-#define R_ARM_GNU_VTENTRY	100
-#define R_ARM_GNU_VTINHERIT	101
-#define R_ARM_THM_PC11		102
-#define R_ARM_THM_PC9		103
-
-/* More TLS relocations */
-#define R_ARM_TLS_GD32		104	/* PC-rel 32 bit for global dynamic */
-#define R_ARM_TLS_LDM32		105	/* PC-rel 32 bit for local dynamic */
-#define R_ARM_TLS_LDO32		106	/* 32 bit offset relative to TLS */
-#define R_ARM_TLS_IE32		107	/* PC-rel 32 bit for GOT entry of */
-#define R_ARM_TLS_LE32		108
-#define R_ARM_TLS_LDO12		109
-#define R_ARM_TLS_LE12		110
-#define R_ARM_TLS_IE12GP	111
-
-/* 112-127 are reserved for private experiments. */
-
-#define R_ARM_RXPC25		249
-#define R_ARM_RSBREL32		250
-#define R_ARM_THM_RPC22		251
-#define R_ARM_RREL32		252
-#define R_ARM_RABS32		253
-#define R_ARM_RPC24		254
-#define R_ARM_RBASE		255
-
-/* Processor specific program header flags */
-#define PF_ARM_SB		0x10000000
-#define PF_ARM_PI		0x20000000
-#define PF_ARM_ENTRY		0x80000000
-
-/* Processor specific program header types */
-#define PT_ARM_EXIDX		(PT_LOPROC + 1)
-
-/* Processor specific section header flags */
-#define SHF_ENTRYSECT		0x10000000
-#define SHF_COMDEF		0x80000000
-
-/* Processor specific symbol types */
-#define STT_ARM_TFUNC		STT_LOPROC
-
-#endif /* _ARM_ELF_MACHDEP_H_ */
diff --git a/libc/include/bits/elf_arm64.h b/libc/include/bits/elf_arm64.h
deleted file mode 100644
index 9330d7b..0000000
--- a/libc/include/bits/elf_arm64.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _AARCH64_ELF_MACHDEP_H_
-#define _AARCH64_ELF_MACHDEP_H_
-
-/* Null relocations */
-#define R_ARM_NONE                      0
-#define R_AARCH64_NONE                  256
-
-/* Static Data relocations */
-#define R_AARCH64_ABS64                 257
-#define R_AARCH64_ABS32                 258
-#define R_AARCH64_ABS16                 259
-#define R_AARCH64_PREL64                260
-#define R_AARCH64_PREL32                261
-#define R_AARCH64_PREL16                262
-
-#define R_AARCH64_MOVW_UABS_G0          263
-#define R_AARCH64_MOVW_UABS_G0_NC       264
-#define R_AARCH64_MOVW_UABS_G1          265
-#define R_AARCH64_MOVW_UABS_G1_NC       266
-#define R_AARCH64_MOVW_UABS_G2          267
-#define R_AARCH64_MOVW_UABS_G2_NC       268
-#define R_AARCH64_MOVW_UABS_G3          269
-#define R_AARCH64_MOVW_SABS_G0          270
-#define R_AARCH64_MOVW_SABS_G1          271
-#define R_AARCH64_MOVW_SABS_G2          272
-
-/* PC-relative addresses */
-#define R_AARCH64_LD_PREL_LO19          273
-#define R_AARCH64_ADR_PREL_LO21         274
-#define R_AARCH64_ADR_PREL_PG_HI21      275
-#define R_AARCH64_ADR_PREL_PG_HI21_NC   276
-#define R_AARCH64_ADD_ABS_LO12_NC       277
-#define R_AARCH64_LDST8_ABS_LO12_NC     278
-
-/* Control-flow relocations */
-#define R_AARCH64_TSTBR14               279
-#define R_AARCH64_CONDBR19              280
-#define R_AARCH64_JUMP26                282
-#define R_AARCH64_CALL26                283
-#define R_AARCH64_LDST16_ABS_LO12_NC    284
-#define R_AARCH64_LDST32_ABS_LO12_NC    285
-#define R_AARCH64_LDST64_ABS_LO12_NC    286
-#define R_AARCH64_LDST128_ABS_LO12_NC   299
-
-#define R_AARCH64_MOVW_PREL_G0          287
-#define R_AARCH64_MOVW_PREL_G0_NC       288
-#define R_AARCH64_MOVW_PREL_G1          289
-#define R_AARCH64_MOVW_PREL_G1_NC       290
-#define R_AARCH64_MOVW_PREL_G2          291
-#define R_AARCH64_MOVW_PREL_G2_NC       292
-#define R_AARCH64_MOVW_PREL_G3          293
-
-/* Dynamic relocations */
-#define R_AARCH64_COPY                  1024
-#define R_AARCH64_GLOB_DAT              1025    /* Create GOT entry.  */
-#define R_AARCH64_JUMP_SLOT             1026    /* Create PLT entry.  */
-#define R_AARCH64_RELATIVE              1027    /* Adjust by program base.  */
-#define R_AARCH64_TLS_DTPMOD            1028    /* Module index. */
-#define R_AARCH64_TLS_DTPREL            1029    /* Module-relative offset. */
-#define R_AARCH64_TLS_TPREL             1030    /* TP-relative offset. */
-#define R_AARCH64_TLSDESC               1031    /* 16-byte descriptor: resolver func + arg. */
-#define R_AARCH64_IRELATIVE             1032
-
-/* Dynamic array tags */
-#define DT_AARCH64_BTI_PLT              0x70000001
-#define DT_AARCH64_PAC_PLT              0x70000003
-#define DT_AARCH64_VARIANT_PCS          0x70000005
-
-#endif /* _AARCH64_ELF_MACHDEP_H_ */
diff --git a/libc/include/bits/elf_common.h b/libc/include/bits/elf_common.h
new file mode 100644
index 0000000..b3c57a2
--- /dev/null
+++ b/libc/include/bits/elf_common.h
@@ -0,0 +1,1435 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2017, 2018 Dell EMC
+ * Copyright (c) 2000, 2001, 2008, 2011, David E. O'Brien
+ * Copyright (c) 1998 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_ELF_COMMON_H_
+#define	_SYS_ELF_COMMON_H_ 1
+
+/*
+ * ELF definitions that are independent of architecture or word size.
+ */
+
+/*
+ * Option kinds.
+ */
+#define	ODK_NULL	0	/* undefined */
+#define	ODK_REGINFO	1	/* register usage info */
+#define	ODK_EXCEPTIONS	2	/* exception processing info */
+#define	ODK_PAD		3	/* section padding */
+#define	ODK_HWPATCH	4	/* hardware patch applied */
+#define	ODK_FILL	5	/* fill value used by the linker */
+#define	ODK_TAGS	6	/* reserved space for tools */
+#define	ODK_HWAND	7	/* hardware AND patch applied */
+#define	ODK_HWOR	8	/* hardware OR patch applied */
+#define	ODK_GP_GROUP	9	/* GP group for text/data sections */
+#define	ODK_IDENT	10	/* ID information */
+#define	ODK_PAGESIZE	11	/* page size information */
+
+/*
+ * ODK_EXCEPTIONS info field masks.
+ */
+#define	OEX_FPU_MIN	0x0000001f	/* min FPU exception required */
+#define	OEX_FPU_MAX	0x00001f00	/* max FPU exception allowed */
+#define	OEX_PAGE0	0x00010000	/* page zero must be mapped */
+#define	OEX_SMM		0x00020000	/* run in sequential memory mode */
+#define	OEX_PRECISEFP	0x00040000	/* run in precise FP exception mode */
+#define	OEX_DISMISS	0x00080000	/* dismiss invalid address traps */
+
+/*
+ * ODK_PAD info field masks.
+ */
+#define	OPAD_PREFIX	0x0001
+#define	OPAD_POSTFIX	0x0002
+#define	OPAD_SYMBOL	0x0004
+
+/*
+ * ODK_HWPATCH info field masks.
+ */
+#define	OHW_R4KEOP	0x00000001	/* patch for R4000 branch at end-of-page bug */
+#define	OHW_R8KPFETCH	0x00000002	/* R8000 prefetch bug may occur */
+#define	OHW_R5KEOP	0x00000004	/* patch for R5000 branch at end-of-page bug */
+#define	OHW_R5KCVTL	0x00000008	/* R5000 cvt.[ds].l bug: clean == 1 */
+#define	OHW_R10KLDL	0x00000010UL	/* need patch for R10000 misaligned load */
+
+/*
+ * ODK_HWAND/ODK_HWOR info field and hwp_flags[12] masks.
+ */
+#define	OHWA0_R4KEOP_CHECKED	0x00000001	/* object checked for R4000 end-of-page bug */
+#define	OHWA0_R4KEOP_CLEAN	0x00000002	/* object verified clean for R4000 end-of-page bug */
+#define	OHWO0_FIXADE		0x00000001	/* object requires call to fixade */
+
+/*
+ * ODK_IDENT/ODK_GP_GROUP info field masks.
+ */
+#define	OGP_GROUP	0x0000ffff	/* GP group number */
+#define	OGP_SELF	0x00010000	/* GP group is self-contained */
+
+/* Indexes into the e_ident array.  Keep synced with
+   http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
+#define	EI_MAG0		0	/* Magic number, byte 0. */
+#define	EI_MAG1		1	/* Magic number, byte 1. */
+#define	EI_MAG2		2	/* Magic number, byte 2. */
+#define	EI_MAG3		3	/* Magic number, byte 3. */
+#define	EI_CLASS	4	/* Class of machine. */
+#define	EI_DATA		5	/* Data format. */
+#define	EI_VERSION	6	/* ELF format version. */
+#define	EI_OSABI	7	/* Operating system / ABI identification */
+#define	EI_ABIVERSION	8	/* ABI version */
+#define	OLD_EI_BRAND	8	/* Start of architecture identification. */
+#define	EI_PAD		9	/* Start of padding (per SVR4 ABI). */
+#define	EI_NIDENT	16	/* Size of e_ident array. */
+
+/* Values for the magic number bytes. */
+#define	ELFMAG0		0x7f
+#define	ELFMAG1		'E'
+#define	ELFMAG2		'L'
+#define	ELFMAG3		'F'
+#define	ELFMAG		"\177ELF"	/* magic string */
+#define	SELFMAG		4		/* magic string size */
+
+/* Values for e_ident[EI_VERSION] and e_version. */
+#define	EV_NONE		0
+#define	EV_CURRENT	1
+
+/* Values for e_ident[EI_CLASS]. */
+#define	ELFCLASSNONE	0	/* Unknown class. */
+#define	ELFCLASS32	1	/* 32-bit architecture. */
+#define	ELFCLASS64	2	/* 64-bit architecture. */
+
+/* Values for e_ident[EI_DATA]. */
+#define	ELFDATANONE	0	/* Unknown data format. */
+#define	ELFDATA2LSB	1	/* 2's complement little-endian. */
+#define	ELFDATA2MSB	2	/* 2's complement big-endian. */
+
+/* Values for e_ident[EI_OSABI]. */
+#define	ELFOSABI_NONE		0	/* UNIX System V ABI */
+#define	ELFOSABI_HPUX		1	/* HP-UX operating system */
+#define	ELFOSABI_NETBSD		2	/* NetBSD */
+#define	ELFOSABI_LINUX		3	/* GNU/Linux */
+#define	ELFOSABI_HURD		4	/* GNU/Hurd */
+#define	ELFOSABI_86OPEN		5	/* 86Open common IA32 ABI */
+#define	ELFOSABI_SOLARIS	6	/* Solaris */
+#define	ELFOSABI_AIX		7	/* AIX */
+#define	ELFOSABI_IRIX		8	/* IRIX */
+#define	ELFOSABI_FREEBSD	9	/* FreeBSD */
+#define	ELFOSABI_TRU64		10	/* TRU64 UNIX */
+#define	ELFOSABI_MODESTO	11	/* Novell Modesto */
+#define	ELFOSABI_OPENBSD	12	/* OpenBSD */
+#define	ELFOSABI_OPENVMS	13	/* Open VMS */
+#define	ELFOSABI_NSK		14	/* HP Non-Stop Kernel */
+#define	ELFOSABI_AROS		15	/* Amiga Research OS */
+#define	ELFOSABI_FENIXOS	16	/* FenixOS */
+#define	ELFOSABI_CLOUDABI	17	/* Nuxi CloudABI */
+#define	ELFOSABI_OPENVOS	18	/* Stratus Technologies OpenVOS */
+#define	ELFOSABI_ARM_AEABI	64	/* ARM EABI */
+#define	ELFOSABI_ARM		97	/* ARM */
+#define	ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
+
+#define	ELFOSABI_MONTEREY	ELFOSABI_AIX	/* Monterey */
+
+/* e_ident */
+#define	IS_ELF(ehdr)	((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
+			 (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
+			 (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
+			 (ehdr).e_ident[EI_MAG3] == ELFMAG3)
+
+/* Values for e_type. */
+#define	ET_NONE		0	/* Unknown type. */
+#define	ET_REL		1	/* Relocatable. */
+#define	ET_EXEC		2	/* Executable. */
+#define	ET_DYN		3	/* Shared object. */
+#define	ET_CORE		4	/* Core file. */
+#define	ET_LOOS		0xfe00	/* First operating system specific. */
+#define	ET_HIOS		0xfeff	/* Last operating system-specific. */
+#define	ET_LOPROC	0xff00	/* First processor-specific. */
+#define	ET_HIPROC	0xffff	/* Last processor-specific. */
+
+/* Values for e_machine. */
+#define	EM_NONE		0	/* Unknown machine. */
+#define	EM_M32		1	/* AT&T WE32100. */
+#define	EM_SPARC	2	/* Sun SPARC. */
+#define	EM_386		3	/* Intel i386. */
+#define	EM_68K		4	/* Motorola 68000. */
+#define	EM_88K		5	/* Motorola 88000. */
+#define	EM_IAMCU	6	/* Intel MCU. */
+#define	EM_860		7	/* Intel i860. */
+#define	EM_MIPS		8	/* MIPS R3000 Big-Endian only. */
+#define	EM_S370		9	/* IBM System/370. */
+#define	EM_MIPS_RS3_LE	10	/* MIPS R3000 Little-Endian. */
+#define	EM_PARISC	15	/* HP PA-RISC. */
+#define	EM_VPP500	17	/* Fujitsu VPP500. */
+#define	EM_SPARC32PLUS	18	/* SPARC v8plus. */
+#define	EM_960		19	/* Intel 80960. */
+#define	EM_PPC		20	/* PowerPC 32-bit. */
+#define	EM_PPC64	21	/* PowerPC 64-bit. */
+#define	EM_S390		22	/* IBM System/390. */
+#define	EM_V800		36	/* NEC V800. */
+#define	EM_FR20		37	/* Fujitsu FR20. */
+#define	EM_RH32		38	/* TRW RH-32. */
+#define	EM_RCE		39	/* Motorola RCE. */
+#define	EM_ARM		40	/* ARM. */
+#define	EM_SH		42	/* Hitachi SH. */
+#define	EM_SPARCV9	43	/* SPARC v9 64-bit. */
+#define	EM_TRICORE	44	/* Siemens TriCore embedded processor. */
+#define	EM_ARC		45	/* Argonaut RISC Core. */
+#define	EM_H8_300	46	/* Hitachi H8/300. */
+#define	EM_H8_300H	47	/* Hitachi H8/300H. */
+#define	EM_H8S		48	/* Hitachi H8S. */
+#define	EM_H8_500	49	/* Hitachi H8/500. */
+#define	EM_IA_64	50	/* Intel IA-64 Processor. */
+#define	EM_MIPS_X	51	/* Stanford MIPS-X. */
+#define	EM_COLDFIRE	52	/* Motorola ColdFire. */
+#define	EM_68HC12	53	/* Motorola M68HC12. */
+#define	EM_MMA		54	/* Fujitsu MMA. */
+#define	EM_PCP		55	/* Siemens PCP. */
+#define	EM_NCPU		56	/* Sony nCPU. */
+#define	EM_NDR1		57	/* Denso NDR1 microprocessor. */
+#define	EM_STARCORE	58	/* Motorola Star*Core processor. */
+#define	EM_ME16		59	/* Toyota ME16 processor. */
+#define	EM_ST100	60	/* STMicroelectronics ST100 processor. */
+#define	EM_TINYJ	61	/* Advanced Logic Corp. TinyJ processor. */
+#define	EM_X86_64	62	/* Advanced Micro Devices x86-64 */
+#define	EM_AMD64	EM_X86_64	/* Advanced Micro Devices x86-64 (compat) */
+#define	EM_PDSP		63	/* Sony DSP Processor. */
+#define	EM_FX66		66	/* Siemens FX66 microcontroller. */
+#define	EM_ST9PLUS	67	/* STMicroelectronics ST9+ 8/16
+				   microcontroller. */
+#define	EM_ST7		68	/* STmicroelectronics ST7 8-bit
+				   microcontroller. */
+#define	EM_68HC16	69	/* Motorola MC68HC16 microcontroller. */
+#define	EM_68HC11	70	/* Motorola MC68HC11 microcontroller. */
+#define	EM_68HC08	71	/* Motorola MC68HC08 microcontroller. */
+#define	EM_68HC05	72	/* Motorola MC68HC05 microcontroller. */
+#define	EM_SVX		73	/* Silicon Graphics SVx. */
+#define	EM_ST19		74	/* STMicroelectronics ST19 8-bit mc. */
+#define	EM_VAX		75	/* Digital VAX. */
+#define	EM_CRIS		76	/* Axis Communications 32-bit embedded
+				   processor. */
+#define	EM_JAVELIN	77	/* Infineon Technologies 32-bit embedded
+				   processor. */
+#define	EM_FIREPATH	78	/* Element 14 64-bit DSP Processor. */
+#define	EM_ZSP		79	/* LSI Logic 16-bit DSP Processor. */
+#define	EM_MMIX		80	/* Donald Knuth's educational 64-bit proc. */
+#define	EM_HUANY	81	/* Harvard University machine-independent
+				   object files. */
+#define	EM_PRISM	82	/* SiTera Prism. */
+#define	EM_AVR		83	/* Atmel AVR 8-bit microcontroller. */
+#define	EM_FR30		84	/* Fujitsu FR30. */
+#define	EM_D10V		85	/* Mitsubishi D10V. */
+#define	EM_D30V		86	/* Mitsubishi D30V. */
+#define	EM_V850		87	/* NEC v850. */
+#define	EM_M32R		88	/* Mitsubishi M32R. */
+#define	EM_MN10300	89	/* Matsushita MN10300. */
+#define	EM_MN10200	90	/* Matsushita MN10200. */
+#define	EM_PJ		91	/* picoJava. */
+#define	EM_OPENRISC	92	/* OpenRISC 32-bit embedded processor. */
+#define	EM_ARC_A5	93	/* ARC Cores Tangent-A5. */
+#define	EM_XTENSA	94	/* Tensilica Xtensa Architecture. */
+#define	EM_VIDEOCORE	95	/* Alphamosaic VideoCore processor. */
+#define	EM_TMM_GPP	96	/* Thompson Multimedia General Purpose
+				   Processor. */
+#define	EM_NS32K	97	/* National Semiconductor 32000 series. */
+#define	EM_TPC		98	/* Tenor Network TPC processor. */
+#define	EM_SNP1K	99	/* Trebia SNP 1000 processor. */
+#define	EM_ST200	100	/* STMicroelectronics ST200 microcontroller. */
+#define	EM_IP2K		101	/* Ubicom IP2xxx microcontroller family. */
+#define	EM_MAX		102	/* MAX Processor. */
+#define	EM_CR		103	/* National Semiconductor CompactRISC
+				   microprocessor. */
+#define	EM_F2MC16	104	/* Fujitsu F2MC16. */
+#define	EM_MSP430	105	/* Texas Instruments embedded microcontroller
+				   msp430. */
+#define	EM_BLACKFIN	106	/* Analog Devices Blackfin (DSP) processor. */
+#define	EM_SE_C33	107	/* S1C33 Family of Seiko Epson processors. */
+#define	EM_SEP		108	/* Sharp embedded microprocessor. */
+#define	EM_ARCA		109	/* Arca RISC Microprocessor. */
+#define	EM_UNICORE	110	/* Microprocessor series from PKU-Unity Ltd.
+				   and MPRC of Peking University */
+#define	EM_AARCH64	183	/* AArch64 (64-bit ARM) */
+#define	EM_RISCV	243	/* RISC-V */
+
+/* Non-standard or deprecated. */
+#define	EM_486		6	/* Intel i486. */
+#define	EM_MIPS_RS4_BE	10	/* MIPS R4000 Big-Endian */
+#define	EM_ALPHA_STD	41	/* Digital Alpha (standard value). */
+#define	EM_ALPHA	0x9026	/* Alpha (written in the absence of an ABI) */
+
+/**
+ * e_flags
+ */
+#define	EF_ARM_RELEXEC	0x1
+#define	EF_ARM_HASENTRY	0x2
+#define	EF_ARM_SYMSARESORTED	0x4
+#define	EF_ARM_DYNSYMSUSESEGIDX	0x8
+#define	EF_ARM_MAPSYMSFIRST	0x10
+#define	EF_ARM_LE8		0x00400000
+#define	EF_ARM_BE8		0x00800000
+#define	EF_ARM_EABIMASK		0xFF000000
+#define	EF_ARM_EABI_UNKNOWN	0x00000000
+#define	EF_ARM_EABI_VER1	0x01000000
+#define	EF_ARM_EABI_VER2	0x02000000
+#define	EF_ARM_EABI_VER3	0x03000000
+#define	EF_ARM_EABI_VER4	0x04000000
+#define	EF_ARM_EABI_VER5	0x05000000
+#define	EF_ARM_INTERWORK	0x00000004
+#define	EF_ARM_APCS_26		0x00000008
+#define	EF_ARM_APCS_FLOAT	0x00000010
+#define	EF_ARM_PIC		0x00000020
+#define	EF_ARM_ALIGN8		0x00000040
+#define	EF_ARM_NEW_ABI		0x00000080
+#define	EF_ARM_OLD_ABI		0x00000100
+#define	EF_ARM_ABI_FLOAT_SOFT	0x00000200
+#define	EF_ARM_SOFT_FLOAT	EF_ARM_ABI_FLOAT_SOFT /* Pre-V5 ABI name */
+#define	EF_ARM_ABI_FLOAT_HARD	0x00000400
+#define	EF_ARM_VFP_FLOAT	EF_ARM_ABI_FLOAT_HARD /* Pre-V5 ABI name */
+#define	EF_ARM_MAVERICK_FLOAT	0x00000800
+
+#define	EF_MIPS_NOREORDER	0x00000001
+#define	EF_MIPS_PIC		0x00000002	/* Contains PIC code */
+#define	EF_MIPS_CPIC		0x00000004	/* STD PIC calling sequence */
+#define	EF_MIPS_UCODE		0x00000010
+#define	EF_MIPS_ABI2		0x00000020	/* N32 */
+#define	EF_MIPS_OPTIONS_FIRST	0x00000080
+#define	EF_MIPS_ABI		0x0000F000
+#define	EF_MIPS_ABI_O32		0x00001000
+#define	EF_MIPS_ABI_O64		0x00002000
+#define	EF_MIPS_ABI_EABI32	0x00003000
+#define	EF_MIPS_ABI_EABI64	0x00004000
+#define	EF_MIPS_ARCH_ASE	0x0F000000	/* Architectural extensions */
+#define	EF_MIPS_ARCH_ASE_MDMX	0x08000000	/* MDMX multimedia extension */
+#define	EF_MIPS_ARCH_ASE_M16	0x04000000	/* MIPS-16 ISA extensions */
+#define	EF_MIPS_ARCH		0xF0000000	/* Architecture field */
+#define	EF_MIPS_ARCH_1		0x00000000	/* -mips1 code */
+#define	EF_MIPS_ARCH_2		0x10000000	/* -mips2 code */
+#define	EF_MIPS_ARCH_3		0x20000000	/* -mips3 code */
+#define	EF_MIPS_ARCH_4		0x30000000	/* -mips4 code */
+#define	EF_MIPS_ARCH_5		0x40000000	/* -mips5 code */
+#define	EF_MIPS_ARCH_32		0x50000000	/* -mips32 code */
+#define	EF_MIPS_ARCH_64		0x60000000	/* -mips64 code */
+#define	EF_MIPS_ARCH_32R2	0x70000000	/* -mips32r2 code */
+#define	EF_MIPS_ARCH_64R2	0x80000000	/* -mips64r2 code */
+
+#define	EF_PPC_EMB		0x80000000
+#define	EF_PPC_RELOCATABLE	0x00010000
+#define	EF_PPC_RELOCATABLE_LIB	0x00008000
+
+#define	EF_RISCV_RVC		0x00000001
+#define	EF_RISCV_FLOAT_ABI_MASK	0x00000006
+#define	EF_RISCV_FLOAT_ABI_SOFT	0x00000000
+#define	EF_RISCV_FLOAT_ABI_SINGLE 0x000002
+#define	EF_RISCV_FLOAT_ABI_DOUBLE 0x000004
+#define	EF_RISCV_FLOAT_ABI_QUAD	0x00000006
+#define	EF_RISCV_RVE		0x00000008
+#define	EF_RISCV_TSO		0x00000010
+
+#define	EF_SPARC_EXT_MASK	0x00ffff00
+#define	EF_SPARC_32PLUS		0x00000100
+#define	EF_SPARC_SUN_US1	0x00000200
+#define	EF_SPARC_HAL_R1		0x00000200
+#define	EF_SPARC_SUN_US3	0x00000800
+
+#define	EF_SPARCV9_MM		0x00000003
+#define	EF_SPARCV9_TSO		0x00000000
+#define	EF_SPARCV9_PSO		0x00000001
+#define	EF_SPARCV9_RMO		0x00000002
+
+/* Special section indexes. */
+#define	SHN_UNDEF	     0		/* Undefined, missing, irrelevant. */
+#define	SHN_LORESERVE	0xff00		/* First of reserved range. */
+#define	SHN_LOPROC	0xff00		/* First processor-specific. */
+#define	SHN_HIPROC	0xff1f		/* Last processor-specific. */
+#define	SHN_LOOS	0xff20		/* First operating system-specific. */
+#define	SHN_FBSD_CACHED	SHN_LOOS	/* Transient, for sys/kern/link_elf_obj
+					   linker only: Cached global in local
+					   symtab. */
+#define	SHN_HIOS	0xff3f		/* Last operating system-specific. */
+#define	SHN_ABS		0xfff1		/* Absolute values. */
+#define	SHN_COMMON	0xfff2		/* Common data. */
+#define	SHN_XINDEX	0xffff		/* Escape -- index stored elsewhere. */
+#define	SHN_HIRESERVE	0xffff		/* Last of reserved range. */
+
+/* sh_type */
+#define	SHT_NULL		0	/* inactive */
+#define	SHT_PROGBITS		1	/* program defined information */
+#define	SHT_SYMTAB		2	/* symbol table section */
+#define	SHT_STRTAB		3	/* string table section */
+#define	SHT_RELA		4	/* relocation section with addends */
+#define	SHT_HASH		5	/* symbol hash table section */
+#define	SHT_DYNAMIC		6	/* dynamic section */
+#define	SHT_NOTE		7	/* note section */
+#define	SHT_NOBITS		8	/* no space section */
+#define	SHT_REL			9	/* relocation section - no addends */
+#define	SHT_SHLIB		10	/* reserved - purpose unknown */
+#define	SHT_DYNSYM		11	/* dynamic symbol table section */
+#define	SHT_INIT_ARRAY		14	/* Initialization function pointers. */
+#define	SHT_FINI_ARRAY		15	/* Termination function pointers. */
+#define	SHT_PREINIT_ARRAY	16	/* Pre-initialization function ptrs. */
+#define	SHT_GROUP		17	/* Section group. */
+#define	SHT_SYMTAB_SHNDX	18	/* Section indexes (see SHN_XINDEX). */
+#define	SHT_LOOS		0x60000000	/* First of OS specific semantics */
+#define	SHT_LOSUNW		0x6ffffff4
+#define	SHT_SUNW_dof		0x6ffffff4
+#define	SHT_SUNW_cap		0x6ffffff5
+#define	SHT_GNU_ATTRIBUTES	0x6ffffff5
+#define	SHT_SUNW_SIGNATURE	0x6ffffff6
+#define	SHT_GNU_HASH		0x6ffffff6
+#define	SHT_GNU_LIBLIST		0x6ffffff7
+#define	SHT_SUNW_ANNOTATE	0x6ffffff7
+#define	SHT_SUNW_DEBUGSTR	0x6ffffff8
+#define	SHT_SUNW_DEBUG		0x6ffffff9
+#define	SHT_SUNW_move		0x6ffffffa
+#define	SHT_SUNW_COMDAT		0x6ffffffb
+#define	SHT_SUNW_syminfo	0x6ffffffc
+#define	SHT_SUNW_verdef		0x6ffffffd
+#define	SHT_GNU_verdef		0x6ffffffd	/* Symbol versions provided */
+#define	SHT_SUNW_verneed	0x6ffffffe
+#define	SHT_GNU_verneed		0x6ffffffe	/* Symbol versions required */
+#define	SHT_SUNW_versym		0x6fffffff
+#define	SHT_GNU_versym		0x6fffffff	/* Symbol version table */
+#define	SHT_HISUNW		0x6fffffff
+#define	SHT_HIOS		0x6fffffff	/* Last of OS specific semantics */
+#define	SHT_LOPROC		0x70000000	/* reserved range for processor */
+#define	SHT_X86_64_UNWIND	0x70000001	/* unwind information */
+#define	SHT_AMD64_UNWIND	SHT_X86_64_UNWIND
+
+#define	SHT_ARM_EXIDX		0x70000001	/* Exception index table. */
+#define	SHT_ARM_PREEMPTMAP	0x70000002	/* BPABI DLL dynamic linking
+						   pre-emption map. */
+#define	SHT_ARM_ATTRIBUTES	0x70000003	/* Object file compatibility
+						   attributes. */
+#define	SHT_ARM_DEBUGOVERLAY	0x70000004	/* See DBGOVL for details. */
+#define	SHT_ARM_OVERLAYSECTION	0x70000005	/* See DBGOVL for details. */
+#define	SHT_MIPS_LIBLIST	0x70000000
+#define	SHT_MIPS_MSYM		0x70000001
+#define	SHT_MIPS_CONFLICT	0x70000002
+#define	SHT_MIPS_GPTAB		0x70000003
+#define	SHT_MIPS_UCODE		0x70000004
+#define	SHT_MIPS_DEBUG		0x70000005
+#define	SHT_MIPS_REGINFO	0x70000006
+#define	SHT_MIPS_PACKAGE	0x70000007
+#define	SHT_MIPS_PACKSYM	0x70000008
+#define	SHT_MIPS_RELD		0x70000009
+#define	SHT_MIPS_IFACE		0x7000000b
+#define	SHT_MIPS_CONTENT	0x7000000c
+#define	SHT_MIPS_OPTIONS	0x7000000d
+#define	SHT_MIPS_DELTASYM	0x7000001b
+#define	SHT_MIPS_DELTAINST	0x7000001c
+#define	SHT_MIPS_DELTACLASS	0x7000001d
+#define	SHT_MIPS_DWARF		0x7000001e	/* MIPS gcc uses MIPS_DWARF */
+#define	SHT_MIPS_DELTADECL	0x7000001f
+#define	SHT_MIPS_SYMBOL_LIB	0x70000020
+#define	SHT_MIPS_EVENTS		0x70000021
+#define	SHT_MIPS_TRANSLATE	0x70000022
+#define	SHT_MIPS_PIXIE		0x70000023
+#define	SHT_MIPS_XLATE		0x70000024
+#define	SHT_MIPS_XLATE_DEBUG	0x70000025
+#define	SHT_MIPS_WHIRL		0x70000026
+#define	SHT_MIPS_EH_REGION	0x70000027
+#define	SHT_MIPS_XLATE_OLD	0x70000028
+#define	SHT_MIPS_PDR_EXCEPTION	0x70000029
+#define	SHT_MIPS_ABIFLAGS	0x7000002a
+
+#define	SHT_SPARC_GOTDATA	0x70000000
+
+#define	SHTORDERED
+#define	SHT_HIPROC		0x7fffffff	/* specific section header types */
+#define	SHT_LOUSER		0x80000000	/* reserved range for application */
+#define	SHT_HIUSER		0xffffffff	/* specific indexes */
+
+/* Flags for sh_flags. */
+#define	SHF_WRITE		0x1	/* Section contains writable data. */
+#define	SHF_ALLOC		0x2	/* Section occupies memory. */
+#define	SHF_EXECINSTR		0x4	/* Section contains instructions. */
+#define	SHF_MERGE		0x10	/* Section may be merged. */
+#define	SHF_STRINGS		0x20	/* Section contains strings. */
+#define	SHF_INFO_LINK		0x40	/* sh_info holds section index. */
+#define	SHF_LINK_ORDER		0x80	/* Special ordering requirements. */
+#define	SHF_OS_NONCONFORMING	0x100	/* OS-specific processing required. */
+#define	SHF_GROUP		0x200	/* Member of section group. */
+#define	SHF_TLS			0x400	/* Section contains TLS data. */
+#define	SHF_COMPRESSED		0x800	/* Section contains compressed data. */
+#define	SHF_MASKOS	0x0ff00000	/* OS-specific semantics. */
+#define	SHF_MASKPROC	0xf0000000	/* Processor-specific semantics. */
+
+/* Flags for section groups. */
+#define	GRP_COMDAT	0x1	/* COMDAT semantics. */
+
+/*
+ * Flags / mask for .gnu.versym sections.
+ */
+#define	VERSYM_VERSION	0x7fff
+#define	VERSYM_HIDDEN	0x8000
+
+/* Values for p_type. */
+#define	PT_NULL		0	/* Unused entry. */
+#define	PT_LOAD		1	/* Loadable segment. */
+#define	PT_DYNAMIC	2	/* Dynamic linking information segment. */
+#define	PT_INTERP	3	/* Pathname of interpreter. */
+#define	PT_NOTE		4	/* Auxiliary information. */
+#define	PT_SHLIB	5	/* Reserved (not used). */
+#define	PT_PHDR		6	/* Location of program header itself. */
+#define	PT_TLS		7	/* Thread local storage segment */
+#define	PT_LOOS		0x60000000	/* First OS-specific. */
+#define	PT_SUNW_UNWIND	0x6464e550	/* amd64 UNWIND program header */
+#define	PT_DUMP_DELTA	0x6fb5d000	/* va->pa map for kernel dumps
+					   (currently arm). */
+#define	PT_LOSUNW	0x6ffffffa
+#define	PT_SUNWBSS	0x6ffffffa	/* Sun Specific segment */
+#define	PT_SUNWSTACK	0x6ffffffb	/* describes the stack segment */
+#define	PT_SUNWDTRACE	0x6ffffffc	/* private */
+#define	PT_SUNWCAP	0x6ffffffd	/* hard/soft capabilities segment */
+#define	PT_HISUNW	0x6fffffff
+#define	PT_HIOS		0x6fffffff	/* Last OS-specific. */
+#define	PT_LOPROC	0x70000000	/* First processor-specific type. */
+#define	PT_ARM_ARCHEXT	0x70000000	/* ARM arch compat information. */
+#define	PT_ARM_EXIDX	0x70000001	/* ARM exception unwind tables. */
+#define	PT_MIPS_REGINFO		0x70000000	/* MIPS register usage info */
+#define	PT_MIPS_RTPROC		0x70000001	/* MIPS runtime procedure tbl */
+#define	PT_MIPS_OPTIONS		0x70000002	/* MIPS e_flags value*/
+#define	PT_MIPS_ABIFLAGS	0x70000003	/* MIPS fp mode */
+#define	PT_HIPROC	0x7fffffff	/* Last processor-specific type. */
+
+#define	PT_OPENBSD_RANDOMIZE	0x65A3DBE6	/* OpenBSD random data segment */
+#define	PT_OPENBSD_WXNEEDED	0x65A3DBE7	/* OpenBSD EXEC/WRITE pages needed */
+#define	PT_OPENBSD_BOOTDATA	0x65A41BE6	/* OpenBSD section for boot args */
+
+/* Values for p_flags. */
+#define	PF_X		0x1		/* Executable. */
+#define	PF_W		0x2		/* Writable. */
+#define	PF_R		0x4		/* Readable. */
+#define	PF_MASKOS	0x0ff00000	/* Operating system-specific. */
+#define	PF_MASKPROC	0xf0000000	/* Processor-specific. */
+
+/* Extended program header index. */
+#define	PN_XNUM		0xffff
+
+/* Values for d_tag. */
+#define	DT_NULL		0	/* Terminating entry. */
+#define	DT_NEEDED	1	/* String table offset of a needed shared
+				   library. */
+#define	DT_PLTRELSZ	2	/* Total size in bytes of PLT relocations. */
+#define	DT_PLTGOT	3	/* Processor-dependent address. */
+#define	DT_HASH		4	/* Address of symbol hash table. */
+#define	DT_STRTAB	5	/* Address of string table. */
+#define	DT_SYMTAB	6	/* Address of symbol table. */
+#define	DT_RELA		7	/* Address of ElfNN_Rela relocations. */
+#define	DT_RELASZ	8	/* Total size of ElfNN_Rela relocations. */
+#define	DT_RELAENT	9	/* Size of each ElfNN_Rela relocation entry. */
+#define	DT_STRSZ	10	/* Size of string table. */
+#define	DT_SYMENT	11	/* Size of each symbol table entry. */
+#define	DT_INIT		12	/* Address of initialization function. */
+#define	DT_FINI		13	/* Address of finalization function. */
+#define	DT_SONAME	14	/* String table offset of shared object
+				   name. */
+#define	DT_RPATH	15	/* String table offset of library path. [sup] */
+#define	DT_SYMBOLIC	16	/* Indicates "symbolic" linking. [sup] */
+#define	DT_REL		17	/* Address of ElfNN_Rel relocations. */
+#define	DT_RELSZ	18	/* Total size of ElfNN_Rel relocations. */
+#define	DT_RELENT	19	/* Size of each ElfNN_Rel relocation. */
+#define	DT_PLTREL	20	/* Type of relocation used for PLT. */
+#define	DT_DEBUG	21	/* Reserved (not used). */
+#define	DT_TEXTREL	22	/* Indicates there may be relocations in
+				   non-writable segments. [sup] */
+#define	DT_JMPREL	23	/* Address of PLT relocations. */
+#define	DT_BIND_NOW	24	/* [sup] */
+#define	DT_INIT_ARRAY	25	/* Address of the array of pointers to
+				   initialization functions */
+#define	DT_FINI_ARRAY	26	/* Address of the array of pointers to
+				   termination functions */
+#define	DT_INIT_ARRAYSZ	27	/* Size in bytes of the array of
+				   initialization functions. */
+#define	DT_FINI_ARRAYSZ	28	/* Size in bytes of the array of
+				   termination functions. */
+#define	DT_RUNPATH	29	/* String table offset of a null-terminated
+				   library search path string. */
+#define	DT_FLAGS	30	/* Object specific flag values. */
+#define	DT_ENCODING	32	/* Values greater than or equal to DT_ENCODING
+				   and less than DT_LOOS follow the rules for
+				   the interpretation of the d_un union
+				   as follows: even == 'd_ptr', odd == 'd_val'
+				   or none */
+#define	DT_PREINIT_ARRAY 32	/* Address of the array of pointers to
+				   pre-initialization functions. */
+#define	DT_PREINIT_ARRAYSZ 33	/* Size in bytes of the array of
+				   pre-initialization functions. */
+#define	DT_MAXPOSTAGS	34	/* number of positive tags */
+#define	DT_RELRSZ	35	/* Total size of ElfNN_Relr relocations. */
+#define	DT_RELR		36	/* Address of ElfNN_Relr relocations. */
+#define	DT_RELRENT	37	/* Size of each ElfNN_Relr relocation. */
+#define	DT_LOOS		0x6000000d	/* First OS-specific */
+#define	DT_SUNW_AUXILIARY	0x6000000d	/* symbol auxiliary name */
+#define	DT_SUNW_RTLDINF		0x6000000e	/* ld.so.1 info (private) */
+#define	DT_SUNW_FILTER		0x6000000f	/* symbol filter name */
+#define	DT_SUNW_CAP		0x60000010	/* hardware/software */
+#define	DT_SUNW_ASLR		0x60000023	/* ASLR control */
+#define	DT_HIOS		0x6ffff000	/* Last OS-specific */
+
+/*
+ * DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
+ * Dyn.d_un.d_val field of the Elf*_Dyn structure.
+ */
+#define	DT_VALRNGLO	0x6ffffd00
+#define	DT_GNU_PRELINKED	0x6ffffdf5 /* prelinking timestamp */
+#define	DT_GNU_CONFLICTSZ	0x6ffffdf6 /* size of conflict section */
+#define	DT_GNU_LIBLISTSZ	0x6ffffdf7 /* size of library list */
+#define	DT_CHECKSUM	0x6ffffdf8	/* elf checksum */
+#define	DT_PLTPADSZ	0x6ffffdf9	/* pltpadding size */
+#define	DT_MOVEENT	0x6ffffdfa	/* move table entry size */
+#define	DT_MOVESZ	0x6ffffdfb	/* move table size */
+#define	DT_FEATURE	0x6ffffdfc	/* feature holder */
+#define	DT_FEATURE_1	DT_FEATURE
+#define	DT_POSFLAG_1	0x6ffffdfd	/* flags for DT_* entries, effecting */
+					/*	the following DT_* entry. */
+					/*	See DF_P1_* definitions */
+#define	DT_SYMINSZ	0x6ffffdfe	/* syminfo table size (in bytes) */
+#define	DT_SYMINENT	0x6ffffdff	/* syminfo entry size (in bytes) */
+#define	DT_VALRNGHI	0x6ffffdff
+
+/*
+ * DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
+ * Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
+ *
+ * If any adjustment is made to the ELF object after it has been
+ * built, these entries will need to be adjusted.
+ */
+#define	DT_ADDRRNGLO	0x6ffffe00
+#define	DT_GNU_HASH	0x6ffffef5	/* GNU-style hash table */
+#define	DT_TLSDESC_PLT	0x6ffffef6	/* loc. of PLT for tlsdesc resolver */
+#define	DT_TLSDESC_GOT	0x6ffffef7	/* loc. of GOT for tlsdesc resolver */
+#define	DT_GNU_CONFLICT	0x6ffffef8	/* address of conflict section */
+#define	DT_GNU_LIBLIST	0x6ffffef9	/* address of library list */
+#define	DT_CONFIG	0x6ffffefa	/* configuration information */
+#define	DT_DEPAUDIT	0x6ffffefb	/* dependency auditing */
+#define	DT_AUDIT	0x6ffffefc	/* object auditing */
+#define	DT_PLTPAD	0x6ffffefd	/* pltpadding (sparcv9) */
+#define	DT_MOVETAB	0x6ffffefe	/* move table */
+#define	DT_SYMINFO	0x6ffffeff	/* syminfo table */
+#define	DT_ADDRRNGHI	0x6ffffeff
+
+#define	DT_VERSYM	0x6ffffff0	/* Address of versym section. */
+#define	DT_RELACOUNT	0x6ffffff9	/* number of RELATIVE relocations */
+#define	DT_RELCOUNT	0x6ffffffa	/* number of RELATIVE relocations */
+#define	DT_FLAGS_1	0x6ffffffb	/* state flags - see DF_1_* defs */
+#define	DT_VERDEF	0x6ffffffc	/* Address of verdef section. */
+#define	DT_VERDEFNUM	0x6ffffffd	/* Number of elems in verdef section */
+#define	DT_VERNEED	0x6ffffffe	/* Address of verneed section. */
+#define	DT_VERNEEDNUM	0x6fffffff	/* Number of elems in verneed section */
+
+#define	DT_LOPROC	0x70000000	/* First processor-specific type. */
+
+#define	DT_AARCH64_BTI_PLT		0x70000001
+#define	DT_AARCH64_PAC_PLT		0x70000003
+#define	DT_AARCH64_VARIANT_PCS		0x70000005
+#define DT_AARCH64_MEMTAG_MODE		0x70000009
+#define DT_AARCH64_MEMTAG_HEAP		0x7000000b
+#define DT_AARCH64_MEMTAG_STACK		0x7000000c
+#define DT_AARCH64_MEMTAG_GLOBALS	0x7000000d
+#define DT_AARCH64_MEMTAG_GLOBALSSZ	0x7000000f
+
+#define	DT_ARM_SYMTABSZ			0x70000001
+#define	DT_ARM_PREEMPTMAP		0x70000002
+
+#define	DT_SPARC_REGISTER		0x70000001
+#define	DT_DEPRECATED_SPARC_REGISTER	0x7000001
+
+#define	DT_MIPS_RLD_VERSION		0x70000001
+#define	DT_MIPS_TIME_STAMP		0x70000002
+#define	DT_MIPS_ICHECKSUM		0x70000003
+#define	DT_MIPS_IVERSION		0x70000004
+#define	DT_MIPS_FLAGS			0x70000005
+#define	DT_MIPS_BASE_ADDRESS		0x70000006
+#define	DT_MIPS_CONFLICT		0x70000008
+#define	DT_MIPS_LIBLIST			0x70000009
+#define	DT_MIPS_LOCAL_GOTNO		0x7000000a
+#define	DT_MIPS_CONFLICTNO		0x7000000b
+#define	DT_MIPS_LIBLISTNO		0x70000010
+#define	DT_MIPS_SYMTABNO		0x70000011
+#define	DT_MIPS_UNREFEXTNO		0x70000012
+#define	DT_MIPS_GOTSYM			0x70000013
+#define	DT_MIPS_HIPAGENO		0x70000014
+#define	DT_MIPS_RLD_MAP			0x70000016
+#define	DT_MIPS_DELTA_CLASS		0x70000017
+#define	DT_MIPS_DELTA_CLASS_NO		0x70000018
+#define	DT_MIPS_DELTA_INSTANCE		0x70000019
+#define	DT_MIPS_DELTA_INSTANCE_NO	0x7000001A
+#define	DT_MIPS_DELTA_RELOC		0x7000001B
+#define	DT_MIPS_DELTA_RELOC_NO		0x7000001C
+#define	DT_MIPS_DELTA_SYM		0x7000001D
+#define	DT_MIPS_DELTA_SYM_NO		0x7000001E
+#define	DT_MIPS_DELTA_CLASSSYM		0x70000020
+#define	DT_MIPS_DELTA_CLASSSYM_NO	0x70000021
+#define	DT_MIPS_CXX_FLAGS		0x70000022
+#define	DT_MIPS_PIXIE_INIT		0x70000023
+#define	DT_MIPS_SYMBOL_LIB		0x70000024
+#define	DT_MIPS_LOCALPAGE_GOTIDX	0x70000025
+#define	DT_MIPS_LOCAL_GOTIDX		0x70000026
+#define	DT_MIPS_HIDDEN_GOTIDX		0x70000027
+#define	DT_MIPS_PROTECTED_GOTIDX	0x70000028
+#define	DT_MIPS_OPTIONS			0x70000029
+#define	DT_MIPS_INTERFACE		0x7000002A
+#define	DT_MIPS_DYNSTR_ALIGN		0x7000002B
+#define	DT_MIPS_INTERFACE_SIZE		0x7000002C
+#define	DT_MIPS_RLD_TEXT_RESOLVE_ADDR	0x7000002D
+#define	DT_MIPS_PERF_SUFFIX		0x7000002E
+#define	DT_MIPS_COMPACT_SIZE		0x7000002F
+#define	DT_MIPS_GP_VALUE		0x70000030
+#define	DT_MIPS_AUX_DYNAMIC		0x70000031
+#define	DT_MIPS_PLTGOT			0x70000032
+#define	DT_MIPS_RLD_OBJ_UPDATE		0x70000033
+#define	DT_MIPS_RWPLT			0x70000034
+#define	DT_MIPS_RLD_MAP_REL		0x70000035
+
+#define	DT_PPC_GOT			0x70000000
+#define	DT_PPC_TLSOPT			0x70000001
+
+#define	DT_PPC64_GLINK			0x70000000
+#define	DT_PPC64_OPD			0x70000001
+#define	DT_PPC64_OPDSZ			0x70000002
+#define	DT_PPC64_TLSOPT			0x70000003
+
+#define	DT_AUXILIARY	0x7ffffffd	/* shared library auxiliary name */
+#define	DT_USED		0x7ffffffe	/* ignored - same as needed */
+#define	DT_FILTER	0x7fffffff	/* shared library filter name */
+#define	DT_HIPROC	0x7fffffff	/* Last processor-specific type. */
+
+/* Values for DT_FLAGS */
+#define	DF_ORIGIN	0x0001	/* Indicates that the object being loaded may
+				   make reference to the $ORIGIN substitution
+				   string */
+#define	DF_SYMBOLIC	0x0002	/* Indicates "symbolic" linking. */
+#define	DF_TEXTREL	0x0004	/* Indicates there may be relocations in
+				   non-writable segments. */
+#define	DF_BIND_NOW	0x0008	/* Indicates that the dynamic linker should
+				   process all relocations for the object
+				   containing this entry before transferring
+				   control to the program. */
+#define	DF_STATIC_TLS	0x0010	/* Indicates that the shared object or
+				   executable contains code using a static
+				   thread-local storage scheme. */
+
+/* Values for DT_FLAGS_1 */
+#define	DF_1_BIND_NOW	0x00000001	/* Same as DF_BIND_NOW */
+#define	DF_1_GLOBAL	0x00000002	/* Set the RTLD_GLOBAL for object */
+#define	DF_1_NODELETE	0x00000008	/* Set the RTLD_NODELETE for object */
+#define	DF_1_LOADFLTR	0x00000010	/* Immediate loading of filtees */
+#define	DF_1_NOOPEN     0x00000040	/* Do not allow loading on dlopen() */
+#define	DF_1_ORIGIN	0x00000080	/* Process $ORIGIN */
+#define	DF_1_INTERPOSE	0x00000400	/* Interpose all objects but main */
+#define	DF_1_NODEFLIB	0x00000800	/* Do not search default paths */
+#define	DF_1_PIE	0x08000000	/* Is position-independent executable */
+
+/* Values for l_flags. */
+#define	LL_NONE			0x0	/* no flags */
+#define	LL_EXACT_MATCH		0x1	/* require an exact match */
+#define	LL_IGNORE_INT_VER	0x2	/* ignore version incompatibilities */
+#define	LL_REQUIRE_MINOR	0x4
+#define	LL_EXPORTS		0x8
+#define	LL_DELAY_LOAD		0x10
+#define	LL_DELTA		0x20
+
+/* Note section names */
+#define	ELF_NOTE_FREEBSD	"FreeBSD"
+#define	ELF_NOTE_NETBSD		"NetBSD"
+#define	ELF_NOTE_SOLARIS	"SUNW Solaris"
+#define	ELF_NOTE_GNU		"GNU"
+
+/* Values for n_type used in executables. */
+#define	NT_FREEBSD_ABI_TAG	1
+#define	NT_FREEBSD_NOINIT_TAG	2
+#define	NT_FREEBSD_ARCH_TAG	3
+#define	NT_FREEBSD_FEATURE_CTL	4
+
+/* NT_FREEBSD_FEATURE_CTL desc[0] bits */
+#define	NT_FREEBSD_FCTL_ASLR_DISABLE	0x00000001
+#define	NT_FREEBSD_FCTL_PROTMAX_DISABLE	0x00000002
+#define	NT_FREEBSD_FCTL_STKGAP_DISABLE	0x00000004
+#define	NT_FREEBSD_FCTL_WXNEEDED	0x00000008
+#define	NT_FREEBSD_FCTL_LA48		0x00000010
+/* was ASG_DISABLE, do not reuse	0x00000020 */
+
+/* Values for n_type.  Used in core files. */
+#define	NT_PRSTATUS	1	/* Process status. */
+#define	NT_FPREGSET	2	/* Floating point registers. */
+#define	NT_PRPSINFO	3	/* Process state info. */
+#define	NT_THRMISC	7	/* Thread miscellaneous info. */
+#define	NT_PROCSTAT_PROC	8	/* Procstat proc data. */
+#define	NT_PROCSTAT_FILES	9	/* Procstat files data. */
+#define	NT_PROCSTAT_VMMAP	10	/* Procstat vmmap data. */
+#define	NT_PROCSTAT_GROUPS	11	/* Procstat groups data. */
+#define	NT_PROCSTAT_UMASK	12	/* Procstat umask data. */
+#define	NT_PROCSTAT_RLIMIT	13	/* Procstat rlimit data. */
+#define	NT_PROCSTAT_OSREL	14	/* Procstat osreldate data. */
+#define	NT_PROCSTAT_PSSTRINGS	15	/* Procstat ps_strings data. */
+#define	NT_PROCSTAT_AUXV	16	/* Procstat auxv data. */
+#define	NT_PTLWPINFO		17	/* Thread ptrace miscellaneous info. */
+#define	NT_PPC_VMX	0x100	/* PowerPC Altivec/VMX registers */
+#define	NT_PPC_VSX	0x102	/* PowerPC VSX registers */
+#define	NT_X86_SEGBASES	0x200	/* x86 FS/GS base addresses. */
+#define	NT_X86_XSTATE	0x202	/* x86 XSAVE extended state. */
+#define	NT_ARM_VFP	0x400	/* ARM VFP registers */
+#define	NT_ARM_TLS	0x401	/* ARM TLS register */
+#define	NT_ARM_ADDR_MASK	0x406	/* arm64 address mask (e.g. for TBI) */
+
+/* GNU note types. */
+#define	NT_GNU_ABI_TAG		1
+#define	NT_GNU_HWCAP		2
+#define	NT_GNU_BUILD_ID		3
+#define	NT_GNU_GOLD_VERSION	4
+#define	NT_GNU_PROPERTY_TYPE_0	5
+
+#define	GNU_PROPERTY_LOPROC			0xc0000000
+#define	GNU_PROPERTY_HIPROC			0xdfffffff
+
+#define	GNU_PROPERTY_AARCH64_FEATURE_1_AND	0xc0000000
+
+#define	GNU_PROPERTY_AARCH64_FEATURE_1_PAC	0x00000002
+
+#define	GNU_PROPERTY_X86_FEATURE_1_AND		0xc0000002
+
+#define	GNU_PROPERTY_X86_FEATURE_1_IBT		0x00000001
+#define	GNU_PROPERTY_X86_FEATURE_1_SHSTK	0x00000002
+
+/* Symbol Binding - ELFNN_ST_BIND - st_info */
+#define	STB_LOCAL	0	/* Local symbol */
+#define	STB_GLOBAL	1	/* Global symbol */
+#define	STB_WEAK	2	/* like global - lower precedence */
+#define	STB_LOOS	10	/* Start of operating system reserved range. */
+#define	STB_GNU_UNIQUE	10	/* Unique symbol (GNU) */
+#define	STB_HIOS	12	/* End of operating system reserved range. */
+#define	STB_LOPROC	13	/* reserved range for processor */
+#define	STB_HIPROC	15	/*   specific semantics. */
+
+/* Symbol type - ELFNN_ST_TYPE - st_info */
+#define	STT_NOTYPE	0	/* Unspecified type. */
+#define	STT_OBJECT	1	/* Data object. */
+#define	STT_FUNC	2	/* Function. */
+#define	STT_SECTION	3	/* Section. */
+#define	STT_FILE	4	/* Source file. */
+#define	STT_COMMON	5	/* Uninitialized common block. */
+#define	STT_TLS		6	/* TLS object. */
+#define	STT_NUM		7
+#define	STT_LOOS	10	/* Reserved range for operating system */
+#define	STT_GNU_IFUNC	10
+#define	STT_HIOS	12	/*   specific semantics. */
+#define	STT_LOPROC	13	/* Start of processor reserved range. */
+#define	STT_SPARC_REGISTER 13	/* SPARC register information. */
+#define	STT_HIPROC	15	/* End of processor reserved range. */
+
+/* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */
+#define	STV_DEFAULT	0x0	/* Default visibility (see binding). */
+#define	STV_INTERNAL	0x1	/* Special meaning in relocatable objects. */
+#define	STV_HIDDEN	0x2	/* Not visible. */
+#define	STV_PROTECTED	0x3	/* Visible but not preemptible. */
+#define	STV_EXPORTED	0x4
+#define	STV_SINGLETON	0x5
+#define	STV_ELIMINATE	0x6
+
+/* Special symbol table indexes. */
+#define	STN_UNDEF	0	/* Undefined symbol index. */
+
+/* Symbol versioning flags. */
+#define	VER_DEF_CURRENT	1
+#define	VER_DEF_IDX(x)	VER_NDX(x)
+
+#define	VER_FLG_BASE	0x01
+#define	VER_FLG_WEAK	0x02
+
+#define	VER_NEED_CURRENT	1
+#define	VER_NEED_WEAK	(1u << 15)
+#define	VER_NEED_HIDDEN	VER_NDX_HIDDEN
+#define	VER_NEED_IDX(x)	VER_NDX(x)
+
+#define	VER_NDX_LOCAL	0
+#define	VER_NDX_GLOBAL	1
+#define	VER_NDX_GIVEN	2
+
+#define	VER_NDX_HIDDEN	(1u << 15)
+#define	VER_NDX(x)	((x) & ~(1u << 15))
+
+#define	CA_SUNW_NULL	0
+#define	CA_SUNW_HW_1	1		/* first hardware capabilities entry */
+#define	CA_SUNW_SF_1	2		/* first software capabilities entry */
+
+/*
+ * Syminfo flag values
+ */
+#define	SYMINFO_FLG_DIRECT	0x0001	/* symbol ref has direct association */
+					/*	to object containing defn. */
+#define	SYMINFO_FLG_PASSTHRU	0x0002	/* ignored - see SYMINFO_FLG_FILTER */
+#define	SYMINFO_FLG_COPY	0x0004	/* symbol is a copy-reloc */
+#define	SYMINFO_FLG_LAZYLOAD	0x0008	/* object containing defn should be */
+					/*	lazily-loaded */
+#define	SYMINFO_FLG_DIRECTBIND	0x0010	/* ref should be bound directly to */
+					/*	object containing defn. */
+#define	SYMINFO_FLG_NOEXTDIRECT	0x0020	/* don't let an external reference */
+					/*	directly bind to this symbol */
+#define	SYMINFO_FLG_FILTER	0x0002	/* symbol ref is associated to a */
+#define	SYMINFO_FLG_AUXILIARY	0x0040	/* 	standard or auxiliary filter */
+
+/*
+ * Syminfo.si_boundto values.
+ */
+#define	SYMINFO_BT_SELF		0xffff	/* symbol bound to self */
+#define	SYMINFO_BT_PARENT	0xfffe	/* symbol bound to parent */
+#define	SYMINFO_BT_NONE		0xfffd	/* no special symbol binding */
+#define	SYMINFO_BT_EXTERN	0xfffc	/* symbol defined as external */
+#define	SYMINFO_BT_LOWRESERVE	0xff00	/* beginning of reserved entries */
+
+/*
+ * Syminfo version values.
+ */
+#define	SYMINFO_NONE		0	/* Syminfo version */
+#define	SYMINFO_CURRENT		1
+#define	SYMINFO_NUM		2
+
+/* Values for ch_type (compressed section headers). */
+#define	ELFCOMPRESS_ZLIB	1	/* ZLIB/DEFLATE */
+#define	ELFCOMPRESS_ZSTD	2	/* Zstandard */
+#define	ELFCOMPRESS_LOOS	0x60000000	/* OS-specific */
+#define	ELFCOMPRESS_HIOS	0x6fffffff
+#define	ELFCOMPRESS_LOPROC	0x70000000	/* Processor-specific */
+#define	ELFCOMPRESS_HIPROC	0x7fffffff
+
+/*
+ * Relocation types.
+ *
+ * All machine architectures are defined here to allow tools on one to
+ * handle others.
+ */
+
+#define	R_386_NONE		0	/* No relocation. */
+#define	R_386_32		1	/* Add symbol value. */
+#define	R_386_PC32		2	/* Add PC-relative symbol value. */
+#define	R_386_GOT32		3	/* Add PC-relative GOT offset. */
+#define	R_386_PLT32		4	/* Add PC-relative PLT offset. */
+#define	R_386_COPY		5	/* Copy data from shared object. */
+#define	R_386_GLOB_DAT		6	/* Set GOT entry to data address. */
+#define	R_386_JMP_SLOT		7	/* Set GOT entry to code address. */
+#define	R_386_RELATIVE		8	/* Add load address of shared object. */
+#define	R_386_GOTOFF		9	/* Add GOT-relative symbol address. */
+#define	R_386_GOTPC		10	/* Add PC-relative GOT table address. */
+#define	R_386_32PLT		11
+#define	R_386_TLS_TPOFF		14	/* Negative offset in static TLS block */
+#define	R_386_TLS_IE		15	/* Absolute address of GOT for -ve static TLS */
+#define	R_386_TLS_GOTIE		16	/* GOT entry for negative static TLS block */
+#define	R_386_TLS_LE		17	/* Negative offset relative to static TLS */
+#define	R_386_TLS_GD		18	/* 32 bit offset to GOT (index,off) pair */
+#define	R_386_TLS_LDM		19	/* 32 bit offset to GOT (index,zero) pair */
+#define	R_386_16		20
+#define	R_386_PC16		21
+#define	R_386_8			22
+#define	R_386_PC8		23
+#define	R_386_TLS_GD_32		24	/* 32 bit offset to GOT (index,off) pair */
+#define	R_386_TLS_GD_PUSH	25	/* pushl instruction for Sun ABI GD sequence */
+#define	R_386_TLS_GD_CALL	26	/* call instruction for Sun ABI GD sequence */
+#define	R_386_TLS_GD_POP	27	/* popl instruction for Sun ABI GD sequence */
+#define	R_386_TLS_LDM_32	28	/* 32 bit offset to GOT (index,zero) pair */
+#define	R_386_TLS_LDM_PUSH	29	/* pushl instruction for Sun ABI LD sequence */
+#define	R_386_TLS_LDM_CALL	30	/* call instruction for Sun ABI LD sequence */
+#define	R_386_TLS_LDM_POP	31	/* popl instruction for Sun ABI LD sequence */
+#define	R_386_TLS_LDO_32	32	/* 32 bit offset from start of TLS block */
+#define	R_386_TLS_IE_32		33	/* 32 bit offset to GOT static TLS offset entry */
+#define	R_386_TLS_LE_32		34	/* 32 bit offset within static TLS block */
+#define	R_386_TLS_DTPMOD32	35	/* GOT entry containing TLS index */
+#define	R_386_TLS_DTPOFF32	36	/* GOT entry containing TLS offset */
+#define	R_386_TLS_TPOFF32	37	/* GOT entry of -ve static TLS offset */
+#define	R_386_SIZE32		38
+#define	R_386_TLS_GOTDESC	39
+#define	R_386_TLS_DESC_CALL	40
+#define	R_386_TLS_DESC		41
+#define	R_386_IRELATIVE		42	/* PLT entry resolved indirectly at runtime */
+#define	R_386_GOT32X		43
+
+#define	R_AARCH64_NONE		0	/* No relocation */
+#define	R_AARCH64_ABS64		257	/* Absolute offset */
+#define	R_AARCH64_ABS32		258	/* Absolute, 32-bit overflow check */
+#define	R_AARCH64_ABS16		259	/* Absolute, 16-bit overflow check */
+#define	R_AARCH64_PREL64	260	/* PC relative */
+#define	R_AARCH64_PREL32	261	/* PC relative, 32-bit overflow check */
+#define	R_AARCH64_PREL16	262	/* PC relative, 16-bit overflow check */
+#define	R_AARCH64_TSTBR14	279	/* TBZ/TBNZ immediate */
+#define	R_AARCH64_CONDBR19	280	/* Conditional branch immediate */
+#define	R_AARCH64_JUMP26	282	/* Branch immediate */
+#define	R_AARCH64_CALL26	283	/* Call immediate */
+#define	R_AARCH64_COPY		1024	/* Copy data from shared object */
+#define	R_AARCH64_GLOB_DAT	1025	/* Set GOT entry to data address */
+#define	R_AARCH64_JUMP_SLOT	1026	/* Set GOT entry to code address */
+#define	R_AARCH64_RELATIVE 	1027	/* Add load address of shared object */
+#define	R_AARCH64_TLS_DTPREL64	1028
+#define	R_AARCH64_TLS_DTPMOD64	1029
+#define	R_AARCH64_TLS_TPREL64 	1030
+#define	R_AARCH64_TLSDESC 	1031	/* Identify the TLS descriptor */
+#define	R_AARCH64_IRELATIVE	1032
+
+#define	R_ARM_NONE		0	/* No relocation. */
+#define	R_ARM_PC24		1
+#define	R_ARM_ABS32		2
+#define	R_ARM_REL32		3
+#define	R_ARM_PC13		4
+#define	R_ARM_ABS16		5
+#define	R_ARM_ABS12		6
+#define	R_ARM_THM_ABS5		7
+#define	R_ARM_ABS8		8
+#define	R_ARM_SBREL32		9
+#define	R_ARM_THM_PC22		10
+#define	R_ARM_THM_PC8		11
+#define	R_ARM_AMP_VCALL9	12
+#define	R_ARM_SWI24		13
+#define	R_ARM_THM_SWI8		14
+#define	R_ARM_XPC25		15
+#define	R_ARM_THM_XPC22		16
+/* TLS relocations */
+#define	R_ARM_TLS_DTPMOD32	17	/* ID of module containing symbol */
+#define	R_ARM_TLS_DTPOFF32	18	/* Offset in TLS block */
+#define	R_ARM_TLS_TPOFF32	19	/* Offset in static TLS block */
+#define	R_ARM_COPY		20	/* Copy data from shared object. */
+#define	R_ARM_GLOB_DAT		21	/* Set GOT entry to data address. */
+#define	R_ARM_JUMP_SLOT		22	/* Set GOT entry to code address. */
+#define	R_ARM_RELATIVE		23	/* Add load address of shared object. */
+#define	R_ARM_GOTOFF		24	/* Add GOT-relative symbol address. */
+#define	R_ARM_GOTPC		25	/* Add PC-relative GOT table address. */
+#define	R_ARM_GOT32		26	/* Add PC-relative GOT offset. */
+#define	R_ARM_PLT32		27	/* Add PC-relative PLT offset. */
+#define	R_ARM_GNU_VTENTRY	100
+#define	R_ARM_GNU_VTINHERIT	101
+#define	R_ARM_RSBREL32		250
+#define	R_ARM_THM_RPC22		251
+#define	R_ARM_RREL32		252
+#define	R_ARM_RABS32		253
+#define	R_ARM_RPC24		254
+#define	R_ARM_RBASE		255
+
+/*	Name			Value	   Field	Calculation */
+#define	R_IA_64_NONE		0	/* None */
+#define	R_IA_64_IMM14		0x21	/* immediate14	S + A */
+#define	R_IA_64_IMM22		0x22	/* immediate22	S + A */
+#define	R_IA_64_IMM64		0x23	/* immediate64	S + A */
+#define	R_IA_64_DIR32MSB	0x24	/* word32 MSB	S + A */
+#define	R_IA_64_DIR32LSB	0x25	/* word32 LSB	S + A */
+#define	R_IA_64_DIR64MSB	0x26	/* word64 MSB	S + A */
+#define	R_IA_64_DIR64LSB	0x27	/* word64 LSB	S + A */
+#define	R_IA_64_GPREL22		0x2a	/* immediate22	@gprel(S + A) */
+#define	R_IA_64_GPREL64I	0x2b	/* immediate64	@gprel(S + A) */
+#define	R_IA_64_GPREL32MSB	0x2c	/* word32 MSB	@gprel(S + A) */
+#define	R_IA_64_GPREL32LSB	0x2d	/* word32 LSB	@gprel(S + A) */
+#define	R_IA_64_GPREL64MSB	0x2e	/* word64 MSB	@gprel(S + A) */
+#define	R_IA_64_GPREL64LSB	0x2f	/* word64 LSB	@gprel(S + A) */
+#define	R_IA_64_LTOFF22		0x32	/* immediate22	@ltoff(S + A) */
+#define	R_IA_64_LTOFF64I	0x33	/* immediate64	@ltoff(S + A) */
+#define	R_IA_64_PLTOFF22	0x3a	/* immediate22	@pltoff(S + A) */
+#define	R_IA_64_PLTOFF64I	0x3b	/* immediate64	@pltoff(S + A) */
+#define	R_IA_64_PLTOFF64MSB	0x3e	/* word64 MSB	@pltoff(S + A) */
+#define	R_IA_64_PLTOFF64LSB	0x3f	/* word64 LSB	@pltoff(S + A) */
+#define	R_IA_64_FPTR64I		0x43	/* immediate64	@fptr(S + A) */
+#define	R_IA_64_FPTR32MSB	0x44	/* word32 MSB	@fptr(S + A) */
+#define	R_IA_64_FPTR32LSB	0x45	/* word32 LSB	@fptr(S + A) */
+#define	R_IA_64_FPTR64MSB	0x46	/* word64 MSB	@fptr(S + A) */
+#define	R_IA_64_FPTR64LSB	0x47	/* word64 LSB	@fptr(S + A) */
+#define	R_IA_64_PCREL60B	0x48	/* immediate60 form1 S + A - P */
+#define	R_IA_64_PCREL21B	0x49	/* immediate21 form1 S + A - P */
+#define	R_IA_64_PCREL21M	0x4a	/* immediate21 form2 S + A - P */
+#define	R_IA_64_PCREL21F	0x4b	/* immediate21 form3 S + A - P */
+#define	R_IA_64_PCREL32MSB	0x4c	/* word32 MSB	S + A - P */
+#define	R_IA_64_PCREL32LSB	0x4d	/* word32 LSB	S + A - P */
+#define	R_IA_64_PCREL64MSB	0x4e	/* word64 MSB	S + A - P */
+#define	R_IA_64_PCREL64LSB	0x4f	/* word64 LSB	S + A - P */
+#define	R_IA_64_LTOFF_FPTR22	0x52	/* immediate22	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_LTOFF_FPTR64I	0x53	/* immediate64	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_LTOFF_FPTR32MSB	0x54	/* word32 MSB	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_LTOFF_FPTR32LSB	0x55	/* word32 LSB	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_LTOFF_FPTR64MSB	0x56	/* word64 MSB	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_LTOFF_FPTR64LSB	0x57	/* word64 LSB	@ltoff(@fptr(S + A)) */
+#define	R_IA_64_SEGREL32MSB	0x5c	/* word32 MSB	@segrel(S + A) */
+#define	R_IA_64_SEGREL32LSB	0x5d	/* word32 LSB	@segrel(S + A) */
+#define	R_IA_64_SEGREL64MSB	0x5e	/* word64 MSB	@segrel(S + A) */
+#define	R_IA_64_SEGREL64LSB	0x5f	/* word64 LSB	@segrel(S + A) */
+#define	R_IA_64_SECREL32MSB	0x64	/* word32 MSB	@secrel(S + A) */
+#define	R_IA_64_SECREL32LSB	0x65	/* word32 LSB	@secrel(S + A) */
+#define	R_IA_64_SECREL64MSB	0x66	/* word64 MSB	@secrel(S + A) */
+#define	R_IA_64_SECREL64LSB	0x67	/* word64 LSB	@secrel(S + A) */
+#define	R_IA_64_REL32MSB	0x6c	/* word32 MSB	BD + A */
+#define	R_IA_64_REL32LSB	0x6d	/* word32 LSB	BD + A */
+#define	R_IA_64_REL64MSB	0x6e	/* word64 MSB	BD + A */
+#define	R_IA_64_REL64LSB	0x6f	/* word64 LSB	BD + A */
+#define	R_IA_64_LTV32MSB	0x74	/* word32 MSB	S + A */
+#define	R_IA_64_LTV32LSB	0x75	/* word32 LSB	S + A */
+#define	R_IA_64_LTV64MSB	0x76	/* word64 MSB	S + A */
+#define	R_IA_64_LTV64LSB	0x77	/* word64 LSB	S + A */
+#define	R_IA_64_PCREL21BI	0x79	/* immediate21 form1 S + A - P */
+#define	R_IA_64_PCREL22		0x7a	/* immediate22	S + A - P */
+#define	R_IA_64_PCREL64I	0x7b	/* immediate64	S + A - P */
+#define	R_IA_64_IPLTMSB		0x80	/* function descriptor MSB special */
+#define	R_IA_64_IPLTLSB		0x81	/* function descriptor LSB speciaal */
+#define	R_IA_64_SUB		0x85	/* immediate64	A - S */
+#define	R_IA_64_LTOFF22X	0x86	/* immediate22	special */
+#define	R_IA_64_LDXMOV		0x87	/* immediate22	special */
+#define	R_IA_64_TPREL14		0x91	/* imm14	@tprel(S + A) */
+#define	R_IA_64_TPREL22		0x92	/* imm22	@tprel(S + A) */
+#define	R_IA_64_TPREL64I	0x93	/* imm64	@tprel(S + A) */
+#define	R_IA_64_TPREL64MSB	0x96	/* word64 MSB	@tprel(S + A) */
+#define	R_IA_64_TPREL64LSB	0x97	/* word64 LSB	@tprel(S + A) */
+#define	R_IA_64_LTOFF_TPREL22	0x9a	/* imm22	@ltoff(@tprel(S+A)) */
+#define	R_IA_64_DTPMOD64MSB	0xa6	/* word64 MSB	@dtpmod(S + A) */
+#define	R_IA_64_DTPMOD64LSB	0xa7	/* word64 LSB	@dtpmod(S + A) */
+#define	R_IA_64_LTOFF_DTPMOD22	0xaa	/* imm22	@ltoff(@dtpmod(S+A)) */
+#define	R_IA_64_DTPREL14	0xb1	/* imm14	@dtprel(S + A) */
+#define	R_IA_64_DTPREL22	0xb2	/* imm22	@dtprel(S + A) */
+#define	R_IA_64_DTPREL64I	0xb3	/* imm64	@dtprel(S + A) */
+#define	R_IA_64_DTPREL32MSB	0xb4	/* word32 MSB	@dtprel(S + A) */
+#define	R_IA_64_DTPREL32LSB	0xb5	/* word32 LSB	@dtprel(S + A) */
+#define	R_IA_64_DTPREL64MSB	0xb6	/* word64 MSB	@dtprel(S + A) */
+#define	R_IA_64_DTPREL64LSB	0xb7	/* word64 LSB	@dtprel(S + A) */
+#define	R_IA_64_LTOFF_DTPREL22	0xba	/* imm22	@ltoff(@dtprel(S+A)) */
+
+#define	R_MIPS_NONE	0	/* No reloc */
+#define	R_MIPS_16	1	/* Direct 16 bit */
+#define	R_MIPS_32	2	/* Direct 32 bit */
+#define	R_MIPS_REL32	3	/* PC relative 32 bit */
+#define	R_MIPS_26	4	/* Direct 26 bit shifted */
+#define	R_MIPS_HI16	5	/* High 16 bit */
+#define	R_MIPS_LO16	6	/* Low 16 bit */
+#define	R_MIPS_GPREL16	7	/* GP relative 16 bit */
+#define	R_MIPS_LITERAL	8	/* 16 bit literal entry */
+#define	R_MIPS_GOT16	9	/* 16 bit GOT entry */
+#define	R_MIPS_PC16	10	/* PC relative 16 bit */
+#define	R_MIPS_CALL16	11	/* 16 bit GOT entry for function */
+#define	R_MIPS_GPREL32	12	/* GP relative 32 bit */
+#define	R_MIPS_64	18	/* Direct 64 bit */
+#define	R_MIPS_GOT_DISP	19
+#define	R_MIPS_GOT_PAGE	20
+#define	R_MIPS_GOT_OFST	21
+#define	R_MIPS_GOT_HI16	22	/* GOT HI 16 bit */
+#define	R_MIPS_GOT_LO16	23	/* GOT LO 16 bit */
+#define	R_MIPS_SUB	24
+#define	R_MIPS_CALLHI16 30	/* upper 16 bit GOT entry for function */
+#define	R_MIPS_CALLLO16 31	/* lower 16 bit GOT entry for function */
+#define	R_MIPS_JALR	37
+#define	R_MIPS_TLS_GD	42
+#define	R_MIPS_COPY	126
+#define	R_MIPS_JUMP_SLOT	127
+
+#define	R_PPC_NONE		0	/* No relocation. */
+#define	R_PPC_ADDR32		1
+#define	R_PPC_ADDR24		2
+#define	R_PPC_ADDR16		3
+#define	R_PPC_ADDR16_LO		4
+#define	R_PPC_ADDR16_HI		5
+#define	R_PPC_ADDR16_HA		6
+#define	R_PPC_ADDR14		7
+#define	R_PPC_ADDR14_BRTAKEN	8
+#define	R_PPC_ADDR14_BRNTAKEN	9
+#define	R_PPC_REL24		10
+#define	R_PPC_REL14		11
+#define	R_PPC_REL14_BRTAKEN	12
+#define	R_PPC_REL14_BRNTAKEN	13
+#define	R_PPC_GOT16		14
+#define	R_PPC_GOT16_LO		15
+#define	R_PPC_GOT16_HI		16
+#define	R_PPC_GOT16_HA		17
+#define	R_PPC_PLTREL24		18
+#define	R_PPC_COPY		19
+#define	R_PPC_GLOB_DAT		20
+#define	R_PPC_JMP_SLOT		21
+#define	R_PPC_RELATIVE		22
+#define	R_PPC_LOCAL24PC		23
+#define	R_PPC_UADDR32		24
+#define	R_PPC_UADDR16		25
+#define	R_PPC_REL32		26
+#define	R_PPC_PLT32		27
+#define	R_PPC_PLTREL32		28
+#define	R_PPC_PLT16_LO		29
+#define	R_PPC_PLT16_HI		30
+#define	R_PPC_PLT16_HA		31
+#define	R_PPC_SDAREL16		32
+#define	R_PPC_SECTOFF		33
+#define	R_PPC_SECTOFF_LO	34
+#define	R_PPC_SECTOFF_HI	35
+#define	R_PPC_SECTOFF_HA	36
+#define	R_PPC_IRELATIVE		248
+
+/*
+ * 64-bit relocations
+ */
+#define	R_PPC64_ADDR64		38
+#define	R_PPC64_ADDR16_HIGHER	39
+#define	R_PPC64_ADDR16_HIGHERA	40
+#define	R_PPC64_ADDR16_HIGHEST	41
+#define	R_PPC64_ADDR16_HIGHESTA	42
+#define	R_PPC64_UADDR64		43
+#define	R_PPC64_REL64		44
+#define	R_PPC64_PLT64		45
+#define	R_PPC64_PLTREL64	46
+#define	R_PPC64_TOC16		47
+#define	R_PPC64_TOC16_LO	48
+#define	R_PPC64_TOC16_HI	49
+#define	R_PPC64_TOC16_HA	50
+#define	R_PPC64_TOC		51
+#define	R_PPC64_DTPMOD64	68
+#define	R_PPC64_TPREL64		73
+#define	R_PPC64_DTPREL64	78
+
+/*
+ * TLS relocations
+ */
+#define	R_PPC_TLS		67
+#define	R_PPC_DTPMOD32		68
+#define	R_PPC_TPREL16		69
+#define	R_PPC_TPREL16_LO	70
+#define	R_PPC_TPREL16_HI	71
+#define	R_PPC_TPREL16_HA	72
+#define	R_PPC_TPREL32		73
+#define	R_PPC_DTPREL16		74
+#define	R_PPC_DTPREL16_LO	75
+#define	R_PPC_DTPREL16_HI	76
+#define	R_PPC_DTPREL16_HA	77
+#define	R_PPC_DTPREL32		78
+#define	R_PPC_GOT_TLSGD16	79
+#define	R_PPC_GOT_TLSGD16_LO	80
+#define	R_PPC_GOT_TLSGD16_HI	81
+#define	R_PPC_GOT_TLSGD16_HA	82
+#define	R_PPC_GOT_TLSLD16	83
+#define	R_PPC_GOT_TLSLD16_LO	84
+#define	R_PPC_GOT_TLSLD16_HI	85
+#define	R_PPC_GOT_TLSLD16_HA	86
+#define	R_PPC_GOT_TPREL16	87
+#define	R_PPC_GOT_TPREL16_LO	88
+#define	R_PPC_GOT_TPREL16_HI	89
+#define	R_PPC_GOT_TPREL16_HA	90
+
+/*
+ * The remaining relocs are from the Embedded ELF ABI, and are not in the
+ *  SVR4 ELF ABI.
+ */
+
+#define	R_PPC_EMB_NADDR32	101
+#define	R_PPC_EMB_NADDR16	102
+#define	R_PPC_EMB_NADDR16_LO	103
+#define	R_PPC_EMB_NADDR16_HI	104
+#define	R_PPC_EMB_NADDR16_HA	105
+#define	R_PPC_EMB_SDAI16	106
+#define	R_PPC_EMB_SDA2I16	107
+#define	R_PPC_EMB_SDA2REL	108
+#define	R_PPC_EMB_SDA21		109
+#define	R_PPC_EMB_MRKREF	110
+#define	R_PPC_EMB_RELSEC16	111
+#define	R_PPC_EMB_RELST_LO	112
+#define	R_PPC_EMB_RELST_HI	113
+#define	R_PPC_EMB_RELST_HA	114
+#define	R_PPC_EMB_BIT_FLD	115
+#define	R_PPC_EMB_RELSDA	116
+
+/*
+ * RISC-V relocation types.
+ */
+
+/* Relocation types used by the dynamic linker. */
+#define	R_RISCV_NONE		0
+#define	R_RISCV_32		1
+#define	R_RISCV_64		2
+#define	R_RISCV_RELATIVE	3
+#define	R_RISCV_COPY		4
+#define	R_RISCV_JUMP_SLOT	5
+#define	R_RISCV_TLS_DTPMOD32	6
+#define	R_RISCV_TLS_DTPMOD64	7
+#define	R_RISCV_TLS_DTPREL32	8
+#define	R_RISCV_TLS_DTPREL64	9
+#define	R_RISCV_TLS_TPREL32	10
+#define	R_RISCV_TLS_TPREL64	11
+
+/* Relocation types not used by the dynamic linker. */
+#define	R_RISCV_BRANCH		16
+#define	R_RISCV_JAL		17
+#define	R_RISCV_CALL		18
+#define	R_RISCV_CALL_PLT	19
+#define	R_RISCV_GOT_HI20	20
+#define	R_RISCV_TLS_GOT_HI20	21
+#define	R_RISCV_TLS_GD_HI20	22
+#define	R_RISCV_PCREL_HI20	23
+#define	R_RISCV_PCREL_LO12_I	24
+#define	R_RISCV_PCREL_LO12_S	25
+#define	R_RISCV_HI20		26
+#define	R_RISCV_LO12_I		27
+#define	R_RISCV_LO12_S		28
+#define	R_RISCV_TPREL_HI20	29
+#define	R_RISCV_TPREL_LO12_I	30
+#define	R_RISCV_TPREL_LO12_S	31
+#define	R_RISCV_TPREL_ADD	32
+#define	R_RISCV_ADD8		33
+#define	R_RISCV_ADD16		34
+#define	R_RISCV_ADD32		35
+#define	R_RISCV_ADD64		36
+#define	R_RISCV_SUB8		37
+#define	R_RISCV_SUB16		38
+#define	R_RISCV_SUB32		39
+#define	R_RISCV_SUB64		40
+#define	R_RISCV_GNU_VTINHERIT	41
+#define	R_RISCV_GNU_VTENTRY	42
+#define	R_RISCV_ALIGN		43
+#define	R_RISCV_RVC_BRANCH	44
+#define	R_RISCV_RVC_JUMP	45
+#define	R_RISCV_RVC_LUI		46
+#define	R_RISCV_RELAX		51
+#define	R_RISCV_SUB6		52
+#define	R_RISCV_SET6		53
+#define	R_RISCV_SET8		54
+#define	R_RISCV_SET16		55
+#define	R_RISCV_SET32		56
+#define	R_RISCV_32_PCREL	57
+#define	R_RISCV_IRELATIVE	58
+
+#define	R_SPARC_NONE		0
+#define	R_SPARC_8		1
+#define	R_SPARC_16		2
+#define	R_SPARC_32		3
+#define	R_SPARC_DISP8		4
+#define	R_SPARC_DISP16		5
+#define	R_SPARC_DISP32		6
+#define	R_SPARC_WDISP30		7
+#define	R_SPARC_WDISP22		8
+#define	R_SPARC_HI22		9
+#define	R_SPARC_22		10
+#define	R_SPARC_13		11
+#define	R_SPARC_LO10		12
+#define	R_SPARC_GOT10		13
+#define	R_SPARC_GOT13		14
+#define	R_SPARC_GOT22		15
+#define	R_SPARC_PC10		16
+#define	R_SPARC_PC22		17
+#define	R_SPARC_WPLT30		18
+#define	R_SPARC_COPY		19
+#define	R_SPARC_GLOB_DAT	20
+#define	R_SPARC_JMP_SLOT	21
+#define	R_SPARC_RELATIVE	22
+#define	R_SPARC_UA32		23
+#define	R_SPARC_PLT32		24
+#define	R_SPARC_HIPLT22		25
+#define	R_SPARC_LOPLT10		26
+#define	R_SPARC_PCPLT32		27
+#define	R_SPARC_PCPLT22		28
+#define	R_SPARC_PCPLT10		29
+#define	R_SPARC_10		30
+#define	R_SPARC_11		31
+#define	R_SPARC_64		32
+#define	R_SPARC_OLO10		33
+#define	R_SPARC_HH22		34
+#define	R_SPARC_HM10		35
+#define	R_SPARC_LM22		36
+#define	R_SPARC_PC_HH22		37
+#define	R_SPARC_PC_HM10		38
+#define	R_SPARC_PC_LM22		39
+#define	R_SPARC_WDISP16		40
+#define	R_SPARC_WDISP19		41
+#define	R_SPARC_GLOB_JMP	42
+#define	R_SPARC_7		43
+#define	R_SPARC_5		44
+#define	R_SPARC_6		45
+#define	R_SPARC_DISP64		46
+#define	R_SPARC_PLT64		47
+#define	R_SPARC_HIX22		48
+#define	R_SPARC_LOX10		49
+#define	R_SPARC_H44		50
+#define	R_SPARC_M44		51
+#define	R_SPARC_L44		52
+#define	R_SPARC_REGISTER	53
+#define	R_SPARC_UA64		54
+#define	R_SPARC_UA16		55
+#define	R_SPARC_TLS_GD_HI22	56
+#define	R_SPARC_TLS_GD_LO10	57
+#define	R_SPARC_TLS_GD_ADD	58
+#define	R_SPARC_TLS_GD_CALL	59
+#define	R_SPARC_TLS_LDM_HI22	60
+#define	R_SPARC_TLS_LDM_LO10	61
+#define	R_SPARC_TLS_LDM_ADD	62
+#define	R_SPARC_TLS_LDM_CALL	63
+#define	R_SPARC_TLS_LDO_HIX22	64
+#define	R_SPARC_TLS_LDO_LOX10	65
+#define	R_SPARC_TLS_LDO_ADD	66
+#define	R_SPARC_TLS_IE_HI22	67
+#define	R_SPARC_TLS_IE_LO10	68
+#define	R_SPARC_TLS_IE_LD	69
+#define	R_SPARC_TLS_IE_LDX	70
+#define	R_SPARC_TLS_IE_ADD	71
+#define	R_SPARC_TLS_LE_HIX22	72
+#define	R_SPARC_TLS_LE_LOX10	73
+#define	R_SPARC_TLS_DTPMOD32	74
+#define	R_SPARC_TLS_DTPMOD64	75
+#define	R_SPARC_TLS_DTPOFF32	76
+#define	R_SPARC_TLS_DTPOFF64	77
+#define	R_SPARC_TLS_TPOFF32	78
+#define	R_SPARC_TLS_TPOFF64	79
+
+#define	R_X86_64_NONE		0	/* No relocation. */
+#define	R_X86_64_64		1	/* Add 64 bit symbol value. */
+#define	R_X86_64_PC32		2	/* PC-relative 32 bit signed sym value. */
+#define	R_X86_64_GOT32		3	/* PC-relative 32 bit GOT offset. */
+#define	R_X86_64_PLT32		4	/* PC-relative 32 bit PLT offset. */
+#define	R_X86_64_COPY		5	/* Copy data from shared object. */
+#define	R_X86_64_GLOB_DAT	6	/* Set GOT entry to data address. */
+#define	R_X86_64_JMP_SLOT	7	/* Set GOT entry to code address. */
+#define	R_X86_64_RELATIVE	8	/* Add load address of shared object. */
+#define	R_X86_64_GOTPCREL	9	/* Add 32 bit signed pcrel offset to GOT. */
+#define	R_X86_64_32		10	/* Add 32 bit zero extended symbol value */
+#define	R_X86_64_32S		11	/* Add 32 bit sign extended symbol value */
+#define	R_X86_64_16		12	/* Add 16 bit zero extended symbol value */
+#define	R_X86_64_PC16		13	/* Add 16 bit signed extended pc relative symbol value */
+#define	R_X86_64_8		14	/* Add 8 bit zero extended symbol value */
+#define	R_X86_64_PC8		15	/* Add 8 bit signed extended pc relative symbol value */
+#define	R_X86_64_DTPMOD64	16	/* ID of module containing symbol */
+#define	R_X86_64_DTPOFF64	17	/* Offset in TLS block */
+#define	R_X86_64_TPOFF64	18	/* Offset in static TLS block */
+#define	R_X86_64_TLSGD		19	/* PC relative offset to GD GOT entry */
+#define	R_X86_64_TLSLD		20	/* PC relative offset to LD GOT entry */
+#define	R_X86_64_DTPOFF32	21	/* Offset in TLS block */
+#define	R_X86_64_GOTTPOFF	22	/* PC relative offset to IE GOT entry */
+#define	R_X86_64_TPOFF32	23	/* Offset in static TLS block */
+#define	R_X86_64_PC64		24	/* PC-relative 64 bit signed sym value. */
+#define	R_X86_64_GOTOFF64	25
+#define	R_X86_64_GOTPC32	26
+#define	R_X86_64_GOT64		27
+#define	R_X86_64_GOTPCREL64	28
+#define	R_X86_64_GOTPC64	29
+#define	R_X86_64_GOTPLT64	30
+#define	R_X86_64_PLTOFF64	31
+#define	R_X86_64_SIZE32		32
+#define	R_X86_64_SIZE64		33
+#define	R_X86_64_GOTPC32_TLSDESC 34
+#define	R_X86_64_TLSDESC_CALL	35
+#define	R_X86_64_TLSDESC	36
+#define	R_X86_64_IRELATIVE	37
+#define	R_X86_64_RELATIVE64	38
+/* 39 and 40 were BND-related, already decomissioned */
+#define	R_X86_64_GOTPCRELX	41
+#define	R_X86_64_REX_GOTPCRELX	42
+
+#define	ELF_BSDF_SIGFASTBLK	0x0001	/* Kernel supports fast sigblock */
+#define	ELF_BSDF_VMNOOVERCOMMIT	0x0002
+
+#endif /* !_SYS_ELF_COMMON_H_ */
diff --git a/libc/include/bits/elf_x86.h b/libc/include/bits/elf_x86.h
deleted file mode 100644
index dfbaba0..0000000
--- a/libc/include/bits/elf_x86.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*	$NetBSD: elf_machdep.h,v 1.12 2016/02/02 20:16:59 christos Exp $	*/
-
-#ifndef _X86_ELF_MACHDEP_H_
-#define _X86_ELF_MACHDEP_H_
-
-/* i386 relocations */
-#define	R_386_NONE	0
-#define	R_386_32	1
-#define	R_386_PC32	2
-#define	R_386_GOT32	3
-#define	R_386_PLT32	4
-#define	R_386_COPY	5
-#define	R_386_GLOB_DAT	6
-#define	R_386_JMP_SLOT	7
-#define	R_386_RELATIVE	8
-#define	R_386_GOTOFF	9
-#define	R_386_GOTPC	10
-#define	R_386_32PLT	11
-
-/* TLS relocations */
-#define	R_386_TLS_TPOFF	14
-#define	R_386_TLS_IE	15
-#define	R_386_TLS_GOTIE	16
-#define	R_386_TLS_LE	17
-#define	R_386_TLS_GD	18
-#define	R_386_TLS_LDM	19
-
-/* The following relocations are GNU extensions. */
-#define	R_386_16	20
-#define	R_386_PC16	21
-#define	R_386_8		22
-#define	R_386_PC8	23
-
-/* More TLS relocations */
-#define	R_386_TLS_GD_32		24
-#define	R_386_TLS_GD_PUSH	25
-#define	R_386_TLS_GD_CALL	26
-#define	R_386_TLS_GD_POP	27
-#define	R_386_TLS_LDM_32	28
-#define	R_386_TLS_LDM_PUSH	29
-#define	R_386_TLS_LDM_CALL	30
-#define	R_386_TLS_LDM_POP	31
-#define	R_386_TLS_LDO_32	32
-#define	R_386_TLS_IE_32		33
-#define	R_386_TLS_LE_32		34
-#define	R_386_TLS_DTPMOD32	35
-#define	R_386_TLS_DTPOFF32	36
-#define	R_386_TLS_TPOFF32	37
-
-#define R_386_SIZE32		38
-
-/* More TLS relocations */
-#define	R_386_TLS_GOTDESC	39
-#define	R_386_TLS_DESC_CALL	40
-#define	R_386_TLS_DESC		41
-
-#define R_386_IRELATIVE		42
-#define R_386_GOT32X		43
-
-#endif
diff --git a/libc/include/bits/elf_x86_64.h b/libc/include/bits/elf_x86_64.h
deleted file mode 100644
index 30062af..0000000
--- a/libc/include/bits/elf_x86_64.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*	$NetBSD: elf_machdep.h,v 1.5 2016/02/02 20:13:59 christos Exp $	*/
-
-#ifndef _X86_64_ELF_MACHDEP_H_
-#define _X86_64_ELF_MACHDEP_H_
-
-/* x86-64 relocations */
-
-#define R_X86_64_NONE		0
-#define R_X86_64_64		1
-#define R_X86_64_PC32		2
-#define R_X86_64_GOT32		3
-#define R_X86_64_PLT32		4
-#define R_X86_64_COPY		5
-#define R_X86_64_GLOB_DAT	6
-#define R_X86_64_JUMP_SLOT	7
-#define R_X86_64_RELATIVE	8
-#define R_X86_64_GOTPCREL	9
-#define R_X86_64_32		10
-#define R_X86_64_32S		11
-#define R_X86_64_16		12
-#define R_X86_64_PC16		13
-#define R_X86_64_8		14
-#define R_X86_64_PC8		15
-
-/* TLS relocations */
-#define R_X86_64_DTPMOD64	16
-#define R_X86_64_DTPOFF64	17
-#define R_X86_64_TPOFF64	18
-#define R_X86_64_TLSGD		19
-#define R_X86_64_TLSLD		20
-#define R_X86_64_DTPOFF32	21
-#define R_X86_64_GOTTPOFF	22
-#define R_X86_64_TPOFF32	23
-
-#define R_X86_64_PC64		24
-#define R_X86_64_GOTOFF64	25
-#define R_X86_64_GOTPC32	26
-#define R_X86_64_GOT64		27
-#define R_X86_64_GOTPCREL64	28
-#define R_X86_64_GOTPC64	29
-#define R_X86_64_GOTPLT64	30
-#define R_X86_64_PLTOFF64	31
-#define R_X86_64_SIZE32		32
-#define R_X86_64_SIZE64		33
-#define R_X86_64_GOTPC32_TLSDESC 34
-#define R_X86_64_TLSDESC_CALL	35
-#define R_X86_64_TLSDESC	36
-#define R_X86_64_IRELATIVE	37
-#define R_X86_64_RELATIVE64	38
-#define R_X86_64_PC32_BND	39
-#define R_X86_64_PLT32_BND	40
-#define R_X86_64_GOTPCRELX	41
-#define R_X86_64_REX_GOTPCRELX	42
-
-#endif
diff --git a/libc/include/bits/fenv_inlines_arm.h b/libc/include/bits/fenv_inlines_arm.h
deleted file mode 100644
index e8b89ea..0000000
--- a/libc/include/bits/fenv_inlines_arm.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*-
- * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: src/lib/msun/arm/fenv.c,v 1.1 2004/06/06 10:03:59 das Exp $
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-
-#if defined(__arm__)
-
-#if !defined(__BIONIC_FENV_INLINE)
-#define __BIONIC_FENV_INLINE static __inline
-#endif
-
-#include <bits/fenv_arm.h>
-
-__BEGIN_DECLS
-
-#define FPSCR_RMODE_SHIFT 22
-
-__BIONIC_FENV_INLINE int fegetenv(fenv_t* __envp) {
-  fenv_t _fpscr;
-  __asm__ __volatile__("vmrs %0,fpscr" : "=r" (_fpscr));
-  *__envp = _fpscr;
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int fesetenv(const fenv_t* __envp) {
-  fenv_t _fpscr = *__envp;
-  __asm__ __volatile__("vmsr fpscr,%0" : :"ri" (_fpscr));
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int feclearexcept(int __excepts) {
-  fexcept_t __fpscr;
-  fegetenv(&__fpscr);
-  __fpscr &= ~__excepts;
-  fesetenv(&__fpscr);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int fegetexceptflag(fexcept_t* __flagp, int __excepts) {
-  fexcept_t __fpscr;
-  fegetenv(&__fpscr);
-  *__flagp = __fpscr & __excepts;
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int fesetexceptflag(const fexcept_t* __flagp, int __excepts) {
-  fexcept_t __fpscr;
-  fegetenv(&__fpscr);
-  __fpscr &= ~__excepts;
-  __fpscr |= *__flagp & __excepts;
-  fesetenv(&__fpscr);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int feraiseexcept(int __excepts) {
-  fexcept_t __ex = __excepts;
-  fesetexceptflag(&__ex, __excepts);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int fetestexcept(int __excepts) {
-  fexcept_t __fpscr;
-  fegetenv(&__fpscr);
-  return (__fpscr & __excepts);
-}
-
-__BIONIC_FENV_INLINE int fegetround(void) {
-  fenv_t _fpscr;
-  fegetenv(&_fpscr);
-  return ((_fpscr >> FPSCR_RMODE_SHIFT) & 0x3);
-}
-
-__BIONIC_FENV_INLINE int fesetround(int __round) {
-  fenv_t _fpscr;
-  fegetenv(&_fpscr);
-  _fpscr &= ~(0x3 << FPSCR_RMODE_SHIFT);
-  _fpscr |= (__round << FPSCR_RMODE_SHIFT);
-  fesetenv(&_fpscr);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int feholdexcept(fenv_t* __envp) {
-  fenv_t __env;
-  fegetenv(&__env);
-  *__envp = __env;
-  __env &= ~FE_ALL_EXCEPT;
-  fesetenv(&__env);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int feupdateenv(const fenv_t* __envp) {
-  fexcept_t __fpscr;
-  fegetenv(&__fpscr);
-  fesetenv(__envp);
-  feraiseexcept(__fpscr & FE_ALL_EXCEPT);
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int feenableexcept(int __mask __unused) {
-  return -1;
-}
-
-__BIONIC_FENV_INLINE int fedisableexcept(int __mask __unused) {
-  return 0;
-}
-
-__BIONIC_FENV_INLINE int fegetexcept(void) {
-  return 0;
-}
-
-#undef FPSCR_RMODE_SHIFT
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/android/legacy_errno_inlines.h b/libc/include/bits/fenv_riscv64.h
similarity index 71%
copy from libc/include/android/legacy_errno_inlines.h
copy to libc/include/bits/fenv_riscv64.h
index fcbca13..e1e43b6 100644
--- a/libc/include/android/legacy_errno_inlines.h
+++ b/libc/include/bits/fenv_riscv64.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,19 +28,25 @@
 
 #pragma once
 
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
+#include <sys/types.h>
 
 __BEGIN_DECLS
 
-static __inline int __attribute__((deprecated)) __set_errno(int n) {
-  errno = n;
-  return -1;
-}
+typedef __uint32_t fenv_t;
+typedef __uint32_t fexcept_t;
+
+/* Exception flags. No FE_DENORMAL for riscv64. */
+#define FE_INEXACT    0x01
+#define FE_UNDERFLOW  0x02
+#define FE_OVERFLOW   0x04
+#define FE_DIVBYZERO  0x08
+#define FE_INVALID    0x10
+#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+
+/* Rounding modes. */
+#define FE_TONEAREST  0x0
+#define FE_TOWARDZERO 0x1
+#define FE_DOWNWARD   0x2
+#define FE_UPWARD     0x3
 
 __END_DECLS
-
-#endif
diff --git a/libc/include/bits/fortify/fcntl.h b/libc/include/bits/fortify/fcntl.h
index 7fe60f4..1f6ebad 100644
--- a/libc/include/bits/fortify/fcntl.h
+++ b/libc/include/bits/fortify/fcntl.h
@@ -59,7 +59,7 @@
 int open(const char* const __pass_object_size pathname, int flags)
         __overloadable
         __clang_error_if(__open_modes_useful(flags), "'open' " __open_too_few_args_error) {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __open_2(pathname, flags);
 #else
     return __open_real(pathname, flags);
@@ -83,7 +83,7 @@
 int openat(int dirfd, const char* const __pass_object_size pathname, int flags)
         __overloadable
         __clang_error_if(__open_modes_useful(flags), "'openat' " __open_too_few_args_error) {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __openat_2(dirfd, pathname, flags);
 #else
     return __openat_real(dirfd, pathname, flags);
@@ -98,7 +98,6 @@
     return __openat_real(dirfd, pathname, flags, modes);
 }
 
-#if __ANDROID_API__ >= 21
 /* Note that open == open64, so we reuse those bits in the open64 variants below.  */
 
 __BIONIC_ERROR_FUNCTION_VISIBILITY
@@ -139,7 +138,6 @@
                            "'openat64' " __open_useless_modes_warning) {
     return openat(dirfd, pathname, flags, modes);
 }
-#endif /* __ANDROID_API__ >= 21 */
 
 #undef __open_too_many_args_error
 #undef __open_too_few_args_error
diff --git a/libc/include/bits/fortify/poll.h b/libc/include/bits/fortify/poll.h
index 143153c..0b5cd4b 100644
--- a/libc/include/bits/fortify/poll.h
+++ b/libc/include/bits/fortify/poll.h
@@ -54,7 +54,6 @@
   return __call_bypassing_fortify(poll)(fds, fd_count, timeout);
 }
 
-#if __ANDROID_API__ >= 21
 __BIONIC_FORTIFY_INLINE
 int ppoll(struct pollfd* const fds __pass_object_size, nfds_t fd_count, const struct timespec* timeout, const sigset_t* mask)
     __overloadable
@@ -69,7 +68,6 @@
 #endif
   return __call_bypassing_fortify(ppoll)(fds, fd_count, timeout, mask);
 }
-#endif /* __ANDROID_API__ >= 21 */
 
 #if __ANDROID_API__ >= 28
 __BIONIC_FORTIFY_INLINE
diff --git a/libc/include/bits/fortify/stat.h b/libc/include/bits/fortify/stat.h
index 2d42a51..9b4ade2 100644
--- a/libc/include/bits/fortify/stat.h
+++ b/libc/include/bits/fortify/stat.h
@@ -39,7 +39,7 @@
     __overloadable
     __enable_if(1, "")
     __clang_error_if(mode & ~0777, "'umask' called with invalid mode") {
-#if __ANDROID_API__ >= 18 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
   return __umask_chk(mode);
 #else
   return __umask_real(mode);
diff --git a/libc/include/bits/fortify/stdio.h b/libc/include/bits/fortify/stdio.h
index 77bdbb4..95db017 100644
--- a/libc/include/bits/fortify/stdio.h
+++ b/libc/include/bits/fortify/stdio.h
@@ -36,7 +36,7 @@
 
 #if defined(__BIONIC_FORTIFY) && !defined(__BIONIC_NO_STDIO_FORTIFY)
 
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 /* No diag -- clang diagnoses misuses of this on its own.  */
 __BIONIC_FORTIFY_INLINE __printflike(3, 0)
 int vsnprintf(char* const __pass_object_size dest, size_t size, const char* format, va_list ap)
@@ -58,7 +58,7 @@
                 "format string will always overflow destination buffer")
     __errorattr("format string will always overflow destination buffer");
 
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 __BIONIC_FORTIFY_VARIADIC __printflike(2, 3)
 int sprintf(char* const __pass_object_size dest, const char* format, ...) __overloadable {
     va_list va;
@@ -126,7 +126,7 @@
         __clang_error_if(size < 0, "in call to 'fgets', size should not be negative")
         __clang_error_if(__bos_unevaluated_lt(__bos(dest), size),
                          "in call to 'fgets', size is larger than the destination buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos(dest);
 
     if (!__bos_dynamic_check_impl_and(bos, >=, (size_t)size, size >= 0)) {
diff --git a/libc/include/bits/fortify/string.h b/libc/include/bits/fortify/string.h
index 08bce2d..f668b9f 100644
--- a/libc/include/bits/fortify/string.h
+++ b/libc/include/bits/fortify/string.h
@@ -40,7 +40,7 @@
 #if defined(__BIONIC_FORTIFY)
 extern void* __memrchr_real(const void*, int, size_t) __RENAME(memrchr);
 
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 /* No diag -- clang diagnoses misuses of this on its own.  */
 __BIONIC_FORTIFY_INLINE
 void* memcpy(void* const dst __pass_object_size0, const void* src, size_t copy_amount)
@@ -82,7 +82,7 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)),
                          "'stpcpy' called with string bigger than buffer") {
-#if __ANDROID_API__ >= 21 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __builtin___stpcpy_chk(dst, src, __bos(dst));
 #else
     return __builtin_stpcpy(dst, src);
@@ -95,7 +95,7 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)),
                          "'strcpy' called with string bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __builtin___strcpy_chk(dst, src, __bos(dst));
 #else
     return __builtin_strcpy(dst, src);
@@ -107,14 +107,14 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)),
                          "'strcat' called with string bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __builtin___strcat_chk(dst, src, __bos(dst));
 #else
     return __builtin_strcat(dst, src);
 #endif
 }
 
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 /* No diag -- clang diagnoses misuses of this on its own.  */
 __BIONIC_FORTIFY_INLINE
 char* strncat(char* const dst __pass_object_size, const char* src, size_t n)
@@ -130,7 +130,7 @@
         __diagnose_as_builtin(__builtin_memset, 1, 2, 3)
         /* If you're a user who wants this warning to go away: use `(&memset)(foo, bar, baz)`. */
         __clang_warning_if(c && !n, "'memset' will set 0 bytes; maybe the arguments got flipped?") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __builtin___memset_chk(s, c, n, __bos0(s));
 #else
     return __builtin_memset(s, c, n);
@@ -161,7 +161,7 @@
 }
 #endif
 
-#if __ANDROID_API__ >= 21 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 /* No diag -- clang diagnoses misuses of this on its own.  */
 __BIONIC_FORTIFY_INLINE
 char* stpncpy(char* const dst __pass_object_size, const char* const src __pass_object_size, size_t n)
@@ -200,7 +200,7 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_lt(__bos(dst), size),
                          "'strlcpy' called with size bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __strlcpy_chk(dst, src, size, __bos(dst));
 #else
     return __call_bypassing_fortify(strlcpy)(dst, src, size);
@@ -212,14 +212,14 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_lt(__bos(dst), size),
                          "'strlcat' called with size bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     return __strlcat_chk(dst, src, size, __bos(dst));
 #else
     return __call_bypassing_fortify(strlcat)(dst, src, size);
 #endif
 }
 
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
 __BIONIC_FORTIFY_INLINE
 size_t strlen(const char* const s __pass_object_size0) __overloadable {
     return __strlen_chk(s, __bos0(s));
@@ -228,7 +228,7 @@
 
 __BIONIC_FORTIFY_INLINE
 char* strchr(const char* const s __pass_object_size, int c) __overloadable {
-#if  __ANDROID_API__ >= 18 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos(s);
 
     if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) {
@@ -240,7 +240,7 @@
 
 __BIONIC_FORTIFY_INLINE
 char* strrchr(const char* const s __pass_object_size, int c) __overloadable {
-#if  __ANDROID_API__ >= 18 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos(s);
 
     if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) {
diff --git a/libc/include/bits/fortify/strings.h b/libc/include/bits/fortify/strings.h
index 65fc5f1..5515ef9 100644
--- a/libc/include/bits/fortify/strings.h
+++ b/libc/include/bits/fortify/strings.h
@@ -33,7 +33,7 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_lt(__bos0(dst), len),
                          "'bcopy' called with size bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos0(dst);
     if (!__bos_trivially_ge(bos, len)) {
         __builtin___memmove_chk(dst, src, len, bos);
@@ -48,7 +48,7 @@
         __overloadable
         __clang_error_if(__bos_unevaluated_lt(__bos0(b), len),
                          "'bzero' called with size bigger than buffer") {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos0(b);
     if (!__bos_trivially_ge(bos, len)) {
         __builtin___memset_chk(b, 0, len, bos);
diff --git a/libc/include/bits/fortify/unistd.h b/libc/include/bits/fortify/unistd.h
index 49a3946..335d0b5 100644
--- a/libc/include/bits/fortify/unistd.h
+++ b/libc/include/bits/fortify/unistd.h
@@ -152,7 +152,7 @@
         __overloadable
         __error_if_overflows_ssizet(count, read)
         __error_if_overflows_objectsize(count, __bos0(buf), read) {
-#if __ANDROID_API__ >= 21 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
+#if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
     size_t bos = __bos0(buf);
 
     if (!__bos_trivially_ge_no_overflow(bos, count)) {
@@ -192,7 +192,6 @@
     return __call_bypassing_fortify(readlink)(path, buf, size);
 }
 
-#if __ANDROID_API__ >= 21
 __BIONIC_FORTIFY_INLINE
 ssize_t readlinkat(int dirfd, const char* path, char* const __pass_object_size buf, size_t size)
         __overloadable
@@ -207,7 +206,6 @@
 #endif
     return __call_bypassing_fortify(readlinkat)(dirfd, path, buf, size);
 }
-#endif /* __ANDROID_API__ >= 21 */
 
 #undef __bos_trivially_ge_no_overflow
 #undef __enable_if_no_overflow_ssizet
diff --git a/libc/include/bits/get_device_api_level_inlines.h b/libc/include/bits/get_device_api_level_inlines.h
index d14eb2c..dc5871b 100644
--- a/libc/include/bits/get_device_api_level_inlines.h
+++ b/libc/include/bits/get_device_api_level_inlines.h
@@ -35,8 +35,8 @@
 __BEGIN_DECLS
 
 // Avoid circular dependencies since this is exposed from <sys/cdefs.h>.
-int __system_property_get(const char* __name, char* __value);
-int atoi(const char* __s) __attribute_pure__;
+int __system_property_get(const char* _Nonnull __name, char*  _Nonnull __value);
+int atoi(const char* _Nonnull __s) __attribute_pure__;
 
 __BIONIC_GET_DEVICE_API_LEVEL_INLINE int android_get_device_api_level() {
   char value[92] = { 0 };
diff --git a/libc/include/bits/getopt.h b/libc/include/bits/getopt.h
index 0411716..60a89ed 100644
--- a/libc/include/bits/getopt.h
+++ b/libc/include/bits/getopt.h
@@ -38,12 +38,12 @@
  * Returns the next option character on success, returns -1 if all options have been parsed, and
  * returns `'?'` on error.
  */
-int getopt(int __argc, char* const __argv[], const char* __options);
+int getopt(int __argc, char* const _Nonnull __argv[_Nullable], const char* _Nonnull __options);
 
 /**
  * Points to the text of the corresponding value for options that take an argument.
  */
-extern char* optarg;
+extern char* _Nullable optarg;
 
 /**
  * The index of the next element to be processed.
diff --git a/libc/include/bits/glibc-syscalls.h b/libc/include/bits/glibc-syscalls.h
index c144919..79f7da0 100644
--- a/libc/include/bits/glibc-syscalls.h
+++ b/libc/include/bits/glibc-syscalls.h
@@ -906,6 +906,9 @@
 #if defined(__NR_restart_syscall)
   #define SYS_restart_syscall __NR_restart_syscall
 #endif
+#if defined(__NR_riscv_flush_icache)
+  #define SYS_riscv_flush_icache __NR_riscv_flush_icache
+#endif
 #if defined(__NR_rmdir)
   #define SYS_rmdir __NR_rmdir
 #endif
diff --git a/libc/include/bits/strcasecmp.h b/libc/include/bits/strcasecmp.h
index 3994b68..23acbe5 100644
--- a/libc/include/bits/strcasecmp.h
+++ b/libc/include/bits/strcasecmp.h
@@ -46,12 +46,12 @@
  * Returns an integer less than, equal to, or greater than zero if the first string is less than,
  * equal to, or greater than the second string (ignoring case).
  */
-int strcasecmp(const char* __s1, const char* __s2) __attribute_pure__;
+int strcasecmp(const char* _Nonnull __s1, const char* _Nonnull __s2) __attribute_pure__;
 
 /**
  * Like strcasecmp() but taking a `locale_t`.
  */
-int strcasecmp_l(const char* __s1, const char* __s2, locale_t __l) __attribute_pure__ __INTRODUCED_IN(23);
+int strcasecmp_l(const char* _Nonnull __s1, const char* _Nonnull __s2, locale_t _Nonnull __l) __attribute_pure__ __INTRODUCED_IN(23);
 
 /**
  * [strncasecmp(3)](http://man7.org/linux/man-pages/man3/strncasecmp.3.html) compares the first
@@ -61,11 +61,11 @@
  * first string is less than, equal to, or greater than the first `n` bytes of the second
  * string (ignoring case).
  */
-int strncasecmp(const char* __s1, const char* __s2, size_t __n) __attribute_pure__;
+int strncasecmp(const char* _Nonnull __s1, const char* _Nonnull __s2, size_t __n) __attribute_pure__;
 
 /**
  * Like strncasecmp() but taking a `locale_t`.
  */
-int strncasecmp_l(const char* __s1, const char* __s2, size_t __n, locale_t __l) __attribute_pure__ __INTRODUCED_IN(23);
+int strncasecmp_l(const char* _Nonnull __s1, const char* _Nonnull __s2, size_t __n, locale_t _Nonnull __l) __attribute_pure__ __INTRODUCED_IN(23);
 
 __END_DECLS
diff --git a/libc/include/bits/swab.h b/libc/include/bits/swab.h
index 63281b6..9591c2e 100644
--- a/libc/include/bits/swab.h
+++ b/libc/include/bits/swab.h
@@ -38,7 +38,7 @@
 
 __BEGIN_DECLS
 
-__BIONIC_SWAB_INLINE void swab(const void* __void_src, void* __void_dst, ssize_t __byte_count) {
+__BIONIC_SWAB_INLINE void swab(const void* _Nonnull __void_src, void* _Nonnull __void_dst, ssize_t __byte_count) {
   const uint8_t* __src = __BIONIC_CAST(static_cast, const uint8_t*, __void_src);
   uint8_t* __dst = __BIONIC_CAST(static_cast, uint8_t*, __void_dst);
   while (__byte_count > 1) {
diff --git a/libc/include/bits/sys_statvfs_inlines.h b/libc/include/bits/sys_statvfs_inlines.h
deleted file mode 100644
index 991fac7..0000000
--- a/libc/include/bits/sys_statvfs_inlines.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <sys/cdefs.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
-
-#if defined(__BIONIC_SYS_STATVFS_INLINE)
-
-__BEGIN_DECLS
-
-#if defined(__BIONIC_NEED_STATVFS_INLINES)
-
-static __inline void __bionic_statfs_to_statvfs(const struct statfs* __src,
-                                                struct statvfs* __dst) {
-  __dst->f_bsize = __src->f_bsize;
-  __dst->f_frsize = __src->f_frsize;
-  __dst->f_blocks = __src->f_blocks;
-  __dst->f_bfree = __src->f_bfree;
-  __dst->f_bavail = __src->f_bavail;
-  __dst->f_files = __src->f_files;
-  __dst->f_ffree = __src->f_ffree;
-  __dst->f_favail = __src->f_ffree;
-  __dst->f_fsid = __src->f_fsid.__val[0] |
-      __BIONIC_CAST(static_cast, uint64_t, __src->f_fsid.__val[1]) << 32;
-  __dst->f_flag = __src->f_flags;
-  __dst->f_namemax = __src->f_namelen;
-}
-
-__BIONIC_SYS_STATVFS_INLINE int statvfs(const char* __path,
-                                        struct statvfs* __result) {
-  struct statfs __tmp;
-  int __rc = statfs(__path, &__tmp);
-  if (__rc != 0) return __rc;
-  __bionic_statfs_to_statvfs(&__tmp, __result);
-  return 0;
-}
-
-__BIONIC_SYS_STATVFS_INLINE int fstatvfs(int __fd,
-                                         struct statvfs* __result) {
-  struct statfs __tmp;
-  int __rc = fstatfs(__fd, &__tmp);
-  if (__rc != 0) return __rc;
-  __bionic_statfs_to_statvfs(&__tmp, __result);
-  return 0;
-}
-
-#endif
-
-#if defined(__BIONIC_NEED_STATVFS64_INLINES)
-
-__BIONIC_SYS_STATVFS_INLINE int statvfs64(const char* __path,
-                                          struct statvfs64* __result) {
-  return statvfs(__path, __BIONIC_CAST(reinterpret_cast, struct statvfs*,
-                                       __result));
-}
-
-__BIONIC_SYS_STATVFS_INLINE int fstatvfs64(int __fd,
-                                          struct statvfs64* __result) {
-  return fstatvfs(__fd, __BIONIC_CAST(reinterpret_cast, struct statvfs*,
-                                      __result));
-}
-
-#endif
-
-__END_DECLS
-
-#endif
diff --git a/libc/include/bits/threads_inlines.h b/libc/include/bits/threads_inlines.h
index afaed64..17de4a1 100644
--- a/libc/include/bits/threads_inlines.h
+++ b/libc/include/bits/threads_inlines.h
@@ -103,12 +103,10 @@
   return __bionic_thrd_error(pthread_mutex_lock(__mtx));
 }
 
-#if __ANDROID_API__ >= 21
 __BIONIC_THREADS_INLINE int mtx_timedlock(mtx_t* __mtx,
                                           const struct timespec* __timeout) {
   return __bionic_thrd_error(pthread_mutex_timedlock(__mtx, __timeout));
 }
-#endif
 
 __BIONIC_THREADS_INLINE int mtx_trylock(mtx_t* __mtx) {
   return __bionic_thrd_error(pthread_mutex_trylock(__mtx));
diff --git a/libc/include/bits/wait.h b/libc/include/bits/wait.h
index a6a2129..c7f1fb0 100644
--- a/libc/include/bits/wait.h
+++ b/libc/include/bits/wait.h
@@ -53,7 +53,7 @@
 #define WIFEXITED(__status) (WTERMSIG(__status) == 0)
 
 /** Returns true if the process was stopped by a signal. */
-#define WIFSTOPPED(__status) (WTERMSIG(__status) == 0x7f)
+#define WIFSTOPPED(__status) (((__status) & 0xff) == 0x7f)
 
 /** Returns true if the process was terminated by a signal. */
 #define WIFSIGNALED(__status) (WTERMSIG((__status)+1) >= 2)
diff --git a/libc/include/dirent.h b/libc/include/dirent.h
index 2328b1a..2751b9e 100644
--- a/libc/include/dirent.h
+++ b/libc/include/dirent.h
@@ -95,7 +95,7 @@
  *
  * Returns null and sets `errno` on failure.
  */
-DIR* opendir(const char* __path);
+DIR* _Nullable opendir(const char* _Nonnull __path);
 
 /**
  * [fopendir(3)](http://man7.org/linux/man-pages/man3/opendir.3.html)
@@ -103,7 +103,7 @@
  *
  * Returns null and sets `errno` on failure.
  */
-DIR* fdopendir(int __dir_fd);
+DIR* _Nullable fdopendir(int __dir_fd);
 
 /**
  * [readdir(3)](http://man7.org/linux/man-pages/man3/readdir.3.html)
@@ -113,7 +113,7 @@
  * or returns null and leaves `errno` unchanged at the end of the directory,
  * or returns null and sets `errno` on failure.
  */
-struct dirent* readdir(DIR* __dir);
+struct dirent* _Nullable readdir(DIR* _Nonnull __dir);
 
 /**
  * [readdir64(3)](http://man7.org/linux/man-pages/man3/readdir.3.html)
@@ -123,10 +123,10 @@
  * or returns null and leaves `errno` unchanged at the end of the directory,
  * or returns null and sets `errno` on failure.
  */
-struct dirent64* readdir64(DIR* __dir) __INTRODUCED_IN(21);
+struct dirent64* _Nullable readdir64(DIR* _Nonnull __dir) __INTRODUCED_IN(21);
 
-int readdir_r(DIR* __dir, struct dirent* __entry, struct dirent** __buffer) __attribute__((__deprecated__("readdir_r is deprecated; use readdir instead")));
-int readdir64_r(DIR* __dir, struct dirent64* __entry, struct dirent64** __buffer) __INTRODUCED_IN(21) __attribute__((__deprecated__("readdir64_r is deprecated; use readdir64 instead")));
+int readdir_r(DIR* _Nonnull __dir, struct dirent* _Nonnull __entry, struct dirent* _Nullable * _Nonnull __buffer) __attribute__((__deprecated__("readdir_r is deprecated; use readdir instead")));
+int readdir64_r(DIR* _Nonnull __dir, struct dirent64* _Nonnull __entry, struct dirent64* _Nullable * _Nonnull __buffer) __INTRODUCED_IN(21) __attribute__((__deprecated__("readdir64_r is deprecated; use readdir64 instead")));
 
 /**
  * [closedir(3)](http://man7.org/linux/man-pages/man3/closedir.3.html)
@@ -134,13 +134,13 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int closedir(DIR* __dir);
+int closedir(DIR* _Nonnull __dir);
 
 /**
  * [rewinddir(3)](http://man7.org/linux/man-pages/man3/rewinddir.3.html)
  * rewinds a directory stream to the first entry.
  */
-void rewinddir(DIR* __dir);
+void rewinddir(DIR* _Nonnull __dir);
 
 /**
  * [seekdir(3)](http://man7.org/linux/man-pages/man3/seekdir.3.html)
@@ -149,7 +149,7 @@
  *
  * Available since API level 23.
  */
-void seekdir(DIR* __dir, long __location) __INTRODUCED_IN(23);
+void seekdir(DIR* _Nonnull __dir, long __location) __INTRODUCED_IN(23);
 
 /**
  * [telldir(3)](http://man7.org/linux/man-pages/man3/telldir.3.html)
@@ -160,7 +160,7 @@
  *
  * Available since API level 23.
  */
-long telldir(DIR* __dir) __INTRODUCED_IN(23);
+long telldir(DIR* _Nonnull __dir) __INTRODUCED_IN(23);
 
 /**
  * [dirfd(3)](http://man7.org/linux/man-pages/man3/dirfd.3.html)
@@ -168,13 +168,13 @@
  *
  * Returns a file descriptor on success and returns -1 and sets `errno` on failure.
  */
-int dirfd(DIR* __dir);
+int dirfd(DIR* _Nonnull __dir);
 
 /**
  * [alphasort](http://man7.org/linux/man-pages/man3/alphasort.3.html) is a
  * comparator for use with scandir() that uses strcoll().
  */
-int alphasort(const struct dirent** __lhs, const struct dirent** __rhs);
+int alphasort(const struct dirent* _Nonnull * _Nonnull __lhs, const struct dirent* _Nonnull * _Nonnull __rhs);
 
 /**
  * [alphasort64](http://man7.org/linux/man-pages/man3/alphasort.3.html) is a
@@ -182,31 +182,33 @@
  *
  * Available since API level 21.
  */
-int alphasort64(const struct dirent64** __lhs, const struct dirent64** __rhs) __INTRODUCED_IN(21);
+int alphasort64(const struct dirent64* _Nonnull * _Nonnull __lhs, const struct dirent64* _Nonnull * _Nonnull __rhs) __INTRODUCED_IN(21);
 
 /**
  * [scandir(3)](http://man7.org/linux/man-pages/man3/scandir.3.html)
  * scans all the directory `__path`, filtering entries with `__filter` and
  * sorting them with qsort() using the given `__comparator`, and storing them
  * into `__name_list`. Passing NULL as the filter accepts all entries.
+ * Passing NULL as the comparator skips sorting.
  *
  * Returns the number of entries returned in the list on success,
  * and returns -1 and sets `errno` on failure.
  */
-int scandir(const char* __path, struct dirent*** __name_list, int (*__filter)(const struct dirent*), int (*__comparator)(const struct dirent**, const struct dirent**));
+int scandir(const char* _Nonnull __path, struct dirent* _Nonnull * _Nonnull * _Nonnull __name_list, int (* _Nullable __filter)(const struct dirent* _Nonnull), int (* _Nullable __comparator)(const struct dirent* _Nonnull * _Nonnull, const struct dirent* _Nonnull * _Nonnull));
 
 /**
  * [scandir64(3)](http://man7.org/linux/man-pages/man3/scandir.3.html)
  * scans all the directory `__path`, filtering entries with `__filter` and
  * sorting them with qsort() using the given `__comparator`, and storing them
  * into `__name_list`. Passing NULL as the filter accepts all entries.
+ * Passing NULL as the comparator skips sorting.
  *
  * Returns the number of entries returned in the list on success,
  * and returns -1 and sets `errno` on failure.
  *
  * Available since API level 21.
  */
-int scandir64(const char* __path, struct dirent64*** __name_list, int (*__filter)(const struct dirent64*), int (*__comparator)(const struct dirent64**, const struct dirent64**)) __INTRODUCED_IN(21);
+int scandir64(const char* _Nonnull __path, struct dirent64* _Nonnull * _Nonnull * _Nonnull __name_list, int (* _Nullable __filter)(const struct dirent64* _Nonnull), int (* _Nullable __comparator)(const struct dirent64* _Nonnull * _Nonnull, const struct dirent64* _Nonnull * _Nonnull)) __INTRODUCED_IN(21);
 
 #if defined(__USE_GNU)
 
@@ -216,13 +218,14 @@
  * filtering entries with `__filter` and sorting them with qsort() using the
  * given `__comparator`, and storing them into `__name_list`. Passing NULL as
  * the filter accepts all entries.
+ * Passing NULL as the comparator skips sorting.
  *
  * Returns the number of entries returned in the list on success,
  * and returns -1 and sets `errno` on failure.
  *
  * Available since API level 24.
  */
-int scandirat64(int __dir_fd, const char* __path, struct dirent64*** __name_list, int (*__filter)(const struct dirent64*), int (*__comparator)(const struct dirent64**, const struct dirent64**)) __INTRODUCED_IN(24);
+int scandirat64(int __dir_fd, const char* _Nonnull __path, struct dirent64* _Nonnull * _Nonnull * _Nonnull __name_list, int (* _Nullable __filter)(const struct dirent64* _Nonnull), int (* _Nullable __comparator)(const struct dirent64* _Nonnull * _Nonnull, const struct dirent64* _Nonnull * _Nonnull)) __INTRODUCED_IN(24);
 
 /**
  * [scandirat(3)](http://man7.org/linux/man-pages/man3/scandirat.3.html)
@@ -230,13 +233,14 @@
  * filtering entries with `__filter` and sorting them with qsort() using the
  * given `__comparator`, and storing them into `__name_list`. Passing NULL as
  * the filter accepts all entries.
+ * Passing NULL as the comparator skips sorting.
  *
  * Returns the number of entries returned in the list on success,
  * and returns -1 and sets `errno` on failure.
  *
  * Available since API level 24.
  */
-int scandirat(int __dir_fd, const char* __path, struct dirent*** __name_list, int (*__filter)(const struct dirent*), int (*__comparator)(const struct dirent**, const struct dirent**)) __INTRODUCED_IN(24);
+int scandirat(int __dir_fd, const char* _Nonnull __path, struct dirent* _Nonnull * _Nonnull * _Nonnull __name_list, int (* _Nullable __filter)(const struct dirent* _Nonnull), int (* _Nullable __comparator)(const struct dirent* _Nonnull * _Nonnull, const struct dirent* _Nonnull * _Nonnull)) __INTRODUCED_IN(24);
 
 #endif
 
diff --git a/libc/include/dlfcn.h b/libc/include/dlfcn.h
index 68d8bc9..a8066a9 100644
--- a/libc/include/dlfcn.h
+++ b/libc/include/dlfcn.h
@@ -36,21 +36,23 @@
 
 typedef struct {
   /* Pathname of shared object that contains address. */
-  const char* dli_fname;
+  const char* _Nullable dli_fname;
   /* Address at which shared object is loaded. */
-  void* dli_fbase;
+  void* _Nullable dli_fbase;
   /* Name of nearest symbol with address lower than addr. */
-  const char* dli_sname;
+  const char* _Nullable dli_sname;
   /* Exact address of symbol named in dli_sname. */
-  void* dli_saddr;
+  void* _Nullable dli_saddr;
 } Dl_info;
 
-void* dlopen(const char* __filename, int __flag);
-int dlclose(void* __handle);
-char* dlerror(void);
-void* dlsym(void* __handle, const char* __symbol);
-void* dlvsym(void* __handle, const char* __symbol, const char* __version) __INTRODUCED_IN(24);
-int dladdr(const void* __addr, Dl_info* __info);
+void* _Nullable dlopen(const char* _Nullable __filename, int __flag);
+int dlclose(void* _Nonnull __handle);
+char* _Nullable dlerror(void);
+/* (RTLD_DEFAULT is null for LP64, but -1 for LP32) */
+void* _Nullable dlsym(void* __BIONIC_COMPLICATED_NULLNESS __handle, const char* _Nullable __symbol);
+/* (RTLD_DEFAULT is null for LP64, but -1 for LP32) */
+void* _Nullable dlvsym(void* __BIONIC_COMPLICATED_NULLNESS __handle, const char* _Nullable __symbol, const char* _Nullable __version) __INTRODUCED_IN(24);
+int dladdr(const void* _Nonnull __addr, Dl_info* _Nonnull __info);
 
 #define RTLD_LOCAL    0
 #define RTLD_LAZY     0x00001
diff --git a/libc/include/elf.h b/libc/include/elf.h
index 536b8c3..1dfc008 100644
--- a/libc/include/elf.h
+++ b/libc/include/elf.h
@@ -30,13 +30,12 @@
 
 #include <sys/cdefs.h>
 
-#include <bits/auxvec.h>
-#include <bits/elf_arm.h>
-#include <bits/elf_arm64.h>
-#include <bits/elf_x86.h>
-#include <bits/elf_x86_64.h>
 #include <linux/elf.h>
 #include <linux/elf-em.h>
+#undef EI_PAD
+
+#include <bits/auxvec.h>
+#include <bits/elf_common.h>
 
 /* http://www.sco.com/developers/gabi/latest/ch4.intro.html */
 typedef __u64 Elf32_Xword;
@@ -83,14 +82,6 @@
   Elf64_Word l_version;
   Elf64_Word l_flags;
 } Elf64_Lib;
-/* ElfW(Lib)::l_flags values. */
-#define LL_NONE 0x0
-#define LL_EXACT_MATCH 0x1
-#define LL_IGNORE_INT_VER 0x2
-#define LL_REQUIRE_MINOR 0x4
-#define LL_EXPORTS 0x8
-#define LL_DELAY_LOAD 0x10
-#define LL_DELTA 0x20
 
 typedef struct {
   Elf32_Xword m_value;
@@ -118,14 +109,6 @@
   Elf64_Half si_boundto;
   Elf64_Half si_flags;
 } Elf64_Syminfo;
-/* ElfW(Syminfo)::si_boundto values. */
-#define SYMINFO_BT_SELF 0xffff
-#define SYMINFO_BT_PARENT 0xfffe
-/* ElfW(Syminfo)::si_flags values. */
-#define SYMINFO_FLG_DIRECT 0x1
-#define SYMINFO_FLG_PASSTHRU 0x2
-#define SYMINFO_FLG_COPY 0x4
-#define SYMINFO_FLG_LAZYLOAD 0x8
 
 typedef Elf32_Half Elf32_Versym;
 typedef Elf64_Half Elf64_Versym;
@@ -197,24 +180,12 @@
 typedef Elf64_Xword Elf64_Relr;
 
 /* http://www.sco.com/developers/gabi/latest/ch5.dynamic.html */
-#define DF_ORIGIN     0x00000001
-#define DF_SYMBOLIC   0x00000002
-#define DF_TEXTREL    0x00000004
-#define DF_BIND_NOW   0x00000008
-#define DF_STATIC_TLS 0x00000010
 
 #define DF_1_NOW        0x00000001 /* Perform complete relocation processing. */
-#define DF_1_GLOBAL     0x00000002 /* implies RTLD_GLOBAL */
 #define DF_1_GROUP      0x00000004
-#define DF_1_NODELETE   0x00000008 /* implies RTLD_NODELETE */
-#define DF_1_LOADFLTR   0x00000010
 #define DF_1_INITFIRST  0x00000020
-#define DF_1_NOOPEN     0x00000040 /* Object can not be used with dlopen(3) */
-#define DF_1_ORIGIN     0x00000080
 #define DF_1_DIRECT     0x00000100
 #define DF_1_TRANS      0x00000200
-#define DF_1_INTERPOSE  0x00000400
-#define DF_1_NODEFLIB   0x00000800
 #define DF_1_NODUMP     0x00001000 /* Object cannot be dumped with dldump(3) */
 #define DF_1_CONFALT    0x00002000
 #define DF_1_ENDFILTEE  0x00004000
@@ -230,58 +201,10 @@
 #define DF_1_GLOBAUDIT  0x01000000
 #define DF_1_SINGLETON  0x02000000
 #define DF_1_STUB       0x04000000
-#define DF_1_PIE        0x08000000
-
-/* http://www.sco.com/developers/gabi/latest/ch5.dynamic.html */
-#define DT_BIND_NOW 24
-#define DT_INIT_ARRAY 25
-#define DT_FINI_ARRAY 26
-#define DT_INIT_ARRAYSZ 27
-#define DT_FINI_ARRAYSZ 28
-#define DT_RUNPATH 29
-#define DT_FLAGS 30
-/* glibc and BSD disagree for DT_ENCODING; glibc looks wrong. */
-#define DT_PREINIT_ARRAY 32
-#define DT_PREINIT_ARRAYSZ 33
-#define DT_RELRSZ 35
-#define DT_RELR 36
-#define DT_RELRENT 37
-
-#define DT_GNU_HASH 0x6ffffef5
-#define DT_TLSDESC_PLT 0x6ffffef6
-#define DT_TLSDESC_GOT 0x6ffffef7
-
-/* http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
-#define EI_ABIVERSION 8
-#undef EI_PAD
-#define EI_PAD 9
-
-/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html */
-#define ELFCOMPRESS_ZLIB 1
-#define ELFCOMPRESS_LOOS 0x60000000
-#define ELFCOMPRESS_HIOS 0x6fffffff
-#define ELFCOMPRESS_LOPROC 0x70000000
-#define ELFCOMPRESS_HIPROC 0x7fffffff
 
 /* http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
 #define ELFOSABI_SYSV 0 /* Synonym for ELFOSABI_NONE used by valgrind. */
-#define ELFOSABI_HPUX 1
-#define ELFOSABI_NETBSD 2
 #define ELFOSABI_GNU 3 /* Synonym for ELFOSABI_LINUX. */
-#define ELFOSABI_SOLARIS 6
-#define ELFOSABI_AIX 7
-#define ELFOSABI_IRIX 8
-#define ELFOSABI_FREEBSD 9
-#define ELFOSABI_TRU64 10
-#define ELFOSABI_MODESTO 11
-#define ELFOSABI_OPENBSD 12
-#define ELFOSABI_OPENVMS 13
-#define ELFOSABI_NSK 14
-#define ELFOSABI_AROS 15
-#define ELFOSABI_FENIXOS 16
-#define ELFOSABI_CLOUDABI 17
-#define ELFOSABI_OPENVOS 18
-#define ELFOSABI_ARM_AEABI 64
 
 /* http://www.sco.com/developers/gabi/latest/ch4.reloc.html */
 #define ELF32_R_INFO(sym, type) ((((Elf32_Word)sym) << 8) | ((type) & 0xff))
@@ -294,234 +217,17 @@
 #define ELF32_ST_INFO(b,t) ELF_ST_INFO(b,t)
 #define ELF64_ST_INFO(b,t) ELF_ST_INFO(b,t)
 
-/* http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
-#define EM_S370 9
-#define EM_VPP500 17
-#define EM_960 19
-#define EM_V800 36
-#define EM_FR20 37
-#define EM_RH32 38
-#define EM_RCE 39
-#define EM_FAKE_ALPHA 41
-#define EM_TRICORE 44
-#define EM_ARC 45
-#define EM_H8_300H 47
-#define EM_H8S 48
-#define EM_H8_500 49
-#define EM_MIPS_X 51
-#define EM_COLDFIRE 52
-#define EM_68HC12 53
-#define EM_MMA 54
-#define EM_PCP 55
-#define EM_NCPU 56
-#define EM_NDR1 57
-#define EM_STARCORE 58
-#define EM_ME16 59
-#define EM_ST100 60
-#define EM_TINYJ 61
-#define EM_PDSP 63
-#define EM_PDP10 64
-#define EM_PDP11 65
-#define EM_FX66 66
-#define EM_ST9PLUS 67
-#define EM_ST7 68
-#define EM_68HC16 69
-#define EM_68HC11 70
-#define EM_68HC08 71
-#define EM_68HC05 72
-#define EM_SVX 73
-#define EM_ST19 74
-#define EM_VAX 75
-#define EM_JAVELIN 77
-#define EM_FIREPATH 78
-#define EM_ZSP 79
-#define EM_MMIX 80
-#define EM_HUANY 81
-#define EM_PRISM 82
-#define EM_AVR 83
-#define EM_FR30 84
-#define EM_D10V 85
-#define EM_D30V 86
-#define EM_V850 87
-#define EM_MN10200 90
-#define EM_PJ 91
-#define EM_ARC_COMPACT 93
-#define EM_XTENSA 94
-#define EM_VIDEOCORE 95
-#define EM_TMM_GPP 96
-#define EM_NS32K 97
-#define EM_TPC 98
-#define EM_SNP1K 99
-#define EM_ST200 100
-#define EM_IP2K 101
-#define EM_MAX 102
-#define EM_CR 103
-#define EM_F2MC16 104
-#define EM_MSP430 105
-#define EM_SE_C33 107
-#define EM_SEP 108
-#define EM_ARCA 109
-#define EM_UNICORE 110
-#define EM_EXCESS 111
-#define EM_DXP 112
-#define EM_CRX 114
-#define EM_XGATE 115
-#define EM_C166 116
-#define EM_M16C 117
-#define EM_DSPIC30F 118
-#define EM_CE 119
-#define EM_M32C 120
-#define EM_TSK3000 131
-#define EM_RS08 132
-#define EM_SHARC 133
-#define EM_ECOG2 134
-#define EM_SCORE7 135
-#define EM_DSP24 136
-#define EM_VIDEOCORE3 137
-#define EM_LATTICEMICO32 138
-#define EM_SE_C17 139
-#define EM_TI_C2000 141
-#define EM_TI_C5500 142
-#define EM_MMDSP_PLUS 160
-#define EM_CYPRESS_M8C 161
-#define EM_R32C 162
-#define EM_TRIMEDIA 163
-#define EM_QDSP6 164
-#define EM_8051 165
-#define EM_STXP7X 166
-#define EM_NDS32 167
-#define EM_ECOG1 168
-#define EM_ECOG1X 168
-#define EM_MAXQ30 169
-#define EM_XIMO16 170
-#define EM_MANIK 171
-#define EM_CRAYNV2 172
-#define EM_RX 173
-#define EM_METAG 174
-#define EM_MCST_ELBRUS 175
-#define EM_ECOG16 176
-#define EM_CR16 177
-#define EM_ETPU 178
-#define EM_SLE9X 179
-#define EM_L10M 180
-#define EM_K10M 181
-#define EM_AVR32 185
-#define EM_STM8 186
-#define EM_TILE64 187
-#define EM_CUDA 190
-#define EM_CLOUDSHIELD 192
-#define EM_COREA_1ST 193
-#define EM_COREA_2ND 194
-#define EM_ARC_COMPACT2 195
-#define EM_OPEN8 196
-#define EM_RL78 197
-#define EM_VIDEOCORE5 198
-#define EM_78KOR 199
-#define EM_56800EX 200
-#define EM_BA1 201
-#define EM_BA2 202
-#define EM_XCORE 203
-#define EM_MCHP_PIC 204
-#define EM_INTEL205 205
-#define EM_INTEL206 206
-#define EM_INTEL207 207
-#define EM_INTEL208 208
-#define EM_INTEL209 209
-#define EM_KM32 210
-#define EM_KMX32 211
-#define EM_KMX16 212
-#define EM_KMX8 213
-#define EM_KVARC 214
-#define EM_CDP 215
-#define EM_COGE 216
-#define EM_COOL 217
-#define EM_NORC 218
-#define EM_CSR_KALIMBA 219
-#define EM_Z80 220
-#define EM_VISIUM 221
-#define EM_FT32 222
-#define EM_MOXIE 223
-#define EM_AMDGPU 224
-#define EM_RISCV 243
-
-/* http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
-#define ET_LOOS 0xfe00
-#define ET_HIOS 0xfeff
-
 /* http://www.sco.com/developers/gabi/latest/ch4.sheader.html */
-#define GRP_COMDAT 0x1
 #define GRP_MASKOS   0x0ff00000
 #define GRP_MASKPROC 0xf0000000
 
-/* http://www.sco.com/developers/gabi/latest/ch5.pheader.html */
-#define PF_X 0x1
-#define PF_W 0x2
-#define PF_R 0x4
-#define PF_MASKOS   0x0ff00000
-#define PF_MASKPROC 0xf0000000
-
-#define STB_LOOS 10
-#define STB_HIOS 12
-#define STB_LOPROC 13
-#define STB_HIPROC 15
-
 /* http://www.sco.com/developers/gabi/latest/ch4.sheader.html */
-#define SHF_MERGE 0x10
-#define SHF_STRINGS 0x20
-#define SHF_INFO_LINK 0x40
-#define SHF_LINK_ORDER 0x80
-#define SHF_OS_NONCONFORMING 0x100
-#define SHF_GROUP 0x200
-#define SHF_TLS 0x400
-#define SHF_COMPRESSED 0x800
-#define SHF_MASKOS 0x0ff00000
-#define SHF_MASKPROC 0xf0000000
-
-/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html */
-#define SHN_LOOS 0xff20
-#define SHN_HIOS 0xff3f
-#define SHN_XINDEX 0xffff
-
-/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html */
-#define SHT_INIT_ARRAY 14
-#define SHT_FINI_ARRAY 15
-#define SHT_PREINIT_ARRAY 16
-#define SHT_GROUP 17
-#define SHT_SYMTAB_SHNDX 18
+/*
+ * Standard replacement for SHT_ANDROID_RELR.
+ */
 #define SHT_RELR 19
 #undef SHT_NUM
 #define SHT_NUM 20
-#define SHT_LOOS 0x60000000
-#define SHT_HIOS 0x6fffffff
-
-/* http://www.sco.com/developers/gabi/latest/ch4.symtab.html */
-#define STN_UNDEF 0
-
-/* http://www.sco.com/developers/gabi/latest/ch4.symtab.html */
-#define STT_GNU_IFUNC 10
-#define STT_LOOS 10
-#define STT_HIOS 12
-#define STT_LOPROC 13
-#define STT_HIPROC 15
-
-/* http://www.sco.com/developers/gabi/latest/ch4.symtab.html */
-#define STV_DEFAULT 0
-#define STV_INTERNAL 1
-#define STV_HIDDEN 2
-#define STV_PROTECTED 3
-
-/* The kernel uses NT_PRFPREG but glibc also offers NT_FPREGSET */
-#define NT_FPREGSET NT_PRFPREG
-
-#define ELF_NOTE_GNU "GNU"
-
-#define NT_GNU_BUILD_ID 3
-
-#define VER_FLG_BASE 0x1
-#define VER_FLG_WEAK 0x2
-
-#define VER_NDX_LOCAL 0
-#define VER_NDX_GLOBAL 1
 
 /*
  * Experimental support for SHT_RELR sections. For details, see proposal
@@ -551,3 +257,13 @@
 #define DT_ANDROID_RELSZ 0x60000010 // DT_LOOS + 3
 #define DT_ANDROID_RELA 0x60000011 // DT_LOOS + 4
 #define DT_ANDROID_RELASZ 0x60000012 // DT_LOOS + 5
+
+/* Linux traditionally doesn't have the trailing 64 that BSD has on these. */
+#define R_AARCH64_TLS_DTPREL R_AARCH64_TLS_DTPREL64
+#define R_AARCH64_TLS_DTPMOD R_AARCH64_TLS_DTPMOD64
+#define R_AARCH64_TLS_TPREL R_AARCH64_TLS_TPREL64
+
+/* TODO: upstream these to FreeBSD? */
+#define R_ARM_TLS_DESC 13
+#define R_ARM_IRELATIVE 160
+#define R_X86_64_JUMP_SLOT 7
diff --git a/libc/include/err.h b/libc/include/err.h
index e91dac9..af44514 100644
--- a/libc/include/err.h
+++ b/libc/include/err.h
@@ -50,7 +50,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-__noreturn void err(int __status, const char* __fmt, ...) __printflike(2, 3);
+__noreturn void err(int __status, const char* _Nullable __fmt, ...) __printflike(2, 3);
 
 /**
  * [verr(3)](http://man7.org/linux/man-pages/man3/verr.3.html) outputs the program name,
@@ -60,7 +60,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-__noreturn void verr(int __status, const char* __fmt, va_list __args) __printflike(2, 0);
+__noreturn void verr(int __status, const char* _Nullable __fmt, va_list __args) __printflike(2, 0);
 
 /**
  * [errx(3)](http://man7.org/linux/man-pages/man3/errx.3.html) outputs the program name, and
@@ -70,7 +70,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-__noreturn void errx(int __status, const char* __fmt, ...) __printflike(2, 3);
+__noreturn void errx(int __status, const char* _Nullable __fmt, ...) __printflike(2, 3);
 
 /**
  * [verrx(3)](http://man7.org/linux/man-pages/man3/err.3.html) outputs the program name, and
@@ -80,7 +80,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-__noreturn void verrx(int __status, const char* __fmt, va_list __args) __printflike(2, 0);
+__noreturn void verrx(int __status, const char* _Nullable __fmt, va_list __args) __printflike(2, 0);
 
 /**
  * [warn(3)](http://man7.org/linux/man-pages/man3/warn.3.html) outputs the program name,
@@ -88,7 +88,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-void warn(const char* __fmt, ...) __printflike(1, 2);
+void warn(const char* _Nullable __fmt, ...) __printflike(1, 2);
 
 /**
  * [vwarn(3)](http://man7.org/linux/man-pages/man3/vwarn.3.html) outputs the program name,
@@ -96,7 +96,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-void vwarn(const char* __fmt, va_list __args) __printflike(1, 0);
+void vwarn(const char* _Nullable __fmt, va_list __args) __printflike(1, 0);
 
 /**
  * [warnx(3)](http://man7.org/linux/man-pages/man3/warnx.3.html) outputs the program name, and
@@ -104,7 +104,7 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-void warnx(const char* __fmt, ...) __printflike(1, 2);
+void warnx(const char* _Nullable __fmt, ...) __printflike(1, 2);
 
 /**
  * [vwarnx(3)](http://man7.org/linux/man-pages/man3/warn.3.html) outputs the program name, and
@@ -112,6 +112,6 @@
  *
  * New code should consider error() in `<error.h>`.
  */
-void vwarnx(const char* __fmt, va_list __args) __printflike(1, 0);
+void vwarnx(const char* _Nullable __fmt, va_list __args) __printflike(1, 0);
 
 __END_DECLS
diff --git a/libc/include/errno.h b/libc/include/errno.h
index b6a4c7e..12ebdf7 100644
--- a/libc/include/errno.h
+++ b/libc/include/errno.h
@@ -49,7 +49,7 @@
  *
  * @private
  */
-int* __errno(void) __attribute_const__;
+int* _Nonnull __errno(void) __attribute_const__;
 
 /**
  * [errno(3)](http://man7.org/linux/man-pages/man3/errno.3.html) is the last error on the calling
@@ -58,5 +58,3 @@
 #define errno (*__errno())
 
 __END_DECLS
-
-#include <android/legacy_errno_inlines.h>
diff --git a/libc/include/error.h b/libc/include/error.h
index 036a831..187ee17 100644
--- a/libc/include/error.h
+++ b/libc/include/error.h
@@ -44,7 +44,7 @@
  *
  * Available since API level 23.
  */
-extern void (*error_print_progname)(void) __INTRODUCED_IN(23);
+extern void (* _Nullable error_print_progname)(void) __INTRODUCED_IN(23);
 
 /**
  * [error_message_count(3)](http://man7.org/linux/man-pages/man3/error_message_count.3.html) is
@@ -70,7 +70,7 @@
  *
  * Available since API level 23.
  */
-void error(int __status, int __errno, const char* __fmt, ...) __printflike(3, 4) __INTRODUCED_IN(23);
+void error(int __status, int __errno, const char* _Nonnull __fmt, ...) __printflike(3, 4) __INTRODUCED_IN(23);
 
 /**
  * [error_at_line(3)](http://man7.org/linux/man-pages/man3/error_at_line.3.html) formats the given
@@ -80,6 +80,6 @@
  *
  * Available since API level 23.
  */
-void error_at_line(int __status, int __errno, const char* __filename, unsigned int __line_number, const char* __fmt, ...) __printflike(5, 6) __INTRODUCED_IN(23);
+void error_at_line(int __status, int __errno, const char* _Nonnull __filename, unsigned int __line_number, const char* _Nonnull __fmt, ...) __printflike(5, 6) __INTRODUCED_IN(23);
 
 __END_DECLS
diff --git a/libc/include/execinfo.h b/libc/include/execinfo.h
index 347ae92..88f4ae7 100644
--- a/libc/include/execinfo.h
+++ b/libc/include/execinfo.h
@@ -47,7 +47,7 @@
  *
  * Available since API level 33.
  */
-int backtrace(void** buffer, int size) __INTRODUCED_IN(33);
+int backtrace(void* _Nonnull * _Nonnull buffer, int size) __INTRODUCED_IN(33);
 
 /**
  * [backtrace_symbols(3)](https://man7.org/linux/man-pages/man3/backtrace_symbols.3.html)
@@ -59,7 +59,7 @@
  *
  * Available since API level 33.
  */
-char** backtrace_symbols(void* const* buffer, int size) __INTRODUCED_IN(33);
+char* _Nullable * _Nullable backtrace_symbols(void* _Nonnull const* _Nonnull buffer, int size) __INTRODUCED_IN(33);
 
 /**
  * [backtrace_symbols_fd(3)](https://man7.org/linux/man-pages/man3/backtrace_symbols_fd.3.html)
@@ -69,6 +69,6 @@
  *
  * Available since API level 33.
  */
-void backtrace_symbols_fd(void* const* buffer, int size, int fd) __INTRODUCED_IN(33);
+void backtrace_symbols_fd(void* _Nonnull const* _Nonnull buffer, int size, int fd) __INTRODUCED_IN(33);
 
 __END_DECLS
diff --git a/libc/include/fcntl.h b/libc/include/fcntl.h
index 1ea94e6..a8db387 100644
--- a/libc/include/fcntl.h
+++ b/libc/include/fcntl.h
@@ -84,7 +84,6 @@
 /** Flag for open(). */
 #define O_RSYNC O_SYNC
 
-#if __ANDROID_API__ >= 21
 /** Flag for splice(). */
 #define SPLICE_F_MOVE 1
 /** Flag for splice(). */
@@ -93,7 +92,6 @@
 #define SPLICE_F_MORE 4
 /** Flag for splice(). */
 #define SPLICE_F_GIFT 8
-#endif
 
 #if __ANDROID_API__ >= 26
 /** Flag for sync_file_range(). */
@@ -111,9 +109,9 @@
  * Returns a new file descriptor on success and returns -1 and sets `errno` on
  * failure.
  */
-int creat(const char* __path, mode_t __mode);
+int creat(const char* _Nonnull __path, mode_t __mode);
 /** See creat(). */
-int creat64(const char* __path, mode_t __mode) __INTRODUCED_IN(21);
+int creat64(const char* _Nonnull __path, mode_t __mode) __INTRODUCED_IN(21);
 
 /**
  * [openat(2)](http://man7.org/linux/man-pages/man2/openat.2.html)
@@ -122,9 +120,9 @@
  * Returns a new file descriptor on success and returns -1 and sets `errno` on
  * failure.
  */
-int openat(int __dir_fd, const char* __path, int __flags, ...);
+int openat(int __dir_fd, const char* _Nonnull __path, int __flags, ...);
 /** See openat(). */
-int openat64(int __dir_fd, const char* __path, int __flags, ...) __INTRODUCED_IN(21);
+int openat64(int __dir_fd, const char* _Nonnull __path, int __flags, ...) __INTRODUCED_IN(21);
 
 /**
  * [open(2)](http://man7.org/linux/man-pages/man2/open.2.html)
@@ -133,9 +131,9 @@
  * Returns a new file descriptor on success and returns -1 and sets `errno` on
  * failure.
  */
-int open(const char* __path, int __flags, ...);
+int open(const char* _Nonnull __path, int __flags, ...);
 /** See open(). */
-int open64(const char* __path, int __flags, ...) __INTRODUCED_IN(21);
+int open64(const char* _Nonnull __path, int __flags, ...) __INTRODUCED_IN(21);
 
 /**
  * [splice(2)](http://man7.org/linux/man-pages/man2/splice.2.html)
@@ -149,7 +147,7 @@
  *
  * Available since API level 21.
  */
-ssize_t splice(int __in_fd, off64_t* __in_offset, int __out_fd, off64_t* __out_offset, size_t __length, unsigned int __flags) __INTRODUCED_IN(21);
+ssize_t splice(int __in_fd, off64_t* __BIONIC_COMPLICATED_NULLNESS __in_offset, int __out_fd, off64_t* __BIONIC_COMPLICATED_NULLNESS __out_offset, size_t __length, unsigned int __flags) __INTRODUCED_IN(21);
 
 /**
  * [tee(2)](http://man7.org/linux/man-pages/man2/tee.2.html)
@@ -177,7 +175,7 @@
  *
  * Available since API level 21.
  */
-ssize_t vmsplice(int __fd, const struct iovec* __iov, size_t __count, unsigned int __flags) __INTRODUCED_IN(21);
+ssize_t vmsplice(int __fd, const struct iovec* _Nonnull __iov, size_t __count, unsigned int __flags) __INTRODUCED_IN(21);
 
 /**
  * [fallocate(2)](http://man7.org/linux/man-pages/man2/fallocate.2.html)
diff --git a/libc/include/fenv.h b/libc/include/fenv.h
index 7b775b6..6e8ea57 100644
--- a/libc/include/fenv.h
+++ b/libc/include/fenv.h
@@ -35,34 +35,31 @@
 #include <bits/fenv_arm.h>
 #elif defined(__i386__)
 #include <bits/fenv_x86.h>
+#elif defined(__riscv)
+#include <bits/fenv_riscv64.h>
 #elif defined(__x86_64__)
 #include <bits/fenv_x86_64.h>
 #endif
 
 __BEGIN_DECLS
 
-// fenv was always available on x86.
-#if __ANDROID_API__ >= 21 || defined(__i386__)
 int feclearexcept(int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-int fegetexceptflag(fexcept_t* __flag_ptr, int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int fegetexceptflag(fexcept_t* _Nonnull __flag_ptr, int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 int feraiseexcept(int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-int fesetexceptflag(const fexcept_t* __flag_ptr, int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int fesetexceptflag(const fexcept_t* _Nonnull __flag_ptr, int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 int fetestexcept(int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 
 int fegetround(void) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 int fesetround(int __rounding_mode) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 
-int fegetenv(fenv_t* __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-int feholdexcept(fenv_t* __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-int fesetenv(const fenv_t* __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-int feupdateenv(const fenv_t* __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int fegetenv(fenv_t* _Nonnull __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int feholdexcept(fenv_t* _Nonnull __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int fesetenv(const fenv_t* _Nonnull __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
+int feupdateenv(const fenv_t* _Nonnull __env) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 
 int feenableexcept(int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 int fedisableexcept(int __exceptions) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
 int fegetexcept(void) __INTRODUCED_IN_ARM(21) __INTRODUCED_IN_X86(9);
-#else
-/* Defined as inlines for pre-21 ARM. */
-#endif
 
 /*
  * The following constant represents the default floating-point environment
@@ -76,7 +73,3 @@
 #define FE_DFL_ENV (&__fe_dfl_env)
 
 __END_DECLS
-
-#if defined(__arm__)
-#include <android/legacy_fenv_inlines_arm.h>
-#endif
diff --git a/libc/include/fts.h b/libc/include/fts.h
index 7e63111..bae2615 100644
--- a/libc/include/fts.h
+++ b/libc/include/fts.h
@@ -39,15 +39,15 @@
 #include <sys/types.h>
 
 typedef struct {
-	struct _ftsent *fts_cur;	/* current node */
-	struct _ftsent *fts_child;	/* linked list of children */
-	struct _ftsent **fts_array;	/* sort array */
+	struct _ftsent * _Nullable fts_cur;	/* current node */
+	struct _ftsent * _Nullable fts_child;	/* linked list of children */
+	struct _ftsent * _Nullable * _Nullable fts_array;	/* sort array */
 	dev_t fts_dev;			/* starting device # */
-	char *fts_path;			/* path for this descent */
+	char * _Nullable fts_path;			/* path for this descent */
 	int fts_rfd;			/* fd for root */
 	size_t fts_pathlen;		/* sizeof(path) */
 	int fts_nitems;			/* elements in the sort array */
-	int (*fts_compar)();		/* compare function */
+	int (* _Nullable fts_compar)();		/* compare function */
 
 #define	FTS_COMFOLLOW	0x0001		/* follow command line symlinks */
 #define	FTS_LOGICAL	0x0002		/* logical walk */
@@ -65,13 +65,13 @@
 } FTS;
 
 typedef struct _ftsent {
-	struct _ftsent *fts_cycle;	/* cycle node */
-	struct _ftsent *fts_parent;	/* parent directory */
-	struct _ftsent *fts_link;	/* next file in directory */
+	struct _ftsent * _Nullable fts_cycle;	/* cycle node */
+	struct _ftsent * _Nullable fts_parent;	/* parent directory */
+	struct _ftsent * _Nullable fts_link;	/* next file in directory */
 	long fts_number;	        /* local numeric value */
-	void *fts_pointer;	        /* local address value */
-	char *fts_accpath;		/* access path */
-	char *fts_path;			/* root path */
+	void * _Nullable fts_pointer;	        /* local address value */
+	char * _Nullable fts_accpath;		/* access path */
+	char * _Nullable fts_path;			/* root path */
 	int fts_errno;			/* errno for this node */
 	int fts_symfd;			/* fd for symlink */
 	size_t fts_pathlen;		/* strlen(fts_path) */
@@ -111,7 +111,7 @@
 #define	FTS_SKIP	 4		/* discard node */
 	unsigned short fts_instr;	/* fts_set() instructions */
 
-	struct stat *fts_statp;		/* stat(2) information */
+	struct stat * _Nullable fts_statp;		/* stat(2) information */
 	char fts_name[1];		/* file name */
 } FTSENT;
 
@@ -122,11 +122,11 @@
  * breakage in 21 that means you can't write code that runs on current devices and pre-21 devices,
  * so we break the tie in favor of current and future devices.
  */
-FTSENT* fts_children(FTS* __fts, int __options) __INTRODUCED_IN(21);
-int fts_close(FTS* __fts) __INTRODUCED_IN(21);
-FTS* fts_open(char* const* __path, int __options, int (*__comparator)(const FTSENT** __lhs, const FTSENT** __rhs)) __INTRODUCED_IN(21);
-FTSENT* fts_read(FTS* __fts) __INTRODUCED_IN(21);
-int fts_set(FTS* __fts, FTSENT* __entry, int __options) __INTRODUCED_IN(21);
+FTSENT* _Nullable fts_children(FTS* _Nonnull __fts, int __options) __INTRODUCED_IN(21);
+int fts_close(FTS* _Nonnull __fts) __INTRODUCED_IN(21);
+FTS* _Nullable fts_open(char* _Nonnull const* _Nonnull __path, int __options, int (* _Nullable __comparator)(const FTSENT* _Nonnull * _Nonnull  __lhs, const FTSENT* _Nonnull * _Nonnull __rhs)) __INTRODUCED_IN(21);
+FTSENT* _Nullable fts_read(FTS* _Nonnull __fts) __INTRODUCED_IN(21);
+int fts_set(FTS* _Nonnull __fts, FTSENT* _Nonnull __entry, int __options) __INTRODUCED_IN(21);
 
 __END_DECLS
 
diff --git a/libc/include/ftw.h b/libc/include/ftw.h
index a289643..c5fa4de 100644
--- a/libc/include/ftw.h
+++ b/libc/include/ftw.h
@@ -55,10 +55,10 @@
 };
 
 __BEGIN_DECLS
-int ftw(const char* __dir_path, int (*__callback)(const char*, const struct stat*, int), int __max_fd_count) __INTRODUCED_IN(17);
-int nftw(const char* __dir_path, int (*__callback)(const char*, const struct stat*, int, struct FTW*), int __max_fd_count, int __flags) __INTRODUCED_IN(17);
-int ftw64(const char* __dir_path, int (*__callback)(const char*, const struct stat64*, int), int __max_fd_count) __RENAME_STAT64(ftw, 17, 21);
-int nftw64(const char* __dir_path, int (*__callback)(const char*, const struct stat64*, int, struct FTW*), int __max_fd_count, int __flags) __RENAME_STAT64(nftw, 17, 21);
+int ftw(const char* _Nonnull __dir_path, int (* _Nonnull __callback)(const char* _Nonnull, const struct stat* _Nonnull, int), int __max_fd_count) __INTRODUCED_IN(17);
+int nftw(const char* _Nonnull __dir_path, int (* _Nonnull __callback)(const char* _Nonnull, const struct stat* _Nonnull, int, struct FTW* _Nonnull), int __max_fd_count, int __flags) __INTRODUCED_IN(17);
+int ftw64(const char* _Nonnull __dir_path, int (* _Nonnull __callback)(const char* _Nonnull, const struct stat64* _Nonnull, int), int __max_fd_count) __RENAME_STAT64(ftw, 17, 21);
+int nftw64(const char* _Nonnull __dir_path, int (* _Nonnull __callback)(const char* _Nonnull, const struct stat64* _Nonnull, int, struct FTW* _Nonnull), int __max_fd_count, int __flags) __RENAME_STAT64(nftw, 17, 21);
 __END_DECLS
 
 #endif
diff --git a/libc/include/getopt.h b/libc/include/getopt.h
index 014226a..c1c0442 100644
--- a/libc/include/getopt.h
+++ b/libc/include/getopt.h
@@ -49,8 +49,11 @@
 #define optional_argument 2
 
 struct option {
-  /** Name of long option. */
-  const char *name;
+  /**
+   * Name of long option. Options must have a non-NULL name.
+   * A NULL name signals the end of the options array.
+   */
+  const char * _Nullable name;
 
   /**
    * One of `no_argument`, `required_argument`, or `optional_argument`.
@@ -58,7 +61,7 @@
   int has_arg;
 
   /** If not NULL, set `*flag` to val when option found. */
-  int* flag;
+  int* _Nullable flag;
 
   /** If `flag` not NULL, the value to assign to `*flag`; otherwise the return value. */
   int val;
@@ -69,12 +72,12 @@
 /**
  * [getopt_long(3)](http://man7.org/linux/man-pages/man3/getopt.3.html) parses command-line options.
  */
-int getopt_long(int __argc, char* const* __argv, const char* __options, const struct option* __long_options, int* __long_index);
+int getopt_long(int __argc, char* _Nonnull const* _Nonnull __argv, const char* _Nonnull __options, const struct option* _Nonnull __long_options, int* _Nullable __long_index);
 
 /**
  * [getopt_long_only(3)](http://man7.org/linux/man-pages/man3/getopt.3.html) parses command-line options.
  */
-int getopt_long_only(int __argc, char* const* __argv, const char* __options, const struct option* __long_options, int* __long_index);
+int getopt_long_only(int __argc, char* _Nonnull const* _Nonnull __argv, const char* _Nonnull __options, const struct option* _Nonnull __long_options, int* _Nullable __long_index);
 
 #ifndef _OPTRESET_DECLARED
 #define _OPTRESET_DECLARED
diff --git a/libc/include/glob.h b/libc/include/glob.h
index 0ba2848..2c2b8d1 100644
--- a/libc/include/glob.h
+++ b/libc/include/glob.h
@@ -47,21 +47,23 @@
   size_t gl_matchc;	/* Count of paths matching pattern. */
   size_t gl_offs;		/* Reserved at beginning of gl_pathv. */
   int gl_flags;		/* Copy of flags parameter to glob. */
-  char** gl_pathv;	/* List of paths matching pattern. */
 
-  /* Copy of `__error_callback` parameter to glob. */
-  int (*gl_errfunc)(const char* __failure_path, int __failure_errno);
+  /** List of paths matching pattern. */
+  char* _Nullable * _Nullable gl_pathv;
 
-  /*
-   * Alternate filesystem access methods for glob; replacement
-   * versions of closedir(3), readdir(3), opendir(3), stat(2)
-   * and lstat(2).
-   */
-  void (*gl_closedir)(void*);
-  struct dirent* (*gl_readdir)(void*);
-  void* (*gl_opendir)(const char*);
-  int (*gl_lstat)(const char*, struct stat*);
-  int (*gl_stat)(const char*, struct stat*);
+  /** Copy of `__error_callback` parameter to glob. */
+  int (* _Nullable gl_errfunc)(const char* _Nonnull __failure_path, int __failure_errno);
+
+  /** Called instead of closedir() when GLOB_ALTDIRFUNC flag is specified. */
+  void (* _Nullable gl_closedir)(void* _Nonnull);
+  /** Called instead of readdir() when GLOB_ALTDIRFUNC flag is specified. */
+  struct dirent* _Nullable (* _Nonnull gl_readdir)(void* _Nonnull);
+  /** Called instead of opendir() when GLOB_ALTDIRFUNC flag is specified. */
+  void* _Nullable (* _Nonnull gl_opendir)(const char* _Nonnull);
+  /** Called instead of lstat() when GLOB_ALTDIRFUNC flag is specified. */
+  int (* _Nullable gl_lstat)(const char* _Nonnull, struct stat* _Nonnull);
+  /** Called instead of stat() when GLOB_ALTDIRFUNC flag is specified. */
+  int (* _Nullable gl_stat)(const char* _Nonnull, struct stat* _Nonnull);
 } glob_t;
 
 /* Believed to have been introduced in 1003.2-1992 */
@@ -90,8 +92,8 @@
 
 __BEGIN_DECLS
 
-int glob(const char* __pattern, int __flags, int (*__error_callback)(const char* __failure_path, int __failure_errno), glob_t* __result_ptr) __INTRODUCED_IN(28);
-void globfree(glob_t* __result_ptr) __INTRODUCED_IN(28);
+int glob(const char* _Nonnull __pattern, int __flags, int (* _Nullable __error_callback)(const char* _Nonnull __failure_path, int __failure_errno), glob_t* _Nonnull __result_ptr) __INTRODUCED_IN(28);
+void globfree(glob_t* _Nonnull __result_ptr) __INTRODUCED_IN(28);
 
 __END_DECLS
 
diff --git a/libc/include/grp.h b/libc/include/grp.h
index 9d67adf..2451db5 100644
--- a/libc/include/grp.h
+++ b/libc/include/grp.h
@@ -39,26 +39,26 @@
 #include <sys/types.h>
 
 struct group {
-  char* gr_name; /* group name */
-  char* gr_passwd; /* group password */
+  char* _Nullable gr_name; /* group name */
+  char* _Nullable gr_passwd; /* group password */
   gid_t gr_gid; /* group id */
-  char** gr_mem; /* group members */
+  char* _Nullable * _Nullable gr_mem; /* group members */
 };
 
 __BEGIN_DECLS
 
-struct group* getgrgid(gid_t __gid);
-struct group* getgrnam(const char* __name);
+struct group* _Nullable getgrgid(gid_t __gid);
+struct group* _Nullable getgrnam(const char* _Nonnull __name);
 
 /* Note: Android has thousands and thousands of ids to iterate through. */
-struct group* getgrent(void) __INTRODUCED_IN(26);
+struct group* _Nullable getgrent(void) __INTRODUCED_IN(26);
 
 void setgrent(void) __INTRODUCED_IN(26);
 void endgrent(void) __INTRODUCED_IN(26);
-int getgrgid_r(gid_t __gid, struct group* __group, char* __buf, size_t __n, struct group** __result) __INTRODUCED_IN(24);
-int getgrnam_r(const char* __name, struct group* __group, char* __buf, size_t __n, struct group** __result) __INTRODUCED_IN(24);
-int getgrouplist(const char* __user, gid_t __group, gid_t* __groups, int* __group_count);
-int initgroups(const char* __user, gid_t __group);
+int getgrgid_r(gid_t __gid, struct group* __BIONIC_COMPLICATED_NULLNESS __group, char* _Nonnull __buf, size_t __n, struct group* _Nullable * _Nonnull __result) __INTRODUCED_IN(24);
+int getgrnam_r(const char* _Nonnull __name, struct group* __BIONIC_COMPLICATED_NULLNESS __group, char* _Nonnull __buf, size_t __n, struct group* _Nullable *_Nonnull __result) __INTRODUCED_IN(24);
+int getgrouplist(const char* _Nonnull __user, gid_t __group, gid_t* __BIONIC_COMPLICATED_NULLNESS __groups, int* _Nonnull __group_count);
+int initgroups(const char* _Nonnull __user, gid_t __group);
 
 __END_DECLS
 
diff --git a/libc/include/iconv.h b/libc/include/iconv.h
index ec4bdea..7cf36dc 100644
--- a/libc/include/iconv.h
+++ b/libc/include/iconv.h
@@ -54,7 +54,7 @@
  *
  * Available since API level 28.
  */
-iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding) __INTRODUCED_IN(28);
+iconv_t _Nonnull iconv_open(const char* _Nonnull __src_encoding, const char* _Nonnull __dst_encoding) __INTRODUCED_IN(28);
 
 /**
  * [iconv(3)](http://man7.org/linux/man-pages/man3/iconv.3.html) converts characters from one
@@ -68,7 +68,7 @@
  *
  * Available since API level 28.
  */
-size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, char** __dst_buf, size_t* __dst_bytes_left) __INTRODUCED_IN(28);
+size_t iconv(iconv_t _Nonnull __converter, char* _Nullable * _Nullable __src_buf, size_t* __BIONIC_COMPLICATED_NULLNESS __src_bytes_left, char* _Nullable * _Nullable __dst_buf, size_t* __BIONIC_COMPLICATED_NULLNESS __dst_bytes_left) __INTRODUCED_IN(28);
 
 /**
  * [iconv_close(3)](http://man7.org/linux/man-pages/man3/iconv_close.3.html) deallocates a converter
@@ -78,6 +78,6 @@
  *
  * Available since API level 28.
  */
-int iconv_close(iconv_t __converter) __INTRODUCED_IN(28);
+int iconv_close(iconv_t _Nonnull __converter) __INTRODUCED_IN(28);
 
 __END_DECLS
diff --git a/libc/include/ifaddrs.h b/libc/include/ifaddrs.h
index 9eaabbd..7c0dcbf 100644
--- a/libc/include/ifaddrs.h
+++ b/libc/include/ifaddrs.h
@@ -44,26 +44,26 @@
  */
 struct ifaddrs {
   /** Pointer to the next element in the linked list. */
-  struct ifaddrs* ifa_next;
+  struct ifaddrs* _Nullable ifa_next;
 
   /** Interface name. */
-  char* ifa_name;
+  char* _Nullable ifa_name;
   /** Interface flags (like `SIOCGIFFLAGS`). */
   unsigned int ifa_flags;
   /** Interface address. */
-  struct sockaddr* ifa_addr;
+  struct sockaddr* _Nullable ifa_addr;
   /** Interface netmask. */
-  struct sockaddr* ifa_netmask;
+  struct sockaddr* _Nullable ifa_netmask;
 
   union {
     /** Interface broadcast address (if IFF_BROADCAST is set). */
-    struct sockaddr* ifu_broadaddr;
+    struct sockaddr* _Nullable ifu_broadaddr;
     /** Interface destination address (if IFF_POINTOPOINT is set). */
-    struct sockaddr* ifu_dstaddr;
+    struct sockaddr* _Nullable ifu_dstaddr;
   } ifa_ifu;
 
   /** Unused. */
-  void* ifa_data;
+  void* _Nullable ifa_data;
 };
 
 /** Synonym for `ifa_ifu.ifu_broadaddr` in `struct ifaddrs`. */
@@ -80,7 +80,7 @@
  *
  * Available since API level 24.
  */
-int getifaddrs(struct ifaddrs** __list_ptr) __INTRODUCED_IN(24);
+int getifaddrs(struct ifaddrs* _Nullable * _Nonnull __list_ptr) __INTRODUCED_IN(24);
 
 /**
  * [freeifaddrs(3)](http://man7.org/linux/man-pages/man3/freeifaddrs.3.html) frees a linked list
@@ -88,6 +88,6 @@
  *
  * Available since API level 24.
  */
-void freeifaddrs(struct ifaddrs* __ptr) __INTRODUCED_IN(24);
+void freeifaddrs(struct ifaddrs* _Nullable __ptr) __INTRODUCED_IN(24);
 
 __END_DECLS
diff --git a/libc/include/inttypes.h b/libc/include/inttypes.h
index 7a409d8..76aee38 100644
--- a/libc/include/inttypes.h
+++ b/libc/include/inttypes.h
@@ -85,6 +85,42 @@
 #define	PRIiPTR			__PRI_PTR_prefix"i"		/* intptr_t */
 
 /* fprintf macros for unsigned integers */
+#define	PRIb8			"b"		/* int8_t */
+#define	PRIb16			"b"		/* int16_t */
+#define	PRIb32			"b"		/* int32_t */
+#define	PRIb64			__PRI_64_prefix"b"		/* int64_t */
+
+#define	PRIbLEAST8		"b"		/* int_least8_t */
+#define	PRIbLEAST16		"b"		/* int_least16_t */
+#define	PRIbLEAST32		"b"		/* int_least32_t */
+#define	PRIbLEAST64		__PRI_64_prefix"b"		/* int_least64_t */
+
+#define	PRIbFAST8		"b"		/* int_fast8_t */
+#define	PRIbFAST16		__PRI_FAST_prefix"b"	/* int_fast16_t */
+#define	PRIbFAST32		__PRI_FAST_prefix"b"	/* int_fast32_t */
+#define	PRIbFAST64		__PRI_64_prefix"b"		/* int_fast64_t */
+
+#define	PRIbMAX			"jb"		/* intmax_t */
+#define	PRIbPTR			__PRI_PTR_prefix"b"		/* intptr_t */
+
+#define	PRIB8			"B"		/* int8_t */
+#define	PRIB16			"B"		/* int16_t */
+#define	PRIB32			"B"		/* int32_t */
+#define	PRIB64			__PRI_64_prefix"B"		/* int64_t */
+
+#define	PRIBLEAST8		"B"		/* int_least8_t */
+#define	PRIBLEAST16		"B"		/* int_least16_t */
+#define	PRIBLEAST32		"B"		/* int_least32_t */
+#define	PRIBLEAST64		__PRI_64_prefix"B"		/* int_least64_t */
+
+#define	PRIBFAST8		"B"		/* int_fast8_t */
+#define	PRIBFAST16		__PRI_FAST_prefix"B"	/* int_fast16_t */
+#define	PRIBFAST32		__PRI_FAST_prefix"B"	/* int_fast32_t */
+#define	PRIBFAST64		__PRI_64_prefix"B"		/* int_fast64_t */
+
+#define	PRIBMAX			"jB"		/* intmax_t */
+#define	PRIBPTR			__PRI_PTR_prefix"B"		/* intptr_t */
+
 #define	PRIo8			"o"		/* int8_t */
 #define	PRIo16			"o"		/* int16_t */
 #define	PRIo32			"o"		/* int32_t */
@@ -195,6 +231,42 @@
 #define	SCNiPTR			__PRI_PTR_prefix"i"		/* intptr_t */
 
 /* fscanf macros for unsigned integers */
+#define	SCNb8			"hhb"		/* uint8_t */
+#define	SCNb16			"hb"		/* uint16_t */
+#define	SCNb32			"b"		/* uint32_t */
+#define	SCNb64			__PRI_64_prefix"b"		/* uint64_t */
+
+#define	SCNbLEAST8		"hhb"		/* uint_least8_t */
+#define	SCNbLEAST16		"hb"		/* uint_least16_t */
+#define	SCNbLEAST32		"b"		/* uint_least32_t */
+#define	SCNbLEAST64		__PRI_64_prefix"b"		/* uint_least64_t */
+
+#define	SCNbFAST8		"hhb"		/* uint_fast8_t */
+#define	SCNbFAST16		__PRI_FAST_prefix"b"	/* uint_fast16_t */
+#define	SCNbFAST32		__PRI_FAST_prefix"b"	/* uint_fast32_t */
+#define	SCNbFAST64		__PRI_64_prefix"b"		/* uint_fast64_t */
+
+#define	SCNbMAX			"jb"		/* uintmax_t */
+#define	SCNbPTR			__PRI_PTR_prefix"b"		/* uintptr_t */
+
+#define	SCNB8			"hhB"		/* uint8_t */
+#define	SCNB16			"hB"		/* uint16_t */
+#define	SCNB32			"B"		/* uint32_t */
+#define	SCNB64			__PRI_64_prefix"B"		/* uint64_t */
+
+#define	SCNBLEAST8		"hhB"		/* uint_least8_t */
+#define	SCNBLEAST16		"hB"		/* uint_least16_t */
+#define	SCNBLEAST32		"B"		/* uint_least32_t */
+#define	SCNBLEAST64		__PRI_64_prefix"B"		/* uint_least64_t */
+
+#define	SCNBFAST8		"hhB"		/* uint_fast8_t */
+#define	SCNBFAST16		__PRI_FAST_prefix"B"	/* uint_fast16_t */
+#define	SCNBFAST32		__PRI_FAST_prefix"B"	/* uint_fast32_t */
+#define	SCNBFAST64		__PRI_64_prefix"B"		/* uint_fast64_t */
+
+#define	SCNBMAX			"jB"		/* uintmax_t */
+#define	SCNBPTR			__PRI_PTR_prefix"B"		/* uintptr_t */
+
 #define	SCNo8			"hho"		/* uint8_t */
 #define	SCNo16			"ho"		/* uint16_t */
 #define	SCNo32			"o"		/* uint32_t */
@@ -257,10 +329,10 @@
 __BEGIN_DECLS
 intmax_t imaxabs(intmax_t __i) __attribute_const__ __INTRODUCED_IN(19);
 imaxdiv_t imaxdiv(intmax_t __numerator, intmax_t __denominator) __attribute_const__ __INTRODUCED_IN(19);
-intmax_t strtoimax(const char* __s, char** __end_ptr, int __base);
-uintmax_t strtoumax(const char* __s, char** __end_ptr, int __base);
-intmax_t wcstoimax(const wchar_t* __s, wchar_t** __end_ptr, int __base) __INTRODUCED_IN(21);
-uintmax_t wcstoumax(const wchar_t* __s, wchar_t** __end_ptr, int __base) __INTRODUCED_IN(21);
+intmax_t strtoimax(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
+uintmax_t strtoumax(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
+intmax_t wcstoimax(const wchar_t* _Nonnull __s, wchar_t* _Nullable * _Nullable __end_ptr, int __base) __INTRODUCED_IN(21);
+uintmax_t wcstoumax(const wchar_t* _Nonnull __s, wchar_t* _Nullable * _Nullable __end_ptr, int __base) __INTRODUCED_IN(21);
 __END_DECLS
 
 #endif
diff --git a/libc/include/langinfo.h b/libc/include/langinfo.h
index d9d8c15..2b43892 100644
--- a/libc/include/langinfo.h
+++ b/libc/include/langinfo.h
@@ -92,8 +92,8 @@
 #define NOEXPR 54
 #define CRNCYSTR 55
 
-char* nl_langinfo(nl_item __item) __INTRODUCED_IN(26);
-char* nl_langinfo_l(nl_item __item, locale_t __l) __INTRODUCED_IN(26);
+char* _Nonnull nl_langinfo(nl_item __item) __INTRODUCED_IN(26);
+char* _Nonnull nl_langinfo_l(nl_item __item, locale_t _Nonnull __l) __INTRODUCED_IN(26);
 
 __END_DECLS
 
diff --git a/libc/include/libgen.h b/libc/include/libgen.h
index b910790..474f066 100644
--- a/libc/include/libgen.h
+++ b/libc/include/libgen.h
@@ -50,7 +50,7 @@
  * Note that Android's cv-qualifiers differ from POSIX; Android's implementation doesn't
  * modify its input and uses thread-local storage for the result if necessary.
  */
-char* __posix_basename(const char* __path) __RENAME(basename);
+char* _Nullable __posix_basename(const char* _Nullable __path) __RENAME(basename);
 
 /**
  * This macro ensures that callers get the POSIX basename() if they include this header,
@@ -65,13 +65,13 @@
  * Note that Android's cv-qualifiers differ from POSIX; Android's implementation doesn't
  * modify its input and uses thread-local storage for the result if necessary.
  */
-char* dirname(const char* __path);
+char* _Nullable dirname(const char* _Nullable __path);
 
 #if !defined(__LP64__)
 /** Deprecated. Use dirname() instead. */
-int dirname_r(const char* __path, char* __buf, size_t __n);
+int dirname_r(const char* _Nullable __path, char* _Nullable __buf, size_t __n);
 /** Deprecated. Use basename() instead. */
-int basename_r(const char* __path, char* __buf, size_t __n);
+int basename_r(const char* _Nullable __path, char* _Nullable __buf, size_t __n);
 #endif
 
 __END_DECLS
diff --git a/libc/include/link.h b/libc/include/link.h
index bd430f5..a0a3d60 100644
--- a/libc/include/link.h
+++ b/libc/include/link.h
@@ -44,41 +44,41 @@
 
 struct dl_phdr_info {
   ElfW(Addr) dlpi_addr;
-  const char* dlpi_name;
-  const ElfW(Phdr)* dlpi_phdr;
+  const char* _Nullable dlpi_name;
+  const ElfW(Phdr)* _Nullable dlpi_phdr;
   ElfW(Half) dlpi_phnum;
 
   // These fields were added in Android R.
   unsigned long long dlpi_adds;
   unsigned long long dlpi_subs;
   size_t dlpi_tls_modid;
-  void* dlpi_tls_data;
+  void* _Nullable dlpi_tls_data;
 };
 
 #if defined(__arm__)
-int dl_iterate_phdr(int (*__callback)(struct dl_phdr_info*, size_t, void*), void* __data) __INTRODUCED_IN(21);
+int dl_iterate_phdr(int (* _Nonnull __callback)(struct dl_phdr_info* _Nonnull, size_t, void* _Nullable), void* _Nullable __data) __INTRODUCED_IN(21);
 #else
-int dl_iterate_phdr(int (*__callback)(struct dl_phdr_info*, size_t, void*), void* __data);
+int dl_iterate_phdr(int (* _Nonnull __callback)(struct dl_phdr_info* _Nonnull, size_t, void*_Nullable ), void* _Nullable __data);
 #endif
 
 #ifdef __arm__
 typedef uintptr_t _Unwind_Ptr;
-_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr, int*);
+_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr, int* _Nonnull);
 #endif
 
 /* Used by the dynamic linker to communicate with the debugger. */
 struct link_map {
   ElfW(Addr) l_addr;
-  char* l_name;
-  ElfW(Dyn)* l_ld;
-  struct link_map* l_next;
-  struct link_map* l_prev;
+  char* _Nullable l_name;
+  ElfW(Dyn)* _Nullable l_ld;
+  struct link_map* _Nullable l_next;
+  struct link_map* _Nullable l_prev;
 };
 
 /* Used by the dynamic linker to communicate with the debugger. */
 struct r_debug {
   int32_t r_version;
-  struct link_map* r_map;
+  struct link_map* _Nullable r_map;
   ElfW(Addr) r_brk;
   enum {
     RT_CONSISTENT,
diff --git a/libc/include/locale.h b/libc/include/locale.h
index 8785b24..27f2a3f 100644
--- a/libc/include/locale.h
+++ b/libc/include/locale.h
@@ -70,16 +70,16 @@
                      LC_IDENTIFICATION_MASK)
 
 struct lconv {
-  char* decimal_point;
-  char* thousands_sep;
-  char* grouping;
-  char* int_curr_symbol;
-  char* currency_symbol;
-  char* mon_decimal_point;
-  char* mon_thousands_sep;
-  char* mon_grouping;
-  char* positive_sign;
-  char* negative_sign;
+  char* _Nonnull decimal_point;
+  char* _Nonnull thousands_sep;
+  char* _Nonnull grouping;
+  char* _Nonnull int_curr_symbol;
+  char* _Nonnull currency_symbol;
+  char* _Nonnull mon_decimal_point;
+  char* _Nonnull mon_thousands_sep;
+  char* _Nonnull mon_grouping;
+  char* _Nonnull positive_sign;
+  char* _Nonnull negative_sign;
   char int_frac_digits;
   char frac_digits;
   char p_cs_precedes;
@@ -96,13 +96,13 @@
   char int_n_sign_posn;
 };
 
-struct lconv* localeconv(void) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
+struct lconv* _Nonnull localeconv(void) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
 
-locale_t duplocale(locale_t __l) __INTRODUCED_IN(21);
-void freelocale(locale_t __l) __INTRODUCED_IN(21);
-locale_t newlocale(int __category_mask, const char* __locale_name, locale_t __base) __INTRODUCED_IN(21);
-char* setlocale(int __category, const char* __locale_name);
-locale_t uselocale(locale_t __l) __INTRODUCED_IN(21);
+locale_t _Nullable duplocale(locale_t _Nonnull __l) __INTRODUCED_IN(21);
+void freelocale(locale_t _Nonnull __l) __INTRODUCED_IN(21);
+locale_t _Nullable newlocale(int __category_mask, const char* _Nonnull __locale_name, locale_t _Nullable __base) __INTRODUCED_IN(21);
+char* _Nullable setlocale(int __category, const char* _Nullable __locale_name);
+locale_t _Nullable uselocale(locale_t _Nullable __l) __INTRODUCED_IN(21);
 
 #define LC_GLOBAL_LOCALE __BIONIC_CAST(reinterpret_cast, locale_t, -1L)
 
diff --git a/libc/include/malloc.h b/libc/include/malloc.h
index 40786fa..91d63b3 100644
--- a/libc/include/malloc.h
+++ b/libc/include/malloc.h
@@ -40,7 +40,7 @@
  * Returns a pointer to the allocated memory on success and returns a null
  * pointer and sets `errno` on failure.
  */
-void* malloc(size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(1) __wur;
+void* _Nullable malloc(size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(1) __wur;
 
 /**
  * [calloc(3)](http://man7.org/linux/man-pages/man3/calloc.3.html) allocates
@@ -49,7 +49,7 @@
  * Returns a pointer to the allocated memory on success and returns a null
  * pointer and sets `errno` on failure.
  */
-void* calloc(size_t __item_count, size_t __item_size) __mallocfunc __BIONIC_ALLOC_SIZE(1,2) __wur;
+void* _Nullable calloc(size_t __item_count, size_t __item_size) __mallocfunc __BIONIC_ALLOC_SIZE(1,2) __wur;
 
 /**
  * [realloc(3)](http://man7.org/linux/man-pages/man3/realloc.3.html) resizes
@@ -58,7 +58,7 @@
  * Returns a pointer (which may be different from `__ptr`) to the resized
  * memory on success and returns a null pointer and sets `errno` on failure.
  */
-void* realloc(void* __ptr, size_t __byte_count) __BIONIC_ALLOC_SIZE(2) __wur;
+void* _Nullable realloc(void* _Nullable __ptr, size_t __byte_count) __BIONIC_ALLOC_SIZE(2) __wur;
 
 /**
  * [reallocarray(3)](http://man7.org/linux/man-pages/man3/realloc.3.html) resizes
@@ -70,13 +70,13 @@
  * Returns a pointer (which may be different from `__ptr`) to the resized
  * memory on success and returns a null pointer and sets `errno` on failure.
  */
-void* reallocarray(void* __ptr, size_t __item_count, size_t __item_size) __BIONIC_ALLOC_SIZE(2, 3) __wur __INTRODUCED_IN(29);
+void* _Nullable reallocarray(void* _Nullable __ptr, size_t __item_count, size_t __item_size) __BIONIC_ALLOC_SIZE(2, 3) __wur __INTRODUCED_IN(29);
 
 /**
  * [free(3)](http://man7.org/linux/man-pages/man3/free.3.html) deallocates
  * memory on the heap.
  */
-void free(void* __ptr);
+void free(void* _Nullable __ptr);
 
 /**
  * [memalign(3)](http://man7.org/linux/man-pages/man3/memalign.3.html) allocates
@@ -87,7 +87,7 @@
  *
  * See also posix_memalign().
  */
-void* memalign(size_t __alignment, size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(2) __wur;
+void* _Nullable memalign(size_t __alignment, size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(2) __wur;
 
 /**
  * [malloc_usable_size(3)](http://man7.org/linux/man-pages/man3/malloc_usable_size.3.html)
@@ -95,7 +95,7 @@
  *
  * Available since API level 17.
  */
-size_t malloc_usable_size(const void* __ptr) __INTRODUCED_IN(17);
+size_t malloc_usable_size(const void* _Nullable __ptr) __INTRODUCED_IN(17);
 
 #define __MALLINFO_BODY \
   /** Total number of non-mmapped bytes currently allocated from OS. */ \
@@ -168,7 +168,7 @@
  *
  * Available since API level 23.
  */
-int malloc_info(int __must_be_zero, FILE* __fp) __INTRODUCED_IN(23);
+int malloc_info(int __must_be_zero, FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * mallopt() option to set the decay time. Valid values are 0 and 1.
@@ -183,7 +183,15 @@
  * Available since API level 28.
  */
 #define M_PURGE (-101)
-
+/**
+ * mallopt() option to immediately purge all possible memory back to
+ * the kernel. This call can take longer than a normal purge since it
+ * examines everything. In some cases, it can take more than twice the
+ * time of a M_PURGE call. The value is ignored.
+ *
+ * Available since API level 34.
+ */
+#define M_PURGE_ALL (-104)
 
 /**
  * mallopt() option to tune the allocator's choice of memory tags to
@@ -224,8 +232,9 @@
 /**
  * mallopt() option for per-thread memory initialization tuning.
  * The value argument should be one of:
- * 1: Disable automatic heap initialization and, where possible, memory tagging,
- *    on this thread.
+ * 1: Disable automatic heap initialization on this thread only.
+ *    If memory tagging is enabled, disable as much as possible of the
+ *    memory tagging initialization for this thread.
  * 0: Normal behavior.
  *
  * Available since API level 31.
@@ -329,7 +338,7 @@
  *
  * See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
  */
-extern void* (*volatile __malloc_hook)(size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
+extern void* _Nonnull (*volatile _Nonnull __malloc_hook)(size_t __byte_count, const void* _Nonnull __caller) __INTRODUCED_IN(28);
 
 /**
  * [__realloc_hook(3)](http://man7.org/linux/man-pages/man3/__realloc_hook.3.html)
@@ -340,7 +349,7 @@
  *
  * See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
  */
-extern void* (*volatile __realloc_hook)(void* __ptr, size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
+extern void* _Nonnull (*volatile _Nonnull __realloc_hook)(void* _Nullable __ptr, size_t __byte_count, const void* _Nonnull __caller) __INTRODUCED_IN(28);
 
 /**
  * [__free_hook(3)](http://man7.org/linux/man-pages/man3/__free_hook.3.html)
@@ -351,7 +360,7 @@
  *
  * See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
  */
-extern void (*volatile __free_hook)(void* __ptr, const void* __caller) __INTRODUCED_IN(28);
+extern void (*volatile _Nonnull __free_hook)(void* _Nullable __ptr, const void* _Nonnull __caller) __INTRODUCED_IN(28);
 
 /**
  * [__memalign_hook(3)](http://man7.org/linux/man-pages/man3/__memalign_hook.3.html)
@@ -362,6 +371,6 @@
  *
  * See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
  */
-extern void* (*volatile __memalign_hook)(size_t __alignment, size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
+extern void* _Nonnull (*volatile _Nonnull __memalign_hook)(size_t __alignment, size_t __byte_count, const void* _Nonnull __caller) __INTRODUCED_IN(28);
 
 __END_DECLS
diff --git a/libc/include/math.h b/libc/include/math.h
index 040dc96..a5fa7c3 100644
--- a/libc/include/math.h
+++ b/libc/include/math.h
@@ -137,9 +137,9 @@
 float expm1f(float __x);
 long double expm1l(long double __x) __RENAME_LDBL(expm1, 3, 21);
 
-double frexp(double __x, int* __exponent);
-float frexpf(float __x, int* __exponent);
-long double frexpl(long double __x, int* __exponent) __RENAME_LDBL(frexp, 3, 21);
+double frexp(double __x, int* _Nonnull __exponent);
+float frexpf(float __x, int* _Nonnull __exponent);
+long double frexpl(long double __x, int* _Nonnull __exponent) __RENAME_LDBL(frexp, 3, 21);
 
 int ilogb(double __x) __attribute_const__;
 int ilogbf(float __x) __attribute_const__;
@@ -169,9 +169,9 @@
 float logbf(float __x);
 long double logbl(long double __x) __RENAME_LDBL(logb, 3, 18);
 
-double modf(double __x, double* __integral_part);
-float modff(float __x, float* __integral_part);
-long double modfl(long double __x, long double* __integral_part) __RENAME_LDBL(modf, 3, 21);
+double modf(double __x, double* _Nonnull __integral_part);
+float modff(float __x, float* _Nonnull __integral_part);
+long double modfl(long double __x, long double* _Nonnull __integral_part) __RENAME_LDBL(modf, 3, 21);
 
 double scalbn(double __x, int __exponent);
 float scalbnf(float __x, int __exponent);
@@ -266,17 +266,17 @@
 float remainderf(float __x, float __y);
 long double remainderl(long double __x, long double __y) __RENAME_LDBL(remainder, 3, 21);
 
-double remquo(double __x, double __y, int* __quotient_bits);
-float remquof(float __x, float __y, int* __quotient_bits);
-long double remquol(long double __x, long double __y, int* __quotient_bits) __RENAME_LDBL(remquo, 3, 21);
+double remquo(double __x, double __y, int* _Nonnull __quotient_bits);
+float remquof(float __x, float __y, int* _Nonnull __quotient_bits);
+long double remquol(long double __x, long double __y, int* _Nonnull __quotient_bits) __RENAME_LDBL(remquo, 3, 21);
 
 double copysign(double __value, double __sign) __attribute_const__;
 float copysignf(float __value, float __sign) __attribute_const__;
 long double copysignl(long double __value, long double __sign) __RENAME_LDBL(copysign, 3, 3) __attribute_const__;
 
-double nan(const char* __kind) __attribute_const__;
-float nanf(const char* __kind) __attribute_const__;
-long double nanl(const char* __kind) __RENAME_LDBL(nan, 13, 13) __attribute_const__;
+double nan(const char* _Nonnull __kind) __attribute_const__;
+float nanf(const char* _Nonnull __kind) __attribute_const__;
+long double nanl(const char* _Nonnull __kind) __RENAME_LDBL(nan, 13, 13) __attribute_const__;
 
 double nextafter(double __x, double __y);
 float nextafterf(float __x, float __y);
@@ -364,10 +364,10 @@
 double drem(double __x, double __y);
 int finite(double __x) __attribute_const__;
 int isnanf(float __x) __attribute_const__;
-double gamma_r(double __x, int* __sign);
-double lgamma_r(double __x, int* __sign);
+double gamma_r(double __x, int* _Nonnull __sign);
+double lgamma_r(double __x, int* _Nonnull __sign);
 double significand(double __x);
-long double lgammal_r(long double __x, int* __sign) __INTRODUCED_IN(23);
+long double lgammal_r(long double __x, int* _Nonnull __sign) __INTRODUCED_IN(23);
 long double significandl(long double __x) __INTRODUCED_IN(21);
 float dremf(float __x, float __y);
 int finitef(float __x) __attribute_const__;
@@ -379,12 +379,12 @@
 float y0f(float __x);
 float y1f(float __x);
 float ynf(int __n, float __x);
-float gammaf_r(float __x, int* __sign);
-float lgammaf_r(float __x, int* __sign);
+float gammaf_r(float __x, int* _Nonnull __sign);
+float lgammaf_r(float __x, int* _Nonnull __sign);
 float significandf(float __x);
-void sincos(double __x, double* __sin, double* __cos);
-void sincosf(float __x, float* __sin, float* __cos);
-void sincosl(long double __x, long double* __sin, long double* __cos);
+void sincos(double __x, double* _Nonnull __sin, double* _Nonnull __cos);
+void sincosf(float __x, float* _Nonnull __sin, float* _Nonnull __cos);
+void sincosl(long double __x, long double* _Nonnull __sin, long double* _Nonnull __cos);
 #endif
 
 /* GNU extensions. */
diff --git a/libc/include/mntent.h b/libc/include/mntent.h
index d5987dc..43cab1f 100644
--- a/libc/include/mntent.h
+++ b/libc/include/mntent.h
@@ -47,21 +47,21 @@
 #define MNTOPT_SUID "suid"
 
 struct mntent {
-  char* mnt_fsname;
-  char* mnt_dir;
-  char* mnt_type;
-  char* mnt_opts;
+  char* _Nullable mnt_fsname;
+  char* _Nullable mnt_dir;
+  char* _Nullable mnt_type;
+  char* _Nullable mnt_opts;
   int mnt_freq;
   int mnt_passno;
 };
 
 __BEGIN_DECLS
 
-int endmntent(FILE* __fp) __INTRODUCED_IN(21);
-struct mntent* getmntent(FILE* __fp);
-struct mntent* getmntent_r(FILE* __fp, struct mntent* __entry, char* __buf, int __size) __INTRODUCED_IN(21);
-FILE* setmntent(const char* __filename, const char* __type) __INTRODUCED_IN(21);
-char* hasmntopt(const struct mntent* __entry, const char* __option) __INTRODUCED_IN(26);
+int endmntent(FILE* _Nullable __fp) __INTRODUCED_IN(21);
+struct mntent* _Nullable getmntent(FILE* _Nonnull __fp);
+struct mntent* _Nullable getmntent_r(FILE* _Nonnull __fp, struct mntent* _Nonnull __entry, char* _Nonnull __buf, int __size) __INTRODUCED_IN(21);
+FILE* _Nullable setmntent(const char* _Nonnull __filename, const char* _Nonnull __type) __INTRODUCED_IN(21);
+char* _Nullable hasmntopt(const struct mntent* _Nonnull __entry, const char* _Nonnull __option) __INTRODUCED_IN(26);
 
 __END_DECLS
 
diff --git a/libc/include/netinet/ether.h b/libc/include/netinet/ether.h
index 480063d..d570c18 100644
--- a/libc/include/netinet/ether.h
+++ b/libc/include/netinet/ether.h
@@ -44,7 +44,7 @@
  *
  * Returns a pointer to a static buffer.
  */
-char* ether_ntoa(const struct ether_addr* __addr);
+char* _Nonnull ether_ntoa(const struct ether_addr* _Nonnull __addr);
 
 /**
  * [ether_ntoa_r(3)](http://man7.org/linux/man-pages/man3/ether_ntoa_r.3.html) returns a string
@@ -52,7 +52,7 @@
  *
  * Returns a pointer to the given buffer.
  */
-char* ether_ntoa_r(const struct ether_addr* __addr, char* __buf);
+char* _Nonnull ether_ntoa_r(const struct ether_addr* _Nonnull __addr, char* _Nonnull __buf);
 
 /**
  * [ether_aton(3)](http://man7.org/linux/man-pages/man3/ether_aton.3.html) returns an `ether_addr`
@@ -60,7 +60,7 @@
  *
  * Returns a pointer to a static buffer, or NULL if the given string isn't a valid MAC address.
  */
-struct ether_addr* ether_aton(const char* __ascii);
+struct ether_addr* _Nullable ether_aton(const char* _Nonnull __ascii);
 
 /**
  * [ether_aton_r(3)](http://man7.org/linux/man-pages/man3/ether_aton_r.3.html) returns an
@@ -68,6 +68,6 @@
  *
  * Returns a pointer to the given buffer, or NULL if the given string isn't a valid MAC address.
  */
-struct ether_addr* ether_aton_r(const char* __ascii, struct ether_addr* __addr);
+struct ether_addr* _Nullable ether_aton_r(const char* _Nonnull __ascii, struct ether_addr* _Nonnull __addr);
 
 __END_DECLS
diff --git a/libc/include/netinet/in.h b/libc/include/netinet/in.h
index 46e3543..b235e6e 100644
--- a/libc/include/netinet/in.h
+++ b/libc/include/netinet/in.h
@@ -54,7 +54,7 @@
 
 typedef uint16_t in_port_t;
 
-int bindresvport(int __fd, struct sockaddr_in* __sin);
+int bindresvport(int __fd, struct sockaddr_in* _Nullable __sin);
 
 #if __ANDROID_API__ >= 24
 extern const struct in6_addr in6addr_any __INTRODUCED_IN(24);
diff --git a/libc/include/nl_types.h b/libc/include/nl_types.h
index 1c80e4e..f4d7f43 100644
--- a/libc/include/nl_types.h
+++ b/libc/include/nl_types.h
@@ -62,7 +62,7 @@
  *
  * Available since API level 28.
  */
-nl_catd catopen(const char* __name, int __flag) __INTRODUCED_IN(26);
+nl_catd _Nonnull catopen(const char* _Nonnull __name, int __flag) __INTRODUCED_IN(26);
 
 /**
  * [catgets(3)](http://man7.org/linux/man-pages/man3/catgets.3.html) translates the given message
@@ -72,13 +72,13 @@
  *
  * Available since API level 28.
  */
-char* catgets(nl_catd __catalog, int __set_number, int __msg_number, const char* __msg) __INTRODUCED_IN(26);
+char* _Nonnull catgets(nl_catd _Nonnull __catalog, int __set_number, int __msg_number, const char* _Nonnull __msg) __INTRODUCED_IN(26);
 
 /**
  * [catclose(3)](http://man7.org/linux/man-pages/man3/catclose.3.html) closes a message catalog.
  *
  * On Android, this always returns -1 with `errno` set to `EBADF`.
  */
-int catclose(nl_catd __catalog) __INTRODUCED_IN(26);
+int catclose(nl_catd _Nonnull __catalog) __INTRODUCED_IN(26);
 
 __END_DECLS
diff --git a/libc/include/pthread.h b/libc/include/pthread.h
index 8bc897a..98695eb 100644
--- a/libc/include/pthread.h
+++ b/libc/include/pthread.h
@@ -26,8 +26,12 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _PTHREAD_H_
-#define _PTHREAD_H_
+#pragma once
+
+/**
+ * @file pthread.h
+ * @brief POSIX threads.
+ */
 
 #include <limits.h>
 #include <bits/pthread_types.h>
@@ -54,9 +58,7 @@
 #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP { { ((PTHREAD_MUTEX_ERRORCHECK & 3) << 14) } }
 
 #define PTHREAD_COND_INITIALIZER  { { 0 } }
-#if __ANDROID_API__ >= 21
 #define PTHREAD_COND_INITIALIZER_MONOTONIC_NP  { { 1 << 1 } }
-#endif
 
 #define PTHREAD_RWLOCK_INITIALIZER  { { 0 } }
 
@@ -92,41 +94,41 @@
 #define PTHREAD_SCOPE_SYSTEM 0
 #define PTHREAD_SCOPE_PROCESS 1
 
-int pthread_atfork(void (*__prepare)(void), void (*__parent)(void), void (*__child)(void));
+int pthread_atfork(void (* _Nullable __prepare)(void), void (* _Nullable __parent)(void), void (* _Nullable __child)(void));
 
-int pthread_attr_destroy(pthread_attr_t* __attr);
-int pthread_attr_getdetachstate(const pthread_attr_t* __attr, int* __state);
-int pthread_attr_getguardsize(const pthread_attr_t* __attr, size_t* __size);
-int pthread_attr_getinheritsched(const pthread_attr_t* __attr, int* __flag) __INTRODUCED_IN(28);
-int pthread_attr_getschedparam(const pthread_attr_t* __attr, struct sched_param* __param);
-int pthread_attr_getschedpolicy(const pthread_attr_t* __attr, int* __policy);
-int pthread_attr_getscope(const pthread_attr_t* __attr, int* __scope);
-int pthread_attr_getstack(const pthread_attr_t* __attr, void** __addr, size_t* __size);
-int pthread_attr_getstacksize(const pthread_attr_t* __attr, size_t* __size);
-int pthread_attr_init(pthread_attr_t* __attr);
-int pthread_attr_setdetachstate(pthread_attr_t* __attr, int __state);
-int pthread_attr_setguardsize(pthread_attr_t* __attr, size_t __size);
-int pthread_attr_setinheritsched(pthread_attr_t* __attr, int __flag) __INTRODUCED_IN(28);
-int pthread_attr_setschedparam(pthread_attr_t* __attr, const struct sched_param* __param);
-int pthread_attr_setschedpolicy(pthread_attr_t* __attr, int __policy);
-int pthread_attr_setscope(pthread_attr_t* __attr, int __scope);
-int pthread_attr_setstack(pthread_attr_t* __attr, void* __addr, size_t __size);
-int pthread_attr_setstacksize(pthread_attr_t* __addr, size_t __size);
+int pthread_attr_destroy(pthread_attr_t* _Nonnull __attr);
+int pthread_attr_getdetachstate(const pthread_attr_t* _Nonnull __attr, int* _Nonnull __state);
+int pthread_attr_getguardsize(const pthread_attr_t* _Nonnull __attr, size_t* _Nonnull __size);
+int pthread_attr_getinheritsched(const pthread_attr_t* _Nonnull __attr, int* _Nonnull __flag) __INTRODUCED_IN(28);
+int pthread_attr_getschedparam(const pthread_attr_t* _Nonnull __attr, struct sched_param* _Nonnull __param);
+int pthread_attr_getschedpolicy(const pthread_attr_t* _Nonnull __attr, int* _Nonnull __policy);
+int pthread_attr_getscope(const pthread_attr_t* _Nonnull __attr, int* _Nonnull __scope);
+int pthread_attr_getstack(const pthread_attr_t* _Nonnull __attr, void* _Nullable * _Nonnull __addr, size_t* _Nonnull __size);
+int pthread_attr_getstacksize(const pthread_attr_t* _Nonnull __attr, size_t* _Nonnull __size);
+int pthread_attr_init(pthread_attr_t* _Nonnull __attr);
+int pthread_attr_setdetachstate(pthread_attr_t* _Nonnull __attr, int __state);
+int pthread_attr_setguardsize(pthread_attr_t* _Nonnull __attr, size_t __size);
+int pthread_attr_setinheritsched(pthread_attr_t* _Nonnull __attr, int __flag) __INTRODUCED_IN(28);
+int pthread_attr_setschedparam(pthread_attr_t* _Nonnull __attr, const struct sched_param* _Nonnull __param);
+int pthread_attr_setschedpolicy(pthread_attr_t* _Nonnull __attr, int __policy);
+int pthread_attr_setscope(pthread_attr_t* _Nonnull __attr, int __scope);
+int pthread_attr_setstack(pthread_attr_t* _Nonnull __attr, void* _Nonnull __addr, size_t __size);
+int pthread_attr_setstacksize(pthread_attr_t* _Nonnull __addr, size_t __size);
 
-int pthread_condattr_destroy(pthread_condattr_t* __attr);
-int pthread_condattr_getclock(const pthread_condattr_t* __attr, clockid_t* __clock) __INTRODUCED_IN(21);
-int pthread_condattr_getpshared(const pthread_condattr_t* __attr, int* __shared);
-int pthread_condattr_init(pthread_condattr_t* __attr);
-int pthread_condattr_setclock(pthread_condattr_t* __attr, clockid_t __clock) __INTRODUCED_IN(21);
-int pthread_condattr_setpshared(pthread_condattr_t* __attr, int __shared);
+int pthread_condattr_destroy(pthread_condattr_t* _Nonnull __attr);
+int pthread_condattr_getclock(const pthread_condattr_t* _Nonnull __attr, clockid_t* _Nonnull __clock) __INTRODUCED_IN(21);
+int pthread_condattr_getpshared(const pthread_condattr_t* _Nonnull __attr, int* _Nonnull __shared);
+int pthread_condattr_init(pthread_condattr_t* _Nonnull __attr);
+int pthread_condattr_setclock(pthread_condattr_t* _Nonnull __attr, clockid_t __clock) __INTRODUCED_IN(21);
+int pthread_condattr_setpshared(pthread_condattr_t* _Nonnull __attr, int __shared);
 
-int pthread_cond_broadcast(pthread_cond_t* __cond);
-int pthread_cond_clockwait(pthread_cond_t* __cond, pthread_mutex_t* __mutex, clockid_t __clock,
-                           const struct timespec* __timeout) __INTRODUCED_IN(30);
-int pthread_cond_destroy(pthread_cond_t* __cond);
-int pthread_cond_init(pthread_cond_t* __cond, const pthread_condattr_t* __attr);
-int pthread_cond_signal(pthread_cond_t* __cond);
-int pthread_cond_timedwait(pthread_cond_t* __cond, pthread_mutex_t* __mutex, const struct timespec* __timeout);
+int pthread_cond_broadcast(pthread_cond_t* _Nonnull __cond);
+int pthread_cond_clockwait(pthread_cond_t* _Nonnull __cond, pthread_mutex_t* _Nonnull __mutex, clockid_t __clock,
+                           const struct timespec* _Nullable __timeout) __INTRODUCED_IN(30);
+int pthread_cond_destroy(pthread_cond_t* _Nonnull __cond);
+int pthread_cond_init(pthread_cond_t* _Nonnull __cond, const pthread_condattr_t* _Nullable __attr);
+int pthread_cond_signal(pthread_cond_t* _Nonnull __cond);
+int pthread_cond_timedwait(pthread_cond_t* _Nonnull __cond, pthread_mutex_t* _Nonnull __mutex, const struct timespec* _Nullable __timeout);
 /*
  * Condition variables use CLOCK_REALTIME by default for their timeouts, however that is
  * typically inappropriate, since that clock can change dramatically, causing the timeout to
@@ -137,9 +139,9 @@
  * Note that pthread_cond_clockwait() allows specifying an arbitrary clock and has superseded this
  * function.
  */
-int pthread_cond_timedwait_monotonic_np(pthread_cond_t* __cond, pthread_mutex_t* __mutex,
-                                        const struct timespec* __timeout) __INTRODUCED_IN_64(28);
-int pthread_cond_wait(pthread_cond_t* __cond, pthread_mutex_t* __mutex);
+int pthread_cond_timedwait_monotonic_np(pthread_cond_t* _Nonnull __cond, pthread_mutex_t* _Nonnull __mutex,
+                                        const struct timespec* _Nullable __timeout) __INTRODUCED_IN_64(28);
+int pthread_cond_wait(pthread_cond_t* _Nonnull __cond, pthread_mutex_t* _Nonnull __mutex);
 
 #if defined(__clang__)
 /*
@@ -151,46 +153,44 @@
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wbuiltin-requires-header"
 #endif
-int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
+int pthread_create(pthread_t* _Nonnull __pthread_ptr, pthread_attr_t const* _Nullable __attr, void* _Nonnull (* _Nonnull __start_routine)(void* _Nonnull), void* _Nullable);
 #if defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 int pthread_detach(pthread_t __pthread);
-void pthread_exit(void* __return_value) __noreturn;
+void pthread_exit(void* _Nullable __return_value) __noreturn;
 
 int pthread_equal(pthread_t __lhs, pthread_t __rhs);
 
-int pthread_getattr_np(pthread_t __pthread, pthread_attr_t* __attr);
+int pthread_getattr_np(pthread_t __pthread, pthread_attr_t* _Nonnull __attr);
 
-int pthread_getcpuclockid(pthread_t __pthread, clockid_t* __clock);
+int pthread_getcpuclockid(pthread_t __pthread, clockid_t* _Nonnull __clock);
 
-int pthread_getschedparam(pthread_t __pthread, int* __policy, struct sched_param* __param);
-
-void* pthread_getspecific(pthread_key_t __key);
+void* _Nullable pthread_getspecific(pthread_key_t __key);
 
 pid_t pthread_gettid_np(pthread_t __pthread) __INTRODUCED_IN(21);
 
-int pthread_join(pthread_t __pthread, void** __return_value_ptr);
+int pthread_join(pthread_t __pthread, void* _Nullable * _Nullable __return_value_ptr);
 
-int pthread_key_create(pthread_key_t* __key_ptr, void (*__key_destructor)(void*));
+int pthread_key_create(pthread_key_t* _Nonnull __key_ptr, void (* _Nullable __key_destructor)(void* _Nullable));
 int pthread_key_delete(pthread_key_t __key);
 
-int pthread_mutexattr_destroy(pthread_mutexattr_t* __attr);
-int pthread_mutexattr_getpshared(const pthread_mutexattr_t* __attr, int* __shared);
-int pthread_mutexattr_gettype(const pthread_mutexattr_t* __attr, int* __type);
-int pthread_mutexattr_getprotocol(const pthread_mutexattr_t* __attr, int* __protocol) __INTRODUCED_IN(28);
-int pthread_mutexattr_init(pthread_mutexattr_t* __attr);
-int pthread_mutexattr_setpshared(pthread_mutexattr_t* __attr, int __shared);
-int pthread_mutexattr_settype(pthread_mutexattr_t* __attr, int __type);
-int pthread_mutexattr_setprotocol(pthread_mutexattr_t* __attr, int __protocol) __INTRODUCED_IN(28);
+int pthread_mutexattr_destroy(pthread_mutexattr_t* _Nonnull __attr);
+int pthread_mutexattr_getpshared(const pthread_mutexattr_t* _Nonnull __attr, int* _Nonnull __shared);
+int pthread_mutexattr_gettype(const pthread_mutexattr_t* _Nonnull __attr, int* _Nonnull __type);
+int pthread_mutexattr_getprotocol(const pthread_mutexattr_t* _Nonnull __attr, int* _Nonnull __protocol) __INTRODUCED_IN(28);
+int pthread_mutexattr_init(pthread_mutexattr_t* _Nonnull __attr);
+int pthread_mutexattr_setpshared(pthread_mutexattr_t* _Nonnull __attr, int __shared);
+int pthread_mutexattr_settype(pthread_mutexattr_t* _Nonnull __attr, int __type);
+int pthread_mutexattr_setprotocol(pthread_mutexattr_t* _Nonnull __attr, int __protocol) __INTRODUCED_IN(28);
 
-int pthread_mutex_clocklock(pthread_mutex_t* __mutex, clockid_t __clock,
-                            const struct timespec* __abstime) __INTRODUCED_IN(30);
-int pthread_mutex_destroy(pthread_mutex_t* __mutex);
-int pthread_mutex_init(pthread_mutex_t* __mutex, const pthread_mutexattr_t* __attr);
-int pthread_mutex_lock(pthread_mutex_t* __mutex);
-int pthread_mutex_timedlock(pthread_mutex_t* __mutex, const struct timespec* __timeout)
+int pthread_mutex_clocklock(pthread_mutex_t* _Nonnull __mutex, clockid_t __clock,
+                            const struct timespec* _Nullable __abstime) __INTRODUCED_IN(30);
+int pthread_mutex_destroy(pthread_mutex_t* _Nonnull __mutex);
+int pthread_mutex_init(pthread_mutex_t* _Nonnull __mutex, const pthread_mutexattr_t* _Nullable __attr);
+int pthread_mutex_lock(pthread_mutex_t* _Nonnull __mutex);
+int pthread_mutex_timedlock(pthread_mutex_t* _Nonnull __mutex, const struct timespec* _Nullable __timeout)
   __INTRODUCED_IN(21);
 
 /*
@@ -202,102 +202,118 @@
  * Note that pthread_mutex_clocklock() allows specifying an arbitrary clock and has superseded this
  * function.
  */
-int pthread_mutex_timedlock_monotonic_np(pthread_mutex_t* __mutex, const struct timespec* __timeout)
+int pthread_mutex_timedlock_monotonic_np(pthread_mutex_t* _Nonnull __mutex, const struct timespec* _Nullable __timeout)
     __INTRODUCED_IN(28);
-int pthread_mutex_trylock(pthread_mutex_t* __mutex);
-int pthread_mutex_unlock(pthread_mutex_t* __mutex);
+int pthread_mutex_trylock(pthread_mutex_t* _Nonnull __mutex);
+int pthread_mutex_unlock(pthread_mutex_t* _Nonnull __mutex);
 
-#if __ANDROID_API__ < 21
-/*
- * Cruft for supporting old API levels. Pre-L we didn't have the proper POSIX
- * APIs for things, but instead had some locally grown, artisan equivalents.
- * Keep exposing the old prototypes on old API levels so we don't regress
- * functionality.
- *
- * See the following bugs:
- *  * https://github.com/android-ndk/ndk/issues/420
- *  * https://github.com/android-ndk/ndk/issues/423
- *  * https://stackoverflow.com/q/44580542/632035
- */
-int pthread_mutex_lock_timeout_np(pthread_mutex_t* __mutex, unsigned __timeout_ms);
-int pthread_cond_timeout_np(pthread_cond_t* __cond, pthread_mutex_t* __mutex, unsigned __timeout_ms);
-int pthread_cond_timedwait_relative_np(pthread_cond_t* __cond, pthread_mutex_t* __mutex, const struct timespec* __relative_timeout);
-#endif
+int pthread_once(pthread_once_t* _Nonnull __once, void (* _Nonnull __init_routine)(void));
 
-int pthread_once(pthread_once_t* __once, void (*__init_routine)(void));
-
-int pthread_rwlockattr_init(pthread_rwlockattr_t* __attr);
-int pthread_rwlockattr_destroy(pthread_rwlockattr_t* __attr);
-int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t* __attr, int* __shared);
-int pthread_rwlockattr_setpshared(pthread_rwlockattr_t* __attr, int __shared);
-int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t* __attr, int* __kind)
+int pthread_rwlockattr_init(pthread_rwlockattr_t* _Nonnull __attr);
+int pthread_rwlockattr_destroy(pthread_rwlockattr_t* _Nonnull __attr);
+int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t* _Nonnull __attr, int* _Nonnull __shared);
+int pthread_rwlockattr_setpshared(pthread_rwlockattr_t* _Nonnull __attr, int __shared);
+int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t* _Nonnull __attr, int* _Nonnull __kind)
   __INTRODUCED_IN(23);
-int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t* __attr, int __kind) __INTRODUCED_IN(23);
+int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t* _Nonnull __attr, int __kind) __INTRODUCED_IN(23);
 
-int pthread_rwlock_clockrdlock(pthread_rwlock_t* __rwlock, clockid_t __clock,
-                               const struct timespec* __timeout) __INTRODUCED_IN(30);
-int pthread_rwlock_clockwrlock(pthread_rwlock_t* __rwlock, clockid_t __clock,
-                               const struct timespec* __timeout) __INTRODUCED_IN(30);
-int pthread_rwlock_destroy(pthread_rwlock_t* __rwlock);
-int pthread_rwlock_init(pthread_rwlock_t* __rwlock, const pthread_rwlockattr_t* __attr);
-int pthread_rwlock_rdlock(pthread_rwlock_t* __rwlock);
-int pthread_rwlock_timedrdlock(pthread_rwlock_t* __rwlock, const struct timespec* __timeout);
+int pthread_rwlock_clockrdlock(pthread_rwlock_t* _Nonnull __rwlock, clockid_t __clock,
+                               const struct timespec* _Nullable __timeout) __INTRODUCED_IN(30);
+int pthread_rwlock_clockwrlock(pthread_rwlock_t* _Nonnull __rwlock, clockid_t __clock,
+                               const struct timespec* _Nullable __timeout) __INTRODUCED_IN(30);
+int pthread_rwlock_destroy(pthread_rwlock_t* _Nonnull __rwlock);
+int pthread_rwlock_init(pthread_rwlock_t* _Nonnull __rwlock, const pthread_rwlockattr_t* _Nullable __attr);
+int pthread_rwlock_rdlock(pthread_rwlock_t* _Nonnull __rwlock);
+int pthread_rwlock_timedrdlock(pthread_rwlock_t* _Nonnull __rwlock, const struct timespec* _Nullable __timeout);
 /* See the comment on pthread_mutex_timedlock_monotonic_np for usage of this function. */
-int pthread_rwlock_timedrdlock_monotonic_np(pthread_rwlock_t* __rwlock,
-                                            const struct timespec* __timeout) __INTRODUCED_IN(28);
-int pthread_rwlock_timedwrlock(pthread_rwlock_t* __rwlock, const struct timespec* __timeout);
+int pthread_rwlock_timedrdlock_monotonic_np(pthread_rwlock_t* _Nonnull __rwlock,
+                                            const struct timespec* _Nullable __timeout) __INTRODUCED_IN(28);
+int pthread_rwlock_timedwrlock(pthread_rwlock_t* _Nonnull __rwlock, const struct timespec* _Nullable __timeout);
 /* See the comment on pthread_mutex_timedlock_monotonic_np for usage of this function. */
-int pthread_rwlock_timedwrlock_monotonic_np(pthread_rwlock_t* __rwlock,
-                                            const struct timespec* __timeout) __INTRODUCED_IN(28);
-int pthread_rwlock_tryrdlock(pthread_rwlock_t* __rwlock);
-int pthread_rwlock_trywrlock(pthread_rwlock_t* __rwlock);
-int pthread_rwlock_unlock(pthread_rwlock_t* __rwlock);
-int pthread_rwlock_wrlock(pthread_rwlock_t* __rwlock);
+int pthread_rwlock_timedwrlock_monotonic_np(pthread_rwlock_t* _Nonnull __rwlock,
+                                            const struct timespec* _Nullable __timeout) __INTRODUCED_IN(28);
+int pthread_rwlock_tryrdlock(pthread_rwlock_t* _Nonnull __rwlock);
+int pthread_rwlock_trywrlock(pthread_rwlock_t* _Nonnull __rwlock);
+int pthread_rwlock_unlock(pthread_rwlock_t* _Nonnull __rwlock);
+int pthread_rwlock_wrlock(pthread_rwlock_t* _Nonnull __rwlock);
 
 #if __ANDROID_API__ >= 24
-int pthread_barrierattr_init(pthread_barrierattr_t* __attr) __INTRODUCED_IN(24);
-int pthread_barrierattr_destroy(pthread_barrierattr_t* __attr) __INTRODUCED_IN(24);
-int pthread_barrierattr_getpshared(const pthread_barrierattr_t* __attr, int* __shared) __INTRODUCED_IN(24);
-int pthread_barrierattr_setpshared(pthread_barrierattr_t* __attr, int __shared) __INTRODUCED_IN(24);
+int pthread_barrierattr_init(pthread_barrierattr_t* _Nonnull __attr) __INTRODUCED_IN(24);
+int pthread_barrierattr_destroy(pthread_barrierattr_t* _Nonnull __attr) __INTRODUCED_IN(24);
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t* _Nonnull __attr, int* _Nonnull __shared) __INTRODUCED_IN(24);
+int pthread_barrierattr_setpshared(pthread_barrierattr_t* _Nonnull __attr, int __shared) __INTRODUCED_IN(24);
 #endif
 
 #if __ANDROID_API__ >= 24
-int pthread_barrier_init(pthread_barrier_t* __barrier, const pthread_barrierattr_t* __attr, unsigned __count) __INTRODUCED_IN(24);
-int pthread_barrier_destroy(pthread_barrier_t* __barrier) __INTRODUCED_IN(24);
-int pthread_barrier_wait(pthread_barrier_t* __barrier) __INTRODUCED_IN(24);
+int pthread_barrier_init(pthread_barrier_t* _Nonnull __barrier, const pthread_barrierattr_t* _Nullable __attr, unsigned __count) __INTRODUCED_IN(24);
+int pthread_barrier_destroy(pthread_barrier_t* _Nonnull __barrier) __INTRODUCED_IN(24);
+int pthread_barrier_wait(pthread_barrier_t* _Nonnull __barrier) __INTRODUCED_IN(24);
 #endif
 
 #if __ANDROID_API__ >= 24
-int pthread_spin_destroy(pthread_spinlock_t* __spinlock) __INTRODUCED_IN(24);
-int pthread_spin_init(pthread_spinlock_t* __spinlock, int __shared) __INTRODUCED_IN(24);
-int pthread_spin_lock(pthread_spinlock_t* __spinlock) __INTRODUCED_IN(24);
-int pthread_spin_trylock(pthread_spinlock_t* __spinlock) __INTRODUCED_IN(24);
-int pthread_spin_unlock(pthread_spinlock_t* __spinlock) __INTRODUCED_IN(24);
+int pthread_spin_destroy(pthread_spinlock_t* _Nonnull __spinlock) __INTRODUCED_IN(24);
+int pthread_spin_init(pthread_spinlock_t* _Nonnull __spinlock, int __shared) __INTRODUCED_IN(24);
+int pthread_spin_lock(pthread_spinlock_t* _Nonnull __spinlock) __INTRODUCED_IN(24);
+int pthread_spin_trylock(pthread_spinlock_t* _Nonnull __spinlock) __INTRODUCED_IN(24);
+int pthread_spin_unlock(pthread_spinlock_t* _Nonnull __spinlock) __INTRODUCED_IN(24);
 #endif
 
 pthread_t pthread_self(void) __attribute_const__;
 
 #if defined(__USE_GNU)
-int pthread_getname_np(pthread_t __pthread, char* __buf, size_t __n) __INTRODUCED_IN(26);
+int pthread_getname_np(pthread_t __pthread, char* _Nonnull __buf, size_t __n) __INTRODUCED_IN(26);
 #endif
 /* TODO: this should be __USE_GNU too. */
-int pthread_setname_np(pthread_t __pthread, const char* __name);
+int pthread_setname_np(pthread_t __pthread, const char* _Nonnull __name);
 
-int pthread_setschedparam(pthread_t __pthread, int __policy, const struct sched_param* __param);
+/**
+ * [pthread_setschedparam(3)](https://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html)
+ * sets the scheduler policy and parameters of the given thread.
+ *
+ * This call is not useful to applications on Android, because they don't
+ * have permission to set their scheduling policy, and the only priority
+ * for their policy is 0 anyway. If you only need to set your scheduling
+ * priority, see setpriority() instead.
+ *
+ * Returns 0 on success and returns an error number on failure.
+ */
+int pthread_setschedparam(pthread_t __pthread, int __policy, const struct sched_param* _Nonnull __param);
+
+/**
+ * [pthread_getschedparam(3)](https://man7.org/linux/man-pages/man3/pthread_getschedparam.3.html)
+ * gets the scheduler policy and parameters of the given thread.
+ *
+ * Returns 0 on success and returns an error number on failure.
+ */
+int pthread_getschedparam(pthread_t __pthread, int* _Nonnull __policy, struct sched_param* _Nonnull __param);
+
+/**
+ * [pthread_setschedprio(3)](https://man7.org/linux/man-pages/man3/pthread_setschedprio.3.html)
+ * sets the scheduler priority of the given thread.
+ *
+ * This call is not useful to applications on Android, because they don't
+ * have permission to set their scheduling policy, and the only priority
+ * for their policy is 0 anyway. If you only need to set your scheduling
+ * priority, see setpriority() instead.
+ *
+ * Returns 0 on success and returns an error number on failure.
+ *
+ * Available since API level 28.
+ */
 int pthread_setschedprio(pthread_t __pthread, int __priority) __INTRODUCED_IN(28);
 
-int pthread_setspecific(pthread_key_t __key, const void* __value);
+int pthread_setspecific(pthread_key_t __key, const void* _Nullable __value);
 
-typedef void (*__pthread_cleanup_func_t)(void*);
+typedef void (* _Nullable __pthread_cleanup_func_t)(void* _Nullable);
 
 typedef struct __pthread_cleanup_t {
-  struct __pthread_cleanup_t*   __cleanup_prev;
-  __pthread_cleanup_func_t      __cleanup_routine;
-  void*                         __cleanup_arg;
+  struct __pthread_cleanup_t*   _Nullable __cleanup_prev;
+  __pthread_cleanup_func_t      _Nullable __cleanup_routine;
+  void*                         _Nullable __cleanup_arg;
 } __pthread_cleanup_t;
 
-void __pthread_cleanup_push(__pthread_cleanup_t* c, __pthread_cleanup_func_t, void*);
-void __pthread_cleanup_pop(__pthread_cleanup_t*, int);
+void __pthread_cleanup_push(__pthread_cleanup_t* _Nonnull c, __pthread_cleanup_func_t _Nullable, void* _Nullable);
+void __pthread_cleanup_pop(__pthread_cleanup_t* _Nonnull, int);
 
 /* Believe or not, the definitions of pthread_cleanup_push and
  * pthread_cleanup_pop below are correct. Posix states that these
@@ -315,5 +331,3 @@
     } while (0);                                       \
 
 __END_DECLS
-
-#endif
diff --git a/libc/include/pwd.h b/libc/include/pwd.h
index d481aac..2b17fbf 100644
--- a/libc/include/pwd.h
+++ b/libc/include/pwd.h
@@ -66,31 +66,31 @@
 __BEGIN_DECLS
 
 struct passwd {
-  char* pw_name;
-  char* pw_passwd;
+  char* _Nullable pw_name;
+  char* _Nullable pw_passwd;
   uid_t pw_uid;
   gid_t pw_gid;
 #ifdef __LP64__
-  char* pw_gecos;
+  char* _Nullable pw_gecos;
 #else
   /* Note: On LP32, we define pw_gecos to pw_passwd since they're both NULL. */
 # define pw_gecos pw_passwd
 #endif
-  char* pw_dir;
-  char* pw_shell;
+  char* _Nullable pw_dir;
+  char* _Nullable pw_shell;
 };
 
-struct passwd* getpwnam(const char* __name);
-struct passwd* getpwuid(uid_t __uid);
+struct passwd* _Nullable getpwnam(const char* _Nonnull __name);
+struct passwd* _Nullable getpwuid(uid_t __uid);
 
 /* Note: Android has thousands and thousands of ids to iterate through */
-struct passwd* getpwent(void) __INTRODUCED_IN(26);
+struct passwd* _Nullable getpwent(void) __INTRODUCED_IN(26);
 
 void setpwent(void) __INTRODUCED_IN(26);
 void endpwent(void) __INTRODUCED_IN(26);
 
-int getpwnam_r(const char* __name, struct passwd* __pwd, char* __buf, size_t __n, struct passwd** __result);
-int getpwuid_r(uid_t __uid, struct passwd* __pwd, char* __buf, size_t __n, struct passwd** __result);
+int getpwnam_r(const char* _Nonnull __name, struct passwd* _Nonnull __pwd, char* _Nonnull __buf, size_t __n, struct passwd* _Nullable * _Nonnull __result);
+int getpwuid_r(uid_t __uid, struct passwd* _Nonnull __pwd, char* _Nonnull __buf, size_t __n, struct passwd* _Nullable * _Nonnull __result);
 
 __END_DECLS
 
diff --git a/libc/include/regex.h b/libc/include/regex.h
index c4cc39c..be33819 100644
--- a/libc/include/regex.h
+++ b/libc/include/regex.h
@@ -49,8 +49,8 @@
 typedef struct {
 	int re_magic;
 	size_t re_nsub;		/* number of parenthesized subexpressions */
-	const char *re_endp;	/* end pointer for REG_PEND */
-	struct re_guts *re_g;	/* none of your business :-) */
+	const char * __BIONIC_COMPLICATED_NULLNESS re_endp;	/* end pointer for REG_PEND */
+	struct re_guts * __BIONIC_COMPLICATED_NULLNESS re_g;	/* none of your business :-) */
 } regex_t;
 
 typedef struct {
@@ -67,6 +67,7 @@
 #define	REG_NOSPEC	0020
 #define	REG_PEND	0040
 #define	REG_DUMP	0200
+#define	REG_GNU		0400
 
 /* regerror() flags */
 #define	REG_NOMATCH	 1
@@ -85,6 +86,7 @@
 #define	REG_EMPTY	14
 #define	REG_ASSERT	15
 #define	REG_INVARG	16
+#define	REG_ILLSEQ	17
 #define	REG_ATOI	255	/* convert name to number (!) */
 #define	REG_ITOA	0400	/* convert number to name (!) */
 
@@ -97,10 +99,10 @@
 #define	REG_BACKR	02000	/* force use of backref code */
 
 __BEGIN_DECLS
-int regcomp(regex_t* __re, const char* __regex, int __flags);
-size_t regerror(int __error_code, const regex_t* __re, char* __buf, size_t __n);
-int regexec(const regex_t* __re, const char* __s, size_t __match_count, regmatch_t __matches[], int __flags);
-void regfree(regex_t* __re);
+int regcomp(regex_t* _Nonnull __re, const char* _Nonnull __regex, int __flags);
+size_t regerror(int __error_code, const regex_t* _Nullable __re, char* _Nullable __buf, size_t __n);
+int regexec(const regex_t* _Nonnull __re, const char* _Nonnull __s, size_t __match_count, regmatch_t __matches[_Nullable], int __flags);
+void regfree(regex_t* _Nonnull __re);
 __END_DECLS
 
 #endif
diff --git a/libc/include/resolv.h b/libc/include/resolv.h
index 6318d00..f25484a 100644
--- a/libc/include/resolv.h
+++ b/libc/include/resolv.h
@@ -40,24 +40,24 @@
 __BEGIN_DECLS
 
 #define b64_ntop __b64_ntop
-int b64_ntop(u_char const* __src, size_t __src_size, char* __dst, size_t __dst_size);
+int b64_ntop(u_char const* _Nonnull __src, size_t __src_size, char* _Nonnull __dst, size_t __dst_size);
 #define b64_pton __b64_pton
-int b64_pton(char const* __src, u_char* __dst, size_t __dst_size);
+int b64_pton(char const* _Nonnull __src, u_char* _Nonnull __dst, size_t __dst_size);
 
 #define dn_comp __dn_comp
-int dn_comp(const char* __src, u_char* __dst, int __dst_size, u_char** __dn_ptrs , u_char** __last_dn_ptr);
+int dn_comp(const char* _Nonnull __src, u_char* _Nonnull __dst, int __dst_size, u_char* _Nullable * _Nullable __dn_ptrs , u_char* _Nullable * _Nullable __last_dn_ptr);
 
-int dn_expand(const u_char* __msg, const u_char* __eom, const u_char* __src, char* __dst, int __dst_size);
+int dn_expand(const u_char* _Nonnull __msg, const u_char* _Nonnull __eom, const u_char* _Nonnull __src, char* _Nonnull __dst, int __dst_size);
 
 #define p_class __p_class
-const char* p_class(int __class);
+const char* _Nonnull p_class(int __class);
 #define p_type __p_type
-const char* p_type(int __type);
+const char* _Nonnull p_type(int __type);
 
 int res_init(void);
-int res_mkquery(int __opcode, const char* __domain_name, int __class, int __type, const u_char* __data, int __data_size, const u_char* __new_rr_in, u_char* __buf, int __buf_size);
-int res_query(const char* __name, int __class, int __type, u_char* __answer, int __answer_size);
-int res_search(const char* __name, int __class, int __type, u_char* __answer, int __answer_size);
+int res_mkquery(int __opcode, const char* _Nonnull __domain_name, int __class, int __type, const u_char* _Nullable __data, int __data_size, const u_char* _Nullable __new_rr_in, u_char* _Nonnull __buf, int __buf_size);
+int res_query(const char* _Nonnull __name, int __class, int __type, u_char* _Nonnull __answer, int __answer_size);
+int res_search(const char* _Nonnull __name, int __class, int __type, u_char* _Nonnull __answer, int __answer_size);
 
 #define res_randomid __res_randomid
 u_int __res_randomid(void) __INTRODUCED_IN(29);
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 364ca10..26bc742 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -104,7 +104,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_setscheduler(pid_t __pid, int __policy, const struct sched_param* __param);
+int sched_setscheduler(pid_t __pid, int __policy, const struct sched_param* _Nonnull __param);
 
 /**
  * [sched_getscheduler(2)](http://man7.org/linux/man-pages/man2/sched_getcpu.2.html)
@@ -145,7 +145,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_setparam(pid_t __pid, const struct sched_param* __param);
+int sched_setparam(pid_t __pid, const struct sched_param* _Nonnull __param);
 
 /**
  * [sched_getparam(2)](http://man7.org/linux/man-pages/man2/sched_getparam.2.html)
@@ -153,7 +153,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_getparam(pid_t __pid, struct sched_param* __param);
+int sched_getparam(pid_t __pid, struct sched_param* _Nonnull __param);
 
 /**
  * [sched_rr_get_interval(2)](http://man7.org/linux/man-pages/man2/sched_rr_get_interval.2.html)
@@ -161,7 +161,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_rr_get_interval(pid_t __pid, struct timespec* __quantum);
+int sched_rr_get_interval(pid_t __pid, struct timespec* _Nonnull __quantum);
 
 #if defined(__USE_GNU)
 
@@ -172,7 +172,7 @@
  * Returns the pid of the child to the caller on success and
  * returns -1 and sets `errno` on failure.
  */
-int clone(int (*__fn)(void*), void* __child_stack, int __flags, void* __arg, ...) __INTRODUCED_IN_ARM(9) __INTRODUCED_IN_X86(17);
+int clone(int (* __BIONIC_COMPLICATED_NULLNESS __fn)(void* __BIONIC_COMPLICATED_NULLNESS ), void* __BIONIC_COMPLICATED_NULLNESS __child_stack, int __flags, void* _Nullable __arg, ...) __INTRODUCED_IN_ARM(9) __INTRODUCED_IN_X86(17);
 
 /**
  * [unshare(2)](http://man7.org/linux/man-pages/man2/unshare.2.html)
@@ -228,7 +228,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_setaffinity(pid_t __pid, size_t __set_size, const cpu_set_t* __set);
+int sched_setaffinity(pid_t __pid, size_t __set_size, const cpu_set_t* _Nonnull __set);
 
 /**
  * [sched_getaffinity(2)](http://man7.org/linux/man-pages/man2/sched_getaffinity.2.html)
@@ -236,7 +236,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int sched_getaffinity(pid_t __pid, size_t __set_size, cpu_set_t* __set);
+int sched_getaffinity(pid_t __pid, size_t __set_size, cpu_set_t* _Nonnull __set);
 
 /**
  * [CPU_ZERO](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) clears all
@@ -308,7 +308,7 @@
  * how many bits are set in a dynamic CPU set allocated by `CPU_ALLOC`.
  */
 #define CPU_COUNT_S(setsize, set)  __sched_cpucount((setsize), (set))
-int __sched_cpucount(size_t __set_size, const cpu_set_t* __set);
+int __sched_cpucount(size_t __set_size, const cpu_set_t* _Nonnull __set);
 
 /**
  * [CPU_EQUAL](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) tests
@@ -379,14 +379,14 @@
  * allocates a CPU set large enough for CPUs in the range 0..count-1.
  */
 #define CPU_ALLOC(count)  __sched_cpualloc((count))
-cpu_set_t* __sched_cpualloc(size_t __count);
+cpu_set_t* _Nullable __sched_cpualloc(size_t __count);
 
 /**
  * [CPU_FREE](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
  * deallocates a CPU set allocated by `CPU_ALLOC`.
  */
 #define CPU_FREE(set)     __sched_cpufree((set))
-void __sched_cpufree(cpu_set_t* __set);
+void __sched_cpufree(cpu_set_t* _Nonnull __set);
 
 #endif /* __USE_GNU */
 
diff --git a/libc/include/search.h b/libc/include/search.h
index 7c4989a..00deef1 100644
--- a/libc/include/search.h
+++ b/libc/include/search.h
@@ -25,9 +25,9 @@
 /** See hsearch()/hsearch_r(). */
 typedef struct entry {
   /** The string key. */
-  char* key;
+  char* _Nullable key;
   /** The associated data. */
-  void* data;
+  void* _Nullable data;
 } ENTRY;
 
 /**
@@ -57,7 +57,7 @@
 #if defined(__USE_BSD) || defined(__USE_GNU)
 /** The hash table type for hcreate_r()/hdestroy_r()/hsearch_r(). */
 struct hsearch_data {
-  struct __hsearch* __hsearch;
+  struct __hsearch* _Nullable __hsearch;
 };
 #endif
 
@@ -69,7 +69,7 @@
  *
  * Available since API level 21.
  */
-void insque(void* __element, void* __previous) __INTRODUCED_IN(21);
+void insque(void* _Nonnull __element, void* _Nullable __previous) __INTRODUCED_IN(21);
 
 /**
  * [remque(3)](http://man7.org/linux/man-pages/man3/remque.3.html) removes
@@ -77,7 +77,7 @@
  *
  * Available since API level 21.
  */
-void remque(void* __element) __INTRODUCED_IN(21);
+void remque(void* _Nonnull __element) __INTRODUCED_IN(21);
 
 /**
  * [hcreate(3)](http://man7.org/linux/man-pages/man3/hcreate.3.html)
@@ -112,7 +112,7 @@
  *
  * Available since API level 28.
  */
-ENTRY* hsearch(ENTRY __entry, ACTION __action) __INTRODUCED_IN(28);
+ENTRY* _Nullable hsearch(ENTRY __entry, ACTION __action) __INTRODUCED_IN(28);
 
 #if defined(__USE_BSD) || defined(__USE_GNU)
 
@@ -124,7 +124,7 @@
  *
  * Available since API level 28.
  */
-int hcreate_r(size_t __n, struct hsearch_data* __table) __INTRODUCED_IN(28);
+int hcreate_r(size_t __n, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
 
 /**
  * [hdestroy_r(3)](http://man7.org/linux/man-pages/man3/hdestroy_r.3.html) destroys
@@ -132,7 +132,7 @@
  *
  * Available since API level 28.
  */
-void hdestroy_r(struct hsearch_data* __table) __INTRODUCED_IN(28);
+void hdestroy_r(struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
 
 /**
  * [hsearch_r(3)](http://man7.org/linux/man-pages/man3/hsearch_r.3.html) finds or
@@ -143,7 +143,7 @@
  *
  * Available since API level 28.
  */
-int hsearch_r(ENTRY __entry, ACTION __action, ENTRY** __result, struct hsearch_data* __table) __INTRODUCED_IN(28);
+int hsearch_r(ENTRY __entry, ACTION __action, ENTRY* _Nullable * _Nonnull __result, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
 
 #endif
 
@@ -158,7 +158,7 @@
  *
  * Available since API level 21.
  */
-void* lfind(const void* __key, const void* __array, size_t* __count, size_t __size, int (*__comparator)(const void*, const void*)) __INTRODUCED_IN(21);
+void* _Nullable lfind(const void* _Nonnull __key, const void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)) __INTRODUCED_IN(21);
 
 /**
  * [lsearch(3)](http://man7.org/linux/man-pages/man3/lsearch.3.html) brute-force
@@ -173,7 +173,7 @@
  *
  * Available since API level 21.
  */
-void* lsearch(const void* __key, void* __array, size_t* __count, size_t __size, int (*__comparator)(const void*, const void*)) __INTRODUCED_IN(21);
+void* _Nonnull lsearch(const void* _Nonnull __key, void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)) __INTRODUCED_IN(21);
 
 /**
  * [tdelete(3)](http://man7.org/linux/man-pages/man3/tdelete.3.html) searches
@@ -182,13 +182,13 @@
  *
  * Returns a pointer to the parent of the deleted node, or NULL on failure.
  */
-void* tdelete(const void* __key, void** __root_ptr, int (*__comparator)(const void*, const void*));
+void* _Nullable tdelete(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
 
 /**
  * [tdestroy(3)](http://man7.org/linux/man-pages/man3/tdestroy.3.html) destroys
  * the hash table `__root` using `__free_fn` on each node.
  */
-void tdestroy(void* __root, void (*__free_fn)(void*));
+void tdestroy(void* _Nullable __root, void (* _Nullable __free_fn)(void* _Nullable));
 
 /**
  * [tfind(3)](http://man7.org/linux/man-pages/man3/tfind.3.html) searches
@@ -197,7 +197,7 @@
  *
  * Returns a pointer to the matching node, or NULL on failure.
  */
-void* tfind(const void* __key, void* const* __root_ptr, int (*__comparator)(const void*, const void*));
+void* _Nullable tfind(const void* _Nonnull __key, void* _Nullable const* _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
 
 /**
  * [tsearch(3)](http://man7.org/linux/man-pages/man3/tsearch.3.html) searches
@@ -208,12 +208,12 @@
  *
  * Returns a pointer to the matching node, or to the newly-added node.
  */
-void* tsearch(const void* __key, void** __root_ptr, int (*__comparator)(const void*, const void*));
+void* _Nullable tsearch(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
 
 /**
  * [twalk(3)](http://man7.org/linux/man-pages/man3/twalk.3.html) calls
  * `__visitor` on every node in the tree.
  */
-void twalk(const void* __root, void (*__visitor)(const void*, VISIT, int)) __INTRODUCED_IN(21);
+void twalk(const void* _Nullable __root, void (* _Nullable __visitor)(const void* _Nullable, VISIT, int)) __INTRODUCED_IN(21);
 
 __END_DECLS
diff --git a/libc/include/semaphore.h b/libc/include/semaphore.h
index 5d66f7e..6ad9ea3 100644
--- a/libc/include/semaphore.h
+++ b/libc/include/semaphore.h
@@ -45,12 +45,12 @@
 
 #define SEM_FAILED __BIONIC_CAST(reinterpret_cast, sem_t*, 0)
 
-int sem_clockwait(sem_t* __sem, clockid_t __clock, const struct timespec* __ts) __INTRODUCED_IN(30);
-int sem_destroy(sem_t* __sem);
-int sem_getvalue(sem_t* __sem, int* __value);
-int sem_init(sem_t* __sem, int __shared, unsigned int __value);
-int sem_post(sem_t* __sem);
-int sem_timedwait(sem_t* __sem, const struct timespec* __ts);
+int sem_clockwait(sem_t* _Nonnull __sem, clockid_t __clock, const struct timespec* _Nonnull __ts) __INTRODUCED_IN(30);
+int sem_destroy(sem_t* _Nonnull __sem);
+int sem_getvalue(sem_t* _Nonnull __sem, int* _Nonnull __value);
+int sem_init(sem_t* _Nonnull __sem, int __shared, unsigned int __value);
+int sem_post(sem_t* _Nonnull __sem);
+int sem_timedwait(sem_t* _Nonnull __sem, const struct timespec* _Nonnull __ts);
 /*
  * POSIX historically only supported using sem_timedwait() with CLOCK_REALTIME, however that is
  * typically inappropriate, since that clock can change dramatically, causing the timeout to either
@@ -59,14 +59,14 @@
  * Note that sem_clockwait() allows specifying an arbitrary clock and has superseded this
  * function.
  */
-int sem_timedwait_monotonic_np(sem_t* __sem, const struct timespec* __ts) __INTRODUCED_IN(28);
-int sem_trywait(sem_t* __sem);
-int sem_wait(sem_t* __sem);
+int sem_timedwait_monotonic_np(sem_t* _Nonnull __sem, const struct timespec* _Nonnull __ts) __INTRODUCED_IN(28);
+int sem_trywait(sem_t* _Nonnull __sem);
+int sem_wait(sem_t* _Nonnull __sem);
 
 /* These aren't actually implemented. */
-sem_t* sem_open(const char* __name, int _flags, ...);
-int sem_close(sem_t* __sem);
-int sem_unlink(const char* __name);
+sem_t* _Nullable sem_open(const char* _Nonnull __name, int _flags, ...);
+int sem_close(sem_t* _Nonnull __sem);
+int sem_unlink(const char* _Nonnull __name);
 
 __END_DECLS
 
diff --git a/libc/include/setjmp.h b/libc/include/setjmp.h
index c2a9544..6d047ae 100644
--- a/libc/include/setjmp.h
+++ b/libc/include/setjmp.h
@@ -47,12 +47,33 @@
 #include <sys/cdefs.h>
 
 #if defined(__aarch64__)
+/**
+ * The size in words of an arm64 jmp_buf. Room for callee-saved registers,
+ * including floating point, stack pointer and program counter, various
+ * internal implementation details, and leaving some free space.
+ *
+ * Coincidentally matches OpenBSD, though they also save/restore the
+ * floating point status register too.
+ */
 #define _JBLEN 32
 #elif defined(__arm__)
+/** The size in words of an arm32 jmp_buf. Inherited from OpenBSD. */
 #define _JBLEN 64
 #elif defined(__i386__)
+/** The size in words of an x86 jmp_buf. Inherited from OpenBSD. */
 #define _JBLEN 10
+#elif defined(__riscv)
+/**
+ * The size in words of a riscv64 jmp_buf. Room for callee-saved registers,
+ * including floating point, stack pointer and program counter, various
+ * internal implementation details, and leaving some free space.
+ *
+ * Coincidentally matches OpenBSD, though they also save/restore the
+ * floating point status register too.
+ */
+#define _JBLEN 32
 #elif defined(__x86_64__)
+/** The size in words of an x86-64 jmp_buf. Inherited from OpenBSD. */
 #define _JBLEN 11
 #endif
 
diff --git a/libc/include/signal.h b/libc/include/signal.h
index 532e4a5..b9aeaab 100644
--- a/libc/include/signal.h
+++ b/libc/include/signal.h
@@ -54,40 +54,36 @@
 int __libc_current_sigrtmin(void) __INTRODUCED_IN(21);
 int __libc_current_sigrtmax(void) __INTRODUCED_IN(21);
 
-extern const char* const sys_siglist[_NSIG];
-extern const char* const sys_signame[_NSIG]; /* BSD compatibility. */
+extern const char* _Nonnull const sys_siglist[_NSIG];
+extern const char* _Nonnull const sys_signame[_NSIG]; /* BSD compatibility. */
 
 #define si_timerid si_tid /* glibc compatibility. */
 
-int sigaction(int __signal, const struct sigaction* __new_action, struct sigaction* __old_action);
-int sigaction64(int __signal, const struct sigaction64* __new_action, struct sigaction64* __old_action) __INTRODUCED_IN(28);
+int sigaction(int __signal, const struct sigaction* _Nullable __new_action, struct sigaction* _Nullable __old_action);
+int sigaction64(int __signal, const struct sigaction64* _Nullable __new_action, struct sigaction64* _Nullable __old_action) __INTRODUCED_IN(28);
 
 int siginterrupt(int __signal, int __flag);
 
-#if __ANDROID_API__ >= 21
-sighandler_t signal(int __signal, sighandler_t __handler) __INTRODUCED_IN(21);
-int sigaddset(sigset_t* __set, int __signal) __INTRODUCED_IN(21);
-int sigaddset64(sigset64_t* __set, int __signal) __INTRODUCED_IN(28);
-int sigdelset(sigset_t* __set, int __signal) __INTRODUCED_IN(21);
-int sigdelset64(sigset64_t* __set, int __signal) __INTRODUCED_IN(28);
-int sigemptyset(sigset_t* __set) __INTRODUCED_IN(21);
-int sigemptyset64(sigset64_t* __set) __INTRODUCED_IN(28);
-int sigfillset(sigset_t* __set) __INTRODUCED_IN(21);
-int sigfillset64(sigset64_t* __set) __INTRODUCED_IN(28);
-int sigismember(const sigset_t* __set, int __signal) __INTRODUCED_IN(21);
-int sigismember64(const sigset64_t* __set, int __signal) __INTRODUCED_IN(28);
-#else
-// Implemented as static inlines before 21.
-#endif
+sighandler_t _Nonnull signal(int __signal, sighandler_t _Nullable __handler) __INTRODUCED_IN(21);
+int sigaddset(sigset_t* _Nonnull __set, int __signal) __INTRODUCED_IN(21);
+int sigaddset64(sigset64_t* _Nonnull __set, int __signal) __INTRODUCED_IN(28);
+int sigdelset(sigset_t* _Nonnull __set, int __signal) __INTRODUCED_IN(21);
+int sigdelset64(sigset64_t* _Nonnull __set, int __signal) __INTRODUCED_IN(28);
+int sigemptyset(sigset_t* _Nonnull __set) __INTRODUCED_IN(21);
+int sigemptyset64(sigset64_t* _Nonnull __set) __INTRODUCED_IN(28);
+int sigfillset(sigset_t* _Nonnull __set) __INTRODUCED_IN(21);
+int sigfillset64(sigset64_t* _Nonnull __set) __INTRODUCED_IN(28);
+int sigismember(const sigset_t* _Nonnull __set, int __signal) __INTRODUCED_IN(21);
+int sigismember64(const sigset64_t* _Nonnull __set, int __signal) __INTRODUCED_IN(28);
 
-int sigpending(sigset_t* __set);
-int sigpending64(sigset64_t* __set) __INTRODUCED_IN(28);
-int sigprocmask(int __how, const sigset_t* __new_set, sigset_t* __old_set);
-int sigprocmask64(int __how, const sigset64_t* __new_set, sigset64_t* __old_set) __INTRODUCED_IN(28);
-int sigsuspend(const sigset_t* __mask);
-int sigsuspend64(const sigset64_t* __mask) __INTRODUCED_IN(28);
-int sigwait(const sigset_t* __set, int* __signal);
-int sigwait64(const sigset64_t* __set, int* __signal) __INTRODUCED_IN(28);
+int sigpending(sigset_t* _Nonnull __set);
+int sigpending64(sigset64_t* _Nonnull __set) __INTRODUCED_IN(28);
+int sigprocmask(int __how, const sigset_t* _Nullable __new_set, sigset_t* _Nullable __old_set);
+int sigprocmask64(int __how, const sigset64_t* _Nullable __new_set, sigset64_t* _Nullable __old_set) __INTRODUCED_IN(28);
+int sigsuspend(const sigset_t* _Nonnull __mask);
+int sigsuspend64(const sigset64_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int sigwait(const sigset_t* _Nonnull __set, int* _Nonnull __signal);
+int sigwait64(const sigset64_t* _Nonnull __set, int* _Nonnull __signal) __INTRODUCED_IN(28);
 
 int sighold(int __signal)
   __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
@@ -99,7 +95,7 @@
 int sigrelse(int __signal)
   __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
   __INTRODUCED_IN(26);
-sighandler_t sigset(int __signal, sighandler_t __handler)
+sighandler_t _Nonnull sigset(int __signal, sighandler_t _Nullable __handler)
   __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN(26);
 
 int raise(int __signal);
@@ -107,27 +103,25 @@
 int killpg(int __pgrp, int __signal);
 int tgkill(int __tgid, int __tid, int __signal);
 
-int sigaltstack(const stack_t* __new_signal_stack, stack_t* __old_signal_stack);
+int sigaltstack(const stack_t* _Nullable __new_signal_stack, stack_t*  _Nullable __old_signal_stack);
 
-void psiginfo(const siginfo_t* __info, const char* __msg) __INTRODUCED_IN(17);
-void psignal(int __signal, const char* __msg) __INTRODUCED_IN(17);
+void psiginfo(const siginfo_t* _Nonnull __info, const char* _Nullable __msg) __INTRODUCED_IN(17);
+void psignal(int __signal, const char* _Nullable __msg) __INTRODUCED_IN(17);
 
 int pthread_kill(pthread_t __pthread, int __signal);
 #if defined(__USE_GNU)
 int pthread_sigqueue(pthread_t __pthread, int __signal, const union sigval __value) __INTRODUCED_IN(29);
 #endif
 
-int pthread_sigmask(int __how, const sigset_t* __new_set, sigset_t* __old_set);
-int pthread_sigmask64(int __how, const sigset64_t* __new_set, sigset64_t* __old_set) __INTRODUCED_IN(28);
+int pthread_sigmask(int __how, const sigset_t* _Nullable __new_set, sigset_t* _Nullable __old_set);
+int pthread_sigmask64(int __how, const sigset64_t* _Nullable __new_set, sigset64_t* _Nullable __old_set) __INTRODUCED_IN(28);
 
 int sigqueue(pid_t __pid, int __signal, const union sigval __value) __INTRODUCED_IN(23);
-int sigtimedwait(const sigset_t* __set, siginfo_t* __info, const struct timespec* __timeout) __INTRODUCED_IN(23);
-int sigtimedwait64(const sigset64_t* __set, siginfo_t* __info, const struct timespec* __timeout) __INTRODUCED_IN(28);
-int sigwaitinfo(const sigset_t* __set, siginfo_t* __info) __INTRODUCED_IN(23);
-int sigwaitinfo64(const sigset64_t* __set, siginfo_t* __info) __INTRODUCED_IN(28);
+int sigtimedwait(const sigset_t* _Nonnull __set, siginfo_t* _Nullable __info, const struct timespec* _Nullable __timeout) __INTRODUCED_IN(23);
+int sigtimedwait64(const sigset64_t* _Nonnull __set, siginfo_t* _Nullable __info, const struct timespec* _Nullable __timeout) __INTRODUCED_IN(28);
+int sigwaitinfo(const sigset_t* _Nonnull __set, siginfo_t* _Nullable __info) __INTRODUCED_IN(23);
+int sigwaitinfo64(const sigset64_t* _Nonnull __set, siginfo_t* _Nullable __info) __INTRODUCED_IN(28);
 
 __END_DECLS
 
-#include <android/legacy_signal_inlines.h>
-
 #endif
diff --git a/libc/include/spawn.h b/libc/include/spawn.h
index e445453..6c34b98 100644
--- a/libc/include/spawn.h
+++ b/libc/include/spawn.h
@@ -52,40 +52,43 @@
 typedef struct __posix_spawnattr* posix_spawnattr_t;
 typedef struct __posix_spawn_file_actions* posix_spawn_file_actions_t;
 
-int posix_spawn(pid_t* __pid, const char* __path, const posix_spawn_file_actions_t* __actions, const posix_spawnattr_t* __attr, char* const __argv[], char* const __env[]) __INTRODUCED_IN(28);
-int posix_spawnp(pid_t* __pid, const char* __file, const posix_spawn_file_actions_t* __actions, const posix_spawnattr_t* __attr, char* const __argv[], char* const __env[]) __INTRODUCED_IN(28);
+int posix_spawn(pid_t* _Nullable __pid, const char* _Nonnull __path, const posix_spawn_file_actions_t _Nullable * _Nullable __actions, const posix_spawnattr_t _Nullable * _Nullable __attr, char* const _Nonnull __argv[_Nonnull], char* const _Nullable __env[_Nullable]) __INTRODUCED_IN(28);
+int posix_spawnp(pid_t* _Nullable __pid, const char* _Nonnull __file, const posix_spawn_file_actions_t _Nullable * _Nullable __actions, const posix_spawnattr_t _Nullable * _Nullable __attr, char* const _Nonnull __argv[_Nonnull], char* const _Nullable __env[_Nullable]) __INTRODUCED_IN(28);
 
-int posix_spawnattr_init(posix_spawnattr_t* __attr) __INTRODUCED_IN(28);
-int posix_spawnattr_destroy(posix_spawnattr_t* __attr) __INTRODUCED_IN(28);
+int posix_spawnattr_init(posix_spawnattr_t _Nonnull * _Nonnull __attr) __INTRODUCED_IN(28);
+int posix_spawnattr_destroy(posix_spawnattr_t _Nonnull * _Nonnull __attr) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setflags(posix_spawnattr_t* __attr, short __flags) __INTRODUCED_IN(28);
-int posix_spawnattr_getflags(const posix_spawnattr_t* __attr, short* __flags) __INTRODUCED_IN(28);
+int posix_spawnattr_setflags(posix_spawnattr_t _Nonnull * _Nonnull __attr, short __flags) __INTRODUCED_IN(28);
+int posix_spawnattr_getflags(const posix_spawnattr_t _Nonnull * _Nonnull __attr, short* _Nonnull __flags) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setpgroup(posix_spawnattr_t* __attr, pid_t __pgroup) __INTRODUCED_IN(28);
-int posix_spawnattr_getpgroup(const posix_spawnattr_t* __attr, pid_t* __pgroup) __INTRODUCED_IN(28);
+int posix_spawnattr_setpgroup(posix_spawnattr_t _Nonnull * _Nonnull __attr, pid_t __pgroup) __INTRODUCED_IN(28);
+int posix_spawnattr_getpgroup(const posix_spawnattr_t _Nonnull * _Nonnull __attr, pid_t* _Nonnull __pgroup) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setsigmask(posix_spawnattr_t* __attr, const sigset_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_setsigmask64(posix_spawnattr_t* __attr, const sigset64_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_getsigmask(const posix_spawnattr_t* __attr, sigset_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_getsigmask64(const posix_spawnattr_t* __attr, sigset64_t* __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_setsigmask(posix_spawnattr_t _Nonnull * _Nonnull __attr, const sigset_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_setsigmask64(posix_spawnattr_t _Nonnull * _Nonnull __attr, const sigset64_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_getsigmask(const posix_spawnattr_t _Nonnull * _Nonnull __attr, sigset_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_getsigmask64(const posix_spawnattr_t _Nonnull * _Nonnull __attr, sigset64_t* _Nonnull __mask) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setsigdefault(posix_spawnattr_t* __attr, const sigset_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_setsigdefault64(posix_spawnattr_t* __attr, const sigset64_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_getsigdefault(const posix_spawnattr_t* __attr, sigset_t* __mask) __INTRODUCED_IN(28);
-int posix_spawnattr_getsigdefault64(const posix_spawnattr_t* __attr, sigset64_t* __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_setsigdefault(posix_spawnattr_t _Nonnull * _Nonnull __attr, const sigset_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_setsigdefault64(posix_spawnattr_t _Nonnull * _Nonnull __attr, const sigset64_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_getsigdefault(const posix_spawnattr_t _Nonnull * _Nonnull __attr, sigset_t* _Nonnull __mask) __INTRODUCED_IN(28);
+int posix_spawnattr_getsigdefault64(const posix_spawnattr_t _Nonnull * _Nonnull __attr, sigset64_t* _Nonnull __mask) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setschedparam(posix_spawnattr_t* __attr, const struct sched_param* __param) __INTRODUCED_IN(28);
-int posix_spawnattr_getschedparam(const posix_spawnattr_t* __attr, struct sched_param* __param) __INTRODUCED_IN(28);
+int posix_spawnattr_setschedparam(posix_spawnattr_t _Nonnull * _Nonnull __attr, const struct sched_param* _Nonnull __param) __INTRODUCED_IN(28);
+int posix_spawnattr_getschedparam(const posix_spawnattr_t _Nonnull * _Nonnull __attr, struct sched_param* _Nonnull __param) __INTRODUCED_IN(28);
 
-int posix_spawnattr_setschedpolicy(posix_spawnattr_t* __attr, int __policy) __INTRODUCED_IN(28);
-int posix_spawnattr_getschedpolicy(const posix_spawnattr_t* __attr, int* __policy) __INTRODUCED_IN(28);
+int posix_spawnattr_setschedpolicy(posix_spawnattr_t _Nonnull * _Nonnull __attr, int __policy) __INTRODUCED_IN(28);
+int posix_spawnattr_getschedpolicy(const posix_spawnattr_t _Nonnull * _Nonnull __attr, int* _Nonnull __policy) __INTRODUCED_IN(28);
 
-int posix_spawn_file_actions_init(posix_spawn_file_actions_t* __actions) __INTRODUCED_IN(28);
-int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t* __actions) __INTRODUCED_IN(28);
+int posix_spawn_file_actions_init(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions) __INTRODUCED_IN(28);
+int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions) __INTRODUCED_IN(28);
 
-int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t* __actions, int __fd, const char* __path, int __flags, mode_t __mode) __INTRODUCED_IN(28);
-int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t* __actions, int __fd) __INTRODUCED_IN(28);
-int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t* __actions, int __fd, int __new_fd) __INTRODUCED_IN(28);
+int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions, int __fd, const char* _Nonnull __path, int __flags, mode_t __mode) __INTRODUCED_IN(28);
+int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions, int __fd) __INTRODUCED_IN(28);
+int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions, int __fd, int __new_fd) __INTRODUCED_IN(28);
+
+int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions, const char* _Nonnull __path) __INTRODUCED_IN(34);
+int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t _Nonnull * _Nonnull __actions, int __fd) __INTRODUCED_IN(34);
 
 __END_DECLS
 
diff --git a/libc/include/stdio.h b/libc/include/stdio.h
index 9de12a4..d7b65e4 100644
--- a/libc/include/stdio.h
+++ b/libc/include/stdio.h
@@ -59,9 +59,9 @@
 typedef struct __sFILE FILE;
 
 #if __ANDROID_API__ >= 23
-extern FILE* stdin __INTRODUCED_IN(23);
-extern FILE* stdout __INTRODUCED_IN(23);
-extern FILE* stderr __INTRODUCED_IN(23);
+extern FILE* _Nonnull stdin __INTRODUCED_IN(23);
+extern FILE* _Nonnull stdout __INTRODUCED_IN(23);
+extern FILE* _Nonnull stderr __INTRODUCED_IN(23);
 
 /* C99 and earlier plus current C++ standards say these must be macros. */
 #define stdin stdin
@@ -103,66 +103,54 @@
 #define L_tmpnam 4096
 #define TMP_MAX 308915776
 
-void clearerr(FILE* __fp);
-int fclose(FILE* __fp);
-int feof(FILE* __fp);
-int ferror(FILE* __fp);
-int fflush(FILE* __fp);
-int fgetc(FILE* __fp);
-char* fgets(char* __buf, int __size, FILE* __fp);
-int fprintf(FILE* __fp , const char* __fmt, ...) __printflike(2, 3);
-int fputc(int __ch, FILE* __fp);
-int fputs(const char* __s, FILE* __fp);
-size_t fread(void* __buf, size_t __size, size_t __count, FILE* __fp);
-int fscanf(FILE* __fp, const char* __fmt, ...) __scanflike(2, 3);
-size_t fwrite(const void* __buf, size_t __size, size_t __count, FILE* __fp);
-int getc(FILE* __fp);
+void clearerr(FILE* _Nonnull __fp);
+int fclose(FILE* _Nonnull __fp);
+int feof(FILE* _Nonnull __fp);
+int ferror(FILE* _Nonnull __fp);
+int fflush(FILE* _Nullable __fp);
+int fgetc(FILE* _Nonnull __fp);
+char* _Nullable fgets(char* _Nonnull __buf, int __size, FILE* _Nonnull __fp);
+int fprintf(FILE* _Nonnull __fp , const char* _Nonnull __fmt, ...) __printflike(2, 3);
+int fputc(int __ch, FILE* _Nonnull __fp);
+int fputs(const char* _Nonnull __s, FILE* _Nonnull __fp);
+size_t fread(void* _Nonnull __buf, size_t __size, size_t __count, FILE* _Nonnull __fp);
+int fscanf(FILE* _Nonnull __fp, const char* _Nonnull __fmt, ...) __scanflike(2, 3);
+size_t fwrite(const void* _Nonnull __buf, size_t __size, size_t __count, FILE* _Nonnull __fp);
+int getc(FILE* _Nonnull __fp);
 int getchar(void);
-ssize_t getdelim(char** __line_ptr, size_t* __line_length_ptr, int __delimiter, FILE* __fp) __INTRODUCED_IN(18);
-ssize_t getline(char** __line_ptr, size_t* __line_length_ptr, FILE* __fp) __INTRODUCED_IN(18);
+ssize_t getdelim(char* _Nullable * _Nonnull __line_ptr, size_t* _Nonnull __line_length_ptr, int __delimiter, FILE* _Nonnull __fp) __INTRODUCED_IN(18);
+ssize_t getline(char* _Nullable * _Nonnull __line_ptr, size_t* _Nonnull __line_length_ptr, FILE* _Nonnull __fp) __INTRODUCED_IN(18);
 
-void perror(const char* __msg);
-int printf(const char* __fmt, ...) __printflike(1, 2);
-int putc(int __ch, FILE* __fp);
+void perror(const char* _Nullable __msg);
+int printf(const char* _Nonnull __fmt, ...) __printflike(1, 2);
+int putc(int __ch, FILE* _Nonnull __fp);
 int putchar(int __ch);
-int puts(const char* __s);
-int remove(const char* __path);
-void rewind(FILE* __fp);
-int scanf(const char* __fmt, ...) __scanflike(1, 2);
-void setbuf(FILE* __fp, char* __buf);
-int setvbuf(FILE* __fp, char* __buf, int __mode, size_t __size);
-int sscanf(const char* __s, const char* __fmt, ...) __scanflike(2, 3);
-int ungetc(int __ch, FILE* __fp);
-int vfprintf(FILE* __fp, const char* __fmt, va_list __args) __printflike(2, 0);
-int vprintf(const char* __fp, va_list __args) __printflike(1, 0);
+int puts(const char* _Nonnull __s);
+int remove(const char* _Nonnull __path);
+void rewind(FILE* _Nonnull __fp);
+int scanf(const char* _Nonnull __fmt, ...) __scanflike(1, 2);
+void setbuf(FILE* _Nonnull __fp, char* _Nullable __buf);
+int setvbuf(FILE* _Nonnull __fp, char* _Nullable __buf, int __mode, size_t __size);
+int sscanf(const char* _Nonnull __s, const char* _Nonnull __fmt, ...) __scanflike(2, 3);
+int ungetc(int __ch, FILE* _Nonnull __fp);
+int vfprintf(FILE* _Nonnull __fp, const char* _Nonnull __fmt, va_list __args) __printflike(2, 0);
+int vprintf(const char* _Nonnull __fp, va_list __args) __printflike(1, 0);
 
-#if __ANDROID_API__ >= 21
-int dprintf(int __fd, const char* __fmt, ...) __printflike(2, 3) __INTRODUCED_IN(21);
-int vdprintf(int __fd, const char* __fmt, va_list __args) __printflike(2, 0) __INTRODUCED_IN(21);
-#else
-/*
- * Old versions of Android called these fdprintf and vfdprintf out of fears that the glibc names
- * would collide with user debug printfs.
- *
- * Allow users to just use dprintf and vfdprintf on any version by renaming those calls to their
- * legacy equivalents if needed.
- */
-int dprintf(int __fd, const char* __fmt, ...) __RENAME(fdprintf) __printflike(2, 3);
-int vdprintf(int __fd, const char* __fmt, va_list __args) __RENAME(vfdprintf) __printflike(2, 0);
-#endif
+int dprintf(int __fd, const char* _Nonnull __fmt, ...) __printflike(2, 3) __INTRODUCED_IN(21);
+int vdprintf(int __fd, const char* _Nonnull __fmt, va_list __args) __printflike(2, 0) __INTRODUCED_IN(21);
 
 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ < 201112L) || \
     (defined(__cplusplus) && __cplusplus <= 201103L)
-char* gets(char* __buf) __attribute__((deprecated("gets is unsafe, use fgets instead")));
+char* _Nullable gets(char* _Nonnull __buf) __attribute__((deprecated("gets is unsafe, use fgets instead")));
 #endif
-int sprintf(char* __s, const char* __fmt, ...)
+int sprintf(char* __BIONIC_COMPLICATED_NULLNESS __s, const char* _Nonnull __fmt, ...)
     __printflike(2, 3) __warnattr_strict("sprintf is often misused; please use snprintf");
-int vsprintf(char* __s, const char* __fmt, va_list __args)
+int vsprintf(char* __BIONIC_COMPLICATED_NULLNESS __s, const char* _Nonnull __fmt, va_list __args)
     __printflike(2, 0) __warnattr_strict("vsprintf is often misused; please use vsnprintf");
-char* tmpnam(char* __s)
+char* _Nullable tmpnam(char* _Nullable __s)
     __warnattr("tmpnam is unsafe, use mkstemp or tmpfile instead");
 #define P_tmpdir "/tmp/" /* deprecated */
-char* tempnam(const char* __dir, const char* __prefix)
+char* _Nullable tempnam(const char* _Nullable __dir, const char* _Nullable __prefix)
     __warnattr("tempnam is unsafe, use mkstemp or tmpfile instead");
 
 /**
@@ -171,7 +159,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int rename(const char* __old_path, const char* __new_path);
+int rename(const char* _Nonnull __old_path, const char* _Nonnull __new_path);
 
 /**
  * [renameat(2)](http://man7.org/linux/man-pages/man2/renameat.2.html) changes
@@ -179,7 +167,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int renameat(int __old_dir_fd, const char* __old_path, int __new_dir_fd, const char* __new_path);
+int renameat(int __old_dir_fd, const char* _Nonnull __old_path, int __new_dir_fd, const char* _Nonnull __new_path);
 
 #if defined(__USE_GNU)
 
@@ -208,108 +196,111 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int renameat2(int __old_dir_fd, const char* __old_path, int __new_dir_fd, const char* __new_path, unsigned __flags) __INTRODUCED_IN(30);
+int renameat2(int __old_dir_fd, const char* _Nonnull __old_path, int __new_dir_fd, const char* _Nonnull __new_path, unsigned __flags) __INTRODUCED_IN(30);
 
 #endif
 
-int fseek(FILE* __fp, long __offset, int __whence);
-long ftell(FILE* __fp);
+int fseek(FILE* _Nonnull __fp, long __offset, int __whence);
+long ftell(FILE* _Nonnull __fp);
 
 /* See https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
 #if defined(__USE_FILE_OFFSET64)
-int fgetpos(FILE* __fp, fpos_t* __pos) __RENAME(fgetpos64) __INTRODUCED_IN(24);
-int fsetpos(FILE* __fp, const fpos_t* __pos) __RENAME(fsetpos64) __INTRODUCED_IN(24);
-int fseeko(FILE* __fp, off_t __offset, int __whence) __RENAME(fseeko64) __INTRODUCED_IN(24);
-off_t ftello(FILE* __fp) __RENAME(ftello64) __INTRODUCED_IN(24);
+int fgetpos(FILE* _Nonnull __fp, fpos_t* _Nonnull __pos) __RENAME(fgetpos64) __INTRODUCED_IN(24);
+int fsetpos(FILE* _Nonnull __fp, const fpos_t* _Nonnull __pos) __RENAME(fsetpos64) __INTRODUCED_IN(24);
+int fseeko(FILE* _Nonnull __fp, off_t __offset, int __whence) __RENAME(fseeko64) __INTRODUCED_IN(24);
+off_t ftello(FILE* _Nonnull __fp) __RENAME(ftello64) __INTRODUCED_IN(24);
 #  if defined(__USE_BSD)
-FILE* funopen(const void* __cookie,
-              int (*__read_fn)(void*, char*, int),
-              int (*__write_fn)(void*, const char*, int),
-              fpos_t (*__seek_fn)(void*, fpos_t, int),
-              int (*__close_fn)(void*)) __RENAME(funopen64) __INTRODUCED_IN(24);
+/* If __read_fn and __write_fn are both nullptr, it will cause EINVAL */
+FILE* _Nullable funopen(const void* _Nullable __cookie,
+              int (* __BIONIC_COMPLICATED_NULLNESS __read_fn)(void* _Nonnull, char* _Nonnull, int),
+              int (* __BIONIC_COMPLICATED_NULLNESS __write_fn)(void* _Nonnull, const char* _Nonnull, int),
+              fpos_t (* _Nullable __seek_fn)(void* _Nonnull, fpos_t, int),
+              int (* _Nullable __close_fn)(void* _Nonnull)) __RENAME(funopen64) __INTRODUCED_IN(24);
 #  endif
 #else
-int fgetpos(FILE* __fp, fpos_t* __pos);
-int fsetpos(FILE* __fp, const fpos_t* __pos);
-int fseeko(FILE* __fp, off_t __offset, int __whence);
-off_t ftello(FILE* __fp);
+int fgetpos(FILE* _Nonnull __fp, fpos_t* _Nonnull __pos);
+int fsetpos(FILE* _Nonnull __fp, const fpos_t* _Nonnull __pos);
+int fseeko(FILE* _Nonnull __fp, off_t __offset, int __whence);
+off_t ftello(FILE* _Nonnull __fp);
 #  if defined(__USE_BSD)
-FILE* funopen(const void* __cookie,
-              int (*__read_fn)(void*, char*, int),
-              int (*__write_fn)(void*, const char*, int),
-              fpos_t (*__seek_fn)(void*, fpos_t, int),
-              int (*__close_fn)(void*));
+/* If __read_fn and __write_fn are both nullptr, it will cause EINVAL */
+FILE* _Nullable funopen(const void* _Nullable __cookie,
+              int (* __BIONIC_COMPLICATED_NULLNESS __read_fn)(void* _Nonnull, char* _Nonnull, int),
+              int (* __BIONIC_COMPLICATED_NULLNESS __write_fn)(void* _Nonnull, const char* _Nonnull, int),
+              fpos_t (* _Nullable __seek_fn)(void* _Nonnull, fpos_t, int),
+              int (* _Nullable __close_fn)(void* _Nonnull));
 #  endif
 #endif
-int fgetpos64(FILE* __fp, fpos64_t* __pos) __INTRODUCED_IN(24);
-int fsetpos64(FILE* __fp, const fpos64_t* __pos) __INTRODUCED_IN(24);
-int fseeko64(FILE* __fp, off64_t __offset, int __whence) __INTRODUCED_IN(24);
-off64_t ftello64(FILE* __fp) __INTRODUCED_IN(24);
+int fgetpos64(FILE* _Nonnull __fp, fpos64_t* _Nonnull __pos) __INTRODUCED_IN(24);
+int fsetpos64(FILE* _Nonnull __fp, const fpos64_t* _Nonnull __pos) __INTRODUCED_IN(24);
+int fseeko64(FILE* _Nonnull __fp, off64_t __offset, int __whence) __INTRODUCED_IN(24);
+off64_t ftello64(FILE* _Nonnull __fp) __INTRODUCED_IN(24);
 #if defined(__USE_BSD)
-FILE* funopen64(const void* __cookie,
-                int (*__read_fn)(void*, char*, int),
-                int (*__write_fn)(void*, const char*, int),
-                fpos64_t (*__seek_fn)(void*, fpos64_t, int),
-                int (*__close_fn)(void*)) __INTRODUCED_IN(24);
+/* If __read_fn and __write_fn are both nullptr, it will cause EINVAL */
+FILE* _Nullable funopen64(const void* _Nullable __cookie,
+                int (* __BIONIC_COMPLICATED_NULLNESS __read_fn)(void* _Nonnull, char* _Nonnull, int),
+                int (* __BIONIC_COMPLICATED_NULLNESS __write_fn)(void* _Nonnull, const char* _Nonnull, int),
+                fpos64_t (* _Nullable __seek_fn)(void* _Nonnull, fpos64_t, int),
+                int (* _Nullable __close_fn)(void* _Nonnull)) __INTRODUCED_IN(24);
 #endif
 
-FILE* fopen(const char* __path, const char* __mode);
-FILE* fopen64(const char* __path, const char* __mode) __INTRODUCED_IN(24);
-FILE* freopen(const char* __path, const char* __mode, FILE* __fp);
-FILE* freopen64(const char* __path, const char* __mode, FILE* __fp) __INTRODUCED_IN(24);
-FILE* tmpfile(void);
-FILE* tmpfile64(void) __INTRODUCED_IN(24);
+FILE* _Nullable fopen(const char* _Nonnull __path, const char* _Nonnull __mode);
+FILE* _Nullable fopen64(const char* _Nonnull __path, const char* _Nonnull __mode) __INTRODUCED_IN(24);
+FILE* _Nullable freopen(const char* _Nullable __path, const char* _Nonnull __mode, FILE* _Nonnull __fp);
+FILE* _Nullable freopen64(const char* _Nullable __path, const char* _Nonnull __mode, FILE* _Nonnull __fp) __INTRODUCED_IN(24);
+FILE* _Nullable tmpfile(void);
+FILE* _Nullable tmpfile64(void) __INTRODUCED_IN(24);
 
-int snprintf(char* __buf, size_t __size, const char* __fmt, ...) __printflike(3, 4);
-int vfscanf(FILE* __fp, const char* __fmt, va_list __args) __scanflike(2, 0);
-int vscanf(const char* __fmt , va_list __args) __scanflike(1, 0);
-int vsnprintf(char* __buf, size_t __size, const char* __fmt, va_list __args) __printflike(3, 0);
-int vsscanf(const char* __s, const char* __fmt, va_list __args) __scanflike(2, 0);
+int snprintf(char* __BIONIC_COMPLICATED_NULLNESS __buf, size_t __size, const char* _Nonnull __fmt, ...) __printflike(3, 4);
+int vfscanf(FILE* _Nonnull __fp, const char* _Nonnull __fmt, va_list __args) __scanflike(2, 0);
+int vscanf(const char* _Nonnull __fmt , va_list __args) __scanflike(1, 0);
+int vsnprintf(char* __BIONIC_COMPLICATED_NULLNESS __buf, size_t __size, const char* _Nonnull __fmt, va_list __args) __printflike(3, 0);
+int vsscanf(const char* _Nonnull __s, const char* _Nonnull __fmt, va_list __args) __scanflike(2, 0);
 
 #define L_ctermid 1024 /* size for ctermid() */
-char* ctermid(char* __buf) __INTRODUCED_IN(26);
+char* _Nonnull ctermid(char* _Nullable __buf) __INTRODUCED_IN(26);
 
-FILE* fdopen(int __fd, const char* __mode);
-int fileno(FILE* __fp);
-int pclose(FILE* __fp);
-FILE* popen(const char* __command, const char* __mode);
-void flockfile(FILE* __fp);
-int ftrylockfile(FILE* __fp);
-void funlockfile(FILE* __fp);
-int getc_unlocked(FILE* __fp);
+FILE* _Nullable fdopen(int __fd, const char* _Nonnull __mode);
+int fileno(FILE* _Nonnull __fp);
+int pclose(FILE* _Nonnull __fp);
+FILE* _Nullable popen(const char* _Nonnull __command, const char* _Nonnull __mode);
+void flockfile(FILE* _Nonnull  __fp);
+int ftrylockfile(FILE* _Nonnull __fp);
+void funlockfile(FILE* _Nonnull __fp);
+int getc_unlocked(FILE* _Nonnull __fp);
 int getchar_unlocked(void);
-int putc_unlocked(int __ch, FILE* __fp);
+int putc_unlocked(int __ch, FILE* _Nonnull __fp);
 int putchar_unlocked(int __ch);
 
-FILE* fmemopen(void* __buf, size_t __size, const char* __mode) __INTRODUCED_IN(23);
-FILE* open_memstream(char** __ptr, size_t* __size_ptr) __INTRODUCED_IN(23);
+FILE* _Nullable fmemopen(void* _Nullable __buf, size_t __size, const char* _Nonnull __mode) __INTRODUCED_IN(23);
+FILE* _Nullable open_memstream(char* _Nonnull * _Nonnull __ptr, size_t* _Nonnull __size_ptr) __INTRODUCED_IN(23);
 
 #if defined(__USE_BSD) || defined(__BIONIC__) /* Historically bionic exposed these. */
-int  asprintf(char** __s_ptr, const char* __fmt, ...) __printflike(2, 3);
-char* fgetln(FILE* __fp, size_t* __length_ptr);
-int fpurge(FILE* __fp);
-void setbuffer(FILE* __fp, char* __buf, int __size);
-int setlinebuf(FILE* __fp);
-int vasprintf(char** __s_ptr, const char* __fmt, va_list __args) __printflike(2, 0);
-void clearerr_unlocked(FILE* __fp) __INTRODUCED_IN(23);
-int feof_unlocked(FILE* __fp) __INTRODUCED_IN(23);
-int ferror_unlocked(FILE* __fp) __INTRODUCED_IN(23);
-int fileno_unlocked(FILE* __fp) __INTRODUCED_IN(24);
+int  asprintf(char* _Nullable * _Nonnull __s_ptr, const char* _Nonnull __fmt, ...) __printflike(2, 3);
+char* _Nullable fgetln(FILE* _Nonnull __fp, size_t* _Nonnull __length_ptr);
+int fpurge(FILE* _Nonnull __fp);
+void setbuffer(FILE* _Nonnull __fp, char* _Nullable __buf, int __size);
+int setlinebuf(FILE* _Nonnull __fp);
+int vasprintf(char* _Nullable * _Nonnull __s_ptr, const char* _Nonnull __fmt, va_list __args) __printflike(2, 0);
+void clearerr_unlocked(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
+int feof_unlocked(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
+int ferror_unlocked(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
+int fileno_unlocked(FILE* _Nonnull __fp) __INTRODUCED_IN(24);
 #define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
 #define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
 #endif
 
 #if defined(__USE_BSD)
-int fflush_unlocked(FILE* __fp) __INTRODUCED_IN(28);
-int fgetc_unlocked(FILE* __fp) __INTRODUCED_IN(28);
-int fputc_unlocked(int __ch, FILE* __fp) __INTRODUCED_IN(28);
-size_t fread_unlocked(void* __buf, size_t __size, size_t __count, FILE* __fp) __INTRODUCED_IN(28);
-size_t fwrite_unlocked(const void* __buf, size_t __size, size_t __count, FILE* __fp) __INTRODUCED_IN(28);
+int fflush_unlocked(FILE* _Nullable __fp) __INTRODUCED_IN(28);
+int fgetc_unlocked(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
+int fputc_unlocked(int __ch, FILE* _Nonnull __fp) __INTRODUCED_IN(28);
+size_t fread_unlocked(void* _Nonnull __buf, size_t __size, size_t __count, FILE* _Nonnull __fp) __INTRODUCED_IN(28);
+size_t fwrite_unlocked(const void* _Nonnull __buf, size_t __size, size_t __count, FILE* _Nonnull __fp) __INTRODUCED_IN(28);
 #endif
 
 #if defined(__USE_GNU)
-int fputs_unlocked(const char* __s, FILE* __fp) __INTRODUCED_IN(28);
-char* fgets_unlocked(char* __buf, int __size, FILE* __fp) __INTRODUCED_IN(28);
+int fputs_unlocked(const char* _Nonnull __s, FILE* _Nonnull __fp) __INTRODUCED_IN(28);
+char* _Nullable fgets_unlocked(char* _Nonnull __buf, int __size, FILE* _Nonnull __fp) __INTRODUCED_IN(28);
 #endif
 
 #if defined(__BIONIC_INCLUDE_FORTIFY_HEADERS)
diff --git a/libc/include/stdio_ext.h b/libc/include/stdio_ext.h
index 3aa183d..8b106a6 100644
--- a/libc/include/stdio_ext.h
+++ b/libc/include/stdio_ext.h
@@ -44,7 +44,7 @@
  *
  * Available since API level 23.
  */
-size_t __fbufsize(FILE* __fp) __INTRODUCED_IN(23);
+size_t __fbufsize(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * [__freadable(3)](http://man7.org/linux/man-pages/man3/__freadable.3.html) returns non-zero if
@@ -52,7 +52,7 @@
  *
  * Available since API level 23.
  */
-int __freadable(FILE* __fp) __INTRODUCED_IN(23);
+int __freadable(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * [__freading(3)](http://man7.org/linux/man-pages/man3/__freading.3.html) returns non-zero if
@@ -60,7 +60,7 @@
  *
  * Available since API level 28.
  */
-int __freading(FILE* __fp) __INTRODUCED_IN(28);
+int __freading(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
 
 /**
  * [__fwritable(3)](http://man7.org/linux/man-pages/man3/__fwritable.3.html) returns non-zero if
@@ -68,7 +68,7 @@
  *
  * Available since API level 23.
  */
-int __fwritable(FILE* __fp) __INTRODUCED_IN(23);
+int __fwritable(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * [__fwriting(3)](http://man7.org/linux/man-pages/man3/__fwriting.3.html) returns non-zero if
@@ -76,7 +76,7 @@
  *
  * Available since API level 28.
  */
-int __fwriting(FILE* __fp) __INTRODUCED_IN(28);
+int __fwriting(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
 
 /**
  * [__flbf(3)](http://man7.org/linux/man-pages/man3/__flbf.3.html) returns non-zero if
@@ -84,7 +84,7 @@
  *
  * Available since API level 23.
  */
-int __flbf(FILE* __fp) __INTRODUCED_IN(23);
+int __flbf(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * [__fpurge(3)](http://man7.org/linux/man-pages/man3/__fpurge.3.html) discards the contents of
@@ -92,15 +92,23 @@
  *
  * Available since API level 23.
  */
-void __fpurge(FILE* __fp) __INTRODUCED_IN(23);
+void __fpurge(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
 
 /**
  * [__fpending(3)](http://man7.org/linux/man-pages/man3/__fpending.3.html) returns the number of
- * bytes in the output buffer.
+ * bytes in the output buffer. See __freadahead() for the input buffer.
  *
  * Available since API level 23.
  */
-size_t __fpending(FILE* __fp) __INTRODUCED_IN(23);
+size_t __fpending(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
+
+/**
+ * __freadahead(3) returns the number of bytes in the input buffer.
+ * See __fpending() for the output buffer.
+ *
+ * Available since API level 34.
+ */
+size_t __freadahead(FILE* _Nonnull __fp) __INTRODUCED_IN(34);
 
 /**
  * [_flushlbf(3)](http://man7.org/linux/man-pages/man3/_flushlbf.3.html) flushes all
@@ -116,7 +124,7 @@
  *
  * Available since API level 28.
  */
-void __fseterr(FILE* __fp) __INTRODUCED_IN(28);
+void __fseterr(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
 
 /** __fsetlocking() constant to query locking type. */
 #define FSETLOCKING_QUERY 0
@@ -133,6 +141,6 @@
  *
  * Available since API level 23.
  */
-int __fsetlocking(FILE* __fp, int __type) __INTRODUCED_IN(23);
+int __fsetlocking(FILE* _Nonnull __fp, int __type) __INTRODUCED_IN(23);
 
 __END_DECLS
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 4aa27f9..2bcb870 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -43,88 +43,84 @@
 
 __noreturn void abort(void) __attribute__((__nomerge__));
 __noreturn void exit(int __status);
-#if __ANDROID_API__ >= 21
 __noreturn void _Exit(int __status) __INTRODUCED_IN(21);
-#else
-__noreturn void _Exit(int) __RENAME(_exit);
-#endif
 
-int atexit(void (*__fn)(void));
+int atexit(void (* _Nonnull __fn)(void));
 
-int at_quick_exit(void (*__fn)(void)) __INTRODUCED_IN(21);
+int at_quick_exit(void (* _Nonnull __fn)(void)) __INTRODUCED_IN(21);
 void quick_exit(int __status) __noreturn __INTRODUCED_IN(21);
 
-char* getenv(const char* __name);
-int putenv(char* __assignment);
-int setenv(const char* __name, const char* __value, int __overwrite);
-int unsetenv(const char* __name);
+char* _Nullable getenv(const char* _Nonnull __name);
+int putenv(char* _Nonnull __assignment);
+int setenv(const char* _Nonnull __name, const char* _Nonnull __value, int __overwrite);
+int unsetenv(const char* _Nonnull __name);
 int clearenv(void);
 
-char* mkdtemp(char* __template);
-char* mktemp(char* __template) __attribute__((deprecated("mktemp is unsafe, use mkstemp or tmpfile instead")));
+char* _Nullable mkdtemp(char* _Nonnull __template);
+char* _Nullable mktemp(char* _Nonnull __template) __attribute__((deprecated("mktemp is unsafe, use mkstemp or tmpfile instead")));
 
-int mkostemp64(char* __template, int __flags) __INTRODUCED_IN(23);
-int mkostemp(char* __template, int __flags) __INTRODUCED_IN(23);
-int mkostemps64(char* __template, int __suffix_length, int __flags) __INTRODUCED_IN(23);
-int mkostemps(char* __template, int __suffix_length, int __flags) __INTRODUCED_IN(23);
-int mkstemp64(char* __template) __INTRODUCED_IN(21);
-int mkstemp(char* __template);
-int mkstemps64(char* __template, int __flags) __INTRODUCED_IN(23);
-int mkstemps(char* __template, int __flags);
+int mkostemp64(char* _Nonnull __template, int __flags) __INTRODUCED_IN(23);
+int mkostemp(char* _Nonnull __template, int __flags) __INTRODUCED_IN(23);
+int mkostemps64(char* _Nonnull __template, int __suffix_length, int __flags) __INTRODUCED_IN(23);
+int mkostemps(char* _Nonnull __template, int __suffix_length, int __flags) __INTRODUCED_IN(23);
+int mkstemp64(char* _Nonnull __template) __INTRODUCED_IN(21);
+int mkstemp(char* _Nonnull __template);
+int mkstemps64(char* _Nonnull __template, int __flags) __INTRODUCED_IN(23);
+int mkstemps(char* _Nonnull __template, int __flags);
 
-long strtol(const char* __s, char** __end_ptr, int __base);
-long long strtoll(const char* __s, char** __end_ptr, int __base);
-unsigned long strtoul(const char* __s, char** __end_ptr, int __base);
-unsigned long long strtoull(const char* __s, char** __end_ptr, int __base);
+long strtol(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
+long long strtoll(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
+unsigned long strtoul(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
+unsigned long long strtoull(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base);
 
-int posix_memalign(void** __memptr, size_t __alignment, size_t __size) __INTRODUCED_IN(17);
+int posix_memalign(void* _Nullable * _Nullable __memptr, size_t __alignment, size_t __size) __INTRODUCED_IN(17);
 
-void* aligned_alloc(size_t __alignment, size_t __size) __INTRODUCED_IN(28);
+void* _Nullable aligned_alloc(size_t __alignment, size_t __size) __INTRODUCED_IN(28);
 
-double strtod(const char* __s, char** __end_ptr);
-long double strtold(const char* __s, char** __end_ptr) __RENAME_LDBL(strtod, 3, 21);
+double strtod(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr);
+long double strtold(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr) __RENAME_LDBL(strtod, 3, 21);
 
-unsigned long strtoul_l(const char* __s, char** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(26);
+unsigned long strtoul_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(26);
 
-int atoi(const char* __s) __attribute_pure__;
-long atol(const char* __s) __attribute_pure__;
-long long atoll(const char* __s) __attribute_pure__;
+int atoi(const char* _Nonnull __s) __attribute_pure__;
+long atol(const char* _Nonnull __s) __attribute_pure__;
+long long atoll(const char* _Nonnull __s) __attribute_pure__;
 
-__wur char* realpath(const char* __path, char* __resolved);
-int system(const char* __command);
+__wur char* _Nullable realpath(const char* _Nonnull __path, char* _Nullable __resolved);
+int system(const char* _Nonnull __command);
 
-void* bsearch(const void* __key, const void* __base, size_t __nmemb, size_t __size, int (*__comparator)(const void* __lhs, const void* __rhs));
+void* _Nullable bsearch(const void* _Nonnull __key, const void* _Nullable __base, size_t __nmemb, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull __lhs, const void* _Nonnull __rhs));
 
-void qsort(void* __base, size_t __nmemb, size_t __size, int (*__comparator)(const void* __lhs, const void* __rhs));
+void qsort(void* _Nullable __base, size_t __nmemb, size_t __size, int (* _Nonnull __comparator)(const void* _Nullable __lhs, const void* _Nullable __rhs));
 
 uint32_t arc4random(void);
 uint32_t arc4random_uniform(uint32_t __upper_bound);
-void arc4random_buf(void* __buf, size_t __n);
+void arc4random_buf(void* _Nonnull __buf, size_t __n);
 
 #define RAND_MAX 0x7fffffff
 
-int rand_r(unsigned int* __seed_ptr) __INTRODUCED_IN(21);
+int rand_r(unsigned int* _Nonnull __seed_ptr) __INTRODUCED_IN(21);
 
 double drand48(void);
-double erand48(unsigned short __xsubi[3]);
-long jrand48(unsigned short __xsubi[3]);
-void lcong48(unsigned short __param[7]) __INTRODUCED_IN(23);
+double erand48(unsigned short __xsubi[_Nonnull 3]);
+long jrand48(unsigned short __xsubi[_Nonnull 3]);
+void lcong48(unsigned short __param[_Nonnull 7]) __INTRODUCED_IN(23);
 long lrand48(void);
 long mrand48(void);
-long nrand48(unsigned short __xsubi[3]);
-unsigned short* seed48(unsigned short __seed16v[3]);
+long nrand48(unsigned short __xsubi[_Nonnull 3]);
+unsigned short* _Nonnull seed48(unsigned short __seed16v[_Nonnull 3]);
 void srand48(long __seed);
 
-char* initstate(unsigned int __seed, char* __state, size_t __n) __INTRODUCED_IN(21);
-char* setstate(char* __state) __INTRODUCED_IN(21);
+char* _Nullable initstate(unsigned int __seed, char* _Nonnull __state, size_t __n) __INTRODUCED_IN(21);
+char* _Nullable setstate(char* _Nonnull __state) __INTRODUCED_IN(21);
 
 int getpt(void);
 int posix_openpt(int __flags) __INTRODUCED_IN(21);
-char* ptsname(int __fd);
-int ptsname_r(int __fd, char* __buf, size_t __n);
+char* _Nullable ptsname(int __fd);
+int ptsname_r(int __fd, char* _Nonnull __buf, size_t __n);
 int unlockpt(int __fd);
 
-int getsubopt(char** __option, char* const* __tokens, char** __value_ptr) __INTRODUCED_IN(26);
+int getsubopt(char* _Nonnull * _Nonnull __option, char* _Nonnull const* _Nonnull __tokens, char* _Nullable * _Nonnull __value_ptr) __INTRODUCED_IN(26);
 
 typedef struct {
   int quot;
@@ -154,63 +150,46 @@
  *
  * Returns the number of samples written to `__averages` (at most 3), and returns -1 on failure.
  */
-int getloadavg(double __averages[], int __n) __INTRODUCED_IN(29);
+int getloadavg(double __averages[_Nonnull], int __n) __INTRODUCED_IN(29);
 
 /* BSD compatibility. */
-const char* getprogname(void) __INTRODUCED_IN(21);
-void setprogname(const char* __name) __INTRODUCED_IN(21);
+const char* _Nullable getprogname(void) __INTRODUCED_IN(21);
+void setprogname(const char* _Nonnull __name) __INTRODUCED_IN(21);
 
-int mblen(const char* __s, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(26);
-size_t mbstowcs(wchar_t* __dst, const char* __src, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
-int mbtowc(wchar_t* __wc_ptr, const char* __s, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
-int wctomb(char* __dst, wchar_t __wc) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
+int mblen(const char* _Nullable __s, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(26);
+size_t mbstowcs(wchar_t* _Nullable __dst, const char* _Nullable __src, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
+int mbtowc(wchar_t* _Nullable __wc_ptr, const char*  _Nullable __s, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
+int wctomb(char* _Nullable __dst, wchar_t __wc) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
 
-size_t wcstombs(char* __dst, const wchar_t* __src, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
+size_t wcstombs(char* _Nullable __dst, const wchar_t* _Nullable __src, size_t __n) __INTRODUCED_IN_NO_GUARD_FOR_NDK(21);
 
-#if __ANDROID_API__ >= 21
 size_t __ctype_get_mb_cur_max(void) __INTRODUCED_IN(21);
 #define MB_CUR_MAX __ctype_get_mb_cur_max()
-#else
-/*
- * Pre-L we didn't have any locale support and so we were always the POSIX
- * locale. POSIX specifies that MB_CUR_MAX for the POSIX locale is 1:
- * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html
- */
-#define MB_CUR_MAX 1
-#endif
 
 #if defined(__BIONIC_INCLUDE_FORTIFY_HEADERS)
 #include <bits/fortify/stdlib.h>
 #endif
 
-#if __ANDROID_API__ >= 19
 int abs(int __x) __attribute_const__ __INTRODUCED_IN(19);
 long labs(long __x) __attribute_const__ __INTRODUCED_IN(19);
 long long llabs(long long __x) __attribute_const__ __INTRODUCED_IN(19);
-#else
-// Implemented as static inlines before 19.
-#endif
 
-#if __ANDROID_API__ >= 21
-float strtof(const char* __s, char** __end_ptr) __INTRODUCED_IN(21);
-double atof(const char* __s) __attribute_pure__ __INTRODUCED_IN(21);
+float strtof(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr) __INTRODUCED_IN(21);
+double atof(const char* _Nonnull __s) __attribute_pure__ __INTRODUCED_IN(21);
 int rand(void) __INTRODUCED_IN(21);
 void srand(unsigned int __seed) __INTRODUCED_IN(21);
 long random(void) __INTRODUCED_IN(21);
 void srandom(unsigned int __seed) __INTRODUCED_IN(21);
 int grantpt(int __fd) __INTRODUCED_IN(21);
 
-long long strtoll_l(const char* __s, char** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(21);
-unsigned long long strtoull_l(const char* __s, char** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(21);
-long double strtold_l(const char* __s, char** __end_ptr, locale_t __l) __INTRODUCED_IN(21);
-#else
-// Implemented as static inlines before 21.
-#endif
+long long strtoll_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+unsigned long long strtoull_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+long double strtold_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
 #if __ANDROID_API__ >= 26
-double strtod_l(const char* __s, char** __end_ptr, locale_t __l) __INTRODUCED_IN(26);
-float strtof_l(const char* __s, char** __end_ptr, locale_t __l) __INTRODUCED_IN(26);
-long strtol_l(const char* __s, char** __end_ptr, int, locale_t __l) __INTRODUCED_IN(26);
+double strtod_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(26);
+float strtof_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(26);
+long strtol_l(const char* _Nonnull __s, char* _Nullable * _Nullable __end_ptr, int, locale_t _Nonnull __l) __INTRODUCED_IN(26);
 #else
 // Implemented as static inlines before 26.
 #endif
diff --git a/libc/include/string.h b/libc/include/string.h
index 59c4687..d6b2967 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -41,20 +41,20 @@
 #include <strings.h>
 #endif
 
-void* memccpy(void* __dst, const void* __src, int __stop_char, size_t __n);
-void* memchr(const void* __s, int __ch, size_t __n) __attribute_pure__;
+void* _Nullable memccpy(void* _Nonnull __dst, const void* _Nonnull __src, int __stop_char, size_t __n);
+void* _Nullable memchr(const void* _Nonnull __s, int __ch, size_t __n) __attribute_pure__;
 #if defined(__cplusplus)
-extern "C++" void* memrchr(void* __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
-extern "C++" const void* memrchr(const void* __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
+extern "C++" void* _Nullable memrchr(void* _Nonnull __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
+extern "C++" const void* _Nullable memrchr(const void* _Nonnull __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
 #else
-void* memrchr(const void* __s, int __ch, size_t __n) __attribute_pure__;
+void* _Nullable memrchr(const void* _Nonnull __s, int __ch, size_t __n) __attribute_pure__;
 #endif
-int memcmp(const void* __lhs, const void* __rhs, size_t __n) __attribute_pure__;
-void* memcpy(void*, const void*, size_t);
+int memcmp(const void* _Nonnull __lhs, const void* _Nonnull __rhs, size_t __n) __attribute_pure__;
+void* _Nonnull memcpy(void* _Nonnull, const void* _Nonnull, size_t);
 #if defined(__USE_GNU)
-void* mempcpy(void* __dst, const void* __src, size_t __n) __INTRODUCED_IN(23);
+void* _Nonnull mempcpy(void* _Nonnull __dst, const void* _Nonnull __src, size_t __n) __INTRODUCED_IN(23);
 #endif
-void* memmove(void* __dst, const void* __src, size_t __n);
+void* _Nonnull memmove(void* _Nonnull __dst, const void* _Nonnull __src, size_t __n);
 
 /**
  * [memset(3)](http://man7.org/linux/man-pages/man3/memset.3.html) writes the
@@ -62,7 +62,7 @@
  *
  * Returns `dst`.
  */
-void* memset(void* __dst, int __ch, size_t __n);
+void* _Nonnull memset(void* _Nonnull __dst, int __ch, size_t __n);
 
 /**
  * [memset_explicit(3)](http://man7.org/linux/man-pages/man3/memset_explicit.3.html)
@@ -71,77 +71,73 @@
  *
  * Returns `dst`.
  */
-void* memset_explicit(void* __dst, int __ch, size_t __n) __INTRODUCED_IN(34);
+void* _Nonnull memset_explicit(void* _Nonnull __dst, int __ch, size_t __n) __INTRODUCED_IN(34);
 
-void* memmem(const void* __haystack, size_t __haystack_size, const void* __needle, size_t __needle_size) __attribute_pure__;
+void* _Nullable memmem(const void* _Nonnull __haystack, size_t __haystack_size, const void* _Nonnull __needle, size_t __needle_size) __attribute_pure__;
 
-char* strchr(const char* __s, int __ch) __attribute_pure__;
-char* __strchr_chk(const char* __s, int __ch, size_t __n) __INTRODUCED_IN(18);
+char* _Nullable strchr(const char* _Nonnull __s, int __ch) __attribute_pure__;
+char* _Nullable __strchr_chk(const char* _Nonnull __s, int __ch, size_t __n) __INTRODUCED_IN(18);
 #if defined(__USE_GNU)
 #if defined(__cplusplus)
-extern "C++" char* strchrnul(char* __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
-extern "C++" const char* strchrnul(const char* __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
+extern "C++" char* _Nonnull strchrnul(char* _Nonnull __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
+extern "C++" const char* _Nonnull strchrnul(const char* _Nonnull __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
 #else
-char* strchrnul(const char* __s, int __ch) __attribute_pure__ __INTRODUCED_IN(24);
+char* _Nonnull strchrnul(const char* _Nonnull __s, int __ch) __attribute_pure__ __INTRODUCED_IN(24);
 #endif
 #endif
 
-char* strrchr(const char* __s, int __ch) __attribute_pure__;
-char* __strrchr_chk(const char* __s, int __ch, size_t __n) __INTRODUCED_IN(18);
+char* _Nullable strrchr(const char* _Nonnull __s, int __ch) __attribute_pure__;
+char* _Nullable __strrchr_chk(const char* _Nonnull __s, int __ch, size_t __n) __INTRODUCED_IN(18);
 
-size_t strlen(const char* __s) __attribute_pure__;
-size_t __strlen_chk(const char* __s, size_t __n) __INTRODUCED_IN(17);
+size_t strlen(const char* _Nonnull __s) __attribute_pure__;
+size_t __strlen_chk(const char* _Nonnull __s, size_t __n) __INTRODUCED_IN(17);
 
-int strcmp(const char* __lhs, const char* __rhs) __attribute_pure__;
-char* stpcpy(char* __dst, const char* __src) __INTRODUCED_IN(21);
-char* strcpy(char* __dst, const char* __src);
-char* strcat(char* __dst, const char* __src);
-char* strdup(const char* __s);
+int strcmp(const char* _Nonnull __lhs, const char* _Nonnull __rhs) __attribute_pure__;
+char* _Nonnull stpcpy(char* _Nonnull __dst, const char* _Nonnull __src) __INTRODUCED_IN(21);
+char* _Nonnull strcpy(char* _Nonnull __dst, const char* _Nonnull __src);
+char* _Nonnull strcat(char* _Nonnull __dst, const char* _Nonnull __src);
+char* _Nullable strdup(const char* _Nonnull __s);
 
-char* strstr(const char* __haystack, const char* __needle) __attribute_pure__;
+char* _Nullable strstr(const char* _Nonnull __haystack, const char* _Nonnull __needle) __attribute_pure__;
 #if defined(__cplusplus)
-extern "C++" char* strcasestr(char*, const char*) __RENAME(strcasestr) __attribute_pure__;
-extern "C++" const char* strcasestr(const char*, const char*) __RENAME(strcasestr) __attribute_pure__;
+extern "C++" char* _Nullable strcasestr(char* _Nonnull, const char* _Nonnull) __RENAME(strcasestr) __attribute_pure__;
+extern "C++" const char* _Nullable strcasestr(const char* _Nonnull, const char* _Nonnull) __RENAME(strcasestr) __attribute_pure__;
 #else
-char* strcasestr(const char* __haystack, const char* __needle) __attribute_pure__;
+char* _Nullable strcasestr(const char* _Nonnull __haystack, const char* _Nonnull __needle) __attribute_pure__;
 #endif
-char* strtok(char* __s, const char* __delimiter);
-char* strtok_r(char* __s, const char* __delimiter, char** __pos_ptr);
+char* _Nullable strtok(char* _Nullable __s, const char* _Nonnull __delimiter);
+char* _Nullable strtok_r(char* _Nullable __s, const char* _Nonnull __delimiter, char* _Nonnull * _Nonnull __pos_ptr);
 
-char* strerror(int __errno_value);
-char* strerror_l(int __errno_value, locale_t __l) __INTRODUCED_IN(23);
+char* _Nonnull strerror(int __errno_value);
+char* _Nonnull strerror_l(int __errno_value, locale_t _Nonnull __l) __INTRODUCED_IN(23);
 #if defined(__USE_GNU) && __ANDROID_API__ >= 23
-char* strerror_r(int __errno_value, char* __buf, size_t __n) __RENAME(__gnu_strerror_r) __INTRODUCED_IN(23);
+char* _Nonnull strerror_r(int __errno_value, char* _Nullable __buf, size_t __n) __RENAME(__gnu_strerror_r) __INTRODUCED_IN(23);
 #else /* POSIX */
-int strerror_r(int __errno_value, char* __buf, size_t __n);
+int strerror_r(int __errno_value, char* _Nonnull __buf, size_t __n);
 #endif
 
-size_t strnlen(const char* __s, size_t __n) __attribute_pure__;
-char* strncat(char* __dst, const char* __src, size_t __n);
-char* strndup(const char* __s, size_t __n);
-int strncmp(const char* __lhs, const char* __rhs, size_t __n) __attribute_pure__;
-char* stpncpy(char* __dst, const char* __src, size_t __n) __INTRODUCED_IN(21);
-char* strncpy(char* __dst, const char* __src, size_t __n);
+size_t strnlen(const char* _Nonnull __s, size_t __n) __attribute_pure__;
+char* _Nonnull strncat(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
+char* _Nullable strndup(const char* _Nonnull __s, size_t __n);
+int strncmp(const char* _Nonnull __lhs, const char* _Nonnull __rhs, size_t __n) __attribute_pure__;
+char* _Nonnull stpncpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n) __INTRODUCED_IN(21);
+char* _Nonnull strncpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
 
-size_t strlcat(char* __dst, const char* __src, size_t __n);
-size_t strlcpy(char* __dst, const char* __src, size_t __n);
+size_t strlcat(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
+size_t strlcpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
 
-size_t strcspn(const char* __s, const char* __reject) __attribute_pure__;
-char* strpbrk(const char* __s, const char* __accept) __attribute_pure__;
-char* strsep(char** __s_ptr, const char* __delimiter);
-size_t strspn(const char* __s, const char* __accept);
+size_t strcspn(const char* _Nonnull __s, const char* _Nonnull __reject) __attribute_pure__;
+char* _Nullable strpbrk(const char* _Nonnull __s, const char* _Nonnull __accept) __attribute_pure__;
+char* _Nullable strsep(char* _Nullable * _Nonnull __s_ptr, const char* _Nonnull __delimiter);
+size_t strspn(const char* _Nonnull __s, const char* _Nonnull __accept);
 
-char* strsignal(int __signal);
+char* _Nonnull strsignal(int __signal);
 
-int strcoll(const char* __lhs, const char* __rhs) __attribute_pure__;
-size_t strxfrm(char* __dst, const char* __src, size_t __n);
+int strcoll(const char* _Nonnull __lhs, const char* _Nonnull __rhs) __attribute_pure__;
+size_t strxfrm(char* __BIONIC_COMPLICATED_NULLNESS __dst, const char* _Nonnull __src, size_t __n);
 
-#if __ANDROID_API__ >= 21
-int strcoll_l(const char* __lhs, const char* __rhs, locale_t __l) __attribute_pure__ __INTRODUCED_IN(21);
-size_t strxfrm_l(char* __dst, const char* __src, size_t __n, locale_t __l) __INTRODUCED_IN(21);
-#else
-// Implemented as static inlines before 21.
-#endif
+int strcoll_l(const char* _Nonnull __lhs, const char* _Nonnull __rhs, locale_t _Nonnull __l) __attribute_pure__ __INTRODUCED_IN(21);
+size_t strxfrm_l(char* __BIONIC_COMPLICATED_NULLNESS __dst, const char* _Nonnull __src, size_t __n, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
 #if defined(__USE_GNU) && !defined(basename)
 /*
@@ -149,10 +145,10 @@
  * It doesn't modify its argument, and in C++ it's const-correct.
  */
 #if defined(__cplusplus)
-extern "C++" char* basename(char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
-extern "C++" const char* basename(const char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
+extern "C++" char* _Nonnull basename(char* _Nullable __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
+extern "C++" const char* _Nonnull basename(const char* _Nonnull __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
 #else
-char* basename(const char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
+char* _Nonnull basename(const char* _Nonnull __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
 #endif
 #endif
 
@@ -169,77 +165,77 @@
 #define __prefer_this_overload __enable_if(true, "preferred overload") __enable_if(true, "")
 extern "C++" {
 inline __always_inline
-void* __bionic_memchr(const void* const s __pass_object_size, int c, size_t n) {
+void* _Nullable __bionic_memchr(const void* _Nonnull const s __pass_object_size, int c, size_t n) {
     return memchr(s, c, n);
 }
 
 inline __always_inline
-const void* memchr(const void* const s __pass_object_size, int c, size_t n)
+const void* _Nullable memchr(const void* _Nonnull const s __pass_object_size, int c, size_t n)
         __prefer_this_overload {
     return __bionic_memchr(s, c, n);
 }
 
 inline __always_inline
-void* memchr(void* const s __pass_object_size, int c, size_t n) __prefer_this_overload {
+void* _Nullable memchr(void* _Nonnull const s __pass_object_size, int c, size_t n) __prefer_this_overload {
     return __bionic_memchr(s, c, n);
 }
 
 inline __always_inline
-char* __bionic_strchr(const char* const s __pass_object_size, int c) {
+char* _Nullable __bionic_strchr(const char* _Nonnull const s __pass_object_size, int c) {
     return strchr(s, c);
 }
 
 inline __always_inline
-const char* strchr(const char* const s __pass_object_size, int c)
+const char* _Nullable strchr(const char* _Nonnull const s __pass_object_size, int c)
         __prefer_this_overload {
     return __bionic_strchr(s, c);
 }
 
 inline __always_inline
-char* strchr(char* const s __pass_object_size, int c)
+char* _Nullable strchr(char* _Nonnull const s __pass_object_size, int c)
         __prefer_this_overload {
     return __bionic_strchr(s, c);
 }
 
 inline __always_inline
-char* __bionic_strrchr(const char* const s __pass_object_size, int c) {
+char* _Nullable __bionic_strrchr(const char* _Nonnull const s __pass_object_size, int c) {
     return strrchr(s, c);
 }
 
 inline __always_inline
-const char* strrchr(const char* const s __pass_object_size, int c) __prefer_this_overload {
+const char* _Nullable strrchr(const char* _Nonnull const s __pass_object_size, int c) __prefer_this_overload {
     return __bionic_strrchr(s, c);
 }
 
 inline __always_inline
-char* strrchr(char* const s __pass_object_size, int c) __prefer_this_overload {
+char* _Nullable strrchr(char* _Nonnull const s __pass_object_size, int c) __prefer_this_overload {
     return __bionic_strrchr(s, c);
 }
 
 /* Functions with no FORTIFY counterpart. */
 inline __always_inline
-char* __bionic_strstr(const char* h, const char* n) { return strstr(h, n); }
+char* _Nullable __bionic_strstr(const char* _Nonnull h, const char* _Nonnull n) { return strstr(h, n); }
 
 inline __always_inline
-const char* strstr(const char* h, const char* n) __prefer_this_overload {
+const char* _Nullable strstr(const char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
     return __bionic_strstr(h, n);
 }
 
 inline __always_inline
-char* strstr(char* h, const char* n) __prefer_this_overload {
+char* _Nullable strstr(char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
     return __bionic_strstr(h, n);
 }
 
 inline __always_inline
-char* __bionic_strpbrk(const char* h, const char* n) { return strpbrk(h, n); }
+char* _Nullable __bionic_strpbrk(const char* _Nonnull h, const char* _Nonnull n) { return strpbrk(h, n); }
 
 inline __always_inline
-char* strpbrk(char* h, const char* n) __prefer_this_overload {
+char* _Nullable strpbrk(char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
     return __bionic_strpbrk(h, n);
 }
 
 inline __always_inline
-const char* strpbrk(const char* h, const char* n) __prefer_this_overload {
+const char* _Nullable strpbrk(const char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
     return __bionic_strpbrk(h, n);
 }
 }
diff --git a/libc/include/strings.h b/libc/include/strings.h
index ff6b925..2f4f764 100644
--- a/libc/include/strings.h
+++ b/libc/include/strings.h
@@ -61,13 +61,13 @@
 
 /** Deprecated. Use memmove() instead. */
 #define bcopy(b1, b2, len) __bionic_bcopy((b1), (b2), (len))
-static __inline__ __always_inline void __bionic_bcopy(const void* b1, void* b2, size_t len) {
+static __inline__ __always_inline void __bionic_bcopy(const void* _Nonnull b1, void* _Nonnull b2, size_t len) {
   __builtin_memmove(b2, b1, len);
 }
 
 /** Deprecated. Use memset() instead. */
 #define bzero(b, len) __bionic_bzero((b), (len))
-static __inline__ __always_inline void __bionic_bzero(void* b, size_t len) {
+static __inline__ __always_inline void __bionic_bzero(void* _Nonnull b, size_t len) {
   __builtin_memset(b, 0, len);
 }
 
diff --git a/libc/include/sys/capability.h b/libc/include/sys/capability.h
index 4cb698f..b43bbf0 100644
--- a/libc/include/sys/capability.h
+++ b/libc/include/sys/capability.h
@@ -44,7 +44,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int capget(cap_user_header_t __hdr_ptr, cap_user_data_t __data_ptr);
+int capget(cap_user_header_t _Nonnull __hdr_ptr, cap_user_data_t _Nullable __data_ptr);
 
 /**
  * [capset(2)](http://man7.org/linux/man-pages/man2/capset.2.html) sets the calling
@@ -52,6 +52,6 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int capset(cap_user_header_t __hdr_ptr, const cap_user_data_t __data_ptr);
+int capset(cap_user_header_t _Nonnull __hdr_ptr, const cap_user_data_t _Nullable __data_ptr);
 
 __END_DECLS
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 5b9d99b..484757e 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -63,6 +63,14 @@
 #define __BIONIC_ALIGN(__value, __alignment) (((__value) + (__alignment)-1) & ~((__alignment)-1))
 
 /*
+ * The nullness constraints of this parameter or return value are
+ * quite complex. This is used to highlight spots where developers
+ * are encouraged to read relevant manuals or code to understand
+ * the full picture of nullness for this pointer.
+ */
+#define __BIONIC_COMPLICATED_NULLNESS _Null_unspecified
+
+/*
  * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
  * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
  * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
diff --git a/libc/include/sys/epoll.h b/libc/include/sys/epoll.h
index 3745737..9e09408 100644
--- a/libc/include/sys/epoll.h
+++ b/libc/include/sys/epoll.h
@@ -40,25 +40,10 @@
 int epoll_create(int __size);
 int epoll_create1(int __flags) __INTRODUCED_IN(21);
 
-/*
- * Some third-party code uses the existence of EPOLL_CLOEXEC to detect the
- * availability of epoll_create1. This is not correct, since having up-to-date
- * UAPI headers says nothing about the C library, but for the time being we
- * don't want to harm adoption to the unified headers. We'll undef EPOLL_CLOEXEC
- * if we don't have epoll_create1 for the time being, and maybe revisit this
- * later.
- *
- * https://github.com/android-ndk/ndk/issues/302
- * https://github.com/android-ndk/ndk/issues/394
- */
-#if __ANDROID_API__ < 21 && defined(EPOLL_CLOEXEC)
-#undef EPOLL_CLOEXEC
-#endif
-
-int epoll_ctl(int __epoll_fd, int __op, int __fd, struct epoll_event* __event);
-int epoll_wait(int __epoll_fd, struct epoll_event* __events, int __event_count, int __timeout_ms);
-int epoll_pwait(int __epoll_fd, struct epoll_event* __events, int __event_count, int __timeout_ms, const sigset_t* __mask) __INTRODUCED_IN(21);
-int epoll_pwait64(int __epoll_fd, struct epoll_event* __events, int __event_count, int __timeout_ms, const sigset64_t* __mask) __INTRODUCED_IN(28);
+int epoll_ctl(int __epoll_fd, int __op, int __fd, struct epoll_event* __BIONIC_COMPLICATED_NULLNESS __event);
+int epoll_wait(int __epoll_fd, struct epoll_event* _Nonnull __events, int __event_count, int __timeout_ms);
+int epoll_pwait(int __epoll_fd, struct epoll_event* _Nonnull __events, int __event_count, int __timeout_ms, const sigset_t* _Nullable __mask) __INTRODUCED_IN(21);
+int epoll_pwait64(int __epoll_fd, struct epoll_event* _Nonnull __events, int __event_count, int __timeout_ms, const sigset64_t* _Nullable __mask) __INTRODUCED_IN(28);
 
 __END_DECLS
 
diff --git a/libc/include/sys/eventfd.h b/libc/include/sys/eventfd.h
index 1b6ad29..1ad11e3 100644
--- a/libc/include/sys/eventfd.h
+++ b/libc/include/sys/eventfd.h
@@ -62,7 +62,7 @@
  *
  * Returns 0 on success, or returns -1 otherwise.
  */
-int eventfd_read(int __fd, eventfd_t* __value);
+int eventfd_read(int __fd, eventfd_t* _Nonnull __value);
 
 /**
  * [eventfd_write(3)](http://man7.org/linux/man-pages/man2/eventfd.2.html) is a convenience
diff --git a/libc/include/sys/inotify.h b/libc/include/sys/inotify.h
index 37fbf99..e834d07 100644
--- a/libc/include/sys/inotify.h
+++ b/libc/include/sys/inotify.h
@@ -37,25 +37,12 @@
 
 __BEGIN_DECLS
 
-/*
- * Some third-party code uses the existence of IN_CLOEXEC/IN_NONBLOCK to detect
- * the availability of inotify_init1. This is not correct, since
- * `syscall(__NR_inotify_init1, IN_CLOEXEC)` is still valid even if the C
- * library doesn't have that function, but for the time being we don't want to
- * harm adoption to the unified headers. We'll avoid defining IN_CLOEXEC and
- * IN_NONBLOCK if we don't have inotify_init1 for the time being, and maybe
- * revisit this later.
- *
- * https://github.com/android-ndk/ndk/issues/394
- */
-#if __ANDROID_API__ >= 21
 #define IN_CLOEXEC O_CLOEXEC
 #define IN_NONBLOCK O_NONBLOCK
-#endif
 
 int inotify_init(void);
 int inotify_init1(int __flags) __INTRODUCED_IN(21);
-int inotify_add_watch(int __fd, const char* __path, uint32_t __mask);
+int inotify_add_watch(int __fd, const char* _Nonnull __path, uint32_t __mask);
 int inotify_rm_watch(int __fd, uint32_t __watch_descriptor);
 
 __END_DECLS
diff --git a/libc/include/sys/ipc.h b/libc/include/sys/ipc.h
index c81ec1a..2e2b8cf 100644
--- a/libc/include/sys/ipc.h
+++ b/libc/include/sys/ipc.h
@@ -52,6 +52,6 @@
  *
  * Returns a key on success, and returns -1 and sets `errno` on failure.
  */
-key_t ftok(const char* __path, int __id);
+key_t ftok(const char* _Nonnull __path, int __id);
 
 __END_DECLS
diff --git a/libc/include/sys/klog.h b/libc/include/sys/klog.h
index b33d11b..b60c2c4 100644
--- a/libc/include/sys/klog.h
+++ b/libc/include/sys/klog.h
@@ -66,6 +66,6 @@
  * This system call is not available to applications.
  * Use syslog() or `<android/log.h>` instead.
  */
-int klogctl(int __type, char* __buf, int __buf_size);
+int klogctl(int __type, char* __BIONIC_COMPLICATED_NULLNESS __buf, int __buf_size);
 
 __END_DECLS
diff --git a/libc/include/sys/mman.h b/libc/include/sys/mman.h
index 6ef0c12..bcf856d 100644
--- a/libc/include/sys/mman.h
+++ b/libc/include/sys/mman.h
@@ -55,17 +55,14 @@
 void* mmap(void* __addr, size_t __size, int __prot, int __flags, int __fd, off_t __offset);
 #endif
 
-#if __ANDROID_API__ >= 21
 /**
  * mmap64() is a variant of mmap() that takes a 64-bit offset even on LP32.
  *
  * See https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md
  *
- * mmap64 wasn't really around until L, but we added an inline for it since it
- * allows a lot more code to compile with _FILE_OFFSET_BITS=64.
+ * Available since API level 21.
  */
 void* mmap64(void* __addr, size_t __size, int __prot, int __flags, int __fd, off64_t __offset) __INTRODUCED_IN(21);
-#endif
 
 /**
  * [munmap(2)](http://man7.org/linux/man-pages/man2/munmap.2.html)
@@ -110,6 +107,8 @@
  * [mlockall(2)](http://man7.org/linux/man-pages/man2/mlockall.2.html)
  * locks pages (preventing swapping).
  *
+ * Available since API level 17.
+ *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
 int mlockall(int __flags) __INTRODUCED_IN(17);
@@ -118,6 +117,8 @@
  * [munlockall(2)](http://man7.org/linux/man-pages/man2/munlockall.2.html)
  * unlocks pages (allowing swapping).
  *
+ * Available since API level 17.
+ *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
 int munlockall(void) __INTRODUCED_IN(17);
@@ -134,6 +135,8 @@
  * [mlock2(2)](http://man7.org/linux/man-pages/man2/mlock.2.html)
  * locks pages (preventing swapping), with optional flags.
  *
+ * Available since API level 30.
+ *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
 int mlock2(const void* __addr, size_t __size, int __flags) __INTRODUCED_IN(30);
@@ -167,9 +170,14 @@
  * works just like madvise(2) but applies to the process specified by the given
  * PID file descriptor.
  *
+ * Available since API level 31. Its sibling process_mrelease() does not have a
+ * libc wrapper and should be called using syscall() instead. Given the lack of
+ * widespread applicability of this system call and the absence of wrappers in
+ * other libcs, it was probably a mistake to have added this wrapper to bionic.
+ *
  * Returns the number of bytes advised on success, and returns -1 and sets `errno` on failure.
  */
-ssize_t process_madvise(int __pid_fd, const struct iovec* __iov, size_t __count, int __advice, unsigned __flags);
+ssize_t process_madvise(int __pid_fd, const struct iovec* __iov, size_t __count, int __advice, unsigned __flags) __INTRODUCED_IN(31);
 
 #if defined(__USE_GNU)
 
@@ -177,6 +185,8 @@
  * [memfd_create(2)](http://man7.org/linux/man-pages/man2/memfd_create.2.html)
  * creates an anonymous file.
  *
+ * Available since API level 30.
+ *
  * Returns an fd on success, and returns -1 and sets `errno` on failure.
  */
 int memfd_create(const char* __name, unsigned __flags) __INTRODUCED_IN(30);
@@ -211,12 +221,11 @@
  * [posix_madvise(3)](http://man7.org/linux/man-pages/man3/posix_madvise.3.html)
  * gives the kernel advice about future usage patterns.
  *
- * Returns 0 on success, and returns a positive error number on failure.
+ * Available since API level 23.
+ * See also madvise() which is available at all API levels.
  *
- * See also madvise() which has been available much longer.
+ * Returns 0 on success, and returns a positive error number on failure.
  */
 int posix_madvise(void* __addr, size_t __size, int __advice) __INTRODUCED_IN(23);
 
 __END_DECLS
-
-#include <android/legacy_sys_mman_inlines.h>
diff --git a/libc/include/sys/mount.h b/libc/include/sys/mount.h
index 4db1ac1..aace205 100644
--- a/libc/include/sys/mount.h
+++ b/libc/include/sys/mount.h
@@ -55,7 +55,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int mount(const char* __source, const char* __target, const char* __fs_type, unsigned long __flags, const void* __data);
+int mount(const char* __BIONIC_COMPLICATED_NULLNESS __source, const char* _Nonnull __target, const char* __BIONIC_COMPLICATED_NULLNESS __fs_type, unsigned long __flags, const void* _Nullable __data);
 
 /**
  * [umount(2)](http://man7.org/linux/man-pages/man2/umount.2.html) unmounts the filesystem at
@@ -63,7 +63,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int umount(const char* __target);
+int umount(const char* _Nonnull __target);
 
 /**
  * [umount2(2)](http://man7.org/linux/man-pages/man2/umount2.2.html) unmounts the filesystem at
@@ -71,6 +71,6 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int umount2(const char* __target, int __flags);
+int umount2(const char* _Nonnull __target, int __flags);
 
 __END_DECLS
diff --git a/libc/include/sys/msg.h b/libc/include/sys/msg.h
index e19452c..ad481a0 100644
--- a/libc/include/sys/msg.h
+++ b/libc/include/sys/msg.h
@@ -46,12 +46,12 @@
 typedef __kernel_ulong_t msglen_t;
 
 /** Not useful on Android; disallowed by SELinux. */
-int msgctl(int __msg_id, int __cmd, struct msqid_ds* __buf) __INTRODUCED_IN(26);
+int msgctl(int __msg_id, int __cmd, struct msqid_ds* _Nullable __buf) __INTRODUCED_IN(26);
 /** Not useful on Android; disallowed by SELinux. */
 int msgget(key_t __key, int __flags) __INTRODUCED_IN(26);
 /** Not useful on Android; disallowed by SELinux. */
-ssize_t msgrcv(int __msg_id, void* __msgbuf_ptr, size_t __size, long __type, int __flags) __INTRODUCED_IN(26);
+ssize_t msgrcv(int __msg_id, void* _Nonnull __msgbuf_ptr, size_t __size, long __type, int __flags) __INTRODUCED_IN(26);
 /** Not useful on Android; disallowed by SELinux. */
-int msgsnd(int __msg_id, const void* __msgbuf_ptr, size_t __size, int __flags) __INTRODUCED_IN(26);
+int msgsnd(int __msg_id, const void* _Nonnull __msgbuf_ptr, size_t __size, int __flags) __INTRODUCED_IN(26);
 
 __END_DECLS
diff --git a/libc/include/sys/pidfd.h b/libc/include/sys/pidfd.h
index 6d0e809..30455bb 100644
--- a/libc/include/sys/pidfd.h
+++ b/libc/include/sys/pidfd.h
@@ -71,6 +71,6 @@
  *
  * Available since API level 31.
  */
-int pidfd_send_signal(int __pidfd, int __sig, siginfo_t *__info, unsigned int __flags) __INTRODUCED_IN(31);
+int pidfd_send_signal(int __pidfd, int __sig, siginfo_t * _Nullable __info, unsigned int __flags) __INTRODUCED_IN(31);
 
 __END_DECLS
diff --git a/libc/include/sys/quota.h b/libc/include/sys/quota.h
index f8faee7..79c653d 100644
--- a/libc/include/sys/quota.h
+++ b/libc/include/sys/quota.h
@@ -51,6 +51,6 @@
  *
  * Available since API level 26.
  */
-int quotactl(int __cmd, const char* __special, int __id, char* __addr) __INTRODUCED_IN(26);
+int quotactl(int __cmd, const char* _Nullable __special, int __id, char* __BIONIC_COMPLICATED_NULLNESS __addr) __INTRODUCED_IN(26);
 
 __END_DECLS
diff --git a/libc/include/sys/random.h b/libc/include/sys/random.h
index be52bd9..0251176 100644
--- a/libc/include/sys/random.h
+++ b/libc/include/sys/random.h
@@ -50,7 +50,7 @@
  *
  * See also arc4random_buf() which is available in all API levels.
  */
-int getentropy(void* __buffer, size_t __buffer_size) __wur __INTRODUCED_IN(28);
+int getentropy(void* _Nonnull __buffer, size_t __buffer_size) __wur __INTRODUCED_IN(28);
 
 /**
  * [getrandom(2)](http://man7.org/linux/man-pages/man2/getrandom.2.html) fills the given buffer
@@ -62,6 +62,6 @@
  *
  * See also arc4random_buf() which is available in all API levels.
  */
-ssize_t getrandom(void* __buffer, size_t __buffer_size, unsigned int __flags) __wur __INTRODUCED_IN(28);
+ssize_t getrandom(void* _Nonnull __buffer, size_t __buffer_size, unsigned int __flags) __wur __INTRODUCED_IN(28);
 
 __END_DECLS
diff --git a/libc/include/sys/resource.h b/libc/include/sys/resource.h
index 9181125..0b540de 100644
--- a/libc/include/sys/resource.h
+++ b/libc/include/sys/resource.h
@@ -41,20 +41,21 @@
 #define RLIM_SAVED_MAX RLIM_INFINITY
 
 typedef unsigned long rlim_t;
+typedef unsigned long long rlim64_t;
 
-int getrlimit(int __resource, struct rlimit* __limit);
-int setrlimit(int __resource, const struct rlimit* __limit);
+int getrlimit(int __resource, struct rlimit* _Nonnull __limit);
+int setrlimit(int __resource, const struct rlimit* _Nonnull __limit);
 
-int getrlimit64(int __resource, struct rlimit64* __limit) __INTRODUCED_IN(21);
-int setrlimit64(int __resource, const struct rlimit64* __limit) __INTRODUCED_IN(21);
+int getrlimit64(int __resource, struct rlimit64* _Nonnull __limit) __INTRODUCED_IN(21);
+int setrlimit64(int __resource, const struct rlimit64* _Nonnull __limit) __INTRODUCED_IN(21);
 
 int getpriority(int __which, id_t __who);
 int setpriority(int __which, id_t __who, int __priority);
 
-int getrusage(int __who, struct rusage* __usage);
+int getrusage(int __who, struct rusage* _Nonnull __usage);
 
-int prlimit(pid_t __pid, int __resource, const struct rlimit* __new_limit, struct rlimit* __old_limit) __INTRODUCED_IN_32(24) __INTRODUCED_IN_64(21);
-int prlimit64(pid_t __pid, int __resource, const struct rlimit64* __new_limit, struct rlimit64* __old_limit) __INTRODUCED_IN(21);
+int prlimit(pid_t __pid, int __resource, const struct rlimit* _Nullable __new_limit, struct rlimit* _Nullable __old_limit) __INTRODUCED_IN_32(24) __INTRODUCED_IN_64(21);
+int prlimit64(pid_t __pid, int __resource, const struct rlimit64* _Nullable __new_limit, struct rlimit64* _Nullable __old_limit) __INTRODUCED_IN(21);
 
 __END_DECLS
 
diff --git a/libc/include/sys/select.h b/libc/include/sys/select.h
index 65571eb..8c6c2ff 100644
--- a/libc/include/sys/select.h
+++ b/libc/include/sys/select.h
@@ -71,16 +71,14 @@
     } \
   } while (0)
 
-void __FD_CLR_chk(int, fd_set*, size_t) __INTRODUCED_IN(21);
-void __FD_SET_chk(int, fd_set*, size_t) __INTRODUCED_IN(21);
-int __FD_ISSET_chk(int, const fd_set*, size_t) __INTRODUCED_IN(21);
+void __FD_CLR_chk(int, fd_set* _Nonnull , size_t) __INTRODUCED_IN(21);
+void __FD_SET_chk(int, fd_set* _Nonnull, size_t) __INTRODUCED_IN(21);
+int __FD_ISSET_chk(int, const fd_set* _Nonnull, size_t) __INTRODUCED_IN(21);
 
 #define __FD_CLR(fd, set) (__FDS_BITS(fd_set*,set)[__FDELT(fd)] &= ~__FDMASK(fd))
 #define __FD_SET(fd, set) (__FDS_BITS(fd_set*,set)[__FDELT(fd)] |= __FDMASK(fd))
 #define __FD_ISSET(fd, set) ((__FDS_BITS(const fd_set*,set)[__FDELT(fd)] & __FDMASK(fd)) != 0)
 
-#if __ANDROID_API__ >= 21
-
 /** Removes `fd` from the given set. Use <poll.h> instead. */
 #define FD_CLR(fd, set) __FD_CLR_chk(fd, set, __bos(set))
 /** Adds `fd` to the given set. Use <poll.h> instead. */
@@ -88,17 +86,6 @@
 /** Tests whether `fd` is in the given set. Use <poll.h> instead. */
 #define FD_ISSET(fd, set) __FD_ISSET_chk(fd, set, __bos(set))
 
-#else
-
-/** Removes `fd` from the given set. Use <poll.h> instead. */
-#define FD_CLR(fd, set) __FD_CLR(fd, set)
-/** Adds `fd` to the given set. Use <poll.h> instead. */
-#define FD_SET(fd, set) __FD_SET(fd, set)
-/** Tests whether `fd` is in the given set. Use <poll.h> instead. */
-#define FD_ISSET(fd, set) __FD_ISSET(fd, set)
-
-#endif /* __ANDROID_API >= 21 */
-
 /**
  * [select(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
  * set of file descriptors.
@@ -108,7 +95,7 @@
  * Returns the number of ready file descriptors on success, 0 for timeout,
  * and returns -1 and sets `errno` on failure.
  */
-int select(int __max_fd_plus_one, fd_set* __read_fds, fd_set* __write_fds, fd_set* __exception_fds, struct timeval* __timeout);
+int select(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, struct timeval* _Nullable __timeout);
 
 /**
  * [pselect(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
@@ -119,7 +106,7 @@
  * Returns the number of ready file descriptors on success, 0 for timeout,
  * and returns -1 and sets `errno` on failure.
  */
-int pselect(int __max_fd_plus_one, fd_set* __read_fds, fd_set* __write_fds, fd_set* __exception_fds, const struct timespec* __timeout, const sigset_t* __mask);
+int pselect(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, const struct timespec* _Nullable __timeout, const sigset_t* _Nullable __mask);
 
 /**
  * [pselect64(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
@@ -132,6 +119,6 @@
  *
  * Available since API level 28.
  */
-int pselect64(int __max_fd_plus_one, fd_set* __read_fds, fd_set* __write_fds, fd_set* __exception_fds, const struct timespec* __timeout, const sigset64_t* __mask) __INTRODUCED_IN(28);
+int pselect64(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, const struct timespec* _Nullable __timeout, const sigset64_t* _Nullable __mask) __INTRODUCED_IN(28);
 
 __END_DECLS
diff --git a/libc/include/sys/sem.h b/libc/include/sys/sem.h
index cd62242..f4256e2 100644
--- a/libc/include/sys/sem.h
+++ b/libc/include/sys/sem.h
@@ -45,18 +45,18 @@
 
 union semun {
   int val;
-  struct semid_ds* buf;
-  unsigned short* array;
-  struct seminfo* __buf;
-  void* __pad;
+  struct semid_ds* _Nullable buf;
+  unsigned short* _Nullable array;
+  struct seminfo* _Nullable __buf;
+  void* _Nullable __pad;
 };
 
 int semctl(int __sem_id, int __sem_num, int __cmd, ...) __INTRODUCED_IN(26);
 int semget(key_t __key, int __sem_count, int __flags) __INTRODUCED_IN(26);
-int semop(int __sem_id, struct sembuf* __ops, size_t __op_count) __INTRODUCED_IN(26);
+int semop(int __sem_id, struct sembuf* _Nonnull __ops, size_t __op_count) __INTRODUCED_IN(26);
 
 #if defined(__USE_GNU)
-int semtimedop(int __sem_id, struct sembuf* __ops, size_t __op_count, const struct timespec* __timeout) __INTRODUCED_IN(26);
+int semtimedop(int __sem_id, struct sembuf* _Nonnull __ops, size_t __op_count, const struct timespec* _Nullable __timeout) __INTRODUCED_IN(26);
 #endif
 
 __END_DECLS
diff --git a/libc/include/sys/sendfile.h b/libc/include/sys/sendfile.h
index 60bbde8..4b00d5d 100644
--- a/libc/include/sys/sendfile.h
+++ b/libc/include/sys/sendfile.h
@@ -40,7 +40,7 @@
 
 /* See https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
 #if defined(__USE_FILE_OFFSET64)
-ssize_t sendfile(int __out_fd, int __in_fd, off_t* __offset, size_t __count) __RENAME(sendfile64) __INTRODUCED_IN(21);
+ssize_t sendfile(int __out_fd, int __in_fd, off_t* _Nullable __offset, size_t __count) __RENAME(sendfile64) __INTRODUCED_IN(21);
 #else
 /**
  * [sendfile(2)](http://man7.org/linux/man-pages/man2/sendfile.2.html) copies data directly
@@ -50,13 +50,13 @@
  *
  * Available since API level 21.
  */
-ssize_t sendfile(int __out_fd, int __in_fd, off_t* __offset, size_t __count);
+ssize_t sendfile(int __out_fd, int __in_fd, off_t* _Nullable __offset, size_t __count);
 #endif
 
 /**
  * Like sendfile() but allows using a 64-bit offset
  * even from a 32-bit process without `__FILE_OFFSET_BITS=64`.
  */
-ssize_t sendfile64(int __out_fd, int __in_fd, off64_t* __offset, size_t __count) __INTRODUCED_IN(21);
+ssize_t sendfile64(int __out_fd, int __in_fd, off64_t* _Nullable __offset, size_t __count) __INTRODUCED_IN(21);
 
 __END_DECLS
diff --git a/libc/include/sys/signalfd.h b/libc/include/sys/signalfd.h
index bd911f7..f669cc8 100644
--- a/libc/include/sys/signalfd.h
+++ b/libc/include/sys/signalfd.h
@@ -48,11 +48,11 @@
  *
  * Available since API level 18.
  */
-int signalfd(int __fd, const sigset_t* __mask, int __flags) __INTRODUCED_IN(18);
+int signalfd(int __fd, const sigset_t* _Nonnull __mask, int __flags) __INTRODUCED_IN(18);
 
 /**
  * Like signalfd() but allows setting a signal mask with RT signals even from a 32-bit process.
  */
-int signalfd64(int __fd, const sigset64_t* __mask, int __flags) __INTRODUCED_IN(28);
+int signalfd64(int __fd, const sigset64_t* _Nonnull __mask, int __flags) __INTRODUCED_IN(28);
 
 __END_DECLS
diff --git a/libc/include/sys/socket.h b/libc/include/sys/socket.h
index f33f112..41c5a9a 100644
--- a/libc/include/sys/socket.h
+++ b/libc/include/sys/socket.h
@@ -116,22 +116,7 @@
    ? (struct cmsghdr*) (msg)->msg_control : (struct cmsghdr*) NULL)
 #define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) &&   (cmsg)->cmsg_len <= (unsigned long)   ((mhdr)->msg_controllen -   ((char*)(cmsg) - (char*)(mhdr)->msg_control)))
 
-#if __ANDROID_API__ >= 21
 struct cmsghdr* __cmsg_nxthdr(struct msghdr* __msg, struct cmsghdr* __cmsg) __INTRODUCED_IN(21);
-#else
-/* TODO(danalbert): Move this into libandroid_support. */
-static inline struct cmsghdr* __cmsg_nxthdr(struct msghdr* msg, struct cmsghdr* cmsg) {
-  struct cmsghdr* ptr =
-      __BIONIC_CAST(reinterpret_cast, struct cmsghdr*,
-                    (__BIONIC_CAST(reinterpret_cast, char*, cmsg) + CMSG_ALIGN(cmsg->cmsg_len)));
-  size_t len = __BIONIC_CAST(reinterpret_cast, char*, ptr + 1) -
-               __BIONIC_CAST(reinterpret_cast, char*, msg->msg_control);
-  if (len > msg->msg_controllen) {
-    return NULL;
-  }
-  return ptr;
-}
-#endif
 
 #define SCM_RIGHTS 0x01
 #define SCM_CREDENTIALS 0x02
diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h
index 4184f6c..54621b7 100644
--- a/libc/include/sys/stat.h
+++ b/libc/include/sys/stat.h
@@ -40,7 +40,7 @@
 
 __BEGIN_DECLS
 
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__riscv)
 #define __STAT64_BODY \
   dev_t st_dev; \
   ino_t st_ino; \
@@ -136,42 +136,74 @@
 #define S_TYPEISSHM(__sb) 0
 #define S_TYPEISTMO(__sb) 0
 
-int chmod(const char* __path, mode_t __mode);
+int chmod(const char* _Nonnull __path, mode_t __mode);
 int fchmod(int __fd, mode_t __mode);
-int mkdir(const char* __path, mode_t __mode);
+int mkdir(const char* _Nonnull __path, mode_t __mode);
 
-int fstat(int __fd, struct stat* __buf);
-int fstat64(int __fd, struct stat64* __buf) __RENAME_STAT64(fstat, 3, 21);
-int fstatat(int __dir_fd, const char* __path, struct stat* __buf, int __flags);
-int fstatat64(int __dir_fd, const char* __path, struct stat64* __buf, int __flags) __RENAME_STAT64(fstatat, 3, 21);
-int lstat(const char* __path, struct stat* __buf);
-int lstat64(const char* __path, struct stat64* __buf) __RENAME_STAT64(lstat, 3, 21);
-int stat(const char* __path, struct stat* __buf);
-int stat64(const char* __path, struct stat64* __buf) __RENAME_STAT64(stat, 3, 21);
+int fstat(int __fd, struct stat* _Nonnull __buf);
+int fstat64(int __fd, struct stat64* _Nonnull __buf) __RENAME_STAT64(fstat, 3, 21);
+int fstatat(int __dir_fd, const char* _Nonnull __path, struct stat* _Nonnull __buf, int __flags);
+int fstatat64(int __dir_fd, const char* _Nonnull __path, struct stat64* _Nonnull __buf, int __flags) __RENAME_STAT64(fstatat, 3, 21);
+int lstat(const char* _Nonnull __path, struct stat* _Nonnull __buf);
+int lstat64(const char* _Nonnull __path, struct stat64* _Nonnull __buf) __RENAME_STAT64(lstat, 3, 21);
+int stat(const char* _Nonnull __path, struct stat* _Nonnull __buf);
+int stat64(const char* _Nonnull __path, struct stat64* _Nonnull __buf) __RENAME_STAT64(stat, 3, 21);
 
-int mknod(const char* __path, mode_t __mode, dev_t __dev);
+int mknod(const char* _Nonnull __path, mode_t __mode, dev_t __dev);
 mode_t umask(mode_t __mask);
 
 #if defined(__BIONIC_INCLUDE_FORTIFY_HEADERS)
 #include <bits/fortify/stat.h>
 #endif
 
-#if __ANDROID_API__ >= 21
-int mkfifo(const char* __path, mode_t __mode) __INTRODUCED_IN(21);
-#else
-// Implemented as a static inline before 21.
-#endif
+int mkfifo(const char* _Nonnull __path, mode_t __mode) __INTRODUCED_IN(21);
+int mkfifoat(int __dir_fd, const char* _Nonnull __path, mode_t __mode) __INTRODUCED_IN(23);
 
-int mkfifoat(int __dir_fd, const char* __path, mode_t __mode) __INTRODUCED_IN(23);
+int fchmodat(int __dir_fd, const char* _Nonnull __path, mode_t __mode, int __flags);
+int mkdirat(int __dir_fd, const char* _Nonnull __path, mode_t __mode);
+int mknodat(int __dir_fd, const char* _Nonnull __path, mode_t __mode, dev_t __dev) __INTRODUCED_IN(21);
 
-int fchmodat(int __dir_fd, const char* __path, mode_t __mode, int __flags);
-int mkdirat(int __dir_fd, const char* __path, mode_t __mode);
-int mknodat(int __dir_fd, const char* __path, mode_t __mode, dev_t __dev) __INTRODUCED_IN(21);
-
+/**
+ * Used in the tv_nsec field of an argument to utimensat()/futimens()
+ * to set that time to the current time.
+ */
 #define UTIME_NOW  ((1L << 30) - 1L)
+
+/**
+ * Used in the tv_nsec field of an argument to utimensat()/futimens()
+ * to _not_ set that time.
+ */
 #define UTIME_OMIT ((1L << 30) - 2L)
-int utimensat(int __dir_fd, const char* __path, const struct timespec __times[2], int __flags);
-int futimens(int __dir_fd, const struct timespec __times[2]) __INTRODUCED_IN(19);
+
+/**
+ * [utimensat(2)](https://man7.org/linux/man-pages/man2/utimensat.2.html) sets
+ * file timestamps.
+ *
+ * Note: Linux supports `__path` being NULL (in which case `__dir_fd` need not
+ * be a directory), allowing futimens() to be implemented with utimensat().
+ * For normal use of utimensat(), though, `__path` should be non-null.
+ *
+ * `__times[0]` is the access time (atime), and `__times[1]` the last modification time (mtime).
+ * If `__times` is NULL, both times are set to the current time.
+ * See also UTIME_NOW and UTIME_OMIT.
+ *
+ * Returns 0 on success and returns -1 and sets `errno` on failure.
+ */
+int utimensat(int __dir_fd, const char* __BIONIC_COMPLICATED_NULLNESS __path, const struct timespec __times[_Nullable 2], int __flags);
+
+/**
+ * [futimens(2)](https://man7.org/linux/man-pages/man2/utimensat.2.html) sets
+ * the given file descriptor's timestamp.
+ *
+ * `__times[0]` is the access time (atime), and `__times[1]` the last modification time (mtime).
+ * If `__times` is NULL, both times are set to the current time.
+ * See also UTIME_NOW and UTIME_OMIT.
+ *
+ * Returns 0 on success and returns -1 and sets `errno` on failure.
+ *
+ * Available since API level 19.
+ */
+int futimens(int __fd, const struct timespec __times[_Nullable 2]) __INTRODUCED_IN(19);
 
 #if defined(__USE_GNU)
 /**
@@ -179,10 +211,10 @@
  * extended file status information.
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
+ *
+ * Available since API level 30.
  */
-int statx(int __dir_fd, const char* __path, int __flags, unsigned __mask, struct statx* __buf) __INTRODUCED_IN(30);
+int statx(int __dir_fd, const char* _Nonnull __path, int __flags, unsigned __mask, struct statx* _Nonnull __buf) __INTRODUCED_IN(30);
 #endif
 
 __END_DECLS
-
-#include <android/legacy_sys_stat_inlines.h>
diff --git a/libc/include/sys/statvfs.h b/libc/include/sys/statvfs.h
index 93fa3d7..d81f836 100644
--- a/libc/include/sys/statvfs.h
+++ b/libc/include/sys/statvfs.h
@@ -27,63 +27,39 @@
 
 __BEGIN_DECLS
 
-struct statvfs {
-  /** Block size. */
-  unsigned long f_bsize;
-  /** Fragment size. */
-  unsigned long f_frsize;
-  /** Total size of filesystem in `f_frsize` blocks. */
-  fsblkcnt_t f_blocks;
-  /** Number of free blocks. */
-  fsblkcnt_t f_bfree;
-  /** Number of free blocks for non-root. */
-  fsblkcnt_t f_bavail;
-  /** Number of inodes. */
-  fsfilcnt_t f_files;
-  /** Number of free inodes. */
-  fsfilcnt_t f_ffree;
-  /** Number of free inodes for non-root. */
-  fsfilcnt_t f_favail;
-  /** Filesystem id. */
-  unsigned long f_fsid;
-  /** Mount flags. (See `ST_` constants.) */
-  unsigned long f_flag;
-  /** Maximum filename length. */
-  unsigned long f_namemax;
+#define __STATVFS64_BODY \
+  /** Block size. */ \
+  unsigned long f_bsize; \
+  /** Fragment size. */ \
+  unsigned long f_frsize; \
+  /** Total size of filesystem in `f_frsize` blocks. */ \
+  fsblkcnt_t f_blocks; \
+  /** Number of free blocks. */ \
+  fsblkcnt_t f_bfree; \
+  /** Number of free blocks for non-root. */ \
+  fsblkcnt_t f_bavail; \
+  /** Number of inodes. */ \
+  fsfilcnt_t f_files; \
+  /** Number of free inodes. */ \
+  fsfilcnt_t f_ffree; \
+  /** Number of free inodes for non-root. */ \
+  fsfilcnt_t f_favail; \
+  /** Filesystem id. */ \
+  unsigned long f_fsid; \
+  /** Mount flags. (See `ST_` constants.) */ \
+  unsigned long f_flag; \
+  /** Maximum filename length. */ \
+  unsigned long f_namemax; \
 
 #if defined(__LP64__)
-  uint32_t __f_reserved[6];
+#define __STATVFS64_CODA uint32_t __f_reserved[6];
+#else
+#define __STATVFS64_CODA
 #endif
-};
 
-struct statvfs64 {
-  /** Block size. */
-  unsigned long f_bsize;
-  /** Fragment size. */
-  unsigned long f_frsize;
-  /** Total size of filesystem in `f_frsize` blocks. */
-  fsblkcnt_t f_blocks;
-  /** Number of free blocks. */
-  fsblkcnt_t f_bfree;
-  /** Number of free blocks for non-root. */
-  fsblkcnt_t f_bavail;
-  /** Number of inodes. */
-  fsfilcnt_t f_files;
-  /** Number of free inodes. */
-  fsfilcnt_t f_ffree;
-  /** Number of free inodes for non-root. */
-  fsfilcnt_t f_favail;
-  /** Filesystem id. */
-  unsigned long f_fsid;
-  /** Mount flags. (See `ST_` constants.) */
-  unsigned long f_flag;
-  /** Maximum filename length. */
-  unsigned long f_namemax;
+struct statvfs { __STATVFS64_BODY __STATVFS64_CODA };
 
-#if defined(__LP64__)
-  uint32_t __f_reserved[6];
-#endif
-};
+struct statvfs64 { __STATVFS64_BODY __STATVFS64_CODA };
 
 /** Flag for `f_flag` in `struct statvfs`: mounted read-only. */
 #define ST_RDONLY      0x0001
@@ -112,38 +88,30 @@
 /** Flag for `f_flag` in `struct statvfs`: see `MS_RELATIME`. */
 #define ST_RELATIME    0x1000
 
-#if __ANDROID_API__ >= 19
-// These functions are implemented as static inlines before API level 19.
-
 /**
  * [statvfs(3)](http://man7.org/linux/man-pages/man3/statvfs.3.html)
  * queries filesystem statistics for the given path.
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
+ *
+ * Available since API level 19.
  */
-int statvfs(const char* __path, struct statvfs* __buf) __INTRODUCED_IN(19);
+int statvfs(const char* _Nonnull __path, struct statvfs* _Nonnull __buf) __INTRODUCED_IN(19);
 
 /**
  * [fstatvfs(3)](http://man7.org/linux/man-pages/man3/fstatvfs.3.html)
  * queries filesystem statistics for the given file descriptor.
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
+ *
+ * Available since API level 19.
  */
-int fstatvfs(int __fd, struct statvfs* __buf) __INTRODUCED_IN(19);
+int fstatvfs(int __fd, struct statvfs* _Nonnull __buf) __INTRODUCED_IN(19);
 
-#endif
-
-#if __ANDROID_API__ >= 21
-// These functions are implemented as static inlines before API level 21.
-
-/** Equivalent to statvfs(). */
-int statvfs64(const char* __path, struct statvfs64* __buf) __INTRODUCED_IN(21);
+/** Equivalent to statvfs() . */
+int statvfs64(const char* _Nonnull __path, struct statvfs64* _Nonnull __buf) __INTRODUCED_IN(21);
 
 /** Equivalent to fstatvfs(). */
-int fstatvfs64(int __fd, struct statvfs64* __buf) __INTRODUCED_IN(21);
-
-#endif
+int fstatvfs64(int __fd, struct statvfs64* _Nonnull __buf) __INTRODUCED_IN(21);
 
 __END_DECLS
-
-#include <android/legacy_sys_statvfs_inlines.h>
diff --git a/libc/include/sys/swap.h b/libc/include/sys/swap.h
index 467b98c..9d016d4 100644
--- a/libc/include/sys/swap.h
+++ b/libc/include/sys/swap.h
@@ -58,7 +58,7 @@
  *
  * Available since API level 19.
  */
-int swapon(const char* __path,  int __flags) __INTRODUCED_IN(19);
+int swapon(const char* _Nonnull __path,  int __flags) __INTRODUCED_IN(19);
 
 /**
  * [swapoff(2)](http://man7.org/linux/man-pages/man2/swapoff.2.html) disables swapping.
@@ -67,6 +67,6 @@
  *
  * Available since API level 19.
  */
-int swapoff(const char* __path) __INTRODUCED_IN(19);
+int swapoff(const char* _Nonnull __path) __INTRODUCED_IN(19);
 
 __END_DECLS
diff --git a/libc/include/sys/sysinfo.h b/libc/include/sys/sysinfo.h
index 4ecf986..cae5c49 100644
--- a/libc/include/sys/sysinfo.h
+++ b/libc/include/sys/sysinfo.h
@@ -43,7 +43,7 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int sysinfo(struct sysinfo* __info);
+int sysinfo(struct sysinfo* _Nonnull __info);
 
 /**
  * [get_nprocs_conf(3)](http://man7.org/linux/man-pages/man3/get_nprocs_conf.3.html) returns
diff --git a/libc/include/sys/ucontext.h b/libc/include/sys/ucontext.h
index 9c5801f..4f4d5ce 100644
--- a/libc/include/sys/ucontext.h
+++ b/libc/include/sys/ucontext.h
@@ -26,8 +26,7 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _SYS_UCONTEXT_H_
-#define _SYS_UCONTEXT_H_
+#pragma once
 
 #include <sys/cdefs.h>
 
@@ -313,8 +312,81 @@
   struct _libc_fpstate __fpregs_mem;
 } ucontext_t;
 
+#elif defined(__riscv)
+
+#define NGREG 32
+
+#if defined(__USE_GNU)
+
+enum {
+  REG_PC = 0,
+#define REG_PC REG_PC
+  REG_RA = 1,
+#define REG_RA REG_RA
+  REG_SP = 2,
+#define REG_SP REG_SP
+  REG_TP = 4,
+#define REG_TP REG_TP
+  REG_S0 = 8,
+#define REG_S0 REG_S0
+  REG_A0 = 10,
+#define REG_A0 REG_A0
+};
+
+#endif // defined(__USE_GNU)
+
+typedef unsigned long __riscv_mc_gp_state[NGREG];
+
+typedef unsigned long greg_t;
+typedef unsigned long gregset_t[NGREG];
+typedef union __riscv_mc_fp_state fpregset_t;
+
+/* These match the kernel <asm/ptrace.h> types but with different names. */
+
+struct __riscv_mc_f_ext_state {
+  uint32_t __f[32];
+  uint32_t __fcsr;
+};
+
+struct __riscv_mc_d_ext_state {
+  uint64_t __f[32];
+  uint32_t __fcsr;
+};
+
+struct __riscv_mc_q_ext_state {
+  uint64_t __f[64] __attribute__((__aligned__(16)));
+  uint32_t __fcsr;
+  uint32_t __reserved[3];
+};
+
+union __riscv_mc_fp_state {
+  struct __riscv_mc_f_ext_state __f;
+  struct __riscv_mc_d_ext_state __d;
+  struct __riscv_mc_q_ext_state __q;
+};
+
+/* This matches the kernel <asm/sigcontext.h> but with different names. */
+
+typedef struct mcontext_t {
+  __riscv_mc_gp_state __gregs;
+  union __riscv_mc_fp_state __fpregs;
+} mcontext_t;
+
+/* This matches the kernel <asm/ucontext.h> but using mcontext_t. */
+
+typedef struct ucontext {
+  unsigned long uc_flags;
+  struct ucontext* uc_link;
+  stack_t uc_stack;
+  union {
+    sigset_t uc_sigmask;
+    sigset64_t uc_sigmask64;
+  };
+  /* The kernel adds extra padding here to allow sigset_t to grow. */
+  char __padding[128 - sizeof(sigset_t)];
+  mcontext_t uc_mcontext;
+} ucontext_t;
+
 #endif
 
 __END_DECLS
-
-#endif /* _SYS_UCONTEXT_H_ */
diff --git a/libc/include/sys/uio.h b/libc/include/sys/uio.h
index 583cfc6..c8c64ae 100644
--- a/libc/include/sys/uio.h
+++ b/libc/include/sys/uio.h
@@ -46,7 +46,7 @@
  * Returns the number of bytes read on success,
  * and returns -1 and sets `errno` on failure.
  */
-ssize_t readv(int __fd, const struct iovec* __iov, int __count);
+ssize_t readv(int __fd, const struct iovec* _Nonnull __iov, int __count);
 
 /**
  * [writev(2)](http://man7.org/linux/man-pages/man2/writev.2.html) writes
@@ -55,7 +55,7 @@
  * Returns the number of bytes written on success,
  * and returns -1 and sets `errno` on failure.
  */
-ssize_t writev(int __fd, const struct iovec* __iov, int __count);
+ssize_t writev(int __fd, const struct iovec* _Nonnull __iov, int __count);
 
 #if defined(__USE_GNU)
 
@@ -69,7 +69,7 @@
  *
  * Available since API level 24.
  */
-ssize_t preadv(int __fd, const struct iovec* __iov, int __count, off_t __offset) __RENAME_IF_FILE_OFFSET64(preadv64) __INTRODUCED_IN(24);
+ssize_t preadv(int __fd, const struct iovec* _Nonnull __iov, int __count, off_t __offset) __RENAME_IF_FILE_OFFSET64(preadv64) __INTRODUCED_IN(24);
 
 /**
  * [pwritev(2)](http://man7.org/linux/man-pages/man2/pwritev.2.html) writes
@@ -81,21 +81,21 @@
  *
  * Available since API level 24.
  */
-ssize_t pwritev(int __fd, const struct iovec* __iov, int __count, off_t __offset) __RENAME_IF_FILE_OFFSET64(pwritev64) __INTRODUCED_IN(24);
+ssize_t pwritev(int __fd, const struct iovec* _Nonnull __iov, int __count, off_t __offset) __RENAME_IF_FILE_OFFSET64(pwritev64) __INTRODUCED_IN(24);
 
 /**
  * Like preadv() but with a 64-bit offset even in a 32-bit process.
  *
  * Available since API level 24.
  */
-ssize_t preadv64(int __fd, const struct iovec* __iov, int __count, off64_t __offset) __INTRODUCED_IN(24);
+ssize_t preadv64(int __fd, const struct iovec* _Nonnull __iov, int __count, off64_t __offset) __INTRODUCED_IN(24);
 
 /**
  * Like pwritev() but with a 64-bit offset even in a 32-bit process.
  *
  * Available since API level 24.
  */
-ssize_t pwritev64(int __fd, const struct iovec* __iov, int __count, off64_t __offset) __INTRODUCED_IN(24);
+ssize_t pwritev64(int __fd, const struct iovec* _Nonnull __iov, int __count, off64_t __offset) __INTRODUCED_IN(24);
 
 /**
  * [preadv2(2)](http://man7.org/linux/man-pages/man2/preadv2.2.html) reads
@@ -107,7 +107,7 @@
  *
  * Available since API level 33.
  */
-ssize_t preadv2(int __fd, const struct iovec* __iov, int __count, off_t __offset, int __flags) __RENAME_IF_FILE_OFFSET64(preadv64v2) __INTRODUCED_IN(33);
+ssize_t preadv2(int __fd, const struct iovec* _Nonnull __iov, int __count, off_t __offset, int __flags) __RENAME_IF_FILE_OFFSET64(preadv64v2) __INTRODUCED_IN(33);
 
 /**
  * [pwritev2(2)](http://man7.org/linux/man-pages/man2/pwritev2.2.html) writes
@@ -119,21 +119,21 @@
  *
  * Available since API level 33.
  */
-ssize_t pwritev2(int __fd, const struct iovec* __iov, int __count, off_t __offset, int __flags) __RENAME_IF_FILE_OFFSET64(pwritev64v2) __INTRODUCED_IN(33);
+ssize_t pwritev2(int __fd, const struct iovec* _Nonnull __iov, int __count, off_t __offset, int __flags) __RENAME_IF_FILE_OFFSET64(pwritev64v2) __INTRODUCED_IN(33);
 
 /**
  * Like preadv2() but with a 64-bit offset even in a 32-bit process.
  *
  * Available since API level 33.
  */
-ssize_t preadv64v2(int __fd, const struct iovec* __iov, int __count, off64_t __offset, int __flags) __INTRODUCED_IN(33);
+ssize_t preadv64v2(int __fd, const struct iovec* _Nonnull __iov, int __count, off64_t __offset, int __flags) __INTRODUCED_IN(33);
 
 /**
  * Like pwritev2() but with a 64-bit offset even in a 32-bit process.
  *
  * Available since API level 33.
  */
-ssize_t pwritev64v2(int __fd, const struct iovec* __iov, int __count, off64_t __offset, int __flags) __INTRODUCED_IN(33);
+ssize_t pwritev64v2(int __fd, const struct iovec* _Nonnull __iov, int __count, off64_t __offset, int __flags) __INTRODUCED_IN(33);
 
 /**
  * [process_vm_readv(2)](http://man7.org/linux/man-pages/man2/process_vm_readv.2.html)
@@ -144,7 +144,7 @@
  *
  * Available since API level 23.
  */
-ssize_t process_vm_readv(pid_t __pid, const struct iovec* __local_iov, unsigned long __local_iov_count, const struct iovec* __remote_iov, unsigned long __remote_iov_count, unsigned long __flags) __INTRODUCED_IN(23);
+ssize_t process_vm_readv(pid_t __pid, const struct iovec* __BIONIC_COMPLICATED_NULLNESS __local_iov, unsigned long __local_iov_count, const struct iovec* __BIONIC_COMPLICATED_NULLNESS __remote_iov, unsigned long __remote_iov_count, unsigned long __flags) __INTRODUCED_IN(23);
 
 /**
  * [process_vm_writev(2)](http://man7.org/linux/man-pages/man2/process_vm_writev.2.html)
@@ -155,7 +155,7 @@
  *
  * Available since API level 23.
  */
-ssize_t process_vm_writev(pid_t __pid, const struct iovec* __local_iov, unsigned long __local_iov_count, const struct iovec* __remote_iov, unsigned long __remote_iov_count, unsigned long __flags) __INTRODUCED_IN(23);
+ssize_t process_vm_writev(pid_t __pid, const struct iovec* __BIONIC_COMPLICATED_NULLNESS __local_iov, unsigned long __local_iov_count, const struct iovec* __BIONIC_COMPLICATED_NULLNESS __remote_iov, unsigned long __remote_iov_count, unsigned long __flags) __INTRODUCED_IN(23);
 
 #endif
 
diff --git a/libc/include/sys/user.h b/libc/include/sys/user.h
index 2392edd..432c7cb 100644
--- a/libc/include/sys/user.h
+++ b/libc/include/sys/user.h
@@ -26,8 +26,7 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _SYS_USER_H_
-#define _SYS_USER_H_
+#pragma once
 
 #include <sys/cdefs.h>
 #include <stddef.h> /* For size_t. */
@@ -233,6 +232,11 @@
   uint32_t fpcr;
 };
 
+#elif defined(__riscv)
+
+// This space deliberately left blank for now.
+// No other libcs have any riscv64-specific structs.
+
 #else
 
 #error "Unsupported architecture."
@@ -240,5 +244,3 @@
 #endif
 
 __END_DECLS
-
-#endif  /* _SYS_USER_H_ */
diff --git a/libc/include/sys/utsname.h b/libc/include/sys/utsname.h
index 1fa3187..aa8c1a0 100644
--- a/libc/include/sys/utsname.h
+++ b/libc/include/sys/utsname.h
@@ -62,6 +62,6 @@
  *
  * Returns 0 on success, and returns -1 and sets `errno` on failure.
  */
-int uname(struct utsname* __buf);
+int uname(struct utsname* _Nonnull __buf);
 
 __END_DECLS
diff --git a/libc/include/sys/vfs.h b/libc/include/sys/vfs.h
index ad859f0..18ae428 100644
--- a/libc/include/sys/vfs.h
+++ b/libc/include/sys/vfs.h
@@ -104,10 +104,10 @@
 #define XENIX_SUPER_MAGIC     0x012FF7B4
 #define XFS_SUPER_MAGIC       0x58465342
 
-int statfs(const char* __path, struct statfs* __buf);
-int statfs64(const char* __path, struct statfs64* __buf) __INTRODUCED_IN(21);
-int fstatfs(int __fd, struct statfs* __buf);
-int fstatfs64(int __fd, struct statfs64* __buf) __INTRODUCED_IN(21);
+int statfs(const char* _Nonnull __path, struct statfs* _Nonnull __buf);
+int statfs64(const char* _Nonnull __path, struct statfs64* _Nonnull __buf) __INTRODUCED_IN(21);
+int fstatfs(int __fd, struct statfs* _Nonnull __buf);
+int fstatfs64(int __fd, struct statfs64* _Nonnull __buf) __INTRODUCED_IN(21);
 
 __END_DECLS
 
diff --git a/libc/include/sys/wait.h b/libc/include/sys/wait.h
index 8c0655f..e6fb855 100644
--- a/libc/include/sys/wait.h
+++ b/libc/include/sys/wait.h
@@ -26,8 +26,7 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _SYS_WAIT_H_
-#define _SYS_WAIT_H_
+#pragma once
 
 #include <bits/wait.h>
 #include <sys/cdefs.h>
@@ -38,13 +37,9 @@
 
 __BEGIN_DECLS
 
-pid_t wait(int* __status);
-pid_t waitpid(pid_t __pid, int* __status, int __options);
-#if __ANDROID_API__ >= 18
-pid_t wait4(pid_t __pid, int* __status, int __options, struct rusage* __rusage) __INTRODUCED_IN(18);
-#else
-// Implemented as a static inline before 18.
-#endif
+pid_t wait(int* _Nullable __status);
+pid_t waitpid(pid_t __pid, int* _Nullable __status, int __options);
+pid_t wait4(pid_t __pid, int* _Nullable __status, int __options, struct rusage* _Nullable __rusage) __INTRODUCED_IN(18);
 
 /* Posix states that idtype_t should be an enumeration type, but
  * the kernel headers define P_ALL, P_PID and P_PGID as constant macros
@@ -52,10 +47,6 @@
  */
 typedef int idtype_t;
 
-int waitid(idtype_t __type, id_t __id, siginfo_t* __info, int __options);
+int waitid(idtype_t __type, id_t __id, siginfo_t* _Nullable __info, int __options);
 
 __END_DECLS
-
-#include <android/legacy_sys_wait_inlines.h>
-
-#endif
diff --git a/libc/include/syslog.h b/libc/include/syslog.h
index 45de253..90ea76e 100644
--- a/libc/include/syslog.h
+++ b/libc/include/syslog.h
@@ -112,17 +112,21 @@
  */
 #define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1)
 
-/** openlog() options are currently ignored on Android. */
+/** openlog() option ignored on Android. */
 #define LOG_PID    0x01
-/** openlog() options are currently ignored on Android. */
+/** openlog() option ignored on Android. */
 #define LOG_CONS   0x02
-/** openlog() options are currently ignored on Android. */
+/** openlog() option ignored on Android. */
 #define LOG_ODELAY 0x04
-/** openlog() options are currently ignored on Android. */
+/** openlog() option ignored on Android. */
 #define LOG_NDELAY 0x08
-/** openlog() options are currently ignored on Android. */
+/** openlog() option ignored on Android. */
 #define LOG_NOWAIT 0x10
-/** openlog() options are currently ignored on Android. */
+/**
+ * openlog() option to log to stderr as well as the system log.
+ *
+ * Available since API level 34 (ignored before then).
+ */
 #define LOG_PERROR 0x20
 
 /**
@@ -133,9 +137,10 @@
 
 /**
  * [openlog(3)](http://man7.org/linux/man-pages/man3/openlog.3.html) sets
- * the log tag to `__prefix`. On Android, the other two arguments are ignored.
+ * the log tag to `__prefix`, which can be NULL to return to the default of
+ * getprogname(). On Android, the other two arguments are ignored.
  */
-void openlog(const char* __prefix, int __option, int __facility);
+void openlog(const char* _Nullable __prefix, int __option, int __facility);
 
 /**
  * [setlogmask(3)](http://man7.org/linux/man-pages/man3/setlogmask.3.html)
@@ -149,13 +154,13 @@
  * the printf()-like message and logs it with the given priority, unless
  * suppressed by setlogmask(). On Android, the output goes to logcat.
  */
-void syslog(int __priority, const char* __fmt, ...) __printflike(2, 3);
+void syslog(int __priority, const char* _Nonnull __fmt, ...) __printflike(2, 3);
 
 /**
  * [vsyslog(3)](http://man7.org/linux/man-pages/man3/vsyslog.3.html) formats
  * the vprintf()-like message and logs it with the given priority, unless
  * suppressed by setlogmask(). On Android, the output goes to logcat.
  */
-void vsyslog(int __priority, const char* __fmt, va_list __args) __printflike(2, 0);
+void vsyslog(int __priority, const char* _Nonnull __fmt, va_list __args) __printflike(2, 0);
 
 __END_DECLS
diff --git a/libc/include/termios.h b/libc/include/termios.h
index e3f388c..92ac24b 100644
--- a/libc/include/termios.h
+++ b/libc/include/termios.h
@@ -49,19 +49,19 @@
  * [cfgetispeed(3)](http://man7.org/linux/man-pages/man3/cfgetispeed.3.html)
  * returns the terminal input baud rate.
  */
-speed_t cfgetispeed(const struct termios* __t) __INTRODUCED_IN(21);
+speed_t cfgetispeed(const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
 
 /**
  * [cfgetospeed(3)](http://man7.org/linux/man-pages/man3/cfgetospeed.3.html)
  * returns the terminal output baud rate.
  */
-speed_t cfgetospeed(const struct termios* __t) __INTRODUCED_IN(21);
+speed_t cfgetospeed(const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
 
 /**
  * [cfmakeraw(3)](http://man7.org/linux/man-pages/man3/cfmakeraw.3.html)
  * configures the terminal for "raw" mode.
  */
-void cfmakeraw(struct termios* __t) __INTRODUCED_IN(21);
+void cfmakeraw(struct termios* _Nonnull __t) __INTRODUCED_IN(21);
 
 /**
  * [cfsetspeed(3)](http://man7.org/linux/man-pages/man3/cfsetspeed.3.html)
@@ -69,7 +69,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int cfsetspeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetspeed(struct termios* _Nonnull __t, speed_t __speed) __INTRODUCED_IN(21);
 
 /**
  * [cfsetispeed(3)](http://man7.org/linux/man-pages/man3/cfsetispeed.3.html)
@@ -77,7 +77,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int cfsetispeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetispeed(struct termios* _Nonnull _t, speed_t __speed) __INTRODUCED_IN(21);
 
 /**
  * [cfsetospeed(3)](http://man7.org/linux/man-pages/man3/cfsetospeed.3.html)
@@ -85,7 +85,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int cfsetospeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetospeed(struct termios* _Nonnull __t, speed_t __speed) __INTRODUCED_IN(21);
 
 /**
  * [tcdrain(3)](http://man7.org/linux/man-pages/man3/tcdrain.3.html)
@@ -120,7 +120,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int tcgetattr(int __fd, struct termios* __t) __INTRODUCED_IN(21);
+int tcgetattr(int __fd, struct termios* _Nonnull __t) __INTRODUCED_IN(21);
 
 /**
  * [tcgetsid(3)](http://man7.org/linux/man-pages/man3/tcgetsid.3.html)
@@ -145,7 +145,7 @@
  *
  * Returns 0 on success and returns -1 and sets `errno` on failure.
  */
-int tcsetattr(int __fd, int __optional_actions, const struct termios* __t) __INTRODUCED_IN(21);
+int tcsetattr(int __fd, int __optional_actions, const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
 
 #endif
 
diff --git a/libc/include/threads.h b/libc/include/threads.h
index 1b00b8f..b1008de 100644
--- a/libc/include/threads.h
+++ b/libc/include/threads.h
@@ -51,9 +51,9 @@
 typedef pthread_mutex_t mtx_t;
 
 /** The type for a thread-specific storage destructor. */
-typedef void (*tss_dtor_t)(void*);
+typedef void (*tss_dtor_t)(void* _Nullable);
 /** The type of the function passed to thrd_create() to create a new thread. */
-typedef int (*thrd_start_t)(void*);
+typedef int (*thrd_start_t)(void* _Nullable);
 
 /** The type used by call_once(). */
 typedef pthread_once_t once_flag;
@@ -82,72 +82,72 @@
 // This file is implemented as static inlines before API level 30.
 
 /** Uses `__flag` to ensure that `__function` is called exactly once. */
-void call_once(once_flag* __flag, void (*__function)(void)) __INTRODUCED_IN(30);
+void call_once(once_flag* _Nonnull __flag, void (* _Nonnull __function)(void)) __INTRODUCED_IN(30);
 
 
 
 /**
  * Unblocks all threads blocked on `__cond`.
  */
-int cnd_broadcast(cnd_t* __cond) __INTRODUCED_IN(30);
+int cnd_broadcast(cnd_t* _Nonnull __cond) __INTRODUCED_IN(30);
 
 /**
  * Destroys a condition variable.
  */
-void cnd_destroy(cnd_t* __cond) __INTRODUCED_IN(30);
+void cnd_destroy(cnd_t* _Nonnull __cond) __INTRODUCED_IN(30);
 
 /**
  * Creates a condition variable.
  */
-int cnd_init(cnd_t* __cond) __INTRODUCED_IN(30);
+int cnd_init(cnd_t* _Nonnull __cond) __INTRODUCED_IN(30);
 
 /**
  * Unblocks one thread blocked on `__cond`.
  */
-int cnd_signal(cnd_t* __cond) __INTRODUCED_IN(30);
+int cnd_signal(cnd_t* _Nonnull __cond) __INTRODUCED_IN(30);
 
 /**
  * Unlocks `__mutex` and blocks until `__cond` is signaled or `__timeout` occurs.
  */
-int cnd_timedwait(cnd_t* __cond, mtx_t* __mutex, const struct timespec* __timeout)
+int cnd_timedwait(cnd_t* _Nonnull __cond, mtx_t* _Nonnull __mutex, const struct timespec* _Nonnull __timeout)
     __INTRODUCED_IN(30);
 
 /**
  * Unlocks `__mutex` and blocks until `__cond` is signaled.
  */
-int cnd_wait(cnd_t* __cond, mtx_t* __mutex) __INTRODUCED_IN(30);
+int cnd_wait(cnd_t* _Nonnull __cond, mtx_t* _Nonnull __mutex) __INTRODUCED_IN(30);
 
 
 
 /**
  * Destroys a mutex.
  */
-void mtx_destroy(mtx_t* __mutex) __INTRODUCED_IN(30);
+void mtx_destroy(mtx_t* _Nonnull __mutex) __INTRODUCED_IN(30);
 
 /**
  * Creates a mutex.
  */
-int mtx_init(mtx_t* __mutex, int __type) __INTRODUCED_IN(30);
+int mtx_init(mtx_t* _Nonnull __mutex, int __type) __INTRODUCED_IN(30);
 
 /**
  * Blocks until `__mutex` is acquired.
  */
-int mtx_lock(mtx_t* __mutex) __INTRODUCED_IN(30);
+int mtx_lock(mtx_t* _Nonnull __mutex) __INTRODUCED_IN(30);
 
 /**
  * Blocks until `__mutex` is acquired or `__timeout` expires.
  */
-int mtx_timedlock(mtx_t* __mutex, const struct timespec* __timeout) __INTRODUCED_IN(30);
+int mtx_timedlock(mtx_t* _Nonnull __mutex, const struct timespec* _Nonnull __timeout) __INTRODUCED_IN(30);
 
 /**
  * Acquires `__mutex` or returns `thrd_busy`.
  */
-int mtx_trylock(mtx_t* __mutex) __INTRODUCED_IN(30);
+int mtx_trylock(mtx_t* _Nonnull __mutex) __INTRODUCED_IN(30);
 
 /**
  * Unlocks `__mutex`.
  */
-int mtx_unlock(mtx_t* __mutex) __INTRODUCED_IN(30);
+int mtx_unlock(mtx_t* _Nonnull __mutex) __INTRODUCED_IN(30);
 
 
 
@@ -155,7 +155,7 @@
  * Creates a new thread running `__function(__arg)`, and sets `*__thrd` to
  * the new thread.
  */
-int thrd_create(thrd_t* __thrd, thrd_start_t __function, void* __arg) __INTRODUCED_IN(30);
+int thrd_create(thrd_t* _Nonnull __thrd, thrd_start_t _Nonnull __function, void* _Nullable __arg) __INTRODUCED_IN(30);
 
 /**
  * Returns the `thrd_t` corresponding to the caller.
@@ -181,7 +181,7 @@
  * Blocks until `__thrd` terminates. If `__result` is not null, `*__result`
  * is set to the exiting thread's result.
  */
-int thrd_join(thrd_t __thrd, int* __result) __INTRODUCED_IN(30);
+int thrd_join(thrd_t __thrd, int* _Nullable __result) __INTRODUCED_IN(30);
 
 /**
  * Blocks the caller for at least `__duration` unless a signal is delivered.
@@ -190,7 +190,7 @@
  *
  * Returns 0 on success, or -1 if a signal was delivered.
  */
-int thrd_sleep(const struct timespec* __duration, struct timespec* __remaining) __INTRODUCED_IN(30);
+int thrd_sleep(const struct timespec* _Nonnull __duration, struct timespec* _Nullable __remaining) __INTRODUCED_IN(30);
 
 /**
  * Request that other threads should be scheduled.
@@ -203,7 +203,7 @@
  * Creates a thread-specific storage key with the associated destructor (which
  * may be null).
  */
-int tss_create(tss_t* __key, tss_dtor_t __dtor) __INTRODUCED_IN(30);
+int tss_create(tss_t* _Nonnull __key, tss_dtor_t _Nullable __dtor) __INTRODUCED_IN(30);
 
 /**
  * Destroys a thread-specific storage key.
@@ -214,13 +214,13 @@
  * Returns the value for the current thread held in the thread-specific storage
  * identified by `__key`.
  */
-void* tss_get(tss_t __key) __INTRODUCED_IN(30);
+void* _Nullable tss_get(tss_t __key) __INTRODUCED_IN(30);
 
 /**
  * Sets the current thread's value for the thread-specific storage identified
  * by `__key` to `__value`.
  */
-int tss_set(tss_t __key, void* __value) __INTRODUCED_IN(30);
+int tss_set(tss_t __key, void* _Nonnull __value) __INTRODUCED_IN(30);
 
 #endif
 
diff --git a/libc/include/time.h b/libc/include/time.h
index 0db14ff..1c3ae4b 100644
--- a/libc/include/time.h
+++ b/libc/include/time.h
@@ -26,8 +26,7 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _TIME_H_
-#define _TIME_H_
+#pragma once
 
 #include <sys/cdefs.h>
 #include <sys/time.h>
@@ -37,7 +36,7 @@
 
 #define CLOCKS_PER_SEC 1000000
 
-extern char* tzname[];
+extern char* _Nonnull tzname[];
 extern int daylight;
 extern long int timezone;
 
@@ -54,63 +53,103 @@
   int tm_yday;
   int tm_isdst;
   long int tm_gmtoff;
-  const char* tm_zone;
+  const char* _Nullable tm_zone;
 };
 
 #define TM_ZONE tm_zone
 
-time_t time(time_t* __t);
-int nanosleep(const struct timespec* __request, struct timespec* __remainder);
+time_t time(time_t* _Nullable __t);
+int nanosleep(const struct timespec* _Nonnull __request, struct timespec* _Nullable __remainder);
 
-char* asctime(const struct tm* __tm);
-char* asctime_r(const struct tm* __tm, char* __buf);
+char* _Nullable asctime(const struct tm* _Nonnull __tm);
+char* _Nullable asctime_r(const struct tm* _Nonnull __tm, char* _Nonnull __buf);
 
 double difftime(time_t __lhs, time_t __rhs);
-time_t mktime(struct tm* __tm);
+time_t mktime(struct tm* _Nonnull __tm);
 
-struct tm* localtime(const time_t* __t);
-struct tm* localtime_r(const time_t* __t, struct tm* __tm);
+struct tm* _Nullable localtime(const time_t* _Nonnull __t);
+struct tm* _Nullable localtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm);
 
-struct tm* gmtime(const time_t* __t);
-struct tm* gmtime_r(const time_t* __t, struct tm* __tm);
+struct tm* _Nullable gmtime(const time_t* _Nonnull __t);
+struct tm* _Nullable gmtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm);
 
-char* strptime(const char* __s, const char* __fmt, struct tm* __tm) __strftimelike(2);
-char* strptime_l(const char* __s, const char* __fmt, struct tm* __tm, locale_t __l) __strftimelike(2) __INTRODUCED_IN(28);
+char* _Nullable strptime(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm) __strftimelike(2);
+char* _Nullable strptime_l(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm, locale_t _Nonnull __l) __strftimelike(2) __INTRODUCED_IN(28);
 
-size_t strftime(char* __buf, size_t __n, const char* __fmt, const struct tm* __tm) __strftimelike(3);
-#if __ANDROID_API__ >= 21
-size_t strftime_l(char* __buf, size_t __n, const char* __fmt, const struct tm* __tm, locale_t __l) __strftimelike(3) __INTRODUCED_IN(21);
-#else
-// Implemented as static inline before 21.
-#endif
+size_t strftime(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm) __strftimelike(3);
+size_t strftime_l(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm, locale_t _Nonnull __l) __strftimelike(3) __INTRODUCED_IN(21);
 
-char* ctime(const time_t* __t);
-char* ctime_r(const time_t* __t, char* __buf);
+char* _Nullable ctime(const time_t* _Nonnull __t);
+char* _Nullable ctime_r(const time_t* _Nonnull __t, char* _Nonnull __buf);
 
 void tzset(void);
 
 clock_t clock(void);
 
-int clock_getcpuclockid(pid_t __pid, clockid_t* __clock) __INTRODUCED_IN(23);
+int clock_getcpuclockid(pid_t __pid, clockid_t* _Nonnull __clock) __INTRODUCED_IN(23);
 
-int clock_getres(clockid_t __clock, struct timespec* __resolution);
-int clock_gettime(clockid_t __clock, struct timespec* __ts);
-int clock_nanosleep(clockid_t __clock, int __flags, const struct timespec* __request, struct timespec* __remainder);
-int clock_settime(clockid_t __clock, const struct timespec* __ts);
 
-int timer_create(clockid_t __clock, struct sigevent* __event, timer_t* __timer_ptr);
-int timer_delete(timer_t __timer);
-int timer_settime(timer_t __timer, int __flags, const struct itimerspec* __new_value, struct itimerspec* __old_value);
-int timer_gettime(timer_t __timer, struct itimerspec* __ts);
-int timer_getoverrun(timer_t __timer);
+int clock_getres(clockid_t __clock, struct timespec* _Nullable __resolution);
+int clock_gettime(clockid_t __clock, struct timespec* _Nonnull __ts);
+int clock_nanosleep(clockid_t __clock, int __flags, const struct timespec* _Nonnull __request, struct timespec* _Nullable __remainder);
+int clock_settime(clockid_t __clock, const struct timespec* _Nonnull __ts);
+
+int timer_create(clockid_t __clock, struct sigevent* _Nullable __event, timer_t _Nonnull * _Nonnull __timer_ptr);
+int timer_delete(timer_t _Nonnull __timer);
+int timer_settime(timer_t _Nonnull __timer, int __flags, const struct itimerspec* _Nonnull __new_value, struct itimerspec* _Nullable __old_value);
+int timer_gettime(timer_t _Nonnull _timer, struct itimerspec* _Nonnull __ts);
+int timer_getoverrun(timer_t _Nonnull __timer);
 
 /* Non-standard extensions that are in the BSDs and glibc. */
-time_t timelocal(struct tm* __tm);
-time_t timegm(struct tm* __tm);
+time_t timelocal(struct tm* _Nonnull __tm);
+time_t timegm(struct tm* _Nonnull __tm);
 
-#define TIME_UTC 1
-int timespec_get(struct timespec* __ts, int __base) __INTRODUCED_IN(29);
+/**
+ * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_REALTIME.
+ *
+ * Available since API level 29.
+ */
+#define TIME_UTC (CLOCK_REALTIME+1)
+
+/**
+ * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_MONOTONIC.
+ *
+ * Available since API level 35.
+ */
+#define TIME_MONOTONIC (CLOCK_MONOTONIC+1)
+
+/**
+ * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_PROCESS_CPUTIME_ID.
+ *
+ * Available since API level 35.
+ */
+#define TIME_ACTIVE (CLOCK_PROCESS_CPUTIME_ID+1)
+
+/**
+ * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_THREAD_CPUTIME_ID.
+ *
+ * Available since API level 35.
+ */
+#define TIME_THREAD_ACTIVE (CLOCK_THREAD_CPUTIME_ID+1)
+
+/**
+ * timespec_get(3) is equivalent to clock_gettime() for the clock corresponding to the given base.
+ *
+ * Returns the base on success and returns 0 on failure.
+ *
+ * Available since API level 29 for TIME_UTC; other bases arrived later.
+ * Code for Android should prefer clock_gettime().
+ */
+int timespec_get(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(29);
+
+/**
+ * timespec_getres(3) is equivalent to clock_getres() for the clock corresponding to the given base.
+ *
+ * Returns the base on success and returns 0 on failure.
+ *
+ * Available since API level 35.
+ * Code for Android should prefer clock_gettime().
+ */
+int timespec_getres(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(35);
 
 __END_DECLS
-
-#endif
diff --git a/libc/include/time64.h b/libc/include/time64.h
index 905669d..7d70030 100644
--- a/libc/include/time64.h
+++ b/libc/include/time64.h
@@ -47,17 +47,17 @@
 
 typedef int64_t time64_t;
 
-char* asctime64(const struct tm*);
-char* asctime64_r(const struct tm*, char*);
-char* ctime64(const time64_t*);
-char* ctime64_r(const time64_t*, char*);
-struct tm* gmtime64(const time64_t*);
-struct tm* gmtime64_r(const time64_t*, struct tm*);
-struct tm* localtime64(const time64_t*);
-struct tm* localtime64_r(const time64_t*, struct tm*);
-time64_t mktime64(const struct tm*);
-time64_t timegm64(const struct tm*);
-time64_t timelocal64(const struct tm*);
+char* _Nullable asctime64(const struct tm* _Nonnull);
+char* _Nullable asctime64_r(const struct tm* _Nonnull, char* _Nonnull);
+char* _Nullable ctime64(const time64_t* _Nonnull);
+char* _Nullable ctime64_r(const time64_t* _Nonnull, char* _Nonnull);
+struct tm* _Nullable gmtime64(const time64_t* _Nonnull);
+struct tm* _Nullable gmtime64_r(const time64_t* _Nonnull, struct tm* _Nonnull);
+struct tm* _Nullable localtime64(const time64_t* _Nonnull);
+struct tm* _Nullable localtime64_r(const time64_t* _Nonnull, struct tm* _Nonnull);
+time64_t mktime64(const struct tm* _Nonnull);
+time64_t timegm64(const struct tm* _Nonnull);
+time64_t timelocal64(const struct tm* _Nonnull);
 
 __END_DECLS
 
diff --git a/libc/include/unistd.h b/libc/include/unistd.h
index b5694b8..7ad94e1 100644
--- a/libc/include/unistd.h
+++ b/libc/include/unistd.h
@@ -73,7 +73,7 @@
 #define _PC_PRIO_IO 18
 #define _PC_SYNC_IO 19
 
-extern char** environ;
+extern char* _Nullable * _Nullable environ;
 
 __noreturn void _exit(int __status);
 
@@ -89,15 +89,15 @@
 pid_t  getsid(pid_t __pid) __INTRODUCED_IN(17);
 pid_t  setsid(void);
 
-int execv(const char* __path, char* const* __argv);
-int execvp(const char* __file, char* const* __argv);
-int execvpe(const char* __file, char* const* __argv, char* const* __envp) __INTRODUCED_IN(21);
-int execve(const char* __file, char* const* __argv, char* const* __envp);
-int execl(const char* __path, const char* __arg0, ...) __attribute__((__sentinel__));
-int execlp(const char* __file, const char* __arg0, ...) __attribute__((__sentinel__));
-int execle(const char* __path, const char* __arg0, ... /*,  char* const* __envp */)
+int execv(const char* _Nonnull __path, char* _Nullable const* _Nullable __argv);
+int execvp(const char* _Nonnull __file, char* _Nullable const* _Nullable __argv);
+int execvpe(const char* _Nonnull __file, char* _Nullable const* _Nullable __argv, char* _Nullable const* _Nullable __envp) __INTRODUCED_IN(21);
+int execve(const char* _Nonnull __file, char* _Nullable const* _Nullable __argv, char* _Nullable const* _Nullable __envp);
+int execl(const char* _Nonnull __path, const char* _Nullable __arg0, ...) __attribute__((__sentinel__));
+int execlp(const char* _Nonnull __file, const char* _Nullable __arg0, ...) __attribute__((__sentinel__));
+int execle(const char* _Nonnull __path, const char* _Nullable __arg0, ... /*,  char* const* __envp */)
     __attribute__((__sentinel__(1)));
-int fexecve(int __fd, char* const* __argv, char* const* __envp) __INTRODUCED_IN(28);
+int fexecve(int __fd, char* _Nullable const* _Nullable __argv, char* _Nullable const* _Nullable __envp) __INTRODUCED_IN(28);
 
 int nice(int __incr);
 
@@ -193,40 +193,40 @@
 uid_t geteuid(void);
 gid_t getgid(void);
 gid_t getegid(void);
-int getgroups(int __size, gid_t* __list);
-int setgroups(size_t __size, const gid_t* __list);
-int getresuid(uid_t* __ruid, uid_t* __euid, uid_t* __suid);
-int getresgid(gid_t* __rgid, gid_t* __egid, gid_t* __sgid);
-char* getlogin(void);
-int getlogin_r(char* __buffer, size_t __buffer_size) __INTRODUCED_IN(28);
+int getgroups(int __size, gid_t* _Nullable __list);
+int setgroups(size_t __size, const gid_t* _Nullable __list);
+int getresuid(uid_t* _Nonnull __ruid, uid_t* _Nonnull __euid, uid_t* _Nonnull __suid);
+int getresgid(gid_t* _Nonnull __rgid, gid_t* _Nonnull __egid, gid_t* _Nonnull __sgid);
+char* _Nullable getlogin(void);
+int getlogin_r(char* _Nonnull __buffer, size_t __buffer_size) __INTRODUCED_IN(28);
 
 long fpathconf(int __fd, int __name);
-long pathconf(const char* __path, int __name);
+long pathconf(const char* _Nonnull __path, int __name);
 
-int access(const char* __path, int __mode);
-int faccessat(int __dirfd, const char* __path, int __mode, int __flags);
-int link(const char* __old_path, const char* __new_path);
-int linkat(int __old_dir_fd, const char* __old_path, int __new_dir_fd, const char* __new_path, int __flags) __INTRODUCED_IN(21);
-int unlink(const char* __path);
-int unlinkat(int __dirfd, const char* __path, int __flags);
-int chdir(const char* __path);
+int access(const char* _Nonnull __path, int __mode);
+int faccessat(int __dirfd, const char* _Nonnull __path, int __mode, int __flags);
+int link(const char* _Nonnull __old_path, const char* _Nonnull __new_path);
+int linkat(int __old_dir_fd, const char* _Nonnull __old_path, int __new_dir_fd, const char* _Nonnull __new_path, int __flags) __INTRODUCED_IN(21);
+int unlink(const char* _Nonnull __path);
+int unlinkat(int __dirfd, const char* _Nonnull __path, int __flags);
+int chdir(const char* _Nonnull __path);
 int fchdir(int __fd);
-int rmdir(const char* __path);
-int pipe(int __fds[2]);
+int rmdir(const char* _Nonnull __path);
+int pipe(int __fds[_Nonnull 2]);
 #if defined(__USE_GNU)
-int pipe2(int __fds[2], int __flags);
+int pipe2(int __fds[_Nonnull 2], int __flags);
 #endif
-int chroot(const char* __path);
-int symlink(const char* __old_path, const char* __new_path);
-int symlinkat(const char* __old_path, int __new_dir_fd, const char* __new_path) __INTRODUCED_IN(21);
-ssize_t readlink(const char* __path, char* __buf, size_t __buf_size);
-ssize_t readlinkat(int __dir_fd, const char* __path, char* __buf, size_t __buf_size)
+int chroot(const char* _Nonnull __path);
+int symlink(const char* _Nonnull __old_path, const char* _Nonnull __new_path);
+int symlinkat(const char* _Nonnull __old_path, int __new_dir_fd, const char* _Nonnull __new_path) __INTRODUCED_IN(21);
+ssize_t readlink(const char* _Nonnull __path, char* _Nonnull __buf, size_t __buf_size);
+ssize_t readlinkat(int __dir_fd, const char* _Nonnull __path, char* _Nonnull __buf, size_t __buf_size)
     __INTRODUCED_IN(21);
-int chown(const char* __path, uid_t __owner, gid_t __group);
+int chown(const char* _Nonnull __path, uid_t __owner, gid_t __group);
 int fchown(int __fd, uid_t __owner, gid_t __group);
-int fchownat(int __dir_fd, const char* __path, uid_t __owner, gid_t __group, int __flags);
-int lchown(const char* __path, uid_t __owner, gid_t __group);
-char* getcwd(char* __buf, size_t __size);
+int fchownat(int __dir_fd, const char* _Nonnull __path, uid_t __owner, gid_t __group, int __flags);
+int lchown(const char* _Nonnull __path, uid_t __owner, gid_t __group);
+char* _Nullable getcwd(char* _Nullable __buf, size_t __size);
 
 void sync(void);
 #if defined(__USE_GNU)
@@ -235,8 +235,29 @@
 
 int close(int __fd);
 
-ssize_t read(int __fd, void* __buf, size_t __count);
-ssize_t write(int __fd, const void* __buf, size_t __count);
+/**
+ * [read(2)](https://man7.org/linux/man-pages/man2/read.2.html) reads
+ * up to `__count` bytes from file descriptor `__fd` into `__buf`.
+ *
+ * Note: `__buf` is not normally nullable, but may be null in the
+ * special case of a zero-length read(), which while not generally
+ * useful may be meaningful to some device drivers.
+ *
+ * Returns the number of bytes read on success, and returns -1 and sets `errno` on failure.
+ */
+ssize_t read(int __fd, void* __BIONIC_COMPLICATED_NULLNESS __buf, size_t __count);
+
+/**
+ * [write(2)](https://man7.org/linux/man-pages/man2/write.2.html) writes
+ * up to `__count` bytes to file descriptor `__fd` from `__buf`.
+ *
+ * Note: `__buf` is not normally nullable, but may be null in the
+ * special case of a zero-length write(), which while not generally
+ * useful may be meaningful to some device drivers.
+ *
+ * Returns the number of bytes written on success, and returns -1 and sets `errno` on failure.
+ */
+ssize_t write(int __fd, const void* __BIONIC_COMPLICATED_NULLNESS __buf, size_t __count);
 
 int dup(int __old_fd);
 int dup2(int __old_fd, int __new_fd);
@@ -246,23 +267,23 @@
 
 /* See https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
 #if defined(__USE_FILE_OFFSET64)
-int truncate(const char* __path, off_t __length) __RENAME(truncate64) __INTRODUCED_IN(21);
+int truncate(const char* _Nonnull __path, off_t __length) __RENAME(truncate64) __INTRODUCED_IN(21);
 off_t lseek(int __fd, off_t __offset, int __whence) __RENAME(lseek64);
-ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset) __RENAME(pread64);
-ssize_t pwrite(int __fd, const void* __buf, size_t __count, off_t __offset) __RENAME(pwrite64);
+ssize_t pread(int __fd, void* _Nonnull __buf, size_t __count, off_t __offset) __RENAME(pread64);
+ssize_t pwrite(int __fd, const void* _Nonnull __buf, size_t __count, off_t __offset) __RENAME(pwrite64);
 int ftruncate(int __fd, off_t __length) __RENAME(ftruncate64);
 #else
-int truncate(const char* __path, off_t __length);
+int truncate(const char* _Nonnull __path, off_t __length);
 off_t lseek(int __fd, off_t __offset, int __whence);
-ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset);
-ssize_t pwrite(int __fd, const void* __buf, size_t __count, off_t __offset);
+ssize_t pread(int __fd, void* _Nonnull __buf, size_t __count, off_t __offset);
+ssize_t pwrite(int __fd, const void* _Nonnull __buf, size_t __count, off_t __offset);
 int ftruncate(int __fd, off_t __length);
 #endif
 
-int truncate64(const char* __path, off64_t __length) __INTRODUCED_IN(21);
+int truncate64(const char* _Nonnull __path, off64_t __length) __INTRODUCED_IN(21);
 off64_t lseek64(int __fd, off64_t __offset, int __whence);
-ssize_t pread64(int __fd, void* __buf, size_t __count, off64_t __offset);
-ssize_t pwrite64(int __fd, const void* __buf, size_t __count, off64_t __offset);
+ssize_t pread64(int __fd, void* _Nonnull __buf, size_t __count, off64_t __offset);
+ssize_t pwrite64(int __fd, const void* _Nonnull __buf, size_t __count, off64_t __offset);
 int ftruncate64(int __fd, off64_t __length);
 
 int pause(void);
@@ -270,25 +291,19 @@
 unsigned int sleep(unsigned int __seconds);
 int usleep(useconds_t __microseconds);
 
-int gethostname(char* __buf, size_t __buf_size);
-int sethostname(const char* __name, size_t __n) __INTRODUCED_IN(23);
+int gethostname(char* _Nonnull _buf, size_t __buf_size);
+int sethostname(const char* _Nonnull __name, size_t __n) __INTRODUCED_IN(23);
 
-int brk(void* __addr);
-void* sbrk(ptrdiff_t __increment);
+int brk(void* _Nonnull __addr);
+void* _Nullable sbrk(ptrdiff_t __increment);
 
 int isatty(int __fd);
-char* ttyname(int __fd);
-int ttyname_r(int __fd, char* __buf, size_t __buf_size);
+char* _Nullable ttyname(int __fd);
+int ttyname_r(int __fd, char* _Nonnull __buf, size_t __buf_size);
 
-int acct(const char* __path);
+int acct(const char* _Nullable __path);
 
-#if __ANDROID_API__ >= 21
 int getpagesize(void) __INTRODUCED_IN(21);
-#else
-static __inline__ int getpagesize(void) {
-  return sysconf(_SC_PAGESIZE);
-}
-#endif
 
 long syscall(long __number, ...);
 
@@ -310,22 +325,22 @@
     } while (_rc == -1 && errno == EINTR); \
     _rc; })
 
-int getdomainname(char* __buf, size_t __buf_size) __INTRODUCED_IN(26);
-int setdomainname(const char* __name, size_t __n) __INTRODUCED_IN(26);
+int getdomainname(char* _Nonnull __buf, size_t __buf_size) __INTRODUCED_IN(26);
+int setdomainname(const char* _Nonnull __name, size_t __n) __INTRODUCED_IN(26);
 
 /**
  * [copy_file_range(2)](https://man7.org/linux/man-pages/man2/copy_file_range.2.html) copies
  * a range of data from one file descriptor to another.
  *
- * Returns the number of bytes copied on success, and returns -1 and sets  errno
- * on failure.
- *
  * Available since API level 34.
+ *
+ * Returns the number of bytes copied on success, and returns -1 and sets
+ * `errno` on failure.
  */
-ssize_t copy_file_range(int __fd_in, off64_t* __off_in, int __fd_out, off64_t* __off_out, size_t __length, unsigned int __flags) __INTRODUCED_IN(34);
+ssize_t copy_file_range(int __fd_in, off64_t* _Nullable __off_in, int __fd_out, off64_t* _Nullable __off_out, size_t __length, unsigned int __flags) __INTRODUCED_IN(34);
 
 #if __ANDROID_API__ >= 28
-void swab(const void* __src, void* __dst, ssize_t __byte_count) __INTRODUCED_IN(28);
+void swab(const void* _Nonnull __src, void* _Nonnull __dst, ssize_t __byte_count) __INTRODUCED_IN(28);
 #endif
 
 /**
diff --git a/libc/include/utmp.h b/libc/include/utmp.h
index cb72ce2..d249f8a 100644
--- a/libc/include/utmp.h
+++ b/libc/include/utmp.h
@@ -30,7 +30,7 @@
 
 /**
  * @file utmp.h
- * @brief POSIX login records.
+ * @brief No-op implementation of non-POSIX login records. See <utmpx.h> for the POSIX equivalents.
  */
 
 #include <sys/cdefs.h>
@@ -69,12 +69,12 @@
 };
 
 struct exit_status {
-  short int e_termination;
-  short int e_exit;
+  short e_termination;
+  short e_exit;
 };
 
 struct utmp {
-  short int ut_type;
+  short ut_type;
   pid_t ut_pid;
   char ut_line[UT_LINESIZE];
   char ut_id[4];
@@ -83,7 +83,7 @@
 
   struct exit_status ut_exit;
 
-  long int ut_session;
+  long ut_session;
   struct timeval ut_tv;
 
   int32_t ut_addr_v6[4];
@@ -97,21 +97,25 @@
 __BEGIN_DECLS
 
 /**
- * Does nothing.
+ * Returns -1 and sets errno to ENOTSUP.
  */
-int utmpname(const char* __path);
+int utmpname(const char* _Nonnull __path);
+
 /**
  * Does nothing.
  */
 void setutent(void);
+
 /**
- * Does nothing.
+ * Does nothing and returns null.
  */
-struct utmp* getutent(void);
+struct utmp* _Nullable getutent(void);
+
 /**
- * Does nothing.
+ * Does nothing and returns null.
  */
-struct utmp* pututline(const struct utmp* __entry);
+struct utmp* _Nullable pututline(const struct utmp* _Nonnull __entry);
+
 /**
  * Does nothing.
  */
diff --git a/libc/include/utmpx.h b/libc/include/utmpx.h
new file mode 100644
index 0000000..5ed8e1a
--- /dev/null
+++ b/libc/include/utmpx.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#pragma once
+
+/**
+ * @file utmpx.h
+ * @brief No-op implementation of POSIX login records.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <time.h>
+
+#define EMPTY         0
+#define RUN_LVL       1
+#define BOOT_TIME     2
+#define NEW_TIME      3
+#define OLD_TIME      4
+#define INIT_PROCESS  5
+#define LOGIN_PROCESS 6
+#define USER_PROCESS  7
+#define DEAD_PROCESS  8
+#define ACCOUNTING    9
+
+struct utmpx {
+  short ut_type;
+  pid_t ut_pid;
+  char ut_line[32];
+  char ut_id[4];
+  char ut_user[32];
+  char ut_host[256];
+
+  struct {
+    short e_termination;
+    short e_exit;
+  } ut_exit;
+
+  long ut_session;
+  struct timeval ut_tv;
+
+  int32_t ut_addr_v6[4];
+  char unused[20];
+};
+
+__BEGIN_DECLS
+
+/**
+ * Does nothing.
+ */
+void setutxent(void) __RENAME(setutent);
+
+/**
+ * Does nothing and returns null.
+ */
+struct utmpx* _Nullable getutxent(void) __RENAME(getutent);
+
+/**
+ * Does nothing and returns null.
+ */
+struct utmpx* _Nullable getutxid(const struct utmpx* _Nonnull __entry) __RENAME(getutent);
+
+/**
+ * Does nothing and returns null.
+ */
+struct utmpx* _Nullable getutxline(const struct utmpx* _Nonnull __entry) __RENAME(getutent);
+
+/**
+ * Does nothing and returns null.
+ */
+struct utmpx* _Nullable pututxline(const struct utmpx* _Nonnull __entry) __RENAME(pututline);
+
+/**
+ * Does nothing.
+ */
+void endutxent(void) __RENAME(endutent);
+
+__END_DECLS
diff --git a/libc/include/wchar.h b/libc/include/wchar.h
index f0966de..39f9374 100644
--- a/libc/include/wchar.h
+++ b/libc/include/wchar.h
@@ -44,101 +44,96 @@
 __BEGIN_DECLS
 
 wint_t btowc(int __ch);
-int fwprintf(FILE* __fp, const wchar_t* __fmt, ...);
-int fwscanf(FILE* __fp, const wchar_t* __fmt, ...);
-wint_t fgetwc(FILE* __fp);
-wchar_t* fgetws(wchar_t* __buf, int __size, FILE* __fp);
-wint_t fputwc(wchar_t __wc, FILE* __fp);
-int fputws(const wchar_t* __s, FILE* __fp);
-int fwide(FILE* __fp, int __mode);
-wint_t getwc(FILE* __fp);
+int fwprintf(FILE* _Nonnull __fp, const wchar_t* _Nonnull __fmt, ...);
+int fwscanf(FILE* _Nonnull __fp, const wchar_t* _Nonnull __fmt, ...);
+wint_t fgetwc(FILE* _Nonnull __fp);
+wchar_t* _Nullable fgetws(wchar_t* _Nonnull __buf, int __size, FILE* _Nonnull __fp);
+wint_t fputwc(wchar_t __wc, FILE* _Nonnull __fp);
+int fputws(const wchar_t* _Nonnull __s, FILE* _Nonnull __fp);
+int fwide(FILE* _Nonnull __fp, int __mode);
+wint_t getwc(FILE* _Nonnull __fp);
 wint_t getwchar(void);
-int mbsinit(const mbstate_t* __ps);
-size_t mbrlen(const char* __s, size_t __n, mbstate_t* __ps);
-size_t mbrtowc(wchar_t* __buf, const char* __s, size_t __n, mbstate_t* __ps);
-size_t mbsrtowcs(wchar_t* __dst, const char** __src, size_t __dst_n, mbstate_t* __ps);
-size_t mbsnrtowcs(wchar_t* __dst, const char** __src, size_t __src_n, size_t __dst_n, mbstate_t* __ps) __INTRODUCED_IN(21);
-wint_t putwc(wchar_t __wc, FILE* __fp);
+int mbsinit(const mbstate_t* _Nullable __ps);
+size_t mbrlen(const char* _Nullable __s, size_t __n, mbstate_t* _Nullable __ps);
+size_t mbrtowc(wchar_t* _Nullable __buf, const char* _Nullable __s, size_t __n, mbstate_t* _Nullable __ps);
+size_t mbsrtowcs(wchar_t* _Nullable __dst, const char* _Nullable * _Nonnull __src, size_t __dst_n, mbstate_t* _Nullable __ps);
+size_t mbsnrtowcs(wchar_t* _Nullable __dst, const char* _Nullable * _Nullable  __src, size_t __src_n, size_t __dst_n, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
+wint_t putwc(wchar_t __wc, FILE* _Nonnull __fp);
 wint_t putwchar(wchar_t __wc);
-int swprintf(wchar_t* __buf, size_t __n, const wchar_t* __fmt, ...);
-int swscanf(const wchar_t* __s, const wchar_t* __fmt, ...);
-wint_t ungetwc(wint_t __wc, FILE* __fp);
-int vfwprintf(FILE* __fp, const wchar_t* __fmt, va_list __args);
-int vfwscanf(FILE* __fp, const wchar_t* __fmt, va_list __args) __INTRODUCED_IN(21);
-int vswprintf(wchar_t* __buf, size_t __n, const wchar_t* __fmt, va_list __args);
-int vswscanf(const wchar_t* __s, const wchar_t* __fmt, va_list __args) __INTRODUCED_IN(21);
-int vwprintf(const wchar_t* __fmt, va_list __args);
-int vwscanf(const wchar_t* __fmt, va_list __args) __INTRODUCED_IN(21);
-wchar_t* wcpcpy(wchar_t* __dst, const wchar_t* __src);
-wchar_t* wcpncpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
-size_t wcrtomb(char* __buf, wchar_t __wc, mbstate_t* __ps);
-int wcscasecmp(const wchar_t* __lhs, const wchar_t* __rhs);
-int wcscasecmp_l(const wchar_t* __lhs, const wchar_t* __rhs, locale_t __l) __INTRODUCED_IN(23);
-wchar_t* wcscat(wchar_t* __dst, const wchar_t* __src);
-wchar_t* wcschr(const wchar_t* __s, wchar_t __wc);
-int wcscmp(const wchar_t* __lhs, const wchar_t* __rhs);
-int wcscoll(const wchar_t* __lhs, const wchar_t* __rhs);
-wchar_t* wcscpy(wchar_t* __dst, const wchar_t* __src);
-size_t wcscspn(const wchar_t* __s, const wchar_t* __accept);
-size_t wcsftime(wchar_t* __buf, size_t __n, const wchar_t* __fmt, const struct tm* __tm);
-size_t wcsftime_l(wchar_t* __buf, size_t __n, const wchar_t* __fmt, const struct tm* __tm, locale_t __l) __INTRODUCED_IN(28);
-size_t wcslen(const wchar_t* __s);
-int wcsncasecmp(const wchar_t* __lhs, const wchar_t* __rhs, size_t __n);
-int wcsncasecmp_l(const wchar_t* __lhs, const wchar_t* __rhs, size_t __n, locale_t __l) __INTRODUCED_IN(23);
-wchar_t* wcsncat(wchar_t* __dst, const wchar_t* __src, size_t __n);
-int wcsncmp(const wchar_t* __lhs, const wchar_t* __rhs, size_t __n);
-wchar_t* wcsncpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
-size_t wcsnrtombs(char* __dst, const wchar_t** __src, size_t __src_n, size_t __dst_n, mbstate_t* __ps) __INTRODUCED_IN(21);
-wchar_t* wcspbrk(const wchar_t* __s, const wchar_t* __accept);
-wchar_t* wcsrchr(const wchar_t* __s, wchar_t __wc);
-size_t wcsrtombs(char* __dst, const wchar_t** __src, size_t __dst_n, mbstate_t* __ps);
-size_t wcsspn(const wchar_t* __s, const wchar_t* __accept);
-wchar_t* wcsstr(const wchar_t* __haystack, const wchar_t* __needle);
-double wcstod(const wchar_t* __s, wchar_t** __end_ptr);
-double wcstod_l(const wchar_t* __s, wchar_t** __end_ptr, locale_t __l) __INTRODUCED_IN(28);
-float wcstof(const wchar_t* __s, wchar_t** __end_ptr) __INTRODUCED_IN(21);
-float wcstof_l(const wchar_t* __s, wchar_t** __end_ptr, locale_t __l) __INTRODUCED_IN(28);
-wchar_t* wcstok(wchar_t* __s, const wchar_t* __delimiter, wchar_t** __ptr);
-long wcstol(const wchar_t* __s, wchar_t** __end_ptr, int __base);
-long wcstol_l(const wchar_t* __s, wchar_t** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(28);
-long long wcstoll(const wchar_t* __s, wchar_t** __end_ptr, int __base) __INTRODUCED_IN(21);
-long double wcstold(const wchar_t* __s, wchar_t** __end_ptr) __RENAME_LDBL(wcstod, 3, 21);
-unsigned long wcstoul(const wchar_t* __s, wchar_t** __end_ptr, int __base);
-unsigned long wcstoul_l(const wchar_t* __s, wchar_t** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(28);
-unsigned long long wcstoull(const wchar_t* __s, wchar_t** __end_ptr, int __base) __INTRODUCED_IN(21);
-int wcswidth(const wchar_t* __s, size_t __n);
-size_t wcsxfrm(wchar_t* __dst, const wchar_t* __src, size_t __n);
+int swprintf(wchar_t* _Nonnull __buf, size_t __n, const wchar_t* _Nonnull __fmt, ...);
+int swscanf(const wchar_t* _Nonnull __s, const wchar_t* _Nonnull __fmt, ...);
+wint_t ungetwc(wint_t __wc, FILE* _Nonnull __fp);
+int vfwprintf(FILE* _Nonnull __fp, const wchar_t* _Nonnull __fmt, va_list __args);
+int vfwscanf(FILE* _Nonnull __fp, const wchar_t* _Nonnull __fmt, va_list __args) __INTRODUCED_IN(21);
+int vswprintf(wchar_t* _Nonnull __buf, size_t __n, const wchar_t* _Nonnull __fmt, va_list __args);
+int vswscanf(const wchar_t* _Nonnull __s, const wchar_t* _Nonnull __fmt, va_list __args) __INTRODUCED_IN(21);
+int vwprintf(const wchar_t* _Nonnull __fmt, va_list __args);
+int vwscanf(const wchar_t* _Nonnull __fmt, va_list __args) __INTRODUCED_IN(21);
+wchar_t* _Nonnull wcpcpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src);
+wchar_t* _Nonnull wcpncpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
+size_t wcrtomb(char* _Nullable __buf, wchar_t __wc, mbstate_t* _Nullable __ps);
+int wcscasecmp(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs);
+int wcscasecmp_l(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs, locale_t _Nonnull __l) __INTRODUCED_IN(23);
+wchar_t* _Nonnull wcscat(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src);
+wchar_t* _Nullable wcschr(const wchar_t * _Nonnull __s, wchar_t __wc);
+int wcscmp(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs);
+int wcscoll(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs);
+wchar_t* _Nonnull wcscpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src);
+size_t wcscspn(const wchar_t* _Nonnull __s, const wchar_t* _Nonnull __accept);
+size_t wcsftime(wchar_t* _Nonnull __buf, size_t __n, const wchar_t* _Nullable __fmt, const struct tm* _Nonnull __tm);
+size_t wcsftime_l(wchar_t* _Nonnull __buf, size_t __n, const wchar_t* _Nullable __fmt, const struct tm* _Nonnull __tm, locale_t _Nonnull __l) __INTRODUCED_IN(28);
+size_t wcslen(const wchar_t* _Nonnull __s);
+int wcsncasecmp(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs, size_t __n);
+int wcsncasecmp_l(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs, size_t __n, locale_t _Nonnull __l) __INTRODUCED_IN(23);
+wchar_t* _Nonnull wcsncat(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
+int wcsncmp(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs, size_t __n);
+wchar_t* _Nonnull wcsncpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
+size_t wcsnrtombs(char* _Nullable __dst, const wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __src, size_t __src_n, size_t __dst_n, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
+wchar_t* _Nullable wcspbrk(const wchar_t* _Nonnull __s, const wchar_t* _Nonnull __accept);
+wchar_t* _Nullable wcsrchr(const wchar_t* _Nonnull __s, wchar_t __wc);
+size_t wcsrtombs(char* _Nullable __dst, const wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __src, size_t __dst_n, mbstate_t* _Nullable __ps);
+size_t wcsspn(const wchar_t* _Nonnull __s, const wchar_t* _Nonnull __accept);
+wchar_t* _Nullable wcsstr(const wchar_t* _Nonnull __haystack, const wchar_t* _Nonnull __needle);
+double wcstod(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr);
+double wcstod_l(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(28);
+float wcstof(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr) __INTRODUCED_IN(21);
+float wcstof_l(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(28);
+wchar_t* _Nullable wcstok(wchar_t* _Nullable __s, const wchar_t* _Nonnull __delimiter, wchar_t* _Nonnull * _Nonnull __ptr);
+long wcstol(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base);
+long wcstol_l(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(28);
+long long wcstoll(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base) __INTRODUCED_IN(21);
+long double wcstold(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr) __RENAME_LDBL(wcstod, 3, 21);
+unsigned long wcstoul(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base);
+unsigned long wcstoul_l(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(28);
+unsigned long long wcstoull(const wchar_t* _Nonnull __s, wchar_t* __BIONIC_COMPLICATED_NULLNESS * _Nullable __end_ptr, int __base) __INTRODUCED_IN(21);
+int wcswidth(const wchar_t* _Nonnull __s, size_t __n);
+size_t wcsxfrm(wchar_t* __BIONIC_COMPLICATED_NULLNESS __dst, const wchar_t* _Nonnull __src, size_t __n);
 int wctob(wint_t __wc);
 int wcwidth(wchar_t __wc);
-wchar_t* wmemchr(const wchar_t* __src, wchar_t __wc, size_t __n);
-int wmemcmp(const wchar_t* __lhs, const wchar_t* __rhs, size_t __n);
-wchar_t* wmemcpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
+wchar_t* _Nullable wmemchr(const wchar_t* _Nonnull __src, wchar_t __wc, size_t __n);
+int wmemcmp(const wchar_t* _Nullable __lhs, const wchar_t* _Nullable __rhs, size_t __n);
+wchar_t* _Nonnull wmemcpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
 #if defined(__USE_GNU)
-wchar_t* wmempcpy(wchar_t* __dst, const wchar_t* __src, size_t __n) __INTRODUCED_IN(23);
+wchar_t* _Nonnull wmempcpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n) __INTRODUCED_IN(23);
 #endif
-wchar_t* wmemmove(wchar_t* __dst, const wchar_t* __src, size_t __n);
-wchar_t* wmemset(wchar_t* __dst, wchar_t __wc, size_t __n);
-int wprintf(const wchar_t* __fmt, ...);
-int wscanf(const wchar_t* __fmt, ...);
+wchar_t* _Nonnull wmemmove(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
+wchar_t* _Nonnull wmemset(wchar_t* _Nonnull __dst, wchar_t __wc, size_t __n);
+int wprintf(const wchar_t* _Nonnull __fmt, ...);
+int wscanf(const wchar_t* _Nonnull __fmt, ...);
 
-#if __ANDROID_API__ >= 21
-long long wcstoll_l(const wchar_t* __s, wchar_t** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(21);
-unsigned long long wcstoull_l(const wchar_t* __s, wchar_t** __end_ptr, int __base, locale_t __l) __INTRODUCED_IN(21);
-long double wcstold_l(const wchar_t* __s, wchar_t** __end_ptr, locale_t __l) __INTRODUCED_IN(21);
+long long wcstoll_l(const wchar_t* _Nonnull __s, wchar_t* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+unsigned long long wcstoull_l(const wchar_t* _Nonnull __s, wchar_t* _Nullable * _Nullable __end_ptr, int __base, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+long double wcstold_l(const wchar_t* _Nonnull __s, wchar_t* _Nullable * _Nullable __end_ptr, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
-int wcscoll_l(const wchar_t* __lhs, const wchar_t* __rhs, locale_t __l) __attribute_pure__
+int wcscoll_l(const wchar_t* _Nonnull __lhs, const wchar_t* _Nonnull __rhs, locale_t _Nonnull __l) __attribute_pure__
     __INTRODUCED_IN(21);
-size_t wcsxfrm_l(wchar_t* __dst, const wchar_t* __src, size_t __n, locale_t __l) __INTRODUCED_IN(21);
-#else
-// Implemented as static inlines before 21.
-#endif
+size_t wcsxfrm_l(wchar_t* __BIONIC_COMPLICATED_NULLNESS __dst, const wchar_t* _Nonnull __src, size_t __n, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+size_t wcslcat(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
+size_t wcslcpy(wchar_t* _Nonnull __dst, const wchar_t* _Nonnull __src, size_t __n);
 
-size_t wcslcat(wchar_t* __dst, const wchar_t* __src, size_t __n);
-size_t wcslcpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
-
-FILE* open_wmemstream(wchar_t** __ptr, size_t* __size_ptr) __INTRODUCED_IN(23);
-wchar_t* wcsdup(const wchar_t* __s);
-size_t wcsnlen(const wchar_t* __s, size_t __n);
+FILE* _Nullable open_wmemstream(wchar_t* _Nonnull * _Nonnull __ptr, size_t* _Nonnull  __size_ptr) __INTRODUCED_IN(23);
+wchar_t* _Nullable wcsdup(const wchar_t* _Nonnull __s);
+size_t wcsnlen(const wchar_t* _Nonnull __s, size_t __n);
 
 __END_DECLS
 
diff --git a/libc/include/wctype.h b/libc/include/wctype.h
index 58510ae..344343f 100644
--- a/libc/include/wctype.h
+++ b/libc/include/wctype.h
@@ -35,31 +35,27 @@
 
 __BEGIN_DECLS
 
-#if __ANDROID_API__ >= 21
-int iswalnum_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswalpha_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswblank_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswcntrl_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswdigit_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswgraph_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswlower_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswprint_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswpunct_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswspace_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswupper_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-int iswxdigit_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
+int iswalnum_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswalpha_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswblank_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswcntrl_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswdigit_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswgraph_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswlower_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswprint_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswpunct_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswspace_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswupper_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswxdigit_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
-wint_t towlower_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-wint_t towupper_l(wint_t __wc, locale_t __l) __INTRODUCED_IN(21);
-#else
-// Implemented as static inlines before 21.
-#endif
+wint_t towlower_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+wint_t towupper_l(wint_t __wc, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
-wint_t towctrans_l(wint_t __wc, wctrans_t __transform, locale_t __l) __INTRODUCED_IN(26);
-wctrans_t wctrans_l(const char* __name, locale_t __l) __INTRODUCED_IN(26);
+wint_t towctrans_l(wint_t __wc, wctrans_t _Nonnull __transform, locale_t _Nonnull __l) __INTRODUCED_IN(26);
+wctrans_t _Nonnull wctrans_l(const char* _Nonnull __name, locale_t _Nonnull __l) __INTRODUCED_IN(26);
 
-wctype_t wctype_l(const char* __name, locale_t __l) __INTRODUCED_IN(21);
-int iswctype_l(wint_t __wc, wctype_t __transform, locale_t __l) __INTRODUCED_IN(21);
+wctype_t wctype_l(const char* _Nonnull __name, locale_t _Nonnull __l) __INTRODUCED_IN(21);
+int iswctype_l(wint_t __wc, wctype_t __transform, locale_t _Nonnull __l) __INTRODUCED_IN(21);
 
 __END_DECLS
 
diff --git a/libc/kernel/README.md b/libc/kernel/README.md
index 5f1c81d..3846a4f 100644
--- a/libc/kernel/README.md
+++ b/libc/kernel/README.md
@@ -99,6 +99,7 @@
 Run this command to automatically download the latest version of the headers
 and import them if there is no checked out kernel source tree:
 ```
+  # For testing only, not for use in production!
   bionic/libc/kernel/tools/generate_uapi_headers.sh --download-kernel
 ```
 
diff --git a/libc/kernel/android/scsi/scsi/scsi_proto.h b/libc/kernel/android/scsi/scsi/scsi_proto.h
index 13ac4c8..24df458 100644
--- a/libc/kernel/android/scsi/scsi/scsi_proto.h
+++ b/libc/kernel/android/scsi/scsi/scsi_proto.h
@@ -139,6 +139,7 @@
 #define ABORTED_COMMAND 0x0b
 #define VOLUME_OVERFLOW 0x0d
 #define MISCOMPARE 0x0e
+#define COMPLETED 0x0f
 #define TYPE_DISK 0x00
 #define TYPE_TAPE 0x01
 #define TYPE_PRINTER 0x02
@@ -210,4 +211,12 @@
   SCSI_VERSION_DESCRIPTOR_SPC4 = 0x0460,
   SCSI_VERSION_DESCRIPTOR_SRP = 0x0940
 };
+enum scsi_support_opcode {
+  SCSI_SUPPORT_NO_INFO = 0,
+  SCSI_SUPPORT_NOT_SUPPORTED = 1,
+  SCSI_SUPPORT_FULL = 3,
+  SCSI_SUPPORT_VENDOR = 5,
+};
+#define SCSI_CONTROL_MASK 0
+#define SCSI_GROUP_NUMBER_MASK 0
 #endif
diff --git a/libc/kernel/android/scsi/scsi/sg.h b/libc/kernel/android/scsi/scsi/sg.h
index a7a1944..9ba6cd6 100644
--- a/libc/kernel/android/scsi/scsi/sg.h
+++ b/libc/kernel/android/scsi/scsi/sg.h
@@ -20,7 +20,7 @@
 #define _SCSI_GENERIC_H
 #include <linux/compiler.h>
 typedef struct sg_iovec {
-  void __user * iov_base;
+  void  * iov_base;
   size_t iov_len;
 } sg_iovec_t;
 typedef struct sg_io_hdr {
@@ -30,13 +30,13 @@
   unsigned char mx_sb_len;
   unsigned short iovec_count;
   unsigned int dxfer_len;
-  void __user * dxferp;
-  unsigned char __user * cmdp;
-  void __user * sbp;
+  void  * dxferp;
+  unsigned char  * cmdp;
+  void  * sbp;
   unsigned int timeout;
   unsigned int flags;
   int pack_id;
-  void __user * usr_ptr;
+  void  * usr_ptr;
   unsigned char status;
   unsigned char masked_status;
   unsigned char msg_status;
@@ -79,7 +79,7 @@
 #define QUEUE_FULL 0x14
 #define ACA_ACTIVE 0x18
 #define TASK_ABORTED 0x20
-#define status_byte(result) (((result) >> 1) & 0x7f)
+#define sg_status_byte(result) (((result) >> 1) & 0x7f)
 typedef struct sg_scsi_id {
   int host_no;
   int channel;
@@ -96,7 +96,7 @@
   char sg_io_owned;
   char problem;
   int pack_id;
-  void __user * usr_ptr;
+  void  * usr_ptr;
   unsigned int duration;
   int unused;
 } sg_req_info_t;
diff --git a/libc/kernel/android/uapi/linux/compiler.h b/libc/kernel/android/uapi/linux/compiler.h
index 8e89655..42d59aa 100644
--- a/libc/kernel/android/uapi/linux/compiler.h
+++ b/libc/kernel/android/uapi/linux/compiler.h
@@ -1,18 +1,11 @@
-#ifndef _UAPI_LINUX_COMPILER_H
-#define _UAPI_LINUX_COMPILER_H
+#pragma once
 
 /*
- * This file is not currently in the Linux kernel tree.
- * Upstream uapi headers refer to <linux/compiler.h> but there is
- * no such uapi file. We've sent this upstream, and are optimistically
- * adding it to bionic in the meantime. This should be replaced by
- * a scrubbed header from external/kernel-headers when possible.
+ * There is no `include/uapi/linux/compiler.h`, just `include/linux/compiler.h`.
  *
- * An alternative to this file is to check in a symbolic link to the
- * non-uapi <linux/compiler.h>. That's fine for building bionic too.
+ * We don't need anything _in_ this file, but we do need this file.
+ * The two #defines are for backwards compatibility.
  */
 
-#define __user
 #define __force
-
-#endif /* _UAPI_LINUX_COMPILER_H */
+#define __user
diff --git a/libc/kernel/android/uapi/linux/compiler_types.h b/libc/kernel/android/uapi/linux/compiler_types.h
index 94f4fbe..859ae05 100644
--- a/libc/kernel/android/uapi/linux/compiler_types.h
+++ b/libc/kernel/android/uapi/linux/compiler_types.h
@@ -1,5 +1,11 @@
+#pragma once
+
 /*
- * The compiler.h file has been split into compiler.h and compiler_types.h.
- * However, to compile bionic we only need the compiler.h.
+ * There is no `include/uapi/linux/compiler_types.h`, just
+ * `include/linux/compiler_types.h`.
+ *
+ * We don't need anything _in_ this file, but we do need this file.
+ * The #include is for backwards compatibility.
  */
+
 #include <linux/compiler.h>
diff --git a/libc/kernel/tools/clean_header.py b/libc/kernel/tools/clean_header.py
index cfd301a..f15fab4 100755
--- a/libc/kernel/tools/clean_header.py
+++ b/libc/kernel/tools/clean_header.py
@@ -109,9 +109,6 @@
     if arch and arch in kernel_default_arch_macros:
         macros.update(kernel_default_arch_macros[arch])
 
-    if arch and arch in kernel_arch_token_replacements:
-        blocks.replaceTokens(kernel_arch_token_replacements[arch])
-
     blocks.removeStructs(kernel_structs_to_remove)
     blocks.optimizeMacros(macros)
     blocks.optimizeIf01()
diff --git a/libc/kernel/tools/cpp.py b/libc/kernel/tools/cpp.py
index 1496231..40e1f26 100755
--- a/libc/kernel/tools/cpp.py
+++ b/libc/kernel/tools/cpp.py
@@ -14,7 +14,7 @@
     utils.panic('ANDROID_BUILD_TOP not set.\n')
 
 # Set up the env vars for libclang.
-site.addsitedir(os.path.join(top, 'prebuilts/clang/host/linux-x86/clang-stable/lib64/python3/site-packages/'))
+site.addsitedir(os.path.join(top, 'prebuilts/clang/host/linux-x86/clang-stable/lib/python3/site-packages/'))
 
 import clang.cindex
 from clang.cindex import conf
@@ -28,7 +28,7 @@
 
 # Set up LD_LIBRARY_PATH to include libclang.so, libLLVM.so, and etc.
 # Note that setting LD_LIBRARY_PATH with os.putenv() sometimes doesn't help.
-clang.cindex.Config.set_library_file(os.path.join(top, 'prebuilts/clang/host/linux-x86/clang-stable/lib64/libclang.so'))
+clang.cindex.Config.set_library_file(os.path.join(top, 'prebuilts/clang/host/linux-x86/clang-stable/lib/libclang.so'))
 
 from defaults import *
 
diff --git a/libc/kernel/tools/defaults.py b/libc/kernel/tools/defaults.py
index 99bbc3e..91d26ce 100644
--- a/libc/kernel/tools/defaults.py
+++ b/libc/kernel/tools/defaults.py
@@ -1,12 +1,4 @@
-# this module contains all the defaults used by the generation of cleaned-up headers
-# for the Bionic C library
-#
-
-import time, os, sys
-from utils import *
-
-# the list of supported architectures
-kernel_archs = [ 'arm', 'arm64', 'x86' ]
+# All the defaults used to generate the cleaned-up uapi headers for bionic.
 
 # the list of include directories that belong to the kernel
 # tree. used when looking for sources...
@@ -51,6 +43,7 @@
     "in_addr": False,
     "ip_mreq_source": False,
     "ip_msfilter": False,
+    "timespec": False,
     }
 
 # define to true if you want to remove all defined(CONFIG_FOO) tests
@@ -58,18 +51,11 @@
 # but just generates cleaner results
 kernel_remove_config_macros = True
 
-# maps an architecture to a set of default macros that would be provided by
-# toolchain preprocessor
+# Maps an architecture to a set of default macros that would be provided by
+# the toolchain's preprocessor. Currently only used to remove confusing
+# big-endian junk from the 32-bit arm headers.
 kernel_default_arch_macros = {
     "arm": {"__ARMEB__": kCppUndefinedMacro, "__ARM_EABI__": "1"},
-    "arm64": {},
-    "x86": {},
-    }
-
-kernel_arch_token_replacements = {
-    "arm": {},
-    "arm64": {},
-    "x86": {},
     }
 
 # Replace tokens in the output according to this mapping.
@@ -104,6 +90,12 @@
     "__kernel_old_timeval": "timeval",
     # Do the same for __kernel_old_itimerval as for timeval.
     "__kernel_old_itimerval": "itimerval",
+    # Replace __packed with __attribute__((__packed__)) to avoid depending
+    # on sys/cdefs.h
+    "__packed": "__attribute__((__packed__))",
+    # Remove unused macros (http://b/262917450).
+    "__force": "",
+    "__user": "",
     }
 
 
diff --git a/libc/kernel/tools/generate_uapi_headers.sh b/libc/kernel/tools/generate_uapi_headers.sh
index 7e49cde..12f60e5 100755
--- a/libc/kernel/tools/generate_uapi_headers.sh
+++ b/libc/kernel/tools/generate_uapi_headers.sh
@@ -43,7 +43,7 @@
 ANDROID_KERNEL_BRANCH="android-mainline"
 KERNEL_DIR=""
 KERNEL_DOWNLOAD=0
-ARCH_LIST=("arm" "arm64" "x86")
+ARCH_LIST=("arm" "arm64" "riscv" "x86")
 ANDROID_KERNEL_DIR="external/kernel-headers/original"
 SKIP_GENERATION=0
 VERIFY_HEADERS_ONLY=0
diff --git a/libc/kernel/tools/update_all.py b/libc/kernel/tools/update_all.py
index abc72a4..ae89a80 100755
--- a/libc/kernel/tools/update_all.py
+++ b/libc/kernel/tools/update_all.py
@@ -92,6 +92,7 @@
                      'kernel/uapi/asm-arm/asm/unistd.h',
                      'kernel/uapi/asm-arm/asm/unistd-eabi.h',
                      'kernel/uapi/asm-arm/asm/unistd-oabi.h',
+                     'kernel/uapi/asm-riscv/asm/unistd.h',
                      'kernel/uapi/asm-x86/asm/unistd_32.h',
                      'kernel/uapi/asm-x86/asm/unistd_64.h',
                      'kernel/uapi/asm-x86/asm/unistd_x32.h']:
diff --git a/libc/kernel/uapi/BUILD b/libc/kernel/uapi/BUILD
index 2f92464..3c9bb69 100644
--- a/libc/kernel/uapi/BUILD
+++ b/libc/kernel/uapi/BUILD
@@ -29,39 +29,39 @@
 package(default_visibility = ["//bionic/libc:__pkg__"])
 
 cc_api_headers(
-  name="libc_kernel_uapi_headers",
-  hdrs=glob(["**/*.h"]),
-  system=True,
+    name = "libc_kernel_uapi_headers",
+    hdrs = glob(["**/*.h"]),
+    system = True,
 )
 
 cc_api_headers(
-  name="libc_kernal_uapi_asm_arm_headers",
-  include_dir="asm-arm",
-  hdrs=glob(["asm-arm/**/*.h"]),
-  system=True,
-  arch="arm",
+    name = "libc_kernel_uapi_asm_arm_headers",
+    hdrs = glob(["asm-arm/**/*.h"]),
+    arch = "arm",
+    include_dir = "asm-arm",
+    system = True,
 )
 
 cc_api_headers(
-  name="libc_kernal_uapi_asm_arm64_headers",
-  include_dir="asm-arm64",
-  hdrs=glob(["asm-arm64/**/*.h"]),
-  system=True,
-  arch="arm64",
+    name = "libc_kernel_uapi_asm_arm64_headers",
+    hdrs = glob(["asm-arm64/**/*.h"]),
+    arch = "arm64",
+    include_dir = "asm-arm64",
+    system = True,
 )
 
 cc_api_headers(
-  name="libc_kernal_uapi_asm_x86_headers",
-  include_dir="asm-x86",
-  hdrs=glob(["asm-x86/**/*.h"]),
-  system=True,
-  arch="x86",
+    name = "libc_kernel_uapi_asm_x86_headers",
+    hdrs = glob(["asm-x86/**/*.h"]),
+    arch = "x86",
+    include_dir = "asm-x86",
+    system = True,
 )
 
 cc_api_headers(
-  name="libc_kernal_uapi_asm_x86_64_headers",
-  include_dir="asm-x86_64",
-  hdrs=glob(["asm-x86_64/**/*.h"]),
-  system=True,
-  arch="x86_64",
+    name = "libc_kernel_uapi_asm_x86_64_headers",
+    hdrs = glob(["asm-x86_64/**/*.h"]),
+    arch = "x86_64",
+    include_dir = "asm-x86_64",
+    system = True,
 )
diff --git a/libc/kernel/uapi/asm-arm/asm/hwcap.h b/libc/kernel/uapi/asm-arm/asm/hwcap.h
index fdc5405..2a3c809 100644
--- a/libc/kernel/uapi/asm-arm/asm/hwcap.h
+++ b/libc/kernel/uapi/asm-arm/asm/hwcap.h
@@ -41,9 +41,17 @@
 #define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT)
 #define HWCAP_LPAE (1 << 20)
 #define HWCAP_EVTSTRM (1 << 21)
+#define HWCAP_FPHP (1 << 22)
+#define HWCAP_ASIMDHP (1 << 23)
+#define HWCAP_ASIMDDP (1 << 24)
+#define HWCAP_ASIMDFHM (1 << 25)
+#define HWCAP_ASIMDBF16 (1 << 26)
+#define HWCAP_I8MM (1 << 27)
 #define HWCAP2_AES (1 << 0)
 #define HWCAP2_PMULL (1 << 1)
 #define HWCAP2_SHA1 (1 << 2)
 #define HWCAP2_SHA2 (1 << 3)
 #define HWCAP2_CRC32 (1 << 4)
+#define HWCAP2_SB (1 << 5)
+#define HWCAP2_SSBS (1 << 6)
 #endif
diff --git a/libc/kernel/uapi/asm-arm/asm/signal.h b/libc/kernel/uapi/asm-arm/asm/signal.h
index 0424380..90cb8d6 100644
--- a/libc/kernel/uapi/asm-arm/asm/signal.h
+++ b/libc/kernel/uapi/asm-arm/asm/signal.h
@@ -76,7 +76,7 @@
 #define sa_handler _u._sa_handler
 #define sa_sigaction _u._sa_sigaction
 typedef struct sigaltstack {
-  void __user * ss_sp;
+  void  * ss_sp;
   int ss_flags;
   __kernel_size_t ss_size;
 } stack_t;
diff --git a/libc/kernel/uapi/asm-arm64/asm/hwcap.h b/libc/kernel/uapi/asm-arm64/asm/hwcap.h
index 95d21aa..bb592e4 100644
--- a/libc/kernel/uapi/asm-arm64/asm/hwcap.h
+++ b/libc/kernel/uapi/asm-arm64/asm/hwcap.h
@@ -82,4 +82,9 @@
 #define HWCAP2_SME_F32F32 (1 << 29)
 #define HWCAP2_SME_FA64 (1 << 30)
 #define HWCAP2_WFXT (1UL << 31)
+#define HWCAP2_EBF16 (1UL << 32)
+#define HWCAP2_SVE_EBF16 (1UL << 33)
+#define HWCAP2_CSSC (1UL << 34)
+#define HWCAP2_RPRFM (1UL << 35)
+#define HWCAP2_SVE2P1 (1UL << 36)
 #endif
diff --git a/libc/kernel/uapi/asm-arm64/asm/kvm.h b/libc/kernel/uapi/asm-arm64/asm/kvm.h
index 1f57fca..ce0c318 100644
--- a/libc/kernel/uapi/asm-arm64/asm/kvm.h
+++ b/libc/kernel/uapi/asm-arm64/asm/kvm.h
@@ -35,6 +35,7 @@
 #define __KVM_HAVE_READONLY_MEM
 #define __KVM_HAVE_VCPU_EVENTS
 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
+#define KVM_DIRTY_LOG_PAGE_OFFSET 64
 #define KVM_REG_SIZE(id) (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
 struct kvm_regs {
   struct user_pt_regs regs;
@@ -51,9 +52,9 @@
 #define KVM_ARM_TARGET_GENERIC_V8 5
 #define KVM_ARM_NUM_TARGETS 6
 #define KVM_ARM_DEVICE_TYPE_SHIFT 0
-#define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
+#define KVM_ARM_DEVICE_TYPE_MASK GENMASK(KVM_ARM_DEVICE_TYPE_SHIFT + 15, KVM_ARM_DEVICE_TYPE_SHIFT)
 #define KVM_ARM_DEVICE_ID_SHIFT 16
-#define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT)
+#define KVM_ARM_DEVICE_ID_MASK GENMASK(KVM_ARM_DEVICE_ID_SHIFT + 15, KVM_ARM_DEVICE_ID_SHIFT)
 #define KVM_ARM_DEVICE_VGIC_V2 0
 #define KVM_VGIC_V2_ADDR_TYPE_DIST 0
 #define KVM_VGIC_V2_ADDR_TYPE_CPU 1
@@ -120,7 +121,7 @@
 struct kvm_arm_copy_mte_tags {
   __u64 guest_ipa;
   __u64 length;
-  void __user * addr;
+  void  * addr;
   __u64 flags;
   __u64 reserved[2];
 };
diff --git a/libc/kernel/uapi/asm-arm64/asm/perf_regs.h b/libc/kernel/uapi/asm-arm64/asm/perf_regs.h
index 71d496f..e18fd05 100644
--- a/libc/kernel/uapi/asm-arm64/asm/perf_regs.h
+++ b/libc/kernel/uapi/asm-arm64/asm/perf_regs.h
@@ -53,5 +53,8 @@
   PERF_REG_ARM64_SP,
   PERF_REG_ARM64_PC,
   PERF_REG_ARM64_MAX,
+  PERF_REG_ARM64_VG = 46,
+  PERF_REG_ARM64_EXTENDED_MAX
 };
+#define PERF_REG_EXTENDED_MASK (1ULL << PERF_REG_ARM64_VG)
 #endif
diff --git a/libc/kernel/uapi/asm-generic/hugetlb_encode.h b/libc/kernel/uapi/asm-generic/hugetlb_encode.h
index 73d8180..059991c 100644
--- a/libc/kernel/uapi/asm-generic/hugetlb_encode.h
+++ b/libc/kernel/uapi/asm-generic/hugetlb_encode.h
@@ -20,17 +20,17 @@
 #define _ASM_GENERIC_HUGETLB_ENCODE_H_
 #define HUGETLB_FLAG_ENCODE_SHIFT 26
 #define HUGETLB_FLAG_ENCODE_MASK 0x3f
-#define HUGETLB_FLAG_ENCODE_16KB (14 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_64KB (16 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_512KB (19 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_1MB (20 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_2MB (21 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_8MB (23 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_16MB (24 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_32MB (25 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_256MB (28 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_512MB (29 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_1GB (30 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_2GB (31 << HUGETLB_FLAG_ENCODE_SHIFT)
-#define HUGETLB_FLAG_ENCODE_16GB (34 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_16KB (14U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_64KB (16U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_512KB (19U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_1MB (20U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_2MB (21U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_8MB (23U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_16MB (24U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_32MB (25U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_256MB (28U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_512MB (29U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_1GB (30U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_2GB (31U << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_16GB (34U << HUGETLB_FLAG_ENCODE_SHIFT)
 #endif
diff --git a/libc/kernel/uapi/asm-generic/mman-common.h b/libc/kernel/uapi/asm-generic/mman-common.h
index e96f4cc..966d05b 100644
--- a/libc/kernel/uapi/asm-generic/mman-common.h
+++ b/libc/kernel/uapi/asm-generic/mman-common.h
@@ -63,6 +63,7 @@
 #define MADV_POPULATE_READ 22
 #define MADV_POPULATE_WRITE 23
 #define MADV_DONTNEED_LOCKED 24
+#define MADV_COLLAPSE 25
 #define MAP_FILE 0
 #define PKEY_DISABLE_ACCESS 0x1
 #define PKEY_DISABLE_WRITE 0x2
diff --git a/libc/kernel/uapi/asm-generic/poll.h b/libc/kernel/uapi/asm-generic/poll.h
index 372bc77..ba6f2e9 100644
--- a/libc/kernel/uapi/asm-generic/poll.h
+++ b/libc/kernel/uapi/asm-generic/poll.h
@@ -41,8 +41,8 @@
 #ifndef POLLRDHUP
 #define POLLRDHUP 0x2000
 #endif
-#define POLLFREE (__force __poll_t) 0x4000
-#define POLL_BUSY_LOOP (__force __poll_t) 0x8000
+#define POLLFREE ( __poll_t) 0x4000
+#define POLL_BUSY_LOOP ( __poll_t) 0x8000
 struct pollfd {
   int fd;
   short events;
diff --git a/libc/kernel/uapi/asm-generic/siginfo.h b/libc/kernel/uapi/asm-generic/siginfo.h
index c5e4178..90393ba 100644
--- a/libc/kernel/uapi/asm-generic/siginfo.h
+++ b/libc/kernel/uapi/asm-generic/siginfo.h
@@ -22,7 +22,7 @@
 #include <linux/types.h>
 typedef union sigval {
   int sival_int;
-  void __user * sival_ptr;
+  void  * sival_ptr;
 } sigval_t;
 #define SI_MAX_SIZE 128
 #ifndef __ARCH_SI_BAND_T
@@ -58,7 +58,7 @@
     __ARCH_SI_CLOCK_T _stime;
   } _sigchld;
   struct {
-    void __user * _addr;
+    void  * _addr;
 #ifdef __ia64__
     int _imm;
     unsigned int _flags;
@@ -70,8 +70,8 @@
       short _addr_lsb;
       struct {
         char _dummy_bnd[__ADDR_BND_PKEY_PAD];
-        void __user * _lower;
-        void __user * _upper;
+        void  * _lower;
+        void  * _upper;
       } _addr_bnd;
       struct {
         char _dummy_pkey[__ADDR_BND_PKEY_PAD];
@@ -89,7 +89,7 @@
     int _fd;
   } _sigpoll;
   struct {
-    void __user * _call_addr;
+    void  * _call_addr;
     int _syscall;
     unsigned int _arch;
   } _sigsys;
diff --git a/libc/kernel/uapi/asm-generic/signal-defs.h b/libc/kernel/uapi/asm-generic/signal-defs.h
index c7e9504..dea8fbc 100644
--- a/libc/kernel/uapi/asm-generic/signal-defs.h
+++ b/libc/kernel/uapi/asm-generic/signal-defs.h
@@ -55,11 +55,11 @@
 #endif
 #ifndef __ASSEMBLY__
 typedef void __signalfn_t(int);
-typedef __signalfn_t __user * __sighandler_t;
+typedef __signalfn_t  * __sighandler_t;
 typedef void __restorefn_t(void);
-typedef __restorefn_t __user * __sigrestore_t;
-#define SIG_DFL ((__force __sighandler_t) 0)
-#define SIG_IGN ((__force __sighandler_t) 1)
-#define SIG_ERR ((__force __sighandler_t) - 1)
+typedef __restorefn_t  * __sigrestore_t;
+#define SIG_DFL (( __sighandler_t) 0)
+#define SIG_IGN (( __sighandler_t) 1)
+#define SIG_ERR (( __sighandler_t) - 1)
 #endif
 #endif
diff --git a/libc/kernel/uapi/asm-generic/signal.h b/libc/kernel/uapi/asm-generic/signal.h
index 5cb1dce..9cf393f 100644
--- a/libc/kernel/uapi/asm-generic/signal.h
+++ b/libc/kernel/uapi/asm-generic/signal.h
@@ -82,7 +82,7 @@
   sigset_t sa_mask;
 };
 typedef struct sigaltstack {
-  void __user * ss_sp;
+  void  * ss_sp;
   int ss_flags;
   __kernel_size_t ss_size;
 } stack_t;
diff --git a/libc/kernel/uapi/asm-generic/termbits-common.h b/libc/kernel/uapi/asm-generic/termbits-common.h
index c67f21d..281eee8 100644
--- a/libc/kernel/uapi/asm-generic/termbits-common.h
+++ b/libc/kernel/uapi/asm-generic/termbits-common.h
@@ -54,6 +54,7 @@
 #define B38400 0x0000000f
 #define EXTA B19200
 #define EXTB B38400
+#define ADDRB 0x20000000
 #define CMSPAR 0x40000000
 #define CRTSCTS 0x80000000
 #define IBSHIFT 16
diff --git a/libc/kernel/uapi/asm-generic/types.h b/libc/kernel/uapi/asm-generic/types.h
index ea6e7df..bac728e 100644
--- a/libc/kernel/uapi/asm-generic/types.h
+++ b/libc/kernel/uapi/asm-generic/types.h
@@ -16,7 +16,7 @@
  ***
  ****************************************************************************
  ****************************************************************************/
-#ifndef _ASM_GENERIC_TYPES_H
-#define _ASM_GENERIC_TYPES_H
+#ifndef _UAPI_ASM_GENERIC_TYPES_H
+#define _UAPI_ASM_GENERIC_TYPES_H
 #include <asm-generic/int-ll64.h>
 #endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/auxvec.h b/libc/kernel/uapi/asm-riscv/asm/auxvec.h
new file mode 100644
index 0000000..c70be17
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/auxvec.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_AUXVEC_H
+#define _UAPI_ASM_RISCV_AUXVEC_H
+#define AT_SYSINFO_EHDR 33
+#define AT_L1I_CACHESIZE 40
+#define AT_L1I_CACHEGEOMETRY 41
+#define AT_L1D_CACHESIZE 42
+#define AT_L1D_CACHEGEOMETRY 43
+#define AT_L2_CACHESIZE 44
+#define AT_L2_CACHEGEOMETRY 45
+#define AT_L3_CACHESIZE 46
+#define AT_L3_CACHEGEOMETRY 47
+#define AT_VECTOR_SIZE_ARCH 9
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/bitsperlong.h b/libc/kernel/uapi/asm-riscv/asm/bitsperlong.h
new file mode 100644
index 0000000..098b610
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/bitsperlong.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_BITSPERLONG_H
+#define _UAPI_ASM_RISCV_BITSPERLONG_H
+#define __BITS_PER_LONG (__SIZEOF_POINTER__ * 8)
+#include <asm-generic/bitsperlong.h>
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/bpf_perf_event.h b/libc/kernel/uapi/asm-riscv/asm/bpf_perf_event.h
new file mode 100644
index 0000000..47c09fd
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/bpf_perf_event.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__
+#define _UAPI__ASM_BPF_PERF_EVENT_H__
+#include <asm/ptrace.h>
+typedef struct user_regs_struct bpf_user_pt_regs_t;
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/byteorder.h b/libc/kernel/uapi/asm-riscv/asm/byteorder.h
new file mode 100644
index 0000000..42afc14
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/byteorder.h
@@ -0,0 +1,22 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_BYTEORDER_H
+#define _UAPI_ASM_RISCV_BYTEORDER_H
+#include <linux/byteorder/little_endian.h>
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/elf.h b/libc/kernel/uapi/asm-riscv/asm/elf.h
new file mode 100644
index 0000000..07593d9
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/elf.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_ELF_H
+#define _UAPI_ASM_RISCV_ELF_H
+#include <asm/ptrace.h>
+typedef unsigned long elf_greg_t;
+typedef struct user_regs_struct elf_gregset_t;
+#define ELF_NGREG (sizeof(elf_gregset_t) / sizeof(elf_greg_t))
+typedef __u64 elf_fpreg_t;
+typedef union __riscv_fp_state elf_fpregset_t;
+#define ELF_NFPREG (sizeof(struct __riscv_d_ext_state) / sizeof(elf_fpreg_t))
+#if __riscv_xlen == 64
+#define ELF_RISCV_R_SYM(r_info) ELF64_R_SYM(r_info)
+#define ELF_RISCV_R_TYPE(r_info) ELF64_R_TYPE(r_info)
+#else
+#define ELF_RISCV_R_SYM(r_info) ELF32_R_SYM(r_info)
+#define ELF_RISCV_R_TYPE(r_info) ELF32_R_TYPE(r_info)
+#endif
+#define R_RISCV_NONE 0
+#define R_RISCV_32 1
+#define R_RISCV_64 2
+#define R_RISCV_RELATIVE 3
+#define R_RISCV_COPY 4
+#define R_RISCV_JUMP_SLOT 5
+#define R_RISCV_TLS_DTPMOD32 6
+#define R_RISCV_TLS_DTPMOD64 7
+#define R_RISCV_TLS_DTPREL32 8
+#define R_RISCV_TLS_DTPREL64 9
+#define R_RISCV_TLS_TPREL32 10
+#define R_RISCV_TLS_TPREL64 11
+#define R_RISCV_BRANCH 16
+#define R_RISCV_JAL 17
+#define R_RISCV_CALL 18
+#define R_RISCV_CALL_PLT 19
+#define R_RISCV_GOT_HI20 20
+#define R_RISCV_TLS_GOT_HI20 21
+#define R_RISCV_TLS_GD_HI20 22
+#define R_RISCV_PCREL_HI20 23
+#define R_RISCV_PCREL_LO12_I 24
+#define R_RISCV_PCREL_LO12_S 25
+#define R_RISCV_HI20 26
+#define R_RISCV_LO12_I 27
+#define R_RISCV_LO12_S 28
+#define R_RISCV_TPREL_HI20 29
+#define R_RISCV_TPREL_LO12_I 30
+#define R_RISCV_TPREL_LO12_S 31
+#define R_RISCV_TPREL_ADD 32
+#define R_RISCV_ADD8 33
+#define R_RISCV_ADD16 34
+#define R_RISCV_ADD32 35
+#define R_RISCV_ADD64 36
+#define R_RISCV_SUB8 37
+#define R_RISCV_SUB16 38
+#define R_RISCV_SUB32 39
+#define R_RISCV_SUB64 40
+#define R_RISCV_GNU_VTINHERIT 41
+#define R_RISCV_GNU_VTENTRY 42
+#define R_RISCV_ALIGN 43
+#define R_RISCV_RVC_BRANCH 44
+#define R_RISCV_RVC_JUMP 45
+#define R_RISCV_LUI 46
+#define R_RISCV_GPREL_I 47
+#define R_RISCV_GPREL_S 48
+#define R_RISCV_TPREL_I 49
+#define R_RISCV_TPREL_S 50
+#define R_RISCV_RELAX 51
+#define R_RISCV_SUB6 52
+#define R_RISCV_SET6 53
+#define R_RISCV_SET8 54
+#define R_RISCV_SET16 55
+#define R_RISCV_SET32 56
+#define R_RISCV_32_PCREL 57
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/errno.h b/libc/kernel/uapi/asm-riscv/asm/errno.h
new file mode 100644
index 0000000..392cd94
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/errno.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/errno.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/fcntl.h b/libc/kernel/uapi/asm-riscv/asm/fcntl.h
new file mode 100644
index 0000000..518d3a7
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/fcntl.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/fcntl.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/hwcap.h b/libc/kernel/uapi/asm-riscv/asm/hwcap.h
new file mode 100644
index 0000000..d130cf7
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/hwcap.h
@@ -0,0 +1,27 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_HWCAP_H
+#define _UAPI_ASM_RISCV_HWCAP_H
+#define COMPAT_HWCAP_ISA_I (1 << ('I' - 'A'))
+#define COMPAT_HWCAP_ISA_M (1 << ('M' - 'A'))
+#define COMPAT_HWCAP_ISA_A (1 << ('A' - 'A'))
+#define COMPAT_HWCAP_ISA_F (1 << ('F' - 'A'))
+#define COMPAT_HWCAP_ISA_D (1 << ('D' - 'A'))
+#define COMPAT_HWCAP_ISA_C (1 << ('C' - 'A'))
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/ioctl.h b/libc/kernel/uapi/asm-riscv/asm/ioctl.h
new file mode 100644
index 0000000..7b7bd37
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/ioctl.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/ioctl.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/ioctls.h b/libc/kernel/uapi/asm-riscv/asm/ioctls.h
new file mode 100644
index 0000000..0c66935
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/ioctls.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/ioctls.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/ipcbuf.h b/libc/kernel/uapi/asm-riscv/asm/ipcbuf.h
new file mode 100644
index 0000000..0021f14
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/ipcbuf.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/ipcbuf.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/kvm.h b/libc/kernel/uapi/asm-riscv/asm/kvm.h
new file mode 100644
index 0000000..b49e3a0
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/kvm.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __LINUX_KVM_RISCV_H
+#define __LINUX_KVM_RISCV_H
+#ifndef __ASSEMBLY__
+#include <linux/types.h>
+#include <asm/ptrace.h>
+#define __KVM_HAVE_READONLY_MEM
+#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
+#define KVM_INTERRUPT_SET - 1U
+#define KVM_INTERRUPT_UNSET - 2U
+struct kvm_regs {
+};
+struct kvm_fpu {
+};
+struct kvm_debug_exit_arch {
+};
+struct kvm_guest_debug_arch {
+};
+struct kvm_sync_regs {
+};
+struct kvm_sregs {
+};
+struct kvm_riscv_config {
+  unsigned long isa;
+  unsigned long zicbom_block_size;
+  unsigned long mvendorid;
+  unsigned long marchid;
+  unsigned long mimpid;
+};
+struct kvm_riscv_core {
+  struct user_regs_struct regs;
+  unsigned long mode;
+};
+#define KVM_RISCV_MODE_S 1
+#define KVM_RISCV_MODE_U 0
+struct kvm_riscv_csr {
+  unsigned long sstatus;
+  unsigned long sie;
+  unsigned long stvec;
+  unsigned long sscratch;
+  unsigned long sepc;
+  unsigned long scause;
+  unsigned long stval;
+  unsigned long sip;
+  unsigned long satp;
+  unsigned long scounteren;
+};
+struct kvm_riscv_timer {
+  __u64 frequency;
+  __u64 time;
+  __u64 compare;
+  __u64 state;
+};
+enum KVM_RISCV_ISA_EXT_ID {
+  KVM_RISCV_ISA_EXT_A = 0,
+  KVM_RISCV_ISA_EXT_C,
+  KVM_RISCV_ISA_EXT_D,
+  KVM_RISCV_ISA_EXT_F,
+  KVM_RISCV_ISA_EXT_H,
+  KVM_RISCV_ISA_EXT_I,
+  KVM_RISCV_ISA_EXT_M,
+  KVM_RISCV_ISA_EXT_SVPBMT,
+  KVM_RISCV_ISA_EXT_SSTC,
+  KVM_RISCV_ISA_EXT_SVINVAL,
+  KVM_RISCV_ISA_EXT_ZIHINTPAUSE,
+  KVM_RISCV_ISA_EXT_ZICBOM,
+  KVM_RISCV_ISA_EXT_MAX,
+};
+#define KVM_RISCV_TIMER_STATE_OFF 0
+#define KVM_RISCV_TIMER_STATE_ON 1
+#define KVM_REG_SIZE(id) (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
+#define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
+#define KVM_REG_RISCV_TYPE_SHIFT 24
+#define KVM_REG_RISCV_CONFIG (0x01 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_CONFIG_REG(name) (offsetof(struct kvm_riscv_config, name) / sizeof(unsigned long))
+#define KVM_REG_RISCV_CORE (0x02 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_CORE_REG(name) (offsetof(struct kvm_riscv_core, name) / sizeof(unsigned long))
+#define KVM_REG_RISCV_CSR (0x03 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_CSR_REG(name) (offsetof(struct kvm_riscv_csr, name) / sizeof(unsigned long))
+#define KVM_REG_RISCV_TIMER (0x04 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_TIMER_REG(name) (offsetof(struct kvm_riscv_timer, name) / sizeof(__u64))
+#define KVM_REG_RISCV_FP_F (0x05 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_FP_F_REG(name) (offsetof(struct __riscv_f_ext_state, name) / sizeof(__u32))
+#define KVM_REG_RISCV_FP_D (0x06 << KVM_REG_RISCV_TYPE_SHIFT)
+#define KVM_REG_RISCV_FP_D_REG(name) (offsetof(struct __riscv_d_ext_state, name) / sizeof(__u64))
+#define KVM_REG_RISCV_ISA_EXT (0x07 << KVM_REG_RISCV_TYPE_SHIFT)
+#endif
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/mman.h b/libc/kernel/uapi/asm-riscv/asm/mman.h
new file mode 100644
index 0000000..6c23fb6
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/mman.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/mman.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/msgbuf.h b/libc/kernel/uapi/asm-riscv/asm/msgbuf.h
new file mode 100644
index 0000000..7809e3c
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/msgbuf.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/msgbuf.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/param.h b/libc/kernel/uapi/asm-riscv/asm/param.h
new file mode 100644
index 0000000..5ccf935
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/param.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/param.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/perf_regs.h b/libc/kernel/uapi/asm-riscv/asm/perf_regs.h
new file mode 100644
index 0000000..ceb0bbe
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/perf_regs.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _ASM_RISCV_PERF_REGS_H
+#define _ASM_RISCV_PERF_REGS_H
+enum perf_event_riscv_regs {
+  PERF_REG_RISCV_PC,
+  PERF_REG_RISCV_RA,
+  PERF_REG_RISCV_SP,
+  PERF_REG_RISCV_GP,
+  PERF_REG_RISCV_TP,
+  PERF_REG_RISCV_T0,
+  PERF_REG_RISCV_T1,
+  PERF_REG_RISCV_T2,
+  PERF_REG_RISCV_S0,
+  PERF_REG_RISCV_S1,
+  PERF_REG_RISCV_A0,
+  PERF_REG_RISCV_A1,
+  PERF_REG_RISCV_A2,
+  PERF_REG_RISCV_A3,
+  PERF_REG_RISCV_A4,
+  PERF_REG_RISCV_A5,
+  PERF_REG_RISCV_A6,
+  PERF_REG_RISCV_A7,
+  PERF_REG_RISCV_S2,
+  PERF_REG_RISCV_S3,
+  PERF_REG_RISCV_S4,
+  PERF_REG_RISCV_S5,
+  PERF_REG_RISCV_S6,
+  PERF_REG_RISCV_S7,
+  PERF_REG_RISCV_S8,
+  PERF_REG_RISCV_S9,
+  PERF_REG_RISCV_S10,
+  PERF_REG_RISCV_S11,
+  PERF_REG_RISCV_T3,
+  PERF_REG_RISCV_T4,
+  PERF_REG_RISCV_T5,
+  PERF_REG_RISCV_T6,
+  PERF_REG_RISCV_MAX,
+};
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/poll.h b/libc/kernel/uapi/asm-riscv/asm/poll.h
new file mode 100644
index 0000000..d7e8adc
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/poll.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/poll.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/posix_types.h b/libc/kernel/uapi/asm-riscv/asm/posix_types.h
new file mode 100644
index 0000000..1b89253
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/posix_types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/posix_types.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/ptrace.h b/libc/kernel/uapi/asm-riscv/asm/ptrace.h
new file mode 100644
index 0000000..94e4ac9
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/ptrace.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_PTRACE_H
+#define _UAPI_ASM_RISCV_PTRACE_H
+#ifndef __ASSEMBLY__
+#include <linux/types.h>
+struct user_regs_struct {
+  unsigned long pc;
+  unsigned long ra;
+  unsigned long sp;
+  unsigned long gp;
+  unsigned long tp;
+  unsigned long t0;
+  unsigned long t1;
+  unsigned long t2;
+  unsigned long s0;
+  unsigned long s1;
+  unsigned long a0;
+  unsigned long a1;
+  unsigned long a2;
+  unsigned long a3;
+  unsigned long a4;
+  unsigned long a5;
+  unsigned long a6;
+  unsigned long a7;
+  unsigned long s2;
+  unsigned long s3;
+  unsigned long s4;
+  unsigned long s5;
+  unsigned long s6;
+  unsigned long s7;
+  unsigned long s8;
+  unsigned long s9;
+  unsigned long s10;
+  unsigned long s11;
+  unsigned long t3;
+  unsigned long t4;
+  unsigned long t5;
+  unsigned long t6;
+};
+struct __riscv_f_ext_state {
+  __u32 f[32];
+  __u32 fcsr;
+};
+struct __riscv_d_ext_state {
+  __u64 f[32];
+  __u32 fcsr;
+};
+struct __riscv_q_ext_state {
+  __u64 f[64] __attribute__((aligned(16)));
+  __u32 fcsr;
+  __u32 reserved[3];
+};
+union __riscv_fp_state {
+  struct __riscv_f_ext_state f;
+  struct __riscv_d_ext_state d;
+  struct __riscv_q_ext_state q;
+};
+#endif
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/resource.h b/libc/kernel/uapi/asm-riscv/asm/resource.h
new file mode 100644
index 0000000..371adb5
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/resource.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/resource.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/sembuf.h b/libc/kernel/uapi/asm-riscv/asm/sembuf.h
new file mode 100644
index 0000000..6ce6549
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/sembuf.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/sembuf.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/setup.h b/libc/kernel/uapi/asm-riscv/asm/setup.h
new file mode 100644
index 0000000..940c4db
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/setup.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/setup.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/shmbuf.h b/libc/kernel/uapi/asm-riscv/asm/shmbuf.h
new file mode 100644
index 0000000..fe8b1be
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/shmbuf.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/shmbuf.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/sigcontext.h b/libc/kernel/uapi/asm-riscv/asm/sigcontext.h
new file mode 100644
index 0000000..0553b94
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/sigcontext.h
@@ -0,0 +1,26 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_SIGCONTEXT_H
+#define _UAPI_ASM_RISCV_SIGCONTEXT_H
+#include <asm/ptrace.h>
+struct sigcontext {
+  struct user_regs_struct sc_regs;
+  union __riscv_fp_state sc_fpregs;
+};
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/siginfo.h b/libc/kernel/uapi/asm-riscv/asm/siginfo.h
new file mode 100644
index 0000000..a31ebb2
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/siginfo.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/siginfo.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/signal.h b/libc/kernel/uapi/asm-riscv/asm/signal.h
new file mode 100644
index 0000000..64373fe
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/signal.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/signal.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/socket.h b/libc/kernel/uapi/asm-riscv/asm/socket.h
new file mode 100644
index 0000000..50a9874
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/socket.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/socket.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/sockios.h b/libc/kernel/uapi/asm-riscv/asm/sockios.h
new file mode 100644
index 0000000..710db92
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/sockios.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/sockios.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/stat.h b/libc/kernel/uapi/asm-riscv/asm/stat.h
new file mode 100644
index 0000000..af7ebfc
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/stat.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/stat.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/statfs.h b/libc/kernel/uapi/asm-riscv/asm/statfs.h
new file mode 100644
index 0000000..93de275
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/statfs.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/statfs.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/swab.h b/libc/kernel/uapi/asm-riscv/asm/swab.h
new file mode 100644
index 0000000..0049f53
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/swab.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/swab.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/termbits.h b/libc/kernel/uapi/asm-riscv/asm/termbits.h
new file mode 100644
index 0000000..42af6fe
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/termbits.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/termbits.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/termios.h b/libc/kernel/uapi/asm-riscv/asm/termios.h
new file mode 100644
index 0000000..feca4c6
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/termios.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/termios.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/types.h b/libc/kernel/uapi/asm-riscv/asm/types.h
new file mode 100644
index 0000000..8250f43
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/types.h>
diff --git a/libc/kernel/uapi/asm-riscv/asm/ucontext.h b/libc/kernel/uapi/asm-riscv/asm/ucontext.h
new file mode 100644
index 0000000..8b72cc1
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/ucontext.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_RISCV_UCONTEXT_H
+#define _UAPI_ASM_RISCV_UCONTEXT_H
+#include <linux/types.h>
+struct ucontext {
+  unsigned long uc_flags;
+  struct ucontext * uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  __u8 __linux_unused[1024 / 8 - sizeof(sigset_t)];
+  struct sigcontext uc_mcontext;
+};
+#endif
diff --git a/libc/kernel/uapi/asm-riscv/asm/unistd.h b/libc/kernel/uapi/asm-riscv/asm/unistd.h
new file mode 100644
index 0000000..665b820
--- /dev/null
+++ b/libc/kernel/uapi/asm-riscv/asm/unistd.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#if defined(__LP64__) && !defined(__SYSCALL_COMPAT)
+#define __ARCH_WANT_NEW_STAT
+#define __ARCH_WANT_SET_GET_RLIMIT
+#endif
+#define __ARCH_WANT_SYS_CLONE3
+#define __ARCH_WANT_MEMFD_SECRET
+#include <asm-generic/unistd.h>
+#ifndef __NR_riscv_flush_icache
+#define __NR_riscv_flush_icache (__NR_arch_specific_syscall + 15)
+#endif
+__SYSCALL(__NR_riscv_flush_icache, sys_riscv_flush_icache)
diff --git a/libc/kernel/uapi/asm-x86/asm/bootparam.h b/libc/kernel/uapi/asm-x86/asm/bootparam.h
index ba1143b..ab9d7f3 100644
--- a/libc/kernel/uapi/asm-x86/asm/bootparam.h
+++ b/libc/kernel/uapi/asm-x86/asm/bootparam.h
@@ -26,8 +26,11 @@
 #define SETUP_APPLE_PROPERTIES 5
 #define SETUP_JAILHOUSE 6
 #define SETUP_CC_BLOB 7
+#define SETUP_IMA 8
+#define SETUP_RNG_SEED 9
+#define SETUP_ENUM_MAX SETUP_RNG_SEED
 #define SETUP_INDIRECT (1 << 31)
-#define SETUP_TYPE_MAX (SETUP_INDIRECT | SETUP_CC_BLOB)
+#define SETUP_TYPE_MAX (SETUP_ENUM_MAX | SETUP_INDIRECT)
 #define RAMDISK_IMAGE_START_MASK 0x07FF
 #define RAMDISK_PROMPT_FLAG 0x8000
 #define RAMDISK_LOAD_FLAG 0x4000
@@ -54,7 +57,7 @@
   __u64 next;
   __u32 type;
   __u32 len;
-  __u8 data[0];
+  __u8 data[];
 };
 struct setup_indirect {
   __u32 type;
@@ -148,6 +151,10 @@
     __u32 flags;
   } __attribute__((packed)) v2;
 } __attribute__((packed));
+struct ima_setup_data {
+  __u64 addr;
+  __u64 size;
+} __attribute__((packed));
 struct boot_params {
   struct screen_info screen_info;
   struct apm_bios_info apm_bios_info;
diff --git a/libc/kernel/uapi/asm-x86/asm/kvm.h b/libc/kernel/uapi/asm-x86/asm/kvm.h
index 9a929ae..77d35fc 100644
--- a/libc/kernel/uapi/asm-x86/asm/kvm.h
+++ b/libc/kernel/uapi/asm-x86/asm/kvm.h
@@ -57,13 +57,6 @@
 #define __KVM_HAVE_XCRS
 #define __KVM_HAVE_READONLY_MEM
 #define KVM_NR_INTERRUPTS 256
-struct kvm_memory_alias {
-  __u32 slot;
-  __u32 flags;
-  __u64 guest_phys_addr;
-  __u64 memory_size;
-  __u64 target_phys_addr;
-};
 struct kvm_pic_state {
   __u8 last_irr;
   __u8 irr;
@@ -178,16 +171,17 @@
 struct kvm_msrs {
   __u32 nmsrs;
   __u32 pad;
-  struct kvm_msr_entry entries[0];
+  struct kvm_msr_entry entries[];
 };
 struct kvm_msr_list {
   __u32 nmsrs;
-  __u32 indices[0];
+  __u32 indices[];
 };
 #define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600
 struct kvm_msr_filter_range {
 #define KVM_MSR_FILTER_READ (1 << 0)
 #define KVM_MSR_FILTER_WRITE (1 << 1)
+#define KVM_MSR_FILTER_RANGE_VALID_MASK (KVM_MSR_FILTER_READ | KVM_MSR_FILTER_WRITE)
   __u32 flags;
   __u32 nmsrs;
   __u32 base;
@@ -197,6 +191,7 @@
 struct kvm_msr_filter {
 #define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0)
 #define KVM_MSR_FILTER_DEFAULT_DENY (1 << 0)
+#define KVM_MSR_FILTER_VALID_MASK (KVM_MSR_FILTER_DEFAULT_DENY)
   __u32 flags;
   struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES];
 };
@@ -211,7 +206,7 @@
 struct kvm_cpuid {
   __u32 nent;
   __u32 padding;
-  struct kvm_cpuid_entry entries[0];
+  struct kvm_cpuid_entry entries[];
 };
 struct kvm_cpuid_entry2 {
   __u32 function;
@@ -229,7 +224,7 @@
 struct kvm_cpuid2 {
   __u32 nent;
   __u32 padding;
-  struct kvm_cpuid_entry2 entries[0];
+  struct kvm_cpuid_entry2 entries[];
 };
 struct kvm_pit_channel_state {
   __u32 count;
@@ -265,6 +260,7 @@
   struct kvm_pit_channel_state channels[3];
 };
 #define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001
+#define KVM_PIT_FLAGS_SPEAKER_DATA_ON 0x00000002
 struct kvm_pit_state2 {
   struct kvm_pit_channel_state channels[3];
   __u32 flags;
@@ -279,6 +275,7 @@
 #define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
 #define KVM_VCPUEVENT_VALID_SMM 0x00000008
 #define KVM_VCPUEVENT_VALID_PAYLOAD 0x00000010
+#define KVM_VCPUEVENT_VALID_TRIPLE_FAULT 0x00000020
 #define KVM_X86_SHADOW_INT_MOV_SS 0x01
 #define KVM_X86_SHADOW_INT_STI 0x02
 struct kvm_vcpu_events {
@@ -309,7 +306,10 @@
     __u8 smm_inside_nmi;
     __u8 latched_init;
   } smi;
-  __u8 reserved[27];
+  struct {
+    __u8 pending;
+  } triple_fault;
+  __u8 reserved[26];
   __u8 exception_has_payload;
   __u64 exception_payload;
 };
@@ -322,7 +322,7 @@
 };
 struct kvm_xsave {
   __u32 region[1024];
-  __u32 extra[0];
+  __u32 extra[];
 };
 #define KVM_MAX_XCRS 16
 struct kvm_xcr {
@@ -351,6 +351,7 @@
 #define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)
 #define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4)
 #define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5)
+#define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS (1 << 6)
 #define KVM_STATE_NESTED_FORMAT_VMX 0
 #define KVM_STATE_NESTED_FORMAT_SVM 1
 #define KVM_STATE_NESTED_GUEST_MODE 0x00000001
@@ -404,7 +405,7 @@
   __u32 fixed_counter_bitmap;
   __u32 flags;
   __u32 pad[4];
-  __u64 events[0];
+  __u64 events[];
 };
 #define KVM_PMU_EVENT_ALLOW 0
 #define KVM_PMU_EVENT_DENY 1
diff --git a/libc/kernel/uapi/asm-x86/asm/sgx.h b/libc/kernel/uapi/asm-x86/asm/sgx.h
index 1874b78..fdc2700 100644
--- a/libc/kernel/uapi/asm-x86/asm/sgx.h
+++ b/libc/kernel/uapi/asm-x86/asm/sgx.h
@@ -29,6 +29,9 @@
 #define SGX_IOC_ENCLAVE_INIT _IOW(SGX_MAGIC, 0x02, struct sgx_enclave_init)
 #define SGX_IOC_ENCLAVE_PROVISION _IOW(SGX_MAGIC, 0x03, struct sgx_enclave_provision)
 #define SGX_IOC_VEPC_REMOVE_ALL _IO(SGX_MAGIC, 0x04)
+#define SGX_IOC_ENCLAVE_RESTRICT_PERMISSIONS _IOWR(SGX_MAGIC, 0x05, struct sgx_enclave_restrict_permissions)
+#define SGX_IOC_ENCLAVE_MODIFY_TYPES _IOWR(SGX_MAGIC, 0x06, struct sgx_enclave_modify_types)
+#define SGX_IOC_ENCLAVE_REMOVE_PAGES _IOWR(SGX_MAGIC, 0x07, struct sgx_enclave_remove_pages)
 struct sgx_enclave_create {
   __u64 src;
 };
@@ -46,6 +49,25 @@
 struct sgx_enclave_provision {
   __u64 fd;
 };
+struct sgx_enclave_restrict_permissions {
+  __u64 offset;
+  __u64 length;
+  __u64 permissions;
+  __u64 result;
+  __u64 count;
+};
+struct sgx_enclave_modify_types {
+  __u64 offset;
+  __u64 length;
+  __u64 page_type;
+  __u64 result;
+  __u64 count;
+};
+struct sgx_enclave_remove_pages {
+  __u64 offset;
+  __u64 length;
+  __u64 count;
+};
 struct sgx_enclave_run;
 typedef int(* sgx_enclave_user_handler_t) (long rdi, long rsi, long rdx, long rsp, long r8, long r9, struct sgx_enclave_run * run);
 struct sgx_enclave_run {
diff --git a/libc/kernel/uapi/asm-x86/asm/sigcontext.h b/libc/kernel/uapi/asm-x86/asm/sigcontext.h
index 7d5b4d4..c790950 100644
--- a/libc/kernel/uapi/asm-x86/asm/sigcontext.h
+++ b/libc/kernel/uapi/asm-x86/asm/sigcontext.h
@@ -180,7 +180,7 @@
   __u32 eflags;
   __u32 esp_at_signal;
   __u16 ss, __ssh;
-  struct _fpstate __user * fpstate;
+  struct _fpstate  * fpstate;
   __u32 oldmask;
   __u32 cr2;
 };
@@ -215,7 +215,7 @@
   __u64 trapno;
   __u64 oldmask;
   __u64 cr2;
-  struct _fpstate __user * fpstate;
+  struct _fpstate  * fpstate;
 #ifdef __ILP32__
   __u32 __fpstate_pad;
 #endif
diff --git a/libc/kernel/uapi/asm-x86/asm/signal.h b/libc/kernel/uapi/asm-x86/asm/signal.h
index cbeeac4..37dce50 100644
--- a/libc/kernel/uapi/asm-x86/asm/signal.h
+++ b/libc/kernel/uapi/asm-x86/asm/signal.h
@@ -88,7 +88,7 @@
 };
 #endif
 typedef struct sigaltstack {
-  void __user * ss_sp;
+  void  * ss_sp;
   int ss_flags;
   __kernel_size_t ss_size;
 } stack_t;
diff --git a/libc/kernel/uapi/asm-x86/asm/svm.h b/libc/kernel/uapi/asm-x86/asm/svm.h
index 8bda2d5..0d95101 100644
--- a/libc/kernel/uapi/asm-x86/asm/svm.h
+++ b/libc/kernel/uapi/asm-x86/asm/svm.h
@@ -130,6 +130,8 @@
 #define SVM_VMGEXIT_AP_CREATE 1
 #define SVM_VMGEXIT_AP_DESTROY 2
 #define SVM_VMGEXIT_HV_FEATURES 0x8000fffd
+#define SVM_VMGEXIT_TERM_REQUEST 0x8000fffe
+#define SVM_VMGEXIT_TERM_REASON(reason_set,reason_code) (((((u64) reason_set) & 0xf)) | ((((u64) reason_code) & 0xff) << 4))
 #define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff
 #define SVM_EXIT_SW 0xf0000000
 #define SVM_EXIT_ERR - 1
diff --git a/libc/kernel/uapi/asm-x86/asm/vmx.h b/libc/kernel/uapi/asm-x86/asm/vmx.h
index 6c07d4c..fdea539 100644
--- a/libc/kernel/uapi/asm-x86/asm/vmx.h
+++ b/libc/kernel/uapi/asm-x86/asm/vmx.h
@@ -81,7 +81,8 @@
 #define EXIT_REASON_UMWAIT 67
 #define EXIT_REASON_TPAUSE 68
 #define EXIT_REASON_BUS_LOCK 74
-#define VMX_EXIT_REASONS { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, { EXIT_REASON_EXTERNAL_INTERRUPT, "EXTERNAL_INTERRUPT" }, { EXIT_REASON_TRIPLE_FAULT, "TRIPLE_FAULT" }, { EXIT_REASON_INIT_SIGNAL, "INIT_SIGNAL" }, { EXIT_REASON_SIPI_SIGNAL, "SIPI_SIGNAL" }, { EXIT_REASON_INTERRUPT_WINDOW, "INTERRUPT_WINDOW" }, { EXIT_REASON_NMI_WINDOW, "NMI_WINDOW" }, { EXIT_REASON_TASK_SWITCH, "TASK_SWITCH" }, { EXIT_REASON_CPUID, "CPUID" }, { EXIT_REASON_HLT, "HLT" }, { EXIT_REASON_INVD, "INVD" }, { EXIT_REASON_INVLPG, "INVLPG" }, { EXIT_REASON_RDPMC, "RDPMC" }, { EXIT_REASON_RDTSC, "RDTSC" }, { EXIT_REASON_VMCALL, "VMCALL" }, { EXIT_REASON_VMCLEAR, "VMCLEAR" }, { EXIT_REASON_VMLAUNCH, "VMLAUNCH" }, { EXIT_REASON_VMPTRLD, "VMPTRLD" }, { EXIT_REASON_VMPTRST, "VMPTRST" }, { EXIT_REASON_VMREAD, "VMREAD" }, { EXIT_REASON_VMRESUME, "VMRESUME" }, { EXIT_REASON_VMWRITE, "VMWRITE" }, { EXIT_REASON_VMOFF, "VMOFF" }, { EXIT_REASON_VMON, "VMON" }, { EXIT_REASON_CR_ACCESS, "CR_ACCESS" }, { EXIT_REASON_DR_ACCESS, "DR_ACCESS" }, { EXIT_REASON_IO_INSTRUCTION, "IO_INSTRUCTION" }, { EXIT_REASON_MSR_READ, "MSR_READ" }, { EXIT_REASON_MSR_WRITE, "MSR_WRITE" }, { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, { EXIT_REASON_MSR_LOAD_FAIL, "MSR_LOAD_FAIL" }, { EXIT_REASON_MWAIT_INSTRUCTION, "MWAIT_INSTRUCTION" }, { EXIT_REASON_MONITOR_TRAP_FLAG, "MONITOR_TRAP_FLAG" }, { EXIT_REASON_MONITOR_INSTRUCTION, "MONITOR_INSTRUCTION" }, { EXIT_REASON_PAUSE_INSTRUCTION, "PAUSE_INSTRUCTION" }, { EXIT_REASON_MCE_DURING_VMENTRY, "MCE_DURING_VMENTRY" }, { EXIT_REASON_TPR_BELOW_THRESHOLD, "TPR_BELOW_THRESHOLD" }, { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, { EXIT_REASON_GDTR_IDTR, "GDTR_IDTR" }, { EXIT_REASON_LDTR_TR, "LDTR_TR" }, { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, { EXIT_REASON_INVEPT, "INVEPT" }, { EXIT_REASON_RDTSCP, "RDTSCP" }, { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, { EXIT_REASON_INVVPID, "INVVPID" }, { EXIT_REASON_WBINVD, "WBINVD" }, { EXIT_REASON_XSETBV, "XSETBV" }, { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, { EXIT_REASON_RDRAND, "RDRAND" }, { EXIT_REASON_INVPCID, "INVPCID" }, { EXIT_REASON_VMFUNC, "VMFUNC" }, { EXIT_REASON_ENCLS, "ENCLS" }, { EXIT_REASON_RDSEED, "RDSEED" }, { EXIT_REASON_PML_FULL, "PML_FULL" }, { EXIT_REASON_XSAVES, "XSAVES" }, { EXIT_REASON_XRSTORS, "XRSTORS" }, { EXIT_REASON_UMWAIT, "UMWAIT" }, { EXIT_REASON_TPAUSE, "TPAUSE" }, { EXIT_REASON_BUS_LOCK, "BUS_LOCK" }
+#define EXIT_REASON_NOTIFY 75
+#define VMX_EXIT_REASONS { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, { EXIT_REASON_EXTERNAL_INTERRUPT, "EXTERNAL_INTERRUPT" }, { EXIT_REASON_TRIPLE_FAULT, "TRIPLE_FAULT" }, { EXIT_REASON_INIT_SIGNAL, "INIT_SIGNAL" }, { EXIT_REASON_SIPI_SIGNAL, "SIPI_SIGNAL" }, { EXIT_REASON_INTERRUPT_WINDOW, "INTERRUPT_WINDOW" }, { EXIT_REASON_NMI_WINDOW, "NMI_WINDOW" }, { EXIT_REASON_TASK_SWITCH, "TASK_SWITCH" }, { EXIT_REASON_CPUID, "CPUID" }, { EXIT_REASON_HLT, "HLT" }, { EXIT_REASON_INVD, "INVD" }, { EXIT_REASON_INVLPG, "INVLPG" }, { EXIT_REASON_RDPMC, "RDPMC" }, { EXIT_REASON_RDTSC, "RDTSC" }, { EXIT_REASON_VMCALL, "VMCALL" }, { EXIT_REASON_VMCLEAR, "VMCLEAR" }, { EXIT_REASON_VMLAUNCH, "VMLAUNCH" }, { EXIT_REASON_VMPTRLD, "VMPTRLD" }, { EXIT_REASON_VMPTRST, "VMPTRST" }, { EXIT_REASON_VMREAD, "VMREAD" }, { EXIT_REASON_VMRESUME, "VMRESUME" }, { EXIT_REASON_VMWRITE, "VMWRITE" }, { EXIT_REASON_VMOFF, "VMOFF" }, { EXIT_REASON_VMON, "VMON" }, { EXIT_REASON_CR_ACCESS, "CR_ACCESS" }, { EXIT_REASON_DR_ACCESS, "DR_ACCESS" }, { EXIT_REASON_IO_INSTRUCTION, "IO_INSTRUCTION" }, { EXIT_REASON_MSR_READ, "MSR_READ" }, { EXIT_REASON_MSR_WRITE, "MSR_WRITE" }, { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, { EXIT_REASON_MSR_LOAD_FAIL, "MSR_LOAD_FAIL" }, { EXIT_REASON_MWAIT_INSTRUCTION, "MWAIT_INSTRUCTION" }, { EXIT_REASON_MONITOR_TRAP_FLAG, "MONITOR_TRAP_FLAG" }, { EXIT_REASON_MONITOR_INSTRUCTION, "MONITOR_INSTRUCTION" }, { EXIT_REASON_PAUSE_INSTRUCTION, "PAUSE_INSTRUCTION" }, { EXIT_REASON_MCE_DURING_VMENTRY, "MCE_DURING_VMENTRY" }, { EXIT_REASON_TPR_BELOW_THRESHOLD, "TPR_BELOW_THRESHOLD" }, { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, { EXIT_REASON_GDTR_IDTR, "GDTR_IDTR" }, { EXIT_REASON_LDTR_TR, "LDTR_TR" }, { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, { EXIT_REASON_INVEPT, "INVEPT" }, { EXIT_REASON_RDTSCP, "RDTSCP" }, { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, { EXIT_REASON_INVVPID, "INVVPID" }, { EXIT_REASON_WBINVD, "WBINVD" }, { EXIT_REASON_XSETBV, "XSETBV" }, { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, { EXIT_REASON_RDRAND, "RDRAND" }, { EXIT_REASON_INVPCID, "INVPCID" }, { EXIT_REASON_VMFUNC, "VMFUNC" }, { EXIT_REASON_ENCLS, "ENCLS" }, { EXIT_REASON_RDSEED, "RDSEED" }, { EXIT_REASON_PML_FULL, "PML_FULL" }, { EXIT_REASON_XSAVES, "XSAVES" }, { EXIT_REASON_XRSTORS, "XRSTORS" }, { EXIT_REASON_UMWAIT, "UMWAIT" }, { EXIT_REASON_TPAUSE, "TPAUSE" }, { EXIT_REASON_BUS_LOCK, "BUS_LOCK" }, { EXIT_REASON_NOTIFY, "NOTIFY" }
 #define VMX_EXIT_REASON_FLAGS { VMX_EXIT_REASONS_FAILED_VMENTRY, "FAILED_VMENTRY" }
 #define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1
 #define VMX_ABORT_LOAD_HOST_PDPTE_FAIL 2
diff --git a/libc/kernel/uapi/drm/amdgpu_drm.h b/libc/kernel/uapi/drm/amdgpu_drm.h
index 2d3afda..fcd5ab8 100644
--- a/libc/kernel/uapi/drm/amdgpu_drm.h
+++ b/libc/kernel/uapi/drm/amdgpu_drm.h
@@ -73,6 +73,8 @@
 #define AMDGPU_GEM_CREATE_ENCRYPTED (1 << 10)
 #define AMDGPU_GEM_CREATE_PREEMPTIBLE (1 << 11)
 #define AMDGPU_GEM_CREATE_DISCARDABLE (1 << 12)
+#define AMDGPU_GEM_CREATE_COHERENT (1 << 13)
+#define AMDGPU_GEM_CREATE_UNCACHED (1 << 14)
 struct drm_amdgpu_gem_create_in {
   __u64 bo_size;
   __u64 alignment;
@@ -453,6 +455,11 @@
 #define AMDGPU_INFO_FW_DMCUB 0x14
 #define AMDGPU_INFO_FW_TOC 0x15
 #define AMDGPU_INFO_FW_CAP 0x16
+#define AMDGPU_INFO_FW_GFX_RLCP 0x17
+#define AMDGPU_INFO_FW_GFX_RLCV 0x18
+#define AMDGPU_INFO_FW_MES_KIQ 0x19
+#define AMDGPU_INFO_FW_MES 0x1a
+#define AMDGPU_INFO_FW_IMU 0x1b
 #define AMDGPU_INFO_NUM_BYTES_MOVED 0x0f
 #define AMDGPU_INFO_VRAM_USAGE 0x10
 #define AMDGPU_INFO_GTT_USAGE 0x11
@@ -650,7 +657,7 @@
   __u32 ib_start_alignment;
   __u32 ib_size_alignment;
   __u32 available_rings;
-  __u32 _pad;
+  __u32 ip_discovery_version;
 };
 struct drm_amdgpu_info_num_handles {
   __u32 uvd_max_handles;
diff --git a/libc/kernel/uapi/drm/drm.h b/libc/kernel/uapi/drm/drm.h
index 878e899..1954452 100644
--- a/libc/kernel/uapi/drm/drm.h
+++ b/libc/kernel/uapi/drm/drm.h
@@ -78,19 +78,19 @@
   int version_minor;
   int version_patchlevel;
   __kernel_size_t name_len;
-  char __user * name;
+  char  * name;
   __kernel_size_t date_len;
-  char __user * date;
+  char  * date;
   __kernel_size_t desc_len;
-  char __user * desc;
+  char  * desc;
 };
 struct drm_unique {
   __kernel_size_t unique_len;
-  char __user * unique;
+  char  * unique;
 };
 struct drm_list {
   int count;
-  struct drm_version __user * version;
+  struct drm_version  * version;
 };
 struct drm_block {
   int unused;
@@ -202,37 +202,37 @@
 };
 struct drm_buf_info {
   int count;
-  struct drm_buf_desc __user * list;
+  struct drm_buf_desc  * list;
 };
 struct drm_buf_free {
   int count;
-  int __user * list;
+  int  * list;
 };
 struct drm_buf_pub {
   int idx;
   int total;
   int used;
-  void __user * address;
+  void  * address;
 };
 struct drm_buf_map {
   int count;
 #ifdef __cplusplus
-  void __user * virt;
+  void  * virt;
 #else
-  void __user * __linux_virtual;
+  void  * __linux_virtual;
 #endif
-  struct drm_buf_pub __user * list;
+  struct drm_buf_pub  * list;
 };
 struct drm_dma {
   int context;
   int send_count;
-  int __user * send_indices;
-  int __user * send_sizes;
+  int  * send_indices;
+  int  * send_sizes;
   enum drm_dma_flags flags;
   int request_count;
   int request_size;
-  int __user * request_indices;
-  int __user * request_sizes;
+  int  * request_indices;
+  int  * request_sizes;
   int granted_count;
 };
 enum drm_ctx_flags {
@@ -245,7 +245,7 @@
 };
 struct drm_ctx_res {
   int count;
-  struct drm_ctx __user * contexts;
+  struct drm_ctx  * contexts;
 };
 struct drm_draw {
   drm_drawable_t handle;
diff --git a/libc/kernel/uapi/drm/drm_fourcc.h b/libc/kernel/uapi/drm/drm_fourcc.h
index f032fa3..ea9525d 100644
--- a/libc/kernel/uapi/drm/drm_fourcc.h
+++ b/libc/kernel/uapi/drm/drm_fourcc.h
@@ -25,7 +25,17 @@
 #define fourcc_code(a,b,c,d) ((__u32) (a) | ((__u32) (b) << 8) | ((__u32) (c) << 16) | ((__u32) (d) << 24))
 #define DRM_FORMAT_BIG_ENDIAN (1U << 31)
 #define DRM_FORMAT_INVALID 0
+#define DRM_FORMAT_C1 fourcc_code('C', '1', ' ', ' ')
+#define DRM_FORMAT_C2 fourcc_code('C', '2', ' ', ' ')
+#define DRM_FORMAT_C4 fourcc_code('C', '4', ' ', ' ')
 #define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ')
+#define DRM_FORMAT_D1 fourcc_code('D', '1', ' ', ' ')
+#define DRM_FORMAT_D2 fourcc_code('D', '2', ' ', ' ')
+#define DRM_FORMAT_D4 fourcc_code('D', '4', ' ', ' ')
+#define DRM_FORMAT_D8 fourcc_code('D', '8', ' ', ' ')
+#define DRM_FORMAT_R1 fourcc_code('R', '1', ' ', ' ')
+#define DRM_FORMAT_R2 fourcc_code('R', '2', ' ', ' ')
+#define DRM_FORMAT_R4 fourcc_code('R', '4', ' ', ' ')
 #define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ')
 #define DRM_FORMAT_R10 fourcc_code('R', '1', '0', ' ')
 #define DRM_FORMAT_R12 fourcc_code('R', '1', '2', ' ')
@@ -86,7 +96,9 @@
 #define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y')
 #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y')
 #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V')
+#define DRM_FORMAT_AVUY8888 fourcc_code('A', 'V', 'U', 'Y')
 #define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V')
+#define DRM_FORMAT_XVUY8888 fourcc_code('X', 'V', 'U', 'Y')
 #define DRM_FORMAT_VUY888 fourcc_code('V', 'U', '2', '4')
 #define DRM_FORMAT_VUY101010 fourcc_code('V', 'U', '3', '0')
 #define DRM_FORMAT_Y210 fourcc_code('Y', '2', '1', '0')
@@ -176,6 +188,14 @@
 #define DRM_FORMAT_MOD_VIVANTE_SUPER_TILED fourcc_mod_code(VIVANTE, 2)
 #define DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED fourcc_mod_code(VIVANTE, 3)
 #define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4)
+#define VIVANTE_MOD_TS_64_4 (1ULL << 48)
+#define VIVANTE_MOD_TS_64_2 (2ULL << 48)
+#define VIVANTE_MOD_TS_128_4 (3ULL << 48)
+#define VIVANTE_MOD_TS_256_4 (4ULL << 48)
+#define VIVANTE_MOD_TS_MASK (0xfULL << 48)
+#define VIVANTE_MOD_COMP_DEC400 (1ULL << 52)
+#define VIVANTE_MOD_COMP_MASK (0xfULL << 52)
+#define VIVANTE_MOD_EXT_MASK (VIVANTE_MOD_TS_MASK | VIVANTE_MOD_COMP_MASK)
 #define DRM_FORMAT_MOD_NVIDIA_TEGRA_TILED fourcc_mod_code(NVIDIA, 1)
 #define DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(c,s,g,k,h) fourcc_mod_code(NVIDIA, (0x10 | ((h) & 0xf) | (((k) & 0xff) << 12) | (((g) & 0x3) << 20) | (((s) & 0x1) << 22) | (((c) & 0x7) << 23)))
 #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(v) DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(0, 0, 0, 0, (v))
@@ -241,11 +261,13 @@
 #define AMD_FMT_MOD_TILE_VER_GFX9 1
 #define AMD_FMT_MOD_TILE_VER_GFX10 2
 #define AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS 3
+#define AMD_FMT_MOD_TILE_VER_GFX11 4
 #define AMD_FMT_MOD_TILE_GFX9_64K_S 9
 #define AMD_FMT_MOD_TILE_GFX9_64K_D 10
 #define AMD_FMT_MOD_TILE_GFX9_64K_S_X 25
 #define AMD_FMT_MOD_TILE_GFX9_64K_D_X 26
 #define AMD_FMT_MOD_TILE_GFX9_64K_R_X 27
+#define AMD_FMT_MOD_TILE_GFX11_256K_R_X 31
 #define AMD_FMT_MOD_DCC_BLOCK_64B 0
 #define AMD_FMT_MOD_DCC_BLOCK_128B 1
 #define AMD_FMT_MOD_DCC_BLOCK_256B 2
diff --git a/libc/kernel/uapi/drm/i915_drm.h b/libc/kernel/uapi/drm/i915_drm.h
index 1c79905..794e784 100644
--- a/libc/kernel/uapi/drm/i915_drm.h
+++ b/libc/kernel/uapi/drm/i915_drm.h
@@ -287,18 +287,18 @@
   int DR1;
   int DR4;
   int num_cliprects;
-  struct drm_clip_rect __user * cliprects;
+  struct drm_clip_rect  * cliprects;
 } drm_i915_batchbuffer_t;
 typedef struct _drm_i915_cmdbuffer {
-  char __user * buf;
+  char  * buf;
   int sz;
   int DR1;
   int DR4;
   int num_cliprects;
-  struct drm_clip_rect __user * cliprects;
+  struct drm_clip_rect  * cliprects;
 } drm_i915_cmdbuffer_t;
 typedef struct drm_i915_irq_emit {
-  int __user * irq_seq;
+  int  * irq_seq;
 } drm_i915_irq_emit_t;
 typedef struct drm_i915_irq_wait {
   int irq_seq;
@@ -368,10 +368,12 @@
 #define I915_PARAM_PERF_REVISION 54
 #define I915_PARAM_HAS_EXEC_TIMELINE_FENCES 55
 #define I915_PARAM_HAS_USERPTR_PROBE 56
-typedef struct drm_i915_getparam {
+#define I915_PARAM_OA_TIMESTAMP_FREQUENCY 57
+struct drm_i915_getparam {
   __s32 param;
-  int __user * value;
-} drm_i915_getparam_t;
+  int  * value;
+};
+typedef struct drm_i915_getparam drm_i915_getparam_t;
 #define I915_SETPARAM_USE_MI_BATCHBUFFER_START 1
 #define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
 #define I915_SETPARAM_ALLOW_BATCHBUFFER 3
@@ -385,7 +387,7 @@
   int region;
   int alignment;
   int size;
-  int __user * region_offset;
+  int  * region_offset;
 } drm_i915_mem_alloc_t;
 typedef struct drm_i915_mem_free {
   int region;
@@ -526,13 +528,13 @@
 };
 struct drm_i915_gem_exec_fence {
   __u32 handle;
+  __u32 flags;
 #define I915_EXEC_FENCE_WAIT (1 << 0)
 #define I915_EXEC_FENCE_SIGNAL (1 << 1)
 #define __I915_EXEC_FENCE_UNKNOWN_FLAGS (- (I915_EXEC_FENCE_SIGNAL << 1))
-  __u32 flags;
 };
-#define DRM_I915_GEM_EXECBUFFER_EXT_TIMELINE_FENCES 0
 struct drm_i915_gem_execbuffer_ext_timeline_fences {
+#define DRM_I915_GEM_EXECBUFFER_EXT_TIMELINE_FENCES 0
   struct i915_user_extension base;
   __u64 fence_count;
   __u64 handles_ptr;
@@ -547,6 +549,7 @@
   __u32 DR4;
   __u32 num_cliprects;
   __u64 cliprects_ptr;
+  __u64 flags;
 #define I915_EXEC_RING_MASK (0x3f)
 #define I915_EXEC_DEFAULT (0 << 0)
 #define I915_EXEC_RENDER (1 << 0)
@@ -557,10 +560,6 @@
 #define I915_EXEC_CONSTANTS_REL_GENERAL (0 << 6)
 #define I915_EXEC_CONSTANTS_ABSOLUTE (1 << 6)
 #define I915_EXEC_CONSTANTS_REL_SURFACE (2 << 6)
-  __u64 flags;
-  __u64 rsvd1;
-  __u64 rsvd2;
-};
 #define I915_EXEC_GEN7_SOL_RESET (1 << 8)
 #define I915_EXEC_SECURE (1 << 9)
 #define I915_EXEC_IS_PINNED (1 << 10)
@@ -579,6 +578,9 @@
 #define I915_EXEC_FENCE_SUBMIT (1 << 20)
 #define I915_EXEC_USE_EXTENSIONS (1 << 21)
 #define __I915_EXEC_UNKNOWN_FLAGS (- (I915_EXEC_USE_EXTENSIONS << 1))
+  __u64 rsvd1;
+  __u64 rsvd2;
+};
 #define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
 #define i915_execbuffer2_set_context_id(eb2,context) (eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK
 #define i915_execbuffer2_get_context_id(eb2) ((eb2).rsvd1 & I915_EXEC_CONTEXT_ID_MASK)
@@ -722,6 +724,8 @@
 #define I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE (1u << 1)
 #define I915_CONTEXT_CREATE_FLAGS_UNKNOWN (- (I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE << 1))
   __u64 extensions;
+#define I915_CONTEXT_CREATE_EXT_SETPARAM 0
+#define I915_CONTEXT_CREATE_EXT_CLONE 1
 };
 struct drm_i915_gem_context_param {
   __u32 ctx_id;
@@ -761,7 +765,7 @@
   __u16 num_siblings;
   __u32 flags;
   __u64 mbz64;
-  struct i915_engine_class_instance engines[0];
+  struct i915_engine_class_instance engines[];
 } __attribute__((packed));
 #define I915_DEFINE_CONTEXT_ENGINES_LOAD_BALANCE(name__,N__) struct { struct i915_user_extension base; __u16 engine_index; __u16 num_siblings; __u32 flags; __u64 mbz64; struct i915_engine_class_instance engines[N__]; \
 } __attribute__((packed)) name__
@@ -772,7 +776,7 @@
   __u16 num_bonds;
   __u64 flags;
   __u64 mbz64[4];
-  struct i915_engine_class_instance engines[0];
+  struct i915_engine_class_instance engines[];
 } __attribute__((packed));
 #define I915_DEFINE_CONTEXT_ENGINES_BOND(name__,N__) struct { struct i915_user_extension base; struct i915_engine_class_instance master; __u16 virtual_index; __u16 num_bonds; __u64 flags; __u64 mbz64[4]; struct i915_engine_class_instance engines[N__]; \
 } __attribute__((packed)) name__
@@ -784,8 +788,8 @@
   __u16 mbz16;
   __u64 flags;
   __u64 mbz64[3];
-  struct i915_engine_class_instance engines[0];
-} __packed;
+  struct i915_engine_class_instance engines[];
+} __attribute__((__packed__));
 #define I915_DEFINE_CONTEXT_ENGINES_PARALLEL_SUBMIT(name__,N__) struct { struct i915_user_extension base; __u16 engine_index; __u16 width; __u16 num_siblings; __u16 mbz16; __u64 flags; __u64 mbz64[3]; struct i915_engine_class_instance engines[N__]; \
 } __attribute__((packed)) name__
 struct i915_context_param_engines {
@@ -798,11 +802,9 @@
 #define I915_DEFINE_CONTEXT_PARAM_ENGINES(name__,N__) struct { __u64 extensions; struct i915_engine_class_instance engines[N__]; \
 } __attribute__((packed)) name__
 struct drm_i915_gem_context_create_ext_setparam {
-#define I915_CONTEXT_CREATE_EXT_SETPARAM 0
   struct i915_user_extension base;
   struct drm_i915_gem_context_param param;
 };
-#define I915_CONTEXT_CREATE_EXT_CLONE 1
 struct drm_i915_gem_context_destroy {
   __u32 ctx_id;
   __u32 pad;
@@ -845,6 +847,8 @@
   I915_OA_FORMAT_A12,
   I915_OA_FORMAT_A12_B8_C8,
   I915_OA_FORMAT_A32u40_A4u32_B8_C8,
+  I915_OAR_FORMAT_A32u40_A4u32_B8_C8,
+  I915_OA_FORMAT_A24u40_A14u32_B8_C8,
   I915_OA_FORMAT_MAX
 };
 enum drm_i915_perf_property_id {
@@ -959,7 +963,13 @@
   __u32 rsvd0;
   __u64 probed_size;
   __u64 unallocated_size;
-  __u64 rsvd1[8];
+  union {
+    __u64 rsvd1[8];
+    struct {
+      __u64 probed_cpu_visible_size;
+      __u64 unallocated_cpu_visible_size;
+    };
+  };
 };
 struct drm_i915_query_memory_regions {
   __u32 num_regions;
@@ -969,6 +979,7 @@
 struct drm_i915_gem_create_ext {
   __u64 size;
   __u32 handle;
+#define I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS (1 << 0)
   __u32 flags;
 #define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0
 #define I915_GEM_CREATE_EXT_PROTECTED_CONTENT 1
diff --git a/libc/kernel/uapi/drm/mga_drm.h b/libc/kernel/uapi/drm/mga_drm.h
index dc62961..eb55fa7 100644
--- a/libc/kernel/uapi/drm/mga_drm.h
+++ b/libc/kernel/uapi/drm/mga_drm.h
@@ -239,7 +239,7 @@
 #define MGA_PARAM_CARD_TYPE 2
 typedef struct drm_mga_getparam {
   int param;
-  void __user * value;
+  void  * value;
 } drm_mga_getparam_t;
 #ifdef __cplusplus
 }
diff --git a/libc/kernel/uapi/drm/msm_drm.h b/libc/kernel/uapi/drm/msm_drm.h
index c2edefd..ad3a971 100644
--- a/libc/kernel/uapi/drm/msm_drm.h
+++ b/libc/kernel/uapi/drm/msm_drm.h
@@ -74,6 +74,7 @@
 #define MSM_INFO_SET_NAME 0x02
 #define MSM_INFO_GET_NAME 0x03
 #define MSM_INFO_SET_IOVA 0x04
+#define MSM_INFO_GET_FLAGS 0x05
 struct drm_msm_gem_info {
   __u32 handle;
   __u32 info;
diff --git a/libc/kernel/uapi/drm/panfrost_drm.h b/libc/kernel/uapi/drm/panfrost_drm.h
index 1f4473d..04a85df 100644
--- a/libc/kernel/uapi/drm/panfrost_drm.h
+++ b/libc/kernel/uapi/drm/panfrost_drm.h
@@ -136,6 +136,38 @@
   __u32 madv;
   __u32 retained;
 };
+#define PANFROSTDUMP_MAJOR 1
+#define PANFROSTDUMP_MINOR 0
+#define PANFROSTDUMP_MAGIC 0x464E4150
+#define PANFROSTDUMP_BUF_REG 0
+#define PANFROSTDUMP_BUF_BOMAP (PANFROSTDUMP_BUF_REG + 1)
+#define PANFROSTDUMP_BUF_BO (PANFROSTDUMP_BUF_BOMAP + 1)
+#define PANFROSTDUMP_BUF_TRAILER (PANFROSTDUMP_BUF_BO + 1)
+struct panfrost_dump_object_header {
+  __u32 magic;
+  __u32 type;
+  __u32 file_size;
+  __u32 file_offset;
+  union {
+    struct {
+      __u64 jc;
+      __u32 gpu_id;
+      __u32 major;
+      __u32 minor;
+      __u64 nbos;
+    } reghdr;
+    struct {
+      __u32 valid;
+      __u64 iova;
+      __u32 data[2];
+    } bomap;
+    __u32 sizer[496];
+  };
+};
+struct panfrost_dump_registers {
+  __u32 reg;
+  __u32 value;
+};
 #ifdef __cplusplus
 }
 #endif
diff --git a/libc/kernel/uapi/drm/r128_drm.h b/libc/kernel/uapi/drm/r128_drm.h
index 618b6dc..3e013b1 100644
--- a/libc/kernel/uapi/drm/r128_drm.h
+++ b/libc/kernel/uapi/drm/r128_drm.h
@@ -204,13 +204,13 @@
     R128_READ_PIXELS = 0x04
   } func;
   int n;
-  int __user * x;
-  int __user * y;
-  unsigned int __user * buffer;
-  unsigned char __user * mask;
+  int  * x;
+  int  * y;
+  unsigned int  * buffer;
+  unsigned char  * mask;
 } drm_r128_depth_t;
 typedef struct drm_r128_stipple {
-  unsigned int __user * mask;
+  unsigned int  * mask;
 } drm_r128_stipple_t;
 typedef struct drm_r128_indirect {
   int idx;
@@ -227,7 +227,7 @@
 #define R128_PARAM_IRQ_NR 1
 typedef struct drm_r128_getparam {
   int param;
-  void __user * value;
+  void  * value;
 } drm_r128_getparam_t;
 #ifdef __cplusplus
 }
diff --git a/libc/kernel/uapi/drm/radeon_drm.h b/libc/kernel/uapi/drm/radeon_drm.h
index 9dc69ad..3ec6bb3 100644
--- a/libc/kernel/uapi/drm/radeon_drm.h
+++ b/libc/kernel/uapi/drm/radeon_drm.h
@@ -479,7 +479,7 @@
   unsigned int clear_depth;
   unsigned int color_mask;
   unsigned int depth_mask;
-  drm_radeon_clear_rect_t __user * depth_boxes;
+  drm_radeon_clear_rect_t  * depth_boxes;
 } drm_radeon_clear_t;
 typedef struct drm_radeon_vertex {
   int prim;
@@ -498,20 +498,20 @@
   int idx;
   int discard;
   int nr_states;
-  drm_radeon_state_t __user * state;
+  drm_radeon_state_t  * state;
   int nr_prims;
-  drm_radeon_prim_t __user * prim;
+  drm_radeon_prim_t  * prim;
 } drm_radeon_vertex2_t;
 typedef struct drm_radeon_cmd_buffer {
   int bufsz;
-  char __user * buf;
+  char  * buf;
   int nbox;
-  struct drm_clip_rect __user * boxes;
+  struct drm_clip_rect  * boxes;
 } drm_radeon_cmd_buffer_t;
 typedef struct drm_radeon_tex_image {
   unsigned int x, y;
   unsigned int width, height;
-  const void __user * data;
+  const void  * data;
 } drm_radeon_tex_image_t;
 typedef struct drm_radeon_texture {
   unsigned int offset;
@@ -519,10 +519,10 @@
   int format;
   int width;
   int height;
-  drm_radeon_tex_image_t __user * image;
+  drm_radeon_tex_image_t  * image;
 } drm_radeon_texture_t;
 typedef struct drm_radeon_stipple {
-  unsigned int __user * mask;
+  unsigned int  * mask;
 } drm_radeon_stipple_t;
 typedef struct drm_radeon_indirect {
   int idx;
@@ -552,7 +552,7 @@
 #define RADEON_PARAM_NUM_Z_PIPES 17
 typedef struct drm_radeon_getparam {
   int param;
-  void __user * value;
+  void  * value;
 } drm_radeon_getparam_t;
 #define RADEON_MEM_REGION_GART 1
 #define RADEON_MEM_REGION_FB 2
@@ -560,7 +560,7 @@
   int region;
   int alignment;
   int size;
-  int __user * region_offset;
+  int  * region_offset;
 } drm_radeon_mem_alloc_t;
 typedef struct drm_radeon_mem_free {
   int region;
@@ -572,7 +572,7 @@
   int start;
 } drm_radeon_mem_init_heap_t;
 typedef struct drm_radeon_irq_emit {
-  int __user * irq_seq;
+  int  * irq_seq;
 } drm_radeon_irq_emit_t;
 typedef struct drm_radeon_irq_wait {
   int irq_seq;
diff --git a/libc/kernel/uapi/drm/savage_drm.h b/libc/kernel/uapi/drm/savage_drm.h
index ae87d21..efc0ae6 100644
--- a/libc/kernel/uapi/drm/savage_drm.h
+++ b/libc/kernel/uapi/drm/savage_drm.h
@@ -68,14 +68,14 @@
 } drm_savage_init_t;
 typedef union drm_savage_cmd_header drm_savage_cmd_header_t;
 typedef struct drm_savage_cmdbuf {
-  drm_savage_cmd_header_t __user * cmd_addr;
+  drm_savage_cmd_header_t  * cmd_addr;
   unsigned int size;
   unsigned int dma_idx;
   int discard;
-  unsigned int __user * vb_addr;
+  unsigned int  * vb_addr;
   unsigned int vb_size;
   unsigned int vb_stride;
-  struct drm_clip_rect __user * box_addr;
+  struct drm_clip_rect  * box_addr;
   unsigned int nbox;
 } drm_savage_cmdbuf_t;
 #define SAVAGE_WAIT_2D 0x1
diff --git a/libc/kernel/uapi/drm/via_drm.h b/libc/kernel/uapi/drm/via_drm.h
index 9ef645a..95a149b 100644
--- a/libc/kernel/uapi/drm/via_drm.h
+++ b/libc/kernel/uapi/drm/via_drm.h
@@ -125,7 +125,7 @@
   unsigned long reg_pause_addr;
 } drm_via_dma_init_t;
 typedef struct _drm_via_cmdbuffer {
-  char __user * buf;
+  char  * buf;
   unsigned long size;
 } drm_via_cmdbuffer_t;
 typedef struct _drm_via_tex_region {
diff --git a/libc/kernel/uapi/linux/acrn.h b/libc/kernel/uapi/linux/acrn.h
index c991ac0..aa408d8 100644
--- a/libc/kernel/uapi/linux/acrn.h
+++ b/libc/kernel/uapi/linux/acrn.h
@@ -19,7 +19,6 @@
 #ifndef _UAPI_ACRN_H
 #define _UAPI_ACRN_H
 #include <linux/types.h>
-#include <linux/uuid.h>
 #define ACRN_IO_REQUEST_MAX 16
 #define ACRN_IOREQ_STATE_PENDING 0
 #define ACRN_IOREQ_STATE_COMPLETE 1
@@ -84,7 +83,7 @@
   __u16 reserved0;
   __u16 vcpu_num;
   __u16 reserved1;
-  guid_t uuid;
+  __u8 uuid[16];
   __u64 vm_flag;
   __u64 ioreq_buf;
   __u64 cpu_affinity;
diff --git a/libc/kernel/uapi/linux/android/binder.h b/libc/kernel/uapi/linux/android/binder.h
index 2745972..52f4c6b 100644
--- a/libc/kernel/uapi/linux/android/binder.h
+++ b/libc/kernel/uapi/linux/android/binder.h
@@ -152,6 +152,7 @@
   TF_STATUS_CODE = 0x08,
   TF_ACCEPT_FDS = 0x10,
   TF_CLEAR_BUF = 0x20,
+  TF_UPDATE_TXN = 0x40,
 };
 struct binder_transaction_data {
   union {
@@ -188,7 +189,7 @@
 struct binder_handle_cookie {
   __u32 handle;
   binder_uintptr_t cookie;
-} __packed;
+} __attribute__((__packed__));
 struct binder_pri_desc {
   __s32 priority;
   __u32 desc;
diff --git a/libc/kernel/uapi/linux/ashmem.h b/libc/kernel/uapi/linux/ashmem.h
index 174667f..88f0e81 100644
--- a/libc/kernel/uapi/linux/ashmem.h
+++ b/libc/kernel/uapi/linux/ashmem.h
@@ -41,4 +41,5 @@
 #define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
 #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
 #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
+#define ASHMEM_GET_FILE_ID _IOR(__ASHMEMIOC, 11, unsigned long)
 #endif
diff --git a/libc/kernel/uapi/linux/aspeed-video.h b/libc/kernel/uapi/linux/aspeed-video.h
new file mode 100644
index 0000000..d5109c1
--- /dev/null
+++ b/libc/kernel/uapi/linux/aspeed-video.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_ASPEED_VIDEO_H
+#define _UAPI_LINUX_ASPEED_VIDEO_H
+#include <linux/v4l2-controls.h>
+#define V4L2_CID_ASPEED_HQ_MODE (V4L2_CID_USER_ASPEED_BASE + 1)
+#define V4L2_CID_ASPEED_HQ_JPEG_QUALITY (V4L2_CID_USER_ASPEED_BASE + 2)
+#endif
diff --git a/libc/kernel/uapi/linux/atm.h b/libc/kernel/uapi/linux/atm.h
index 488fa05..72d329d 100644
--- a/libc/kernel/uapi/linux/atm.h
+++ b/libc/kernel/uapi/linux/atm.h
@@ -140,7 +140,7 @@
 struct atmif_sioc {
   int number;
   int length;
-  void __user * arg;
+  void  * arg;
 };
 typedef unsigned short atm_backend_t;
 #endif
diff --git a/libc/kernel/uapi/linux/atm_zatm.h b/libc/kernel/uapi/linux/atm_zatm.h
new file mode 100644
index 0000000..1649b85
--- /dev/null
+++ b/libc/kernel/uapi/linux/atm_zatm.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef LINUX_ATM_ZATM_H
+#define LINUX_ATM_ZATM_H
+#include <linux/atmapi.h>
+#include <linux/atmioc.h>
+#define ZATM_GETPOOL _IOW('a', ATMIOC_SARPRV + 1, struct atmif_sioc)
+#define ZATM_GETPOOLZ _IOW('a', ATMIOC_SARPRV + 2, struct atmif_sioc)
+#define ZATM_SETPOOL _IOW('a', ATMIOC_SARPRV + 3, struct atmif_sioc)
+struct zatm_pool_info {
+  int ref_count;
+  int low_water, high_water;
+  int rqa_count, rqu_count;
+  int offset, next_off;
+  int next_cnt, next_thres;
+};
+struct zatm_pool_req {
+  int pool_num;
+  struct zatm_pool_info info;
+};
+#define ZATM_OAM_POOL 0
+#define ZATM_AAL0_POOL 1
+#define ZATM_AAL5_POOL_BASE 2
+#define ZATM_LAST_POOL ZATM_AAL5_POOL_BASE + 10
+#define ZATM_TIMER_HISTORY_SIZE 16
+#endif
diff --git a/libc/kernel/uapi/linux/atmdev.h b/libc/kernel/uapi/linux/atmdev.h
index 69eb240..74cdfc1 100644
--- a/libc/kernel/uapi/linux/atmdev.h
+++ b/libc/kernel/uapi/linux/atmdev.h
@@ -86,7 +86,7 @@
 #define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG)
 struct atm_iobuf {
   int length;
-  void __user * buffer;
+  void  * buffer;
 };
 #define ATM_CI_MAX - 1
 struct atm_cirange {
diff --git a/libc/kernel/uapi/linux/audit.h b/libc/kernel/uapi/linux/audit.h
index 2c37e2a..f7c969b 100644
--- a/libc/kernel/uapi/linux/audit.h
+++ b/libc/kernel/uapi/linux/audit.h
@@ -140,7 +140,7 @@
 #define AUDIT_MAX_KEY_LEN 256
 #define AUDIT_BITMASK_SIZE 64
 #define AUDIT_WORD(nr) ((__u32) ((nr) / 32))
-#define AUDIT_BIT(nr) (1 << ((nr) - AUDIT_WORD(nr) * 32))
+#define AUDIT_BIT(nr) (1U << ((nr) - AUDIT_WORD(nr) * 32))
 #define AUDIT_SYSCALL_CLASSES 16
 #define AUDIT_CLASS_DIR_WRITE 0
 #define AUDIT_CLASS_DIR_WRITE_32 1
diff --git a/libc/kernel/uapi/linux/blkpg.h b/libc/kernel/uapi/linux/blkpg.h
index fdde696..bfe504f 100644
--- a/libc/kernel/uapi/linux/blkpg.h
+++ b/libc/kernel/uapi/linux/blkpg.h
@@ -25,7 +25,7 @@
   int op;
   int flags;
   int datalen;
-  void __user * data;
+  void  * data;
 };
 #define BLKPG_ADD_PARTITION 1
 #define BLKPG_DEL_PARTITION 2
diff --git a/libc/kernel/uapi/linux/blkzoned.h b/libc/kernel/uapi/linux/blkzoned.h
index b551e8b..e41ac9f 100644
--- a/libc/kernel/uapi/linux/blkzoned.h
+++ b/libc/kernel/uapi/linux/blkzoned.h
@@ -54,7 +54,7 @@
   __u64 sector;
   __u32 nr_zones;
   __u32 flags;
-  struct blk_zone zones[0];
+  struct blk_zone zones[];
 };
 struct blk_zone_range {
   __u64 sector;
diff --git a/libc/kernel/uapi/linux/bpf.h b/libc/kernel/uapi/linux/bpf.h
index dd10b34..163dd1e 100644
--- a/libc/kernel/uapi/linux/bpf.h
+++ b/libc/kernel/uapi/linux/bpf.h
@@ -74,10 +74,27 @@
   __u64 cgroup_inode_id;
   __u32 attach_type;
 };
+enum bpf_cgroup_iter_order {
+  BPF_CGROUP_ITER_ORDER_UNSPEC = 0,
+  BPF_CGROUP_ITER_SELF_ONLY,
+  BPF_CGROUP_ITER_DESCENDANTS_PRE,
+  BPF_CGROUP_ITER_DESCENDANTS_POST,
+  BPF_CGROUP_ITER_ANCESTORS_UP,
+};
 union bpf_iter_link_info {
   struct {
     __u32 map_fd;
   } map;
+  struct {
+    enum bpf_cgroup_iter_order order;
+    __u32 cgroup_fd;
+    __u64 cgroup_id;
+  } cgroup;
+  struct {
+    __u32 tid;
+    __u32 pid;
+    __u32 pid_fd;
+  } task;
 };
 enum bpf_cmd {
   BPF_MAP_CREATE,
@@ -138,7 +155,8 @@
   BPF_MAP_TYPE_CPUMAP,
   BPF_MAP_TYPE_XSKMAP,
   BPF_MAP_TYPE_SOCKHASH,
-  BPF_MAP_TYPE_CGROUP_STORAGE,
+  BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED,
+  BPF_MAP_TYPE_CGROUP_STORAGE = BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED,
   BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
   BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
   BPF_MAP_TYPE_QUEUE,
@@ -150,6 +168,8 @@
   BPF_MAP_TYPE_INODE_STORAGE,
   BPF_MAP_TYPE_TASK_STORAGE,
   BPF_MAP_TYPE_BLOOM_FILTER,
+  BPF_MAP_TYPE_USER_RINGBUF,
+  BPF_MAP_TYPE_CGRP_STORAGE,
 };
 enum bpf_prog_type {
   BPF_PROG_TYPE_UNSPEC,
@@ -229,6 +249,7 @@
   BPF_SK_REUSEPORT_SELECT_OR_MIGRATE,
   BPF_PERF_EVENT,
   BPF_TRACE_KPROBE_MULTI,
+  BPF_LSM_CGROUP,
   __MAX_BPF_ATTACH_TYPE
 };
 #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
@@ -423,6 +444,7 @@
     __u32 attach_flags;
     __aligned_u64 prog_ids;
     __u32 prog_cnt;
+    __aligned_u64 prog_attach_flags;
   } query;
   struct {
     __u64 name;
@@ -498,10 +520,12 @@
     __u32 flags;
   } prog_bind_map;
 } __attribute__((aligned(8)));
-#define __BPF_FUNC_MAPPER(FN) FN(unspec), FN(map_lookup_elem), FN(map_update_elem), FN(map_delete_elem), FN(probe_read), FN(ktime_get_ns), FN(trace_printk), FN(get_prandom_u32), FN(get_smp_processor_id), FN(skb_store_bytes), FN(l3_csum_replace), FN(l4_csum_replace), FN(tail_call), FN(clone_redirect), FN(get_current_pid_tgid), FN(get_current_uid_gid), FN(get_current_comm), FN(get_cgroup_classid), FN(skb_vlan_push), FN(skb_vlan_pop), FN(skb_get_tunnel_key), FN(skb_set_tunnel_key), FN(perf_event_read), FN(redirect), FN(get_route_realm), FN(perf_event_output), FN(skb_load_bytes), FN(get_stackid), FN(csum_diff), FN(skb_get_tunnel_opt), FN(skb_set_tunnel_opt), FN(skb_change_proto), FN(skb_change_type), FN(skb_under_cgroup), FN(get_hash_recalc), FN(get_current_task), FN(probe_write_user), FN(current_task_under_cgroup), FN(skb_change_tail), FN(skb_pull_data), FN(csum_update), FN(set_hash_invalid), FN(get_numa_node_id), FN(skb_change_head), FN(xdp_adjust_head), FN(probe_read_str), FN(get_socket_cookie), FN(get_socket_uid), FN(set_hash), FN(setsockopt), FN(skb_adjust_room), FN(redirect_map), FN(sk_redirect_map), FN(sock_map_update), FN(xdp_adjust_meta), FN(perf_event_read_value), FN(perf_prog_read_value), FN(getsockopt), FN(override_return), FN(sock_ops_cb_flags_set), FN(msg_redirect_map), FN(msg_apply_bytes), FN(msg_cork_bytes), FN(msg_pull_data), FN(bind), FN(xdp_adjust_tail), FN(skb_get_xfrm_state), FN(get_stack), FN(skb_load_bytes_relative), FN(fib_lookup), FN(sock_hash_update), FN(msg_redirect_hash), FN(sk_redirect_hash), FN(lwt_push_encap), FN(lwt_seg6_store_bytes), FN(lwt_seg6_adjust_srh), FN(lwt_seg6_action), FN(rc_repeat), FN(rc_keydown), FN(skb_cgroup_id), FN(get_current_cgroup_id), FN(get_local_storage), FN(sk_select_reuseport), FN(skb_ancestor_cgroup_id), FN(sk_lookup_tcp), FN(sk_lookup_udp), FN(sk_release), FN(map_push_elem), FN(map_pop_elem), FN(map_peek_elem), FN(msg_push_data), FN(msg_pop_data), FN(rc_pointer_rel), FN(spin_lock), FN(spin_unlock), FN(sk_fullsock), FN(tcp_sock), FN(skb_ecn_set_ce), FN(get_listener_sock), FN(skc_lookup_tcp), FN(tcp_check_syncookie), FN(sysctl_get_name), FN(sysctl_get_current_value), FN(sysctl_get_new_value), FN(sysctl_set_new_value), FN(strtol), FN(strtoul), FN(sk_storage_get), FN(sk_storage_delete), FN(send_signal), FN(tcp_gen_syncookie), FN(skb_output), FN(probe_read_user), FN(probe_read_kernel), FN(probe_read_user_str), FN(probe_read_kernel_str), FN(tcp_send_ack), FN(send_signal_thread), FN(jiffies64), FN(read_branch_records), FN(get_ns_current_pid_tgid), FN(xdp_output), FN(get_netns_cookie), FN(get_current_ancestor_cgroup_id), FN(sk_assign), FN(ktime_get_boot_ns), FN(seq_printf), FN(seq_write), FN(sk_cgroup_id), FN(sk_ancestor_cgroup_id), FN(ringbuf_output), FN(ringbuf_reserve), FN(ringbuf_submit), FN(ringbuf_discard), FN(ringbuf_query), FN(csum_level), FN(skc_to_tcp6_sock), FN(skc_to_tcp_sock), FN(skc_to_tcp_timewait_sock), FN(skc_to_tcp_request_sock), FN(skc_to_udp6_sock), FN(get_task_stack), FN(load_hdr_opt), FN(store_hdr_opt), FN(reserve_hdr_opt), FN(inode_storage_get), FN(inode_storage_delete), FN(d_path), FN(copy_from_user), FN(snprintf_btf), FN(seq_printf_btf), FN(skb_cgroup_classid), FN(redirect_neigh), FN(per_cpu_ptr), FN(this_cpu_ptr), FN(redirect_peer), FN(task_storage_get), FN(task_storage_delete), FN(get_current_task_btf), FN(bprm_opts_set), FN(ktime_get_coarse_ns), FN(ima_inode_hash), FN(sock_from_file), FN(check_mtu), FN(for_each_map_elem), FN(snprintf), FN(sys_bpf), FN(btf_find_by_name_kind), FN(sys_close), FN(timer_init), FN(timer_set_callback), FN(timer_start), FN(timer_cancel), FN(get_func_ip), FN(get_attach_cookie), FN(task_pt_regs), FN(get_branch_snapshot), FN(trace_vprintk), FN(skc_to_unix_sock), FN(kallsyms_lookup_name), FN(find_vma), FN(loop), FN(strncmp), FN(get_func_arg), FN(get_func_ret), FN(get_func_arg_cnt), FN(get_retval), FN(set_retval), FN(xdp_get_buff_len), FN(xdp_load_bytes), FN(xdp_store_bytes), FN(copy_from_user_task), FN(skb_set_tstamp), FN(ima_file_hash), FN(kptr_xchg), FN(map_lookup_percpu_elem), FN(skc_to_mptcp_sock), FN(dynptr_from_mem), FN(ringbuf_reserve_dynptr), FN(ringbuf_submit_dynptr), FN(ringbuf_discard_dynptr), FN(dynptr_read), FN(dynptr_write), FN(dynptr_data),
-#define __BPF_ENUM_FN(x) BPF_FUNC_ ##x
+#define ___BPF_FUNC_MAPPER(FN,ctx...) FN(unspec, 0, ##ctx) FN(map_lookup_elem, 1, ##ctx) FN(map_update_elem, 2, ##ctx) FN(map_delete_elem, 3, ##ctx) FN(probe_read, 4, ##ctx) FN(ktime_get_ns, 5, ##ctx) FN(trace_printk, 6, ##ctx) FN(get_prandom_u32, 7, ##ctx) FN(get_smp_processor_id, 8, ##ctx) FN(skb_store_bytes, 9, ##ctx) FN(l3_csum_replace, 10, ##ctx) FN(l4_csum_replace, 11, ##ctx) FN(tail_call, 12, ##ctx) FN(clone_redirect, 13, ##ctx) FN(get_current_pid_tgid, 14, ##ctx) FN(get_current_uid_gid, 15, ##ctx) FN(get_current_comm, 16, ##ctx) FN(get_cgroup_classid, 17, ##ctx) FN(skb_vlan_push, 18, ##ctx) FN(skb_vlan_pop, 19, ##ctx) FN(skb_get_tunnel_key, 20, ##ctx) FN(skb_set_tunnel_key, 21, ##ctx) FN(perf_event_read, 22, ##ctx) FN(redirect, 23, ##ctx) FN(get_route_realm, 24, ##ctx) FN(perf_event_output, 25, ##ctx) FN(skb_load_bytes, 26, ##ctx) FN(get_stackid, 27, ##ctx) FN(csum_diff, 28, ##ctx) FN(skb_get_tunnel_opt, 29, ##ctx) FN(skb_set_tunnel_opt, 30, ##ctx) FN(skb_change_proto, 31, ##ctx) FN(skb_change_type, 32, ##ctx) FN(skb_under_cgroup, 33, ##ctx) FN(get_hash_recalc, 34, ##ctx) FN(get_current_task, 35, ##ctx) FN(probe_write_user, 36, ##ctx) FN(current_task_under_cgroup, 37, ##ctx) FN(skb_change_tail, 38, ##ctx) FN(skb_pull_data, 39, ##ctx) FN(csum_update, 40, ##ctx) FN(set_hash_invalid, 41, ##ctx) FN(get_numa_node_id, 42, ##ctx) FN(skb_change_head, 43, ##ctx) FN(xdp_adjust_head, 44, ##ctx) FN(probe_read_str, 45, ##ctx) FN(get_socket_cookie, 46, ##ctx) FN(get_socket_uid, 47, ##ctx) FN(set_hash, 48, ##ctx) FN(setsockopt, 49, ##ctx) FN(skb_adjust_room, 50, ##ctx) FN(redirect_map, 51, ##ctx) FN(sk_redirect_map, 52, ##ctx) FN(sock_map_update, 53, ##ctx) FN(xdp_adjust_meta, 54, ##ctx) FN(perf_event_read_value, 55, ##ctx) FN(perf_prog_read_value, 56, ##ctx) FN(getsockopt, 57, ##ctx) FN(override_return, 58, ##ctx) FN(sock_ops_cb_flags_set, 59, ##ctx) FN(msg_redirect_map, 60, ##ctx) FN(msg_apply_bytes, 61, ##ctx) FN(msg_cork_bytes, 62, ##ctx) FN(msg_pull_data, 63, ##ctx) FN(bind, 64, ##ctx) FN(xdp_adjust_tail, 65, ##ctx) FN(skb_get_xfrm_state, 66, ##ctx) FN(get_stack, 67, ##ctx) FN(skb_load_bytes_relative, 68, ##ctx) FN(fib_lookup, 69, ##ctx) FN(sock_hash_update, 70, ##ctx) FN(msg_redirect_hash, 71, ##ctx) FN(sk_redirect_hash, 72, ##ctx) FN(lwt_push_encap, 73, ##ctx) FN(lwt_seg6_store_bytes, 74, ##ctx) FN(lwt_seg6_adjust_srh, 75, ##ctx) FN(lwt_seg6_action, 76, ##ctx) FN(rc_repeat, 77, ##ctx) FN(rc_keydown, 78, ##ctx) FN(skb_cgroup_id, 79, ##ctx) FN(get_current_cgroup_id, 80, ##ctx) FN(get_local_storage, 81, ##ctx) FN(sk_select_reuseport, 82, ##ctx) FN(skb_ancestor_cgroup_id, 83, ##ctx) FN(sk_lookup_tcp, 84, ##ctx) FN(sk_lookup_udp, 85, ##ctx) FN(sk_release, 86, ##ctx) FN(map_push_elem, 87, ##ctx) FN(map_pop_elem, 88, ##ctx) FN(map_peek_elem, 89, ##ctx) FN(msg_push_data, 90, ##ctx) FN(msg_pop_data, 91, ##ctx) FN(rc_pointer_rel, 92, ##ctx) FN(spin_lock, 93, ##ctx) FN(spin_unlock, 94, ##ctx) FN(sk_fullsock, 95, ##ctx) FN(tcp_sock, 96, ##ctx) FN(skb_ecn_set_ce, 97, ##ctx) FN(get_listener_sock, 98, ##ctx) FN(skc_lookup_tcp, 99, ##ctx) FN(tcp_check_syncookie, 100, ##ctx) FN(sysctl_get_name, 101, ##ctx) FN(sysctl_get_current_value, 102, ##ctx) FN(sysctl_get_new_value, 103, ##ctx) FN(sysctl_set_new_value, 104, ##ctx) FN(strtol, 105, ##ctx) FN(strtoul, 106, ##ctx) FN(sk_storage_get, 107, ##ctx) FN(sk_storage_delete, 108, ##ctx) FN(send_signal, 109, ##ctx) FN(tcp_gen_syncookie, 110, ##ctx) FN(skb_output, 111, ##ctx) FN(probe_read_user, 112, ##ctx) FN(probe_read_kernel, 113, ##ctx) FN(probe_read_user_str, 114, ##ctx) FN(probe_read_kernel_str, 115, ##ctx) FN(tcp_send_ack, 116, ##ctx) FN(send_signal_thread, 117, ##ctx) FN(jiffies64, 118, ##ctx) FN(read_branch_records, 119, ##ctx) FN(get_ns_current_pid_tgid, 120, ##ctx) FN(xdp_output, 121, ##ctx) FN(get_netns_cookie, 122, ##ctx) FN(get_current_ancestor_cgroup_id, 123, ##ctx) FN(sk_assign, 124, ##ctx) FN(ktime_get_boot_ns, 125, ##ctx) FN(seq_printf, 126, ##ctx) FN(seq_write, 127, ##ctx) FN(sk_cgroup_id, 128, ##ctx) FN(sk_ancestor_cgroup_id, 129, ##ctx) FN(ringbuf_output, 130, ##ctx) FN(ringbuf_reserve, 131, ##ctx) FN(ringbuf_submit, 132, ##ctx) FN(ringbuf_discard, 133, ##ctx) FN(ringbuf_query, 134, ##ctx) FN(csum_level, 135, ##ctx) FN(skc_to_tcp6_sock, 136, ##ctx) FN(skc_to_tcp_sock, 137, ##ctx) FN(skc_to_tcp_timewait_sock, 138, ##ctx) FN(skc_to_tcp_request_sock, 139, ##ctx) FN(skc_to_udp6_sock, 140, ##ctx) FN(get_task_stack, 141, ##ctx) FN(load_hdr_opt, 142, ##ctx) FN(store_hdr_opt, 143, ##ctx) FN(reserve_hdr_opt, 144, ##ctx) FN(inode_storage_get, 145, ##ctx) FN(inode_storage_delete, 146, ##ctx) FN(d_path, 147, ##ctx) FN(copy_from_user, 148, ##ctx) FN(snprintf_btf, 149, ##ctx) FN(seq_printf_btf, 150, ##ctx) FN(skb_cgroup_classid, 151, ##ctx) FN(redirect_neigh, 152, ##ctx) FN(per_cpu_ptr, 153, ##ctx) FN(this_cpu_ptr, 154, ##ctx) FN(redirect_peer, 155, ##ctx) FN(task_storage_get, 156, ##ctx) FN(task_storage_delete, 157, ##ctx) FN(get_current_task_btf, 158, ##ctx) FN(bprm_opts_set, 159, ##ctx) FN(ktime_get_coarse_ns, 160, ##ctx) FN(ima_inode_hash, 161, ##ctx) FN(sock_from_file, 162, ##ctx) FN(check_mtu, 163, ##ctx) FN(for_each_map_elem, 164, ##ctx) FN(snprintf, 165, ##ctx) FN(sys_bpf, 166, ##ctx) FN(btf_find_by_name_kind, 167, ##ctx) FN(sys_close, 168, ##ctx) FN(timer_init, 169, ##ctx) FN(timer_set_callback, 170, ##ctx) FN(timer_start, 171, ##ctx) FN(timer_cancel, 172, ##ctx) FN(get_func_ip, 173, ##ctx) FN(get_attach_cookie, 174, ##ctx) FN(task_pt_regs, 175, ##ctx) FN(get_branch_snapshot, 176, ##ctx) FN(trace_vprintk, 177, ##ctx) FN(skc_to_unix_sock, 178, ##ctx) FN(kallsyms_lookup_name, 179, ##ctx) FN(find_vma, 180, ##ctx) FN(loop, 181, ##ctx) FN(strncmp, 182, ##ctx) FN(get_func_arg, 183, ##ctx) FN(get_func_ret, 184, ##ctx) FN(get_func_arg_cnt, 185, ##ctx) FN(get_retval, 186, ##ctx) FN(set_retval, 187, ##ctx) FN(xdp_get_buff_len, 188, ##ctx) FN(xdp_load_bytes, 189, ##ctx) FN(xdp_store_bytes, 190, ##ctx) FN(copy_from_user_task, 191, ##ctx) FN(skb_set_tstamp, 192, ##ctx) FN(ima_file_hash, 193, ##ctx) FN(kptr_xchg, 194, ##ctx) FN(map_lookup_percpu_elem, 195, ##ctx) FN(skc_to_mptcp_sock, 196, ##ctx) FN(dynptr_from_mem, 197, ##ctx) FN(ringbuf_reserve_dynptr, 198, ##ctx) FN(ringbuf_submit_dynptr, 199, ##ctx) FN(ringbuf_discard_dynptr, 200, ##ctx) FN(dynptr_read, 201, ##ctx) FN(dynptr_write, 202, ##ctx) FN(dynptr_data, 203, ##ctx) FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx) FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx) FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx) FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx) FN(ktime_get_tai_ns, 208, ##ctx) FN(user_ringbuf_drain, 209, ##ctx) FN(cgrp_storage_get, 210, ##ctx) FN(cgrp_storage_delete, 211, ##ctx)
+#define __BPF_FUNC_MAPPER_APPLY(name,value,FN) FN(name),
+#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN)
+#define __BPF_ENUM_FN(x,y) BPF_FUNC_ ##x = y,
 enum bpf_func_id {
-  __BPF_FUNC_MAPPER(__BPF_ENUM_FN) __BPF_FUNC_MAX_ID,
+  ___BPF_FUNC_MAPPER(__BPF_ENUM_FN) __BPF_FUNC_MAX_ID,
 };
 #undef __BPF_ENUM_FN
 enum {
@@ -535,6 +559,9 @@
   BPF_F_SEQ_NUMBER = (1ULL << 3),
 };
 enum {
+  BPF_F_TUNINFO_FLAGS = (1ULL << 4),
+};
+enum {
   BPF_F_INDEX_MASK = 0xffffffffULL,
   BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
   BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
@@ -662,7 +689,10 @@
   };
   __u8 tunnel_tos;
   __u8 tunnel_ttl;
-  __u16 tunnel_ext;
+  union {
+    __u16 tunnel_ext;
+    __be16 tunnel_flags;
+  };
   __u32 tunnel_label;
   union {
     __u32 local_ipv4;
@@ -684,6 +714,7 @@
   BPF_DROP = 2,
   BPF_REDIRECT = 7,
   BPF_LWT_REROUTE = 128,
+  BPF_FLOW_DISSECTOR_CONTINUE = 129,
 };
 struct bpf_sock {
   __u32 bound_dev_if;
@@ -846,6 +877,8 @@
   __u64 run_cnt;
   __u64 recursion_misses;
   __u32 verified_insns;
+  __u32 attach_btf_obj_id;
+  __u32 attach_btf_id;
 } __attribute__((aligned(8)));
 struct bpf_map_info {
   __u32 type;
@@ -899,6 +932,16 @@
           __u32 map_id;
         } map;
       };
+      union {
+        struct {
+          __u64 cgroup_id;
+          __u32 order;
+        } cgroup;
+        struct {
+          __u32 tid;
+          __u32 pid;
+        } task;
+      };
     } iter;
     struct {
       __u32 netns_ino;
@@ -966,6 +1009,7 @@
   __bpf_md_ptr(void *, skb_data_end);
   __u32 skb_len;
   __u32 skb_tcp_flags;
+  __u64 skb_hwtstamp;
 };
 enum {
   BPF_SOCK_OPS_RTO_CB_FLAG = (1 << 0),
@@ -1166,6 +1210,14 @@
   __u64 : 64;
   __u64 : 64;
 } __attribute__((aligned(8)));
+struct bpf_list_head {
+  __u64 : 64;
+  __u64 : 64;
+} __attribute__((aligned(8)));
+struct bpf_list_node {
+  __u64 : 64;
+  __u64 : 64;
+} __attribute__((aligned(8)));
 struct bpf_sysctl {
   __u32 write;
   __u32 file_pos;
@@ -1223,6 +1275,7 @@
   BPF_CORE_TYPE_SIZE = 9,
   BPF_CORE_ENUMVAL_EXISTS = 10,
   BPF_CORE_ENUMVAL_VALUE = 11,
+  BPF_CORE_TYPE_MATCHES = 12,
 };
 struct bpf_core_relo {
   __u32 insn_off;
diff --git a/libc/kernel/uapi/linux/btf.h b/libc/kernel/uapi/linux/btf.h
index fc57d3c..a1f68bf 100644
--- a/libc/kernel/uapi/linux/btf.h
+++ b/libc/kernel/uapi/linux/btf.h
@@ -65,6 +65,7 @@
   BTF_KIND_FLOAT = 16,
   BTF_KIND_DECL_TAG = 17,
   BTF_KIND_TYPE_TAG = 18,
+  BTF_KIND_ENUM64 = 19,
   NR_BTF_KINDS,
   BTF_KIND_MAX = NR_BTF_KINDS - 1,
 };
@@ -115,4 +116,9 @@
 struct btf_decl_tag {
   __s32 component_idx;
 };
+struct btf_enum64 {
+  __u32 name_off;
+  __u32 val_lo32;
+  __u32 val_hi32;
+};
 #endif
diff --git a/libc/kernel/uapi/linux/btrfs.h b/libc/kernel/uapi/linux/btrfs.h
index 9f76d52..0fdac66 100644
--- a/libc/kernel/uapi/linux/btrfs.h
+++ b/libc/kernel/uapi/linux/btrfs.h
@@ -18,8 +18,12 @@
  ****************************************************************************/
 #ifndef _UAPI_LINUX_BTRFS_H
 #define _UAPI_LINUX_BTRFS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
 #include <linux/types.h>
 #include <linux/ioctl.h>
+#include <linux/fs.h>
 #define BTRFS_IOCTL_MAGIC 0x94
 #define BTRFS_VOL_NAME_MAX 255
 #define BTRFS_LABEL_SIZE 256
@@ -59,7 +63,7 @@
   __u64 num_ref_copies;
   __u64 num_excl_copies;
   struct btrfs_qgroup_limit lim;
-  __u64 qgroups[0];
+  __u64 qgroups[];
 };
 struct btrfs_ioctl_qgroup_limit_args {
   __u64 qgroupid;
@@ -75,7 +79,7 @@
   union {
     struct {
       __u64 size;
-      struct btrfs_qgroup_inherit __user * qgroup_inherit;
+      struct btrfs_qgroup_inherit  * qgroup_inherit;
     };
     __u64 unused[4];
   };
@@ -176,6 +180,7 @@
 #define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE (1ULL << 0)
 #define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID (1ULL << 1)
 #define BTRFS_FEATURE_COMPAT_RO_VERITY (1ULL << 2)
+#define BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE (1ULL << 3)
 #define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0)
 #define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
 #define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
@@ -295,7 +300,7 @@
   __u64 offset;
   __u32 type;
   __u32 len;
-};
+} __attribute__((__may_alias__));
 #define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key))
 struct btrfs_ioctl_search_args {
   struct btrfs_ioctl_search_key key;
@@ -304,7 +309,7 @@
 struct btrfs_ioctl_search_args_v2 {
   struct btrfs_ioctl_search_key key;
   __u64 buf_size;
-  __u64 buf[0];
+  __u64 buf[];
 };
 struct btrfs_ioctl_clone_range_args {
   __s64 src_fd;
@@ -335,7 +340,7 @@
   __u16 dest_count;
   __u16 reserved1;
   __u32 reserved2;
-  struct btrfs_ioctl_same_extent_info info[0];
+  struct btrfs_ioctl_same_extent_info info[];
 };
 struct btrfs_ioctl_space_info {
   __u64 flags;
@@ -345,14 +350,14 @@
 struct btrfs_ioctl_space_args {
   __u64 space_slots;
   __u64 total_spaces;
-  struct btrfs_ioctl_space_info spaces[0];
+  struct btrfs_ioctl_space_info spaces[];
 };
 struct btrfs_data_container {
   __u32 bytes_left;
   __u32 bytes_missing;
   __u32 elem_cnt;
   __u32 elem_missed;
-  __u64 val[0];
+  __u64 val[];
 };
 struct btrfs_ioctl_ino_path_args {
   __u64 inum;
@@ -422,11 +427,12 @@
 #define BTRFS_SEND_FLAG_OMIT_STREAM_HEADER 0x2
 #define BTRFS_SEND_FLAG_OMIT_END_CMD 0x4
 #define BTRFS_SEND_FLAG_VERSION 0x8
-#define BTRFS_SEND_FLAG_MASK (BTRFS_SEND_FLAG_NO_FILE_DATA | BTRFS_SEND_FLAG_OMIT_STREAM_HEADER | BTRFS_SEND_FLAG_OMIT_END_CMD | BTRFS_SEND_FLAG_VERSION)
+#define BTRFS_SEND_FLAG_COMPRESSED 0x10
+#define BTRFS_SEND_FLAG_MASK (BTRFS_SEND_FLAG_NO_FILE_DATA | BTRFS_SEND_FLAG_OMIT_STREAM_HEADER | BTRFS_SEND_FLAG_OMIT_END_CMD | BTRFS_SEND_FLAG_VERSION | BTRFS_SEND_FLAG_COMPRESSED)
 struct btrfs_ioctl_send_args {
   __s64 send_fd;
   __u64 clone_sources_count;
-  __u64 __user * clone_sources;
+  __u64  * clone_sources;
   __u64 parent_root;
   __u64 flags;
   __u32 version;
@@ -463,7 +469,7 @@
   __u8 align[7];
 };
 struct btrfs_ioctl_encoded_io_args {
-  const struct iovec __user * iov;
+  const struct iovec  * iov;
   unsigned long iovcnt;
   __s64 offset;
   __u64 flags;
@@ -560,4 +566,7 @@
 #define BTRFS_IOC_SNAP_DESTROY_V2 _IOW(BTRFS_IOCTL_MAGIC, 63, struct btrfs_ioctl_vol_args_v2)
 #define BTRFS_IOC_ENCODED_READ _IOR(BTRFS_IOCTL_MAGIC, 64, struct btrfs_ioctl_encoded_io_args)
 #define BTRFS_IOC_ENCODED_WRITE _IOW(BTRFS_IOCTL_MAGIC, 64, struct btrfs_ioctl_encoded_io_args)
+#ifdef __cplusplus
+}
+#endif
 #endif
diff --git a/libc/kernel/uapi/linux/btrfs_tree.h b/libc/kernel/uapi/linux/btrfs_tree.h
index 02a9ae4..02422c0 100644
--- a/libc/kernel/uapi/linux/btrfs_tree.h
+++ b/libc/kernel/uapi/linux/btrfs_tree.h
@@ -21,6 +21,10 @@
 #include <linux/btrfs.h>
 #include <linux/types.h>
 #include <stddef.h>
+#define BTRFS_MAGIC 0x4D5F53665248425FULL
+#define BTRFS_MAX_LEVEL 8
+#define BTRFS_NAME_LEN 255
+#define BTRFS_LINK_MAX 65535U
 #define BTRFS_ROOT_TREE_OBJECTID 1ULL
 #define BTRFS_EXTENT_TREE_OBJECTID 2ULL
 #define BTRFS_CHUNK_TREE_OBJECTID 3ULL
@@ -113,6 +117,23 @@
 #define BTRFS_FT_SYMLINK 7
 #define BTRFS_FT_XATTR 8
 #define BTRFS_FT_MAX 9
+#define BTRFS_FT_ENCRYPTED 0x80
+#define BTRFS_INODE_NODATASUM (1U << 0)
+#define BTRFS_INODE_NODATACOW (1U << 1)
+#define BTRFS_INODE_READONLY (1U << 2)
+#define BTRFS_INODE_NOCOMPRESS (1U << 3)
+#define BTRFS_INODE_PREALLOC (1U << 4)
+#define BTRFS_INODE_SYNC (1U << 5)
+#define BTRFS_INODE_IMMUTABLE (1U << 6)
+#define BTRFS_INODE_APPEND (1U << 7)
+#define BTRFS_INODE_NODUMP (1U << 8)
+#define BTRFS_INODE_NOATIME (1U << 9)
+#define BTRFS_INODE_DIRSYNC (1U << 10)
+#define BTRFS_INODE_COMPRESS (1U << 11)
+#define BTRFS_INODE_ROOT_ITEM_INIT (1U << 31)
+#define BTRFS_INODE_FLAG_MASK (BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW | BTRFS_INODE_READONLY | BTRFS_INODE_NOCOMPRESS | BTRFS_INODE_PREALLOC | BTRFS_INODE_SYNC | BTRFS_INODE_IMMUTABLE | BTRFS_INODE_APPEND | BTRFS_INODE_NODUMP | BTRFS_INODE_NOATIME | BTRFS_INODE_DIRSYNC | BTRFS_INODE_COMPRESS | BTRFS_INODE_ROOT_ITEM_INIT)
+#define BTRFS_INODE_RO_VERITY (1U << 0)
+#define BTRFS_INODE_RO_FLAG_MASK (BTRFS_INODE_RO_VERITY)
 struct btrfs_disk_key {
   __le64 objectid;
   __u8 type;
@@ -123,6 +144,62 @@
   __u8 type;
   __u64 offset;
 } __attribute__((__packed__));
+struct btrfs_header {
+  __u8 csum[BTRFS_CSUM_SIZE];
+  __u8 fsid[BTRFS_FSID_SIZE];
+  __le64 bytenr;
+  __le64 flags;
+  __u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
+  __le64 generation;
+  __le64 owner;
+  __le32 nritems;
+  __u8 level;
+} __attribute__((__packed__));
+#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
+#define BTRFS_NUM_BACKUP_ROOTS 4
+struct btrfs_root_backup {
+  __le64 tree_root;
+  __le64 tree_root_gen;
+  __le64 chunk_root;
+  __le64 chunk_root_gen;
+  __le64 extent_root;
+  __le64 extent_root_gen;
+  __le64 fs_root;
+  __le64 fs_root_gen;
+  __le64 dev_root;
+  __le64 dev_root_gen;
+  __le64 csum_root;
+  __le64 csum_root_gen;
+  __le64 total_bytes;
+  __le64 bytes_used;
+  __le64 num_devices;
+  __le64 unused_64[4];
+  __u8 tree_root_level;
+  __u8 chunk_root_level;
+  __u8 extent_root_level;
+  __u8 fs_root_level;
+  __u8 dev_root_level;
+  __u8 csum_root_level;
+  __u8 unused_8[10];
+} __attribute__((__packed__));
+struct btrfs_item {
+  struct btrfs_disk_key key;
+  __le32 offset;
+  __le32 size;
+} __attribute__((__packed__));
+struct btrfs_leaf {
+  struct btrfs_header header;
+  struct btrfs_item items[];
+} __attribute__((__packed__));
+struct btrfs_key_ptr {
+  struct btrfs_disk_key key;
+  __le64 blockptr;
+  __le64 generation;
+} __attribute__((__packed__));
+struct btrfs_node {
+  struct btrfs_header header;
+  struct btrfs_key_ptr ptrs[];
+} __attribute__((__packed__));
 struct btrfs_dev_item {
   __le64 devid;
   __le64 total_bytes;
@@ -156,6 +233,45 @@
   __le16 sub_stripes;
   struct btrfs_stripe stripe;
 } __attribute__((__packed__));
+struct btrfs_super_block {
+  __u8 csum[BTRFS_CSUM_SIZE];
+  __u8 fsid[BTRFS_FSID_SIZE];
+  __le64 bytenr;
+  __le64 flags;
+  __le64 magic;
+  __le64 generation;
+  __le64 root;
+  __le64 chunk_root;
+  __le64 log_root;
+  __le64 __unused_log_root_transid;
+  __le64 total_bytes;
+  __le64 bytes_used;
+  __le64 root_dir_objectid;
+  __le64 num_devices;
+  __le32 sectorsize;
+  __le32 nodesize;
+  __le32 __unused_leafsize;
+  __le32 stripesize;
+  __le32 sys_chunk_array_size;
+  __le64 chunk_root_generation;
+  __le64 compat_flags;
+  __le64 compat_ro_flags;
+  __le64 incompat_flags;
+  __le16 csum_type;
+  __u8 root_level;
+  __u8 chunk_root_level;
+  __u8 log_root_level;
+  struct btrfs_dev_item dev_item;
+  char label[BTRFS_LABEL_SIZE];
+  __le64 cache_generation;
+  __le64 uuid_tree_generation;
+  __u8 metadata_uuid[BTRFS_FSID_SIZE];
+  __u64 nr_global_roots;
+  __le64 reserved[27];
+  __u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
+  struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
+  __u8 padding[565];
+} __attribute__((__packed__));
 #define BTRFS_FREE_SPACE_EXTENT 1
 #define BTRFS_FREE_SPACE_BITMAP 2
 struct btrfs_free_space_entry {
@@ -188,6 +304,11 @@
 #define BTRFS_EXTENT_FLAG_DATA (1ULL << 0)
 #define BTRFS_EXTENT_FLAG_TREE_BLOCK (1ULL << 1)
 #define BTRFS_BLOCK_FLAG_FULL_BACKREF (1ULL << 8)
+#define BTRFS_BACKREF_REV_MAX 256
+#define BTRFS_BACKREF_REV_SHIFT 56
+#define BTRFS_BACKREF_REV_MASK (((u64) BTRFS_BACKREF_REV_MAX - 1) << BTRFS_BACKREF_REV_SHIFT)
+#define BTRFS_OLD_BACKREF_REV 0
+#define BTRFS_MIXED_BACKREF_REV 1
 #define BTRFS_EXTENT_FLAG_SUPER (1ULL << 48)
 struct btrfs_tree_block_info {
   struct btrfs_disk_key key;
@@ -221,7 +342,7 @@
   __le64 parent_objectid;
   __le64 index;
   __le16 name_len;
-  __u8 name[0];
+  __u8 name[];
 } __attribute__((__packed__));
 struct btrfs_timespec {
   __le64 sec;
@@ -394,6 +515,7 @@
 #define BTRFS_QGROUP_STATUS_FLAG_ON (1ULL << 0)
 #define BTRFS_QGROUP_STATUS_FLAG_RESCAN (1ULL << 1)
 #define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT (1ULL << 2)
+#define BTRFS_QGROUP_STATUS_FLAGS_MASK (BTRFS_QGROUP_STATUS_FLAG_ON | BTRFS_QGROUP_STATUS_FLAG_RESCAN | BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT)
 #define BTRFS_QGROUP_STATUS_VERSION 1
 struct btrfs_qgroup_status_item {
   __le64 version;
diff --git a/libc/kernel/uapi/linux/byteorder/big_endian.h b/libc/kernel/uapi/linux/byteorder/big_endian.h
index b6c978b..82c5a4c 100644
--- a/libc/kernel/uapi/linux/byteorder/big_endian.h
+++ b/libc/kernel/uapi/linux/byteorder/big_endian.h
@@ -27,34 +27,34 @@
 #include <linux/stddef.h>
 #include <linux/types.h>
 #include <linux/swab.h>
-#define __constant_htonl(x) ((__force __be32) (__u32) (x))
-#define __constant_ntohl(x) ((__force __u32) (__be32) (x))
-#define __constant_htons(x) ((__force __be16) (__u16) (x))
-#define __constant_ntohs(x) ((__force __u16) (__be16) (x))
-#define __constant_cpu_to_le64(x) ((__force __le64) ___constant_swab64((x)))
-#define __constant_le64_to_cpu(x) ___constant_swab64((__force __u64) (__le64) (x))
-#define __constant_cpu_to_le32(x) ((__force __le32) ___constant_swab32((x)))
-#define __constant_le32_to_cpu(x) ___constant_swab32((__force __u32) (__le32) (x))
-#define __constant_cpu_to_le16(x) ((__force __le16) ___constant_swab16((x)))
-#define __constant_le16_to_cpu(x) ___constant_swab16((__force __u16) (__le16) (x))
-#define __constant_cpu_to_be64(x) ((__force __be64) (__u64) (x))
-#define __constant_be64_to_cpu(x) ((__force __u64) (__be64) (x))
-#define __constant_cpu_to_be32(x) ((__force __be32) (__u32) (x))
-#define __constant_be32_to_cpu(x) ((__force __u32) (__be32) (x))
-#define __constant_cpu_to_be16(x) ((__force __be16) (__u16) (x))
-#define __constant_be16_to_cpu(x) ((__force __u16) (__be16) (x))
-#define __cpu_to_le64(x) ((__force __le64) __swab64((x)))
-#define __le64_to_cpu(x) __swab64((__force __u64) (__le64) (x))
-#define __cpu_to_le32(x) ((__force __le32) __swab32((x)))
-#define __le32_to_cpu(x) __swab32((__force __u32) (__le32) (x))
-#define __cpu_to_le16(x) ((__force __le16) __swab16((x)))
-#define __le16_to_cpu(x) __swab16((__force __u16) (__le16) (x))
-#define __cpu_to_be64(x) ((__force __be64) (__u64) (x))
-#define __be64_to_cpu(x) ((__force __u64) (__be64) (x))
-#define __cpu_to_be32(x) ((__force __be32) (__u32) (x))
-#define __be32_to_cpu(x) ((__force __u32) (__be32) (x))
-#define __cpu_to_be16(x) ((__force __be16) (__u16) (x))
-#define __be16_to_cpu(x) ((__force __u16) (__be16) (x))
+#define __constant_htonl(x) (( __be32) (__u32) (x))
+#define __constant_ntohl(x) (( __u32) (__be32) (x))
+#define __constant_htons(x) (( __be16) (__u16) (x))
+#define __constant_ntohs(x) (( __u16) (__be16) (x))
+#define __constant_cpu_to_le64(x) (( __le64) ___constant_swab64((x)))
+#define __constant_le64_to_cpu(x) ___constant_swab64(( __u64) (__le64) (x))
+#define __constant_cpu_to_le32(x) (( __le32) ___constant_swab32((x)))
+#define __constant_le32_to_cpu(x) ___constant_swab32(( __u32) (__le32) (x))
+#define __constant_cpu_to_le16(x) (( __le16) ___constant_swab16((x)))
+#define __constant_le16_to_cpu(x) ___constant_swab16(( __u16) (__le16) (x))
+#define __constant_cpu_to_be64(x) (( __be64) (__u64) (x))
+#define __constant_be64_to_cpu(x) (( __u64) (__be64) (x))
+#define __constant_cpu_to_be32(x) (( __be32) (__u32) (x))
+#define __constant_be32_to_cpu(x) (( __u32) (__be32) (x))
+#define __constant_cpu_to_be16(x) (( __be16) (__u16) (x))
+#define __constant_be16_to_cpu(x) (( __u16) (__be16) (x))
+#define __cpu_to_le64(x) (( __le64) __swab64((x)))
+#define __le64_to_cpu(x) __swab64(( __u64) (__le64) (x))
+#define __cpu_to_le32(x) (( __le32) __swab32((x)))
+#define __le32_to_cpu(x) __swab32(( __u32) (__le32) (x))
+#define __cpu_to_le16(x) (( __le16) __swab16((x)))
+#define __le16_to_cpu(x) __swab16(( __u16) (__le16) (x))
+#define __cpu_to_be64(x) (( __be64) (__u64) (x))
+#define __be64_to_cpu(x) (( __u64) (__be64) (x))
+#define __cpu_to_be32(x) (( __be32) (__u32) (x))
+#define __be32_to_cpu(x) (( __u32) (__be32) (x))
+#define __cpu_to_be16(x) (( __be16) (__u16) (x))
+#define __be16_to_cpu(x) (( __u16) (__be16) (x))
 #define __cpu_to_le64s(x) __swab64s((x))
 #define __le64_to_cpus(x) __swab64s((x))
 #define __cpu_to_le32s(x) __swab32s((x))
diff --git a/libc/kernel/uapi/linux/byteorder/little_endian.h b/libc/kernel/uapi/linux/byteorder/little_endian.h
index a272d4d..28155b5 100644
--- a/libc/kernel/uapi/linux/byteorder/little_endian.h
+++ b/libc/kernel/uapi/linux/byteorder/little_endian.h
@@ -27,34 +27,34 @@
 #include <linux/stddef.h>
 #include <linux/types.h>
 #include <linux/swab.h>
-#define __constant_htonl(x) ((__force __be32) ___constant_swab32((x)))
-#define __constant_ntohl(x) ___constant_swab32((__force __be32) (x))
-#define __constant_htons(x) ((__force __be16) ___constant_swab16((x)))
-#define __constant_ntohs(x) ___constant_swab16((__force __be16) (x))
-#define __constant_cpu_to_le64(x) ((__force __le64) (__u64) (x))
-#define __constant_le64_to_cpu(x) ((__force __u64) (__le64) (x))
-#define __constant_cpu_to_le32(x) ((__force __le32) (__u32) (x))
-#define __constant_le32_to_cpu(x) ((__force __u32) (__le32) (x))
-#define __constant_cpu_to_le16(x) ((__force __le16) (__u16) (x))
-#define __constant_le16_to_cpu(x) ((__force __u16) (__le16) (x))
-#define __constant_cpu_to_be64(x) ((__force __be64) ___constant_swab64((x)))
-#define __constant_be64_to_cpu(x) ___constant_swab64((__force __u64) (__be64) (x))
-#define __constant_cpu_to_be32(x) ((__force __be32) ___constant_swab32((x)))
-#define __constant_be32_to_cpu(x) ___constant_swab32((__force __u32) (__be32) (x))
-#define __constant_cpu_to_be16(x) ((__force __be16) ___constant_swab16((x)))
-#define __constant_be16_to_cpu(x) ___constant_swab16((__force __u16) (__be16) (x))
-#define __cpu_to_le64(x) ((__force __le64) (__u64) (x))
-#define __le64_to_cpu(x) ((__force __u64) (__le64) (x))
-#define __cpu_to_le32(x) ((__force __le32) (__u32) (x))
-#define __le32_to_cpu(x) ((__force __u32) (__le32) (x))
-#define __cpu_to_le16(x) ((__force __le16) (__u16) (x))
-#define __le16_to_cpu(x) ((__force __u16) (__le16) (x))
-#define __cpu_to_be64(x) ((__force __be64) __swab64((x)))
-#define __be64_to_cpu(x) __swab64((__force __u64) (__be64) (x))
-#define __cpu_to_be32(x) ((__force __be32) __swab32((x)))
-#define __be32_to_cpu(x) __swab32((__force __u32) (__be32) (x))
-#define __cpu_to_be16(x) ((__force __be16) __swab16((x)))
-#define __be16_to_cpu(x) __swab16((__force __u16) (__be16) (x))
+#define __constant_htonl(x) (( __be32) ___constant_swab32((x)))
+#define __constant_ntohl(x) ___constant_swab32(( __be32) (x))
+#define __constant_htons(x) (( __be16) ___constant_swab16((x)))
+#define __constant_ntohs(x) ___constant_swab16(( __be16) (x))
+#define __constant_cpu_to_le64(x) (( __le64) (__u64) (x))
+#define __constant_le64_to_cpu(x) (( __u64) (__le64) (x))
+#define __constant_cpu_to_le32(x) (( __le32) (__u32) (x))
+#define __constant_le32_to_cpu(x) (( __u32) (__le32) (x))
+#define __constant_cpu_to_le16(x) (( __le16) (__u16) (x))
+#define __constant_le16_to_cpu(x) (( __u16) (__le16) (x))
+#define __constant_cpu_to_be64(x) (( __be64) ___constant_swab64((x)))
+#define __constant_be64_to_cpu(x) ___constant_swab64(( __u64) (__be64) (x))
+#define __constant_cpu_to_be32(x) (( __be32) ___constant_swab32((x)))
+#define __constant_be32_to_cpu(x) ___constant_swab32(( __u32) (__be32) (x))
+#define __constant_cpu_to_be16(x) (( __be16) ___constant_swab16((x)))
+#define __constant_be16_to_cpu(x) ___constant_swab16(( __u16) (__be16) (x))
+#define __cpu_to_le64(x) (( __le64) (__u64) (x))
+#define __le64_to_cpu(x) (( __u64) (__le64) (x))
+#define __cpu_to_le32(x) (( __le32) (__u32) (x))
+#define __le32_to_cpu(x) (( __u32) (__le32) (x))
+#define __cpu_to_le16(x) (( __le16) (__u16) (x))
+#define __le16_to_cpu(x) (( __u16) (__le16) (x))
+#define __cpu_to_be64(x) (( __be64) __swab64((x)))
+#define __be64_to_cpu(x) __swab64(( __u64) (__be64) (x))
+#define __cpu_to_be32(x) (( __be32) __swab32((x)))
+#define __be32_to_cpu(x) __swab32(( __u32) (__be32) (x))
+#define __cpu_to_be16(x) (( __be16) __swab16((x)))
+#define __be16_to_cpu(x) __swab16(( __u16) (__be16) (x))
 #define __cpu_to_le64s(x) do { (void) (x); } while(0)
 #define __le64_to_cpus(x) do { (void) (x); } while(0)
 #define __cpu_to_le32s(x) do { (void) (x); } while(0)
diff --git a/libc/kernel/uapi/linux/can.h b/libc/kernel/uapi/linux/can.h
index 30eeca2..1365dba 100644
--- a/libc/kernel/uapi/linux/can.h
+++ b/libc/kernel/uapi/linux/can.h
@@ -20,21 +20,29 @@
 #define _UAPI_CAN_H
 #include <linux/types.h>
 #include <linux/socket.h>
+#include <linux/stddef.h>
 #define CAN_EFF_FLAG 0x80000000U
 #define CAN_RTR_FLAG 0x40000000U
 #define CAN_ERR_FLAG 0x20000000U
 #define CAN_SFF_MASK 0x000007FFU
 #define CAN_EFF_MASK 0x1FFFFFFFU
 #define CAN_ERR_MASK 0x1FFFFFFFU
+#define CANXL_PRIO_MASK CAN_SFF_MASK
 typedef __u32 canid_t;
 #define CAN_SFF_ID_BITS 11
 #define CAN_EFF_ID_BITS 29
+#define CANXL_PRIO_BITS CAN_SFF_ID_BITS
 typedef __u32 can_err_mask_t;
 #define CAN_MAX_DLC 8
 #define CAN_MAX_RAW_DLC 15
 #define CAN_MAX_DLEN 8
 #define CANFD_MAX_DLC 15
 #define CANFD_MAX_DLEN 64
+#define CANXL_MIN_DLC 0
+#define CANXL_MAX_DLC 2047
+#define CANXL_MAX_DLC_MASK 0x07FF
+#define CANXL_MIN_DLEN 1
+#define CANXL_MAX_DLEN 2048
 struct can_frame {
   canid_t can_id;
   union {
@@ -57,8 +65,22 @@
   __u8 __res1;
   __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
 };
+#define CANXL_XLF 0x80
+#define CANXL_SEC 0x01
+struct canxl_frame {
+  canid_t prio;
+  __u8 flags;
+  __u8 sdt;
+  __u16 len;
+  __u32 af;
+  __u8 data[CANXL_MAX_DLEN];
+};
 #define CAN_MTU (sizeof(struct can_frame))
 #define CANFD_MTU (sizeof(struct canfd_frame))
+#define CANXL_MTU (sizeof(struct canxl_frame))
+#define CANXL_HDR_SIZE (offsetof(struct canxl_frame, data))
+#define CANXL_MIN_MTU (CANXL_HDR_SIZE + 64)
+#define CANXL_MAX_MTU CANXL_MTU
 #define CAN_RAW 1
 #define CAN_BCM 2
 #define CAN_TP16 3
diff --git a/libc/kernel/uapi/linux/can/bcm.h b/libc/kernel/uapi/linux/can/bcm.h
index 42e0782..f5ab2c2 100644
--- a/libc/kernel/uapi/linux/can/bcm.h
+++ b/libc/kernel/uapi/linux/can/bcm.h
@@ -31,7 +31,7 @@
   struct bcm_timeval ival1, ival2;
   canid_t can_id;
   __u32 nframes;
-  struct can_frame frames[0];
+  struct can_frame frames[];
 };
 enum {
   TX_SETUP = 1,
diff --git a/libc/kernel/uapi/linux/can/error.h b/libc/kernel/uapi/linux/can/error.h
index 645373b..f585d2c 100644
--- a/libc/kernel/uapi/linux/can/error.h
+++ b/libc/kernel/uapi/linux/can/error.h
@@ -28,6 +28,7 @@
 #define CAN_ERR_BUSOFF 0x00000040U
 #define CAN_ERR_BUSERROR 0x00000080U
 #define CAN_ERR_RESTARTED 0x00000100U
+#define CAN_ERR_CNT 0x00000200U
 #define CAN_ERR_LOSTARB_UNSPEC 0x00
 #define CAN_ERR_CRTL_UNSPEC 0x00
 #define CAN_ERR_CRTL_RX_OVERFLOW 0x01
@@ -76,4 +77,7 @@
 #define CAN_ERR_TRX_CANL_SHORT_TO_VCC 0x60
 #define CAN_ERR_TRX_CANL_SHORT_TO_GND 0x70
 #define CAN_ERR_TRX_CANL_SHORT_TO_CANH 0x80
+#define CAN_ERROR_WARNING_THRESHOLD 96
+#define CAN_ERROR_PASSIVE_THRESHOLD 128
+#define CAN_BUS_OFF_THRESHOLD 256
 #endif
diff --git a/libc/kernel/uapi/linux/can/raw.h b/libc/kernel/uapi/linux/can/raw.h
index a3bddb7..f8de179 100644
--- a/libc/kernel/uapi/linux/can/raw.h
+++ b/libc/kernel/uapi/linux/can/raw.h
@@ -30,5 +30,6 @@
   CAN_RAW_RECV_OWN_MSGS,
   CAN_RAW_FD_FRAMES,
   CAN_RAW_JOIN_FILTERS,
+  CAN_RAW_XL_FRAMES,
 };
 #endif
diff --git a/libc/kernel/uapi/linux/capability.h b/libc/kernel/uapi/linux/capability.h
index 958e6ab..8f3281e 100644
--- a/libc/kernel/uapi/linux/capability.h
+++ b/libc/kernel/uapi/linux/capability.h
@@ -28,12 +28,12 @@
 typedef struct __user_cap_header_struct {
   __u32 version;
   int pid;
-} __user * cap_user_header_t;
+}  * cap_user_header_t;
 typedef struct __user_cap_data_struct {
   __u32 effective;
   __u32 permitted;
   __u32 inheritable;
-} __user * cap_user_data_t;
+}  * cap_user_data_t;
 #define VFS_CAP_REVISION_MASK 0xFF000000
 #define VFS_CAP_REVISION_SHIFT 24
 #define VFS_CAP_FLAGS_MASK ~VFS_CAP_REVISION_MASK
@@ -111,5 +111,5 @@
 #define CAP_LAST_CAP CAP_CHECKPOINT_RESTORE
 #define cap_valid(x) ((x) >= 0 && (x) <= CAP_LAST_CAP)
 #define CAP_TO_INDEX(x) ((x) >> 5)
-#define CAP_TO_MASK(x) (1 << ((x) & 31))
+#define CAP_TO_MASK(x) (1U << ((x) & 31))
 #endif
diff --git a/libc/kernel/uapi/linux/capi.h b/libc/kernel/uapi/linux/capi.h
index de2a839..a09f9bc 100644
--- a/libc/kernel/uapi/linux/capi.h
+++ b/libc/kernel/uapi/linux/capi.h
@@ -51,7 +51,7 @@
 #define CAPI_GET_PROFILE _IOWR('C', 0x09, struct capi_profile)
 typedef struct capi_manufacturer_cmd {
   unsigned long cmd;
-  void __user * data;
+  void  * data;
 } capi_manufacturer_cmd;
 #define CAPI_MANUFACTURER_CMD _IOWR('C', 0x20, struct capi_manufacturer_cmd)
 #define CAPI_GET_ERRCODE _IOR('C', 0x21, __u16)
diff --git a/libc/kernel/uapi/linux/cciss_ioctl.h b/libc/kernel/uapi/linux/cciss_ioctl.h
index 3e9bb3b..827e6a0 100644
--- a/libc/kernel/uapi/linux/cciss_ioctl.h
+++ b/libc/kernel/uapi/linux/cciss_ioctl.h
@@ -47,7 +47,7 @@
   RequestBlock_struct Request;
   ErrorInfo_struct error_info;
   WORD buf_size;
-  BYTE __user * buf;
+  BYTE  * buf;
 } IOCTL_Command_struct;
 typedef struct _BIG_IOCTL_Command_struct {
   LUNAddr_struct LUN_info;
@@ -55,7 +55,7 @@
   ErrorInfo_struct error_info;
   DWORD malloc_size;
   DWORD buf_size;
-  BYTE __user * buf;
+  BYTE  * buf;
 } BIG_IOCTL_Command_struct;
 typedef struct _LogvolInfo_struct {
   __u32 LunID;
diff --git a/libc/kernel/uapi/linux/cdrom.h b/libc/kernel/uapi/linux/cdrom.h
index 0fe0727..bd1d7df 100644
--- a/libc/kernel/uapi/linux/cdrom.h
+++ b/libc/kernel/uapi/linux/cdrom.h
@@ -128,7 +128,7 @@
   union cdrom_addr addr;
   __u8 addr_format;
   int nframes;
-  __u8 __user * buf;
+  __u8  * buf;
 };
 struct cdrom_multisession {
   union cdrom_addr addr;
@@ -149,16 +149,16 @@
 #define CGC_DATA_NONE 3
 struct cdrom_generic_command {
   unsigned char cmd[CDROM_PACKET_SIZE];
-  unsigned char __user * buffer;
+  unsigned char  * buffer;
   unsigned int buflen;
   int stat;
-  struct request_sense __user * sense;
+  struct request_sense  * sense;
   unsigned char data_direction;
   int quiet;
   int timeout;
   union {
-    void __user * reserved[1];
-    void __user * unused;
+    void  * reserved[1];
+    void  * unused;
   };
 };
 struct cdrom_timed_media_change_info {
diff --git a/libc/kernel/uapi/linux/cec.h b/libc/kernel/uapi/linux/cec.h
index b90dc49..3953fe3 100644
--- a/libc/kernel/uapi/linux/cec.h
+++ b/libc/kernel/uapi/linux/cec.h
@@ -340,6 +340,7 @@
 #define CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE 0x08
 #define CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX 0x04
 #define CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX 0x02
+#define CEC_OP_FEAT_DEV_HAS_SET_AUDIO_VOLUME_LEVEL 0x01
 #define CEC_MSG_GIVE_FEATURES 0xa5
 #define CEC_MSG_DECK_CONTROL 0x42
 #define CEC_OP_DECK_CTL_MODE_SKIP_FWD 1
@@ -554,6 +555,7 @@
 #define CEC_MSG_SYSTEM_AUDIO_MODE_STATUS 0x7e
 #define CEC_OP_AUD_FMT_ID_CEA861 0
 #define CEC_OP_AUD_FMT_ID_CEA861_CXT 1
+#define CEC_MSG_SET_AUDIO_VOLUME_LEVEL 0x73
 #define CEC_MSG_SET_AUDIO_RATE 0x9a
 #define CEC_OP_AUD_RATE_OFF 0
 #define CEC_OP_AUD_RATE_WIDE_STD 1
diff --git a/libc/kernel/uapi/linux/chio.h b/libc/kernel/uapi/linux/chio.h
index 725e760..74f286f 100644
--- a/libc/kernel/uapi/linux/chio.h
+++ b/libc/kernel/uapi/linux/chio.h
@@ -71,7 +71,7 @@
 #define CP_INVERT 1
 struct changer_element_status {
   int ces_type;
-  unsigned char __user * ces_data;
+  unsigned char  * ces_data;
 };
 #define CESTATUS_FULL 0x01
 #define CESTATUS_IMPEXP 0x02
diff --git a/libc/kernel/uapi/linux/coda.h b/libc/kernel/uapi/linux/coda.h
index aad1b97..5795cdf 100644
--- a/libc/kernel/uapi/linux/coda.h
+++ b/libc/kernel/uapi/linux/coda.h
@@ -505,13 +505,13 @@
 };
 #define PIOCPARM_MASK 0x0000ffff
 struct ViceIoctl {
-  void __user * in;
-  void __user * out;
+  void  * in;
+  void  * out;
   u_short in_size;
   u_short out_size;
 };
 struct PioctlData {
-  const char __user * path;
+  const char  * path;
   int follow;
   struct ViceIoctl vi;
 };
diff --git a/libc/kernel/uapi/linux/comedi.h b/libc/kernel/uapi/linux/comedi.h
index e0d015a..465d1bf 100644
--- a/libc/kernel/uapi/linux/comedi.h
+++ b/libc/kernel/uapi/linux/comedi.h
@@ -244,14 +244,14 @@
 struct comedi_insn {
   unsigned int insn;
   unsigned int n;
-  unsigned int __user * data;
+  unsigned int  * data;
   unsigned int subdev;
   unsigned int chanspec;
   unsigned int unused[3];
 };
 struct comedi_insnlist {
   unsigned int n_insns;
-  struct comedi_insn __user * insns;
+  struct comedi_insn  * insns;
 };
 struct comedi_cmd {
   unsigned int subdev;
@@ -268,19 +268,19 @@
   unsigned int stop_arg;
   unsigned int * chanlist;
   unsigned int chanlist_len;
-  short __user * data;
+  short  * data;
   unsigned int data_len;
 };
 struct comedi_chaninfo {
   unsigned int subdev;
-  unsigned int __user * maxdata_list;
-  unsigned int __user * flaglist;
-  unsigned int __user * rangelist;
+  unsigned int  * maxdata_list;
+  unsigned int  * flaglist;
+  unsigned int  * rangelist;
   unsigned int unused[4];
 };
 struct comedi_rangeinfo {
   unsigned int range_type;
-  void __user * range_ptr;
+  void  * range_ptr;
 };
 struct comedi_krange {
   int min;
diff --git a/libc/kernel/uapi/linux/connector.h b/libc/kernel/uapi/linux/connector.h
index adf3a7f..e3891e3 100644
--- a/libc/kernel/uapi/linux/connector.h
+++ b/libc/kernel/uapi/linux/connector.h
@@ -50,6 +50,6 @@
   __u32 ack;
   __u16 len;
   __u16 flags;
-  __u8 data[0];
+  __u8 data[];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/counter.h b/libc/kernel/uapi/linux/counter.h
index 4b86b28..f986365 100644
--- a/libc/kernel/uapi/linux/counter.h
+++ b/libc/kernel/uapi/linux/counter.h
@@ -46,6 +46,7 @@
   COUNTER_EVENT_THRESHOLD,
   COUNTER_EVENT_INDEX,
   COUNTER_EVENT_CHANGE_OF_STATE,
+  COUNTER_EVENT_CAPTURE,
 };
 struct counter_watch {
   struct counter_component component;
@@ -91,4 +92,8 @@
   COUNTER_SYNAPSE_ACTION_FALLING_EDGE,
   COUNTER_SYNAPSE_ACTION_BOTH_EDGES,
 };
+enum counter_signal_polarity {
+  COUNTER_SIGNAL_POLARITY_POSITIVE,
+  COUNTER_SIGNAL_POLARITY_NEGATIVE,
+};
 #endif
diff --git a/libc/kernel/uapi/linux/cxl_mem.h b/libc/kernel/uapi/linux/cxl_mem.h
index 578cefd..c94af87 100644
--- a/libc/kernel/uapi/linux/cxl_mem.h
+++ b/libc/kernel/uapi/linux/cxl_mem.h
@@ -44,7 +44,7 @@
 struct cxl_mem_query_commands {
   __u32 n_commands;
   __u32 rsvd;
-  struct cxl_command_info __user commands[];
+  struct cxl_command_info  commands[];
 };
 struct cxl_send_command {
   __u32 id;
diff --git a/libc/kernel/uapi/linux/cycx_cfm.h b/libc/kernel/uapi/linux/cycx_cfm.h
index 052de53..230b58d 100644
--- a/libc/kernel/uapi/linux/cycx_cfm.h
+++ b/libc/kernel/uapi/linux/cycx_cfm.h
@@ -53,7 +53,7 @@
   unsigned short reserved[6];
   char descr[CFM_DESCR_LEN];
   struct cycx_fw_info info;
-  unsigned char image[0];
+  unsigned char image[];
 };
 struct cycx_fw_header {
   unsigned long reset_size;
diff --git a/libc/kernel/uapi/linux/dcbnl.h b/libc/kernel/uapi/linux/dcbnl.h
index d1f2eba..bc88387 100644
--- a/libc/kernel/uapi/linux/dcbnl.h
+++ b/libc/kernel/uapi/linux/dcbnl.h
@@ -99,11 +99,13 @@
 #define IEEE_8021QAZ_APP_SEL_DGRAM 3
 #define IEEE_8021QAZ_APP_SEL_ANY 4
 #define IEEE_8021QAZ_APP_SEL_DSCP 5
+#define DCB_APP_SEL_PCP 255
 struct dcb_app {
   __u8 selector;
   __u8 priority;
   __u16 protocol;
 };
+#define IEEE_8021QAZ_APP_SEL_MAX 255
 struct dcb_peer_app_info {
   __u8 willing;
   __u8 error;
@@ -178,12 +180,14 @@
   DCB_ATTR_IEEE_QCN,
   DCB_ATTR_IEEE_QCN_STATS,
   DCB_ATTR_DCB_BUFFER,
+  DCB_ATTR_DCB_APP_TRUST_TABLE,
   __DCB_ATTR_IEEE_MAX
 };
 #define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1)
 enum ieee_attrs_app {
   DCB_ATTR_IEEE_APP_UNSPEC,
   DCB_ATTR_IEEE_APP,
+  DCB_ATTR_DCB_APP,
   __DCB_ATTR_IEEE_APP_MAX
 };
 #define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1)
diff --git a/libc/kernel/uapi/linux/devlink.h b/libc/kernel/uapi/linux/devlink.h
index b45865e..b7705c3 100644
--- a/libc/kernel/uapi/linux/devlink.h
+++ b/libc/kernel/uapi/linux/devlink.h
@@ -107,6 +107,8 @@
   DEVLINK_CMD_LINECARD_SET,
   DEVLINK_CMD_LINECARD_NEW,
   DEVLINK_CMD_LINECARD_DEL,
+  DEVLINK_CMD_SELFTESTS_GET,
+  DEVLINK_CMD_SELFTESTS_RUN,
   __DEVLINK_CMD_MAX,
   DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
 };
@@ -188,6 +190,25 @@
 #define DEVLINK_FLASH_OVERWRITE_SETTINGS _BITUL(DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT)
 #define DEVLINK_FLASH_OVERWRITE_IDENTIFIERS _BITUL(DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT)
 #define DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS (_BITUL(__DEVLINK_FLASH_OVERWRITE_MAX_BIT) - 1)
+enum devlink_attr_selftest_id {
+  DEVLINK_ATTR_SELFTEST_ID_UNSPEC,
+  DEVLINK_ATTR_SELFTEST_ID_FLASH,
+  __DEVLINK_ATTR_SELFTEST_ID_MAX,
+  DEVLINK_ATTR_SELFTEST_ID_MAX = __DEVLINK_ATTR_SELFTEST_ID_MAX - 1
+};
+enum devlink_selftest_status {
+  DEVLINK_SELFTEST_STATUS_SKIP,
+  DEVLINK_SELFTEST_STATUS_PASS,
+  DEVLINK_SELFTEST_STATUS_FAIL
+};
+enum devlink_attr_selftest_result {
+  DEVLINK_ATTR_SELFTEST_RESULT_UNSPEC,
+  DEVLINK_ATTR_SELFTEST_RESULT,
+  DEVLINK_ATTR_SELFTEST_RESULT_ID,
+  DEVLINK_ATTR_SELFTEST_RESULT_STATUS,
+  __DEVLINK_ATTR_SELFTEST_RESULT_MAX,
+  DEVLINK_ATTR_SELFTEST_RESULT_MAX = __DEVLINK_ATTR_SELFTEST_RESULT_MAX - 1
+};
 enum devlink_trap_action {
   DEVLINK_TRAP_ACTION_DROP,
   DEVLINK_TRAP_ACTION_TRAP,
@@ -403,6 +424,11 @@
   DEVLINK_ATTR_LINECARD_STATE,
   DEVLINK_ATTR_LINECARD_TYPE,
   DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES,
+  DEVLINK_ATTR_NESTED_DEVLINK,
+  DEVLINK_ATTR_SELFTESTS,
+  DEVLINK_ATTR_RATE_TX_PRIORITY,
+  DEVLINK_ATTR_RATE_TX_WEIGHT,
+  DEVLINK_ATTR_REGION_DIRECT,
   __DEVLINK_ATTR_MAX,
   DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1
 };
@@ -433,11 +459,19 @@
 enum devlink_resource_unit {
   DEVLINK_RESOURCE_UNIT_ENTRY,
 };
+enum devlink_port_fn_attr_cap {
+  DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT,
+  DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT,
+  __DEVLINK_PORT_FN_ATTR_CAPS_MAX,
+};
+#define DEVLINK_PORT_FN_CAP_ROCE _BITUL(DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT)
+#define DEVLINK_PORT_FN_CAP_MIGRATABLE _BITUL(DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT)
 enum devlink_port_function_attr {
   DEVLINK_PORT_FUNCTION_ATTR_UNSPEC,
   DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR,
   DEVLINK_PORT_FN_ATTR_STATE,
   DEVLINK_PORT_FN_ATTR_OPSTATE,
+  DEVLINK_PORT_FN_ATTR_CAPS,
   __DEVLINK_PORT_FUNCTION_ATTR_MAX,
   DEVLINK_PORT_FUNCTION_ATTR_MAX = __DEVLINK_PORT_FUNCTION_ATTR_MAX - 1
 };
diff --git a/libc/kernel/uapi/linux/dlm.h b/libc/kernel/uapi/linux/dlm.h
index c75918f..499baad 100644
--- a/libc/kernel/uapi/linux/dlm.h
+++ b/libc/kernel/uapi/linux/dlm.h
@@ -31,6 +31,5 @@
   char * sb_lvbptr;
 };
 #define DLM_LSFL_TIMEWARN 0x00000002
-#define DLM_LSFL_FS 0x00000004
 #define DLM_LSFL_NEWEXCL 0x00000008
 #endif
diff --git a/libc/kernel/uapi/linux/dlm_device.h b/libc/kernel/uapi/linux/dlm_device.h
index 5e54d2e..e1b0c6d 100644
--- a/libc/kernel/uapi/linux/dlm_device.h
+++ b/libc/kernel/uapi/linux/dlm_device.h
@@ -33,11 +33,11 @@
   __u32 parent;
   __u64 xid;
   __u64 timeout;
-  void __user * castparam;
-  void __user * castaddr;
-  void __user * bastparam;
-  void __user * bastaddr;
-  struct dlm_lksb __user * lksb;
+  void  * castparam;
+  void  * castaddr;
+  void  * bastparam;
+  void  * bastaddr;
+  struct dlm_lksb  * lksb;
   char lvb[DLM_USER_LVB_LEN];
   char name[];
 };
@@ -67,9 +67,9 @@
 struct dlm_lock_result {
   __u32 version[3];
   __u32 length;
-  void __user * user_astaddr;
-  void __user * user_astparam;
-  struct dlm_lksb __user * user_lksb;
+  void  * user_astaddr;
+  void  * user_astparam;
+  struct dlm_lksb  * user_lksb;
   struct dlm_lksb lksb;
   __u8 bast_mode;
   __u8 unused[3];
diff --git a/libc/kernel/uapi/linux/dm-ioctl.h b/libc/kernel/uapi/linux/dm-ioctl.h
index 98cbc1f..f0ff78c 100644
--- a/libc/kernel/uapi/linux/dm-ioctl.h
+++ b/libc/kernel/uapi/linux/dm-ioctl.h
@@ -48,23 +48,23 @@
 struct dm_target_deps {
   __u32 count;
   __u32 padding;
-  __u64 dev[0];
+  __u64 dev[];
 };
 struct dm_name_list {
   __u64 dev;
   __u32 next;
-  char name[0];
+  char name[];
 };
 #define DM_NAME_LIST_FLAG_HAS_UUID 1
 #define DM_NAME_LIST_FLAG_DOESNT_HAVE_UUID 2
 struct dm_target_versions {
   __u32 next;
   __u32 version[3];
-  char name[0];
+  char name[];
 };
 struct dm_target_msg {
   __u64 sector;
-  char message[0];
+  char message[];
 };
 enum {
   DM_VERSION_CMD = 0,
@@ -106,9 +106,9 @@
 #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
 #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
 #define DM_VERSION_MAJOR 4
-#define DM_VERSION_MINOR 46
+#define DM_VERSION_MINOR 47
 #define DM_VERSION_PATCHLEVEL 0
-#define DM_VERSION_EXTRA "-ioctl(2022-02-22)"
+#define DM_VERSION_EXTRA "-ioctl(2022-07-28)"
 #define DM_READONLY_FLAG (1 << 0)
 #define DM_SUSPEND_FLAG (1 << 1)
 #define DM_PERSISTENT_DEV_FLAG (1 << 3)
diff --git a/libc/kernel/uapi/linux/dm-log-userspace.h b/libc/kernel/uapi/linux/dm-log-userspace.h
index 4f0671b..37feee6 100644
--- a/libc/kernel/uapi/linux/dm-log-userspace.h
+++ b/libc/kernel/uapi/linux/dm-log-userspace.h
@@ -49,6 +49,6 @@
   __u32 seq;
   __u32 request_type;
   __u32 data_size;
-  char data[0];
+  char data[];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/dma-buf.h b/libc/kernel/uapi/linux/dma-buf.h
index 4e31379..7462c15 100644
--- a/libc/kernel/uapi/linux/dma-buf.h
+++ b/libc/kernel/uapi/linux/dma-buf.h
@@ -29,9 +29,19 @@
 #define DMA_BUF_SYNC_END (1 << 2)
 #define DMA_BUF_SYNC_VALID_FLAGS_MASK (DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END)
 #define DMA_BUF_NAME_LEN 32
+struct dma_buf_export_sync_file {
+  __u32 flags;
+  __s32 fd;
+};
+struct dma_buf_import_sync_file {
+  __u32 flags;
+  __s32 fd;
+};
 #define DMA_BUF_BASE 'b'
 #define DMA_BUF_IOCTL_SYNC _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
 #define DMA_BUF_SET_NAME _IOW(DMA_BUF_BASE, 1, const char *)
 #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, __u32)
 #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, __u64)
+#define DMA_BUF_IOCTL_EXPORT_SYNC_FILE _IOWR(DMA_BUF_BASE, 2, struct dma_buf_export_sync_file)
+#define DMA_BUF_IOCTL_IMPORT_SYNC_FILE _IOW(DMA_BUF_BASE, 3, struct dma_buf_import_sync_file)
 #endif
diff --git a/libc/kernel/uapi/linux/dn.h b/libc/kernel/uapi/linux/dn.h
deleted file mode 100644
index 621f60f..0000000
--- a/libc/kernel/uapi/linux/dn.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/****************************************************************************
- ****************************************************************************
- ***
- ***   This header was automatically generated from a Linux kernel header
- ***   of the same name, to make information necessary for userspace to
- ***   call into the kernel available to libc.  It contains only constants,
- ***   structures, and macros generated from the original header, and thus,
- ***   contains no copyrightable information.
- ***
- ***   To edit the content of this header, modify the corresponding
- ***   source file (e.g. under external/kernel-headers/original/) then
- ***   run bionic/libc/kernel/tools/update_all.py
- ***
- ***   Any manual change here will be lost the next time this script will
- ***   be run. You've been warned!
- ***
- ****************************************************************************
- ****************************************************************************/
-#ifndef _LINUX_DN_H
-#define _LINUX_DN_H
-#include <linux/ioctl.h>
-#include <linux/types.h>
-#include <linux/if_ether.h>
-#define DNPROTO_NSP 2
-#define DNPROTO_ROU 3
-#define DNPROTO_NML 4
-#define DNPROTO_EVL 5
-#define DNPROTO_EVR 6
-#define DNPROTO_NSPT 7
-#define DN_ADDL 2
-#define DN_MAXADDL 2
-#define DN_MAXOPTL 16
-#define DN_MAXOBJL 16
-#define DN_MAXACCL 40
-#define DN_MAXALIASL 128
-#define DN_MAXNODEL 256
-#define DNBUFSIZE 65023
-#define SO_CONDATA 1
-#define SO_CONACCESS 2
-#define SO_PROXYUSR 3
-#define SO_LINKINFO 7
-#define DSO_CONDATA 1
-#define DSO_DISDATA 10
-#define DSO_CONACCESS 2
-#define DSO_ACCEPTMODE 4
-#define DSO_CONACCEPT 5
-#define DSO_CONREJECT 6
-#define DSO_LINKINFO 7
-#define DSO_STREAM 8
-#define DSO_SEQPACKET 9
-#define DSO_MAXWINDOW 11
-#define DSO_NODELAY 12
-#define DSO_CORK 13
-#define DSO_SERVICES 14
-#define DSO_INFO 15
-#define DSO_MAX 15
-#define LL_INACTIVE 0
-#define LL_CONNECTING 1
-#define LL_RUNNING 2
-#define LL_DISCONNECTING 3
-#define ACC_IMMED 0
-#define ACC_DEFER 1
-#define SDF_WILD 1
-#define SDF_PROXY 2
-#define SDF_UICPROXY 4
-struct dn_naddr {
-  __le16 a_len;
-  __u8 a_addr[DN_MAXADDL];
-};
-struct sockaddr_dn {
-  __u16 sdn_family;
-  __u8 sdn_flags;
-  __u8 sdn_objnum;
-  __le16 sdn_objnamel;
-  __u8 sdn_objname[DN_MAXOBJL];
-  struct dn_naddr sdn_add;
-};
-#define sdn_nodeaddrl sdn_add.a_len
-#define sdn_nodeaddr sdn_add.a_addr
-struct optdata_dn {
-  __le16 opt_status;
-#define opt_sts opt_status
-  __le16 opt_optl;
-  __u8 opt_data[16];
-};
-struct accessdata_dn {
-  __u8 acc_accl;
-  __u8 acc_acc[DN_MAXACCL];
-  __u8 acc_passl;
-  __u8 acc_pass[DN_MAXACCL];
-  __u8 acc_userl;
-  __u8 acc_user[DN_MAXACCL];
-};
-struct linkinfo_dn {
-  __u16 idn_segsize;
-  __u8 idn_linkstate;
-};
-union etheraddress {
-  __u8 dne_addr[ETH_ALEN];
-  struct {
-    __u8 dne_hiord[4];
-    __u8 dne_nodeaddr[2];
-  } dne_remote;
-};
-struct dn_addr {
-  __le16 dna_family;
-  union etheraddress dna_netaddr;
-};
-#define DECNET_IOCTL_BASE 0x89
-#define SIOCSNETADDR _IOW(DECNET_IOCTL_BASE, 0xe0, struct dn_naddr)
-#define SIOCGNETADDR _IOR(DECNET_IOCTL_BASE, 0xe1, struct dn_naddr)
-#define OSIOCSNETADDR _IOW(DECNET_IOCTL_BASE, 0xe0, int)
-#define OSIOCGNETADDR _IOR(DECNET_IOCTL_BASE, 0xe1, int)
-#endif
diff --git a/libc/kernel/uapi/linux/dns_resolver.h b/libc/kernel/uapi/linux/dns_resolver.h
index 21cb5c0..e7113d0 100644
--- a/libc/kernel/uapi/linux/dns_resolver.h
+++ b/libc/kernel/uapi/linux/dns_resolver.h
@@ -55,13 +55,13 @@
   __u8 zero;
   __u8 content;
   __u8 version;
-} __packed;
+} __attribute__((__packed__));
 struct dns_server_list_v1_header {
   struct dns_payload_header hdr;
   __u8 source;
   __u8 status;
   __u8 nr_servers;
-} __packed;
+} __attribute__((__packed__));
 struct dns_server_list_v1_server {
   __u16 name_len;
   __u16 priority;
@@ -71,8 +71,8 @@
   __u8 status;
   __u8 protocol;
   __u8 nr_addrs;
-} __packed;
+} __attribute__((__packed__));
 struct dns_server_list_v1_address {
   __u8 address_type;
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/linux/dvb/frontend.h b/libc/kernel/uapi/linux/dvb/frontend.h
index d060138..2ea7d9d 100644
--- a/libc/kernel/uapi/linux/dvb/frontend.h
+++ b/libc/kernel/uapi/linux/dvb/frontend.h
@@ -122,6 +122,22 @@
   FEC_3_5,
   FEC_9_10,
   FEC_2_5,
+  FEC_1_3,
+  FEC_1_4,
+  FEC_5_9,
+  FEC_7_9,
+  FEC_8_15,
+  FEC_11_15,
+  FEC_13_18,
+  FEC_9_20,
+  FEC_11_20,
+  FEC_23_36,
+  FEC_25_36,
+  FEC_13_45,
+  FEC_26_45,
+  FEC_28_45,
+  FEC_32_45,
+  FEC_77_90,
 };
 enum fe_modulation {
   QPSK,
@@ -138,6 +154,13 @@
   APSK_32,
   DQPSK,
   QAM_4_NR,
+  QAM_1024,
+  QAM_4096,
+  APSK_8_L,
+  APSK_16_L,
+  APSK_32_L,
+  APSK_64,
+  APSK_64_L,
 };
 enum fe_transmit_mode {
   TRANSMISSION_MODE_2K,
@@ -162,6 +185,7 @@
   GUARD_INTERVAL_PN420,
   GUARD_INTERVAL_PN595,
   GUARD_INTERVAL_PN945,
+  GUARD_INTERVAL_1_64,
 };
 enum fe_hierarchy {
   HIERARCHY_NONE,
@@ -259,6 +283,9 @@
   ROLLOFF_20,
   ROLLOFF_25,
   ROLLOFF_AUTO,
+  ROLLOFF_15,
+  ROLLOFF_10,
+  ROLLOFF_5,
 };
 enum fe_delivery_system {
   SYS_UNDEFINED,
@@ -280,6 +307,7 @@
   SYS_DVBT2,
   SYS_TURBO,
   SYS_DVBC_ANNEX_C,
+  SYS_DVBC2,
 };
 #define SYS_DVBC_ANNEX_AC SYS_DVBC_ANNEX_A
 #define SYS_DMBTH SYS_DTMB
diff --git a/libc/kernel/uapi/linux/dvb/osd.h b/libc/kernel/uapi/linux/dvb/osd.h
index 84b268b..379294e 100644
--- a/libc/kernel/uapi/linux/dvb/osd.h
+++ b/libc/kernel/uapi/linux/dvb/osd.h
@@ -50,7 +50,7 @@
   int x1;
   int y1;
   int color;
-  void __user * data;
+  void  * data;
 } osd_cmd_t;
 typedef enum {
   OSD_BITMAP1,
diff --git a/libc/kernel/uapi/linux/dvb/video.h b/libc/kernel/uapi/linux/dvb/video.h
index 6577e1f..2458766 100644
--- a/libc/kernel/uapi/linux/dvb/video.h
+++ b/libc/kernel/uapi/linux/dvb/video.h
@@ -94,7 +94,7 @@
   video_displayformat_t display_format;
 };
 struct video_still_picture {
-  char __user * iFrame;
+  char  * iFrame;
   __s32 size;
 };
 typedef __u16 video_attributes_t;
diff --git a/libc/kernel/uapi/linux/dw100.h b/libc/kernel/uapi/linux/dw100.h
new file mode 100644
index 0000000..13d8487
--- /dev/null
+++ b/libc/kernel/uapi/linux/dw100.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __UAPI_DW100_H__
+#define __UAPI_DW100_H__
+#include <linux/v4l2-controls.h>
+#define V4L2_CID_DW100_DEWARPING_16x16_VERTEX_MAP (V4L2_CID_USER_DW100_BASE + 1)
+#endif
diff --git a/libc/kernel/uapi/linux/elf.h b/libc/kernel/uapi/linux/elf.h
index 35486fb..28c8426 100644
--- a/libc/kernel/uapi/linux/elf.h
+++ b/libc/kernel/uapi/linux/elf.h
@@ -352,6 +352,7 @@
 #define NT_S390_GS_CB 0x30b
 #define NT_S390_GS_BC 0x30c
 #define NT_S390_RI_CB 0x30d
+#define NT_S390_PV_CPU_DATA 0x30e
 #define NT_ARM_VFP 0x400
 #define NT_ARM_TLS 0x401
 #define NT_ARM_HW_BREAK 0x402
diff --git a/libc/kernel/uapi/linux/ethtool.h b/libc/kernel/uapi/linux/ethtool.h
index c096f7f..a58be6f 100644
--- a/libc/kernel/uapi/linux/ethtool.h
+++ b/libc/kernel/uapi/linux/ethtool.h
@@ -98,7 +98,7 @@
   __u32 id;
   __u32 type_id;
   __u32 len;
-  void * data[0];
+  void * data[];
 };
 #define DOWNSHIFT_DEV_DEFAULT_COUNT 0xff
 #define DOWNSHIFT_DEV_DISABLE 0
@@ -118,14 +118,14 @@
   __u32 cmd;
   __u32 version;
   __u32 len;
-  __u8 data[0];
+  __u8 data[];
 };
 struct ethtool_eeprom {
   __u32 cmd;
   __u32 magic;
   __u32 offset;
   __u32 len;
-  __u8 data[0];
+  __u8 data[];
 };
 struct ethtool_eee {
   __u32 cmd;
@@ -277,17 +277,31 @@
   ETHTOOL_MODULE_POWER_MODE_LOW = 1,
   ETHTOOL_MODULE_POWER_MODE_HIGH,
 };
+enum ethtool_podl_pse_admin_state {
+  ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1,
+  ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED,
+  ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED,
+};
+enum ethtool_podl_pse_pw_d_status {
+  ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE,
+  ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR,
+};
 struct ethtool_gstrings {
   __u32 cmd;
   __u32 string_set;
   __u32 len;
-  __u8 data[0];
+  __u8 data[];
 };
 struct ethtool_sset_info {
   __u32 cmd;
   __u32 reserved;
   __u64 sset_mask;
-  __u32 data[0];
+  __u32 data[];
 };
 enum ethtool_test_flags {
   ETH_TEST_FL_OFFLINE = (1 << 0),
@@ -300,17 +314,17 @@
   __u32 flags;
   __u32 reserved;
   __u32 len;
-  __u64 data[0];
+  __u64 data[];
 };
 struct ethtool_stats {
   __u32 cmd;
   __u32 n_stats;
-  __u64 data[0];
+  __u64 data[];
 };
 struct ethtool_perm_addr {
   __u32 cmd;
   __u32 size;
-  __u8 data[0];
+  __u8 data[];
 };
 enum ethtool_flags {
   ETH_FLAG_TXVLAN = (1 << 7),
@@ -410,7 +424,7 @@
 struct ethtool_rxfh_indir {
   __u32 cmd;
   __u32 size;
-  __u32 ring_index[0];
+  __u32 ring_index[];
 };
 struct ethtool_rxfh {
   __u32 cmd;
@@ -420,7 +434,7 @@
   __u8 hfunc;
   __u8 rsvd8[3];
   __u32 rsvd32;
-  __u32 rss_config[0];
+  __u32 rss_config[];
 };
 #define ETH_RXFH_CONTEXT_ALLOC 0xffffffff
 #define ETH_RXFH_INDIR_NO_CHANGE 0xffffffff
@@ -462,7 +476,7 @@
   __u32 version;
   __u32 flag;
   __u32 len;
-  __u8 data[0];
+  __u8 data[];
 };
 #define ETH_FW_DUMP_DISABLE 0
 struct ethtool_get_features_block {
@@ -474,7 +488,7 @@
 struct ethtool_gfeatures {
   __u32 cmd;
   __u32 size;
-  struct ethtool_get_features_block features[0];
+  struct ethtool_get_features_block features[];
 };
 struct ethtool_set_features_block {
   __u32 valid;
@@ -483,7 +497,7 @@
 struct ethtool_sfeatures {
   __u32 cmd;
   __u32 size;
-  struct ethtool_set_features_block features[0];
+  struct ethtool_set_features_block features[];
 };
 struct ethtool_ts_info {
   __u32 cmd;
@@ -705,6 +719,12 @@
   ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90,
   ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91,
   ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92,
+  ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93,
+  ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94,
+  ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95,
+  ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96,
+  ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97,
+  ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98,
   __ETHTOOL_LINK_MODE_MASK_NBITS
 };
 #define __ETHTOOL_LINK_MODE_LEGACY_MASK(base_name) (1UL << (ETHTOOL_LINK_MODE_ ##base_name ##_BIT))
@@ -785,6 +805,7 @@
 #define SPEED_100000 100000
 #define SPEED_200000 200000
 #define SPEED_400000 400000
+#define SPEED_800000 800000
 #define SPEED_UNKNOWN - 1
 #define DUPLEX_HALF 0x00
 #define DUPLEX_FULL 0x01
@@ -800,6 +821,10 @@
 #define MASTER_SLAVE_STATE_MASTER 2
 #define MASTER_SLAVE_STATE_SLAVE 3
 #define MASTER_SLAVE_STATE_ERR 4
+#define RATE_MATCH_NONE 0
+#define RATE_MATCH_PAUSE 1
+#define RATE_MATCH_CRS 2
+#define RATE_MATCH_OPEN_LOOP 3
 #define PORT_TP 0x00
 #define PORT_AUI 0x01
 #define PORT_MII 0x02
@@ -901,8 +926,8 @@
   __u8 transceiver;
   __u8 master_slave_cfg;
   __u8 master_slave_state;
-  __u8 reserved1[1];
+  __u8 rate_matching;
   __u32 reserved[7];
-  __u32 link_mode_masks[0];
+  __u32 link_mode_masks[];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/ethtool_netlink.h b/libc/kernel/uapi/linux/ethtool_netlink.h
index 85ce51b..cc9c53c 100644
--- a/libc/kernel/uapi/linux/ethtool_netlink.h
+++ b/libc/kernel/uapi/linux/ethtool_netlink.h
@@ -56,6 +56,9 @@
   ETHTOOL_MSG_PHC_VCLOCKS_GET,
   ETHTOOL_MSG_MODULE_GET,
   ETHTOOL_MSG_MODULE_SET,
+  ETHTOOL_MSG_PSE_GET,
+  ETHTOOL_MSG_PSE_SET,
+  ETHTOOL_MSG_RSS_GET,
   __ETHTOOL_MSG_USER_CNT,
   ETHTOOL_MSG_USER_MAX = __ETHTOOL_MSG_USER_CNT - 1
 };
@@ -97,6 +100,8 @@
   ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY,
   ETHTOOL_MSG_MODULE_GET_REPLY,
   ETHTOOL_MSG_MODULE_NTF,
+  ETHTOOL_MSG_PSE_GET_REPLY,
+  ETHTOOL_MSG_RSS_GET_REPLY,
   __ETHTOOL_MSG_KERNEL_CNT,
   ETHTOOL_MSG_KERNEL_MAX = __ETHTOOL_MSG_KERNEL_CNT - 1
 };
@@ -193,6 +198,7 @@
   ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG,
   ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE,
   ETHTOOL_A_LINKMODES_LANES,
+  ETHTOOL_A_LINKMODES_RATE_MATCHING,
   __ETHTOOL_A_LINKMODES_CNT,
   ETHTOOL_A_LINKMODES_MAX = __ETHTOOL_A_LINKMODES_CNT - 1
 };
@@ -204,6 +210,7 @@
   ETHTOOL_A_LINKSTATE_SQI_MAX,
   ETHTOOL_A_LINKSTATE_EXT_STATE,
   ETHTOOL_A_LINKSTATE_EXT_SUBSTATE,
+  ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT,
   __ETHTOOL_A_LINKSTATE_CNT,
   ETHTOOL_A_LINKSTATE_MAX = __ETHTOOL_A_LINKSTATE_CNT - 1
 };
@@ -609,6 +616,25 @@
   __ETHTOOL_A_MODULE_CNT,
   ETHTOOL_A_MODULE_MAX = (__ETHTOOL_A_MODULE_CNT - 1)
 };
+enum {
+  ETHTOOL_A_PSE_UNSPEC,
+  ETHTOOL_A_PSE_HEADER,
+  ETHTOOL_A_PODL_PSE_ADMIN_STATE,
+  ETHTOOL_A_PODL_PSE_ADMIN_CONTROL,
+  ETHTOOL_A_PODL_PSE_PW_D_STATUS,
+  __ETHTOOL_A_PSE_CNT,
+  ETHTOOL_A_PSE_MAX = (__ETHTOOL_A_PSE_CNT - 1)
+};
+enum {
+  ETHTOOL_A_RSS_UNSPEC,
+  ETHTOOL_A_RSS_HEADER,
+  ETHTOOL_A_RSS_CONTEXT,
+  ETHTOOL_A_RSS_HFUNC,
+  ETHTOOL_A_RSS_INDIR,
+  ETHTOOL_A_RSS_HKEY,
+  __ETHTOOL_A_RSS_CNT,
+  ETHTOOL_A_RSS_MAX = (__ETHTOOL_A_RSS_CNT - 1),
+};
 #define ETHTOOL_GENL_NAME "ethtool"
 #define ETHTOOL_GENL_VERSION 1
 #define ETHTOOL_MCGRP_MONITOR_NAME "monitor"
diff --git a/libc/kernel/uapi/linux/eventpoll.h b/libc/kernel/uapi/linux/eventpoll.h
index d2601e5..de4c1f1 100644
--- a/libc/kernel/uapi/linux/eventpoll.h
+++ b/libc/kernel/uapi/linux/eventpoll.h
@@ -25,22 +25,23 @@
 #define EPOLL_CTL_ADD 1
 #define EPOLL_CTL_DEL 2
 #define EPOLL_CTL_MOD 3
-#define EPOLLIN (__force __poll_t) 0x00000001
-#define EPOLLPRI (__force __poll_t) 0x00000002
-#define EPOLLOUT (__force __poll_t) 0x00000004
-#define EPOLLERR (__force __poll_t) 0x00000008
-#define EPOLLHUP (__force __poll_t) 0x00000010
-#define EPOLLNVAL (__force __poll_t) 0x00000020
-#define EPOLLRDNORM (__force __poll_t) 0x00000040
-#define EPOLLRDBAND (__force __poll_t) 0x00000080
-#define EPOLLWRNORM (__force __poll_t) 0x00000100
-#define EPOLLWRBAND (__force __poll_t) 0x00000200
-#define EPOLLMSG (__force __poll_t) 0x00000400
-#define EPOLLRDHUP (__force __poll_t) 0x00002000
-#define EPOLLEXCLUSIVE ((__force __poll_t) (1U << 28))
-#define EPOLLWAKEUP ((__force __poll_t) (1U << 29))
-#define EPOLLONESHOT ((__force __poll_t) (1U << 30))
-#define EPOLLET ((__force __poll_t) (1U << 31))
+#define EPOLLIN ( __poll_t) 0x00000001
+#define EPOLLPRI ( __poll_t) 0x00000002
+#define EPOLLOUT ( __poll_t) 0x00000004
+#define EPOLLERR ( __poll_t) 0x00000008
+#define EPOLLHUP ( __poll_t) 0x00000010
+#define EPOLLNVAL ( __poll_t) 0x00000020
+#define EPOLLRDNORM ( __poll_t) 0x00000040
+#define EPOLLRDBAND ( __poll_t) 0x00000080
+#define EPOLLWRNORM ( __poll_t) 0x00000100
+#define EPOLLWRBAND ( __poll_t) 0x00000200
+#define EPOLLMSG ( __poll_t) 0x00000400
+#define EPOLLRDHUP ( __poll_t) 0x00002000
+#define EPOLL_URING_WAKE (( __poll_t) (1U << 27))
+#define EPOLLEXCLUSIVE (( __poll_t) (1U << 28))
+#define EPOLLWAKEUP (( __poll_t) (1U << 29))
+#define EPOLLONESHOT (( __poll_t) (1U << 30))
+#define EPOLLET (( __poll_t) (1U << 31))
 #ifdef __x86_64__
 #define EPOLL_PACKED __attribute__((packed))
 #else
diff --git a/libc/kernel/uapi/linux/f2fs.h b/libc/kernel/uapi/linux/f2fs.h
index 76da8f6..7c9629a 100644
--- a/libc/kernel/uapi/linux/f2fs.h
+++ b/libc/kernel/uapi/linux/f2fs.h
@@ -25,7 +25,7 @@
 #define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2)
 #define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3)
 #define F2FS_IOC_RELEASE_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 4)
-#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5)
+#define F2FS_IOC_ABORT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 5)
 #define F2FS_IOC_GARBAGE_COLLECT _IOW(F2FS_IOCTL_MAGIC, 6, __u32)
 #define F2FS_IOC_WRITE_CHECKPOINT _IO(F2FS_IOCTL_MAGIC, 7)
 #define F2FS_IOC_DEFRAGMENT _IOWR(F2FS_IOCTL_MAGIC, 8, struct f2fs_defragment)
@@ -45,6 +45,7 @@
 #define F2FS_IOC_SET_COMPRESS_OPTION _IOW(F2FS_IOCTL_MAGIC, 22, struct f2fs_comp_option)
 #define F2FS_IOC_DECOMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 23)
 #define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24)
+#define F2FS_IOC_START_ATOMIC_REPLACE _IO(F2FS_IOCTL_MAGIC, 25)
 #define F2FS_IOC_SHUTDOWN _IOR('X', 125, __u32)
 #define F2FS_GOING_DOWN_FULLSYNC 0x0
 #define F2FS_GOING_DOWN_METASYNC 0x1
diff --git a/libc/kernel/uapi/linux/fanotify.h b/libc/kernel/uapi/linux/fanotify.h
index f4e2a2e..9815a64 100644
--- a/libc/kernel/uapi/linux/fanotify.h
+++ b/libc/kernel/uapi/linux/fanotify.h
@@ -68,9 +68,11 @@
 #define FAN_MARK_IGNORED_SURV_MODIFY 0x00000040
 #define FAN_MARK_FLUSH 0x00000080
 #define FAN_MARK_EVICTABLE 0x00000200
+#define FAN_MARK_IGNORE 0x00000400
 #define FAN_MARK_INODE 0x00000000
 #define FAN_MARK_MOUNT 0x00000010
 #define FAN_MARK_FILESYSTEM 0x00000100
+#define FAN_MARK_IGNORE_SURV (FAN_MARK_IGNORE | FAN_MARK_IGNORED_SURV_MODIFY)
 #define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_DONT_FOLLOW | FAN_MARK_ONLYDIR | FAN_MARK_MOUNT | FAN_MARK_IGNORED_MASK | FAN_MARK_IGNORED_SURV_MODIFY | FAN_MARK_FLUSH)
 #define FAN_ALL_EVENTS (FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN)
 #define FAN_ALL_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM)
@@ -100,7 +102,7 @@
 struct fanotify_event_info_fid {
   struct fanotify_event_info_header hdr;
   __kernel_fsid_t fsid;
-  unsigned char handle[0];
+  unsigned char handle[];
 };
 struct fanotify_event_info_pidfd {
   struct fanotify_event_info_header hdr;
diff --git a/libc/kernel/uapi/linux/fd.h b/libc/kernel/uapi/linux/fd.h
index 4d72d69..dc1d444 100644
--- a/libc/kernel/uapi/linux/fd.h
+++ b/libc/kernel/uapi/linux/fd.h
@@ -175,7 +175,7 @@
 #define FD_RAW_SOFTFAILURE 0x800
 #define FD_RAW_FAILURE 0x10000
 #define FD_RAW_HARDFAILURE 0x20000
-  void __user * data;
+  void  * data;
   char * kernel_data;
   struct floppy_raw_cmd * next;
   long length;
diff --git a/libc/kernel/uapi/linux/fiemap.h b/libc/kernel/uapi/linux/fiemap.h
index 4310786..a67a5fe 100644
--- a/libc/kernel/uapi/linux/fiemap.h
+++ b/libc/kernel/uapi/linux/fiemap.h
@@ -34,7 +34,7 @@
   __u32 fm_mapped_extents;
   __u32 fm_extent_count;
   __u32 fm_reserved;
-  struct fiemap_extent fm_extents[0];
+  struct fiemap_extent fm_extents[];
 };
 #define FIEMAP_MAX_OFFSET (~0ULL)
 #define FIEMAP_FLAG_SYNC 0x00000001
diff --git a/libc/kernel/uapi/linux/filter.h b/libc/kernel/uapi/linux/filter.h
index d13c59d..57fe2fb 100644
--- a/libc/kernel/uapi/linux/filter.h
+++ b/libc/kernel/uapi/linux/filter.h
@@ -31,7 +31,7 @@
 };
 struct sock_fprog {
   unsigned short len;
-  struct sock_filter __user * filter;
+  struct sock_filter  * filter;
 };
 #define BPF_RVAL(code) ((code) & 0x18)
 #define BPF_A 0x10
diff --git a/libc/kernel/uapi/linux/firewire-cdev.h b/libc/kernel/uapi/linux/firewire-cdev.h
index 92957bc..a54191c 100644
--- a/libc/kernel/uapi/linux/firewire-cdev.h
+++ b/libc/kernel/uapi/linux/firewire-cdev.h
@@ -50,7 +50,7 @@
   __u32 type;
   __u32 rcode;
   __u32 length;
-  __u32 data[0];
+  __u32 data[];
 };
 struct fw_cdev_event_request {
   __u64 closure;
@@ -59,7 +59,7 @@
   __u64 offset;
   __u32 handle;
   __u32 length;
-  __u32 data[0];
+  __u32 data[];
 };
 struct fw_cdev_event_request2 {
   __u64 closure;
@@ -72,14 +72,14 @@
   __u32 generation;
   __u32 handle;
   __u32 length;
-  __u32 data[0];
+  __u32 data[];
 };
 struct fw_cdev_event_iso_interrupt {
   __u64 closure;
   __u32 type;
   __u32 cycle;
   __u32 header_length;
-  __u32 header[0];
+  __u32 header[];
 };
 struct fw_cdev_event_iso_interrupt_mc {
   __u64 closure;
@@ -98,7 +98,7 @@
   __u32 type;
   __u32 rcode;
   __u32 length;
-  __u32 data[0];
+  __u32 data[];
 };
 union fw_cdev_event {
   struct fw_cdev_event_common common;
@@ -207,7 +207,7 @@
 #define FW_CDEV_ISO_HEADER_LENGTH(v) ((v) << 24)
 struct fw_cdev_iso_packet {
   __u32 control;
-  __u32 header[0];
+  __u32 header[];
 };
 struct fw_cdev_queue_iso {
   __u64 packets;
diff --git a/libc/kernel/uapi/linux/fs.h b/libc/kernel/uapi/linux/fs.h
index 3bb4183..b8bfaac 100644
--- a/libc/kernel/uapi/linux/fs.h
+++ b/libc/kernel/uapi/linux/fs.h
@@ -63,7 +63,7 @@
   __u16 dest_count;
   __u16 reserved1;
   __u32 reserved2;
-  struct file_dedupe_range_info info[0];
+  struct file_dedupe_range_info info[];
 };
 struct files_stat_struct {
   unsigned long nr_files;
@@ -190,10 +190,10 @@
 #define SYNC_FILE_RANGE_WAIT_AFTER 4
 #define SYNC_FILE_RANGE_WRITE_AND_WAIT (SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WAIT_AFTER)
 typedef int __bitwise __kernel_rwf_t;
-#define RWF_HIPRI ((__force __kernel_rwf_t) 0x00000001)
-#define RWF_DSYNC ((__force __kernel_rwf_t) 0x00000002)
-#define RWF_SYNC ((__force __kernel_rwf_t) 0x00000004)
-#define RWF_NOWAIT ((__force __kernel_rwf_t) 0x00000008)
-#define RWF_APPEND ((__force __kernel_rwf_t) 0x00000010)
+#define RWF_HIPRI (( __kernel_rwf_t) 0x00000001)
+#define RWF_DSYNC (( __kernel_rwf_t) 0x00000002)
+#define RWF_SYNC (( __kernel_rwf_t) 0x00000004)
+#define RWF_NOWAIT (( __kernel_rwf_t) 0x00000008)
+#define RWF_APPEND (( __kernel_rwf_t) 0x00000010)
 #define RWF_SUPPORTED (RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_NOWAIT | RWF_APPEND)
 #endif
diff --git a/libc/kernel/uapi/linux/fscrypt.h b/libc/kernel/uapi/linux/fscrypt.h
index ca42eb3..9efafae 100644
--- a/libc/kernel/uapi/linux/fscrypt.h
+++ b/libc/kernel/uapi/linux/fscrypt.h
@@ -32,7 +32,10 @@
 #define FSCRYPT_MODE_AES_256_CTS 4
 #define FSCRYPT_MODE_AES_128_CBC 5
 #define FSCRYPT_MODE_AES_128_CTS 6
+#define FSCRYPT_MODE_SM4_XTS 7
+#define FSCRYPT_MODE_SM4_CTS 8
 #define FSCRYPT_MODE_ADIANTUM 9
+#define FSCRYPT_MODE_AES_256_HCTR2 10
 #define FSCRYPT_POLICY_V1 0
 #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
 struct fscrypt_policy_v1 {
@@ -137,8 +140,6 @@
 #define FS_ENCRYPTION_MODE_AES_256_CTS FSCRYPT_MODE_AES_256_CTS
 #define FS_ENCRYPTION_MODE_AES_128_CBC FSCRYPT_MODE_AES_128_CBC
 #define FS_ENCRYPTION_MODE_AES_128_CTS FSCRYPT_MODE_AES_128_CTS
-#define FS_ENCRYPTION_MODE_SPECK128_256_XTS 7
-#define FS_ENCRYPTION_MODE_SPECK128_256_CTS 8
 #define FS_ENCRYPTION_MODE_ADIANTUM FSCRYPT_MODE_ADIANTUM
 #define FS_KEY_DESC_PREFIX FSCRYPT_KEY_DESC_PREFIX
 #define FS_KEY_DESC_PREFIX_SIZE FSCRYPT_KEY_DESC_PREFIX_SIZE
diff --git a/libc/kernel/uapi/linux/fuse.h b/libc/kernel/uapi/linux/fuse.h
index 144e960..f1eec4d 100644
--- a/libc/kernel/uapi/linux/fuse.h
+++ b/libc/kernel/uapi/linux/fuse.h
@@ -20,7 +20,7 @@
 #define _LINUX_FUSE_H
 #include <stdint.h>
 #define FUSE_KERNEL_VERSION 7
-#define FUSE_KERNEL_MINOR_VERSION 36
+#define FUSE_KERNEL_MINOR_VERSION 38
 #define FUSE_ROOT_ID 1
 struct fuse_attr {
   uint64_t ino;
@@ -76,6 +76,7 @@
 #define FOPEN_CACHE_DIR (1 << 3)
 #define FOPEN_STREAM (1 << 4)
 #define FOPEN_NOFLUSH (1 << 5)
+#define FOPEN_PARALLEL_DIRECT_WRITES (1 << 6)
 #define FUSE_ASYNC_READ (1 << 0)
 #define FUSE_POSIX_LOCKS (1 << 1)
 #define FUSE_FILE_OPS (1 << 2)
@@ -138,6 +139,7 @@
 #define FUSE_ATTR_DAX (1 << 1)
 #define FUSE_OPEN_KILL_SUIDGID (1 << 0)
 #define FUSE_SETXATTR_ACL_KILL_SGID (1 << 0)
+#define FUSE_EXPIRE_ONLY (1 << 0)
 enum fuse_opcode {
   FUSE_LOOKUP = 1,
   FUSE_FORGET = 2,
@@ -187,6 +189,7 @@
   FUSE_SETUPMAPPING = 48,
   FUSE_REMOVEMAPPING = 49,
   FUSE_SYNCFS = 50,
+  FUSE_TMPFILE = 51,
   FUSE_CANONICAL_PATH = 2016,
   CUSE_INIT = 4096,
   CUSE_INIT_BSWAP_RESERVED = 1048576,
@@ -494,7 +497,7 @@
 struct fuse_notify_inval_entry_out {
   uint64_t parent;
   uint32_t namelen;
-  uint32_t padding;
+  uint32_t flags;
 };
 struct fuse_notify_delete_out {
   uint64_t parent;
diff --git a/libc/kernel/uapi/linux/futex.h b/libc/kernel/uapi/linux/futex.h
index c80b90c..8d1a2a4 100644
--- a/libc/kernel/uapi/linux/futex.h
+++ b/libc/kernel/uapi/linux/futex.h
@@ -59,12 +59,12 @@
   __u32 __reserved;
 };
 struct robust_list {
-  struct robust_list __user * next;
+  struct robust_list  * next;
 };
 struct robust_list_head {
   struct robust_list list;
   long futex_offset;
-  struct robust_list __user * list_op_pending;
+  struct robust_list  * list_op_pending;
 };
 #define FUTEX_WAITERS 0x80000000
 #define FUTEX_OWNER_DIED 0x40000000
diff --git a/libc/kernel/uapi/linux/genetlink.h b/libc/kernel/uapi/linux/genetlink.h
index 2e2137d..0f86331 100644
--- a/libc/kernel/uapi/linux/genetlink.h
+++ b/libc/kernel/uapi/linux/genetlink.h
@@ -81,6 +81,7 @@
   CTRL_ATTR_MCAST_GRP_ID,
   __CTRL_ATTR_MCAST_GRP_MAX,
 };
+#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
 enum {
   CTRL_ATTR_POLICY_UNSPEC,
   CTRL_ATTR_POLICY_DO,
@@ -88,5 +89,5 @@
   __CTRL_ATTR_POLICY_DUMP_MAX,
   CTRL_ATTR_POLICY_DUMP_MAX = __CTRL_ATTR_POLICY_DUMP_MAX - 1
 };
-#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
+#define CTRL_ATTR_POLICY_MAX (__CTRL_ATTR_POLICY_DUMP_MAX - 1)
 #endif
diff --git a/libc/kernel/uapi/linux/hid.h b/libc/kernel/uapi/linux/hid.h
index ce93cd7..37ab462 100644
--- a/libc/kernel/uapi/linux/hid.h
+++ b/libc/kernel/uapi/linux/hid.h
@@ -22,12 +22,20 @@
 #define USB_INTERFACE_SUBCLASS_BOOT 1
 #define USB_INTERFACE_PROTOCOL_KEYBOARD 1
 #define USB_INTERFACE_PROTOCOL_MOUSE 2
-#define HID_REQ_GET_REPORT 0x01
-#define HID_REQ_GET_IDLE 0x02
-#define HID_REQ_GET_PROTOCOL 0x03
-#define HID_REQ_SET_REPORT 0x09
-#define HID_REQ_SET_IDLE 0x0A
-#define HID_REQ_SET_PROTOCOL 0x0B
+enum hid_report_type {
+  HID_INPUT_REPORT = 0,
+  HID_OUTPUT_REPORT = 1,
+  HID_FEATURE_REPORT = 2,
+  HID_REPORT_TYPES,
+};
+enum hid_class_request {
+  HID_REQ_GET_REPORT = 0x01,
+  HID_REQ_GET_IDLE = 0x02,
+  HID_REQ_GET_PROTOCOL = 0x03,
+  HID_REQ_SET_REPORT = 0x09,
+  HID_REQ_SET_IDLE = 0x0A,
+  HID_REQ_SET_PROTOCOL = 0x0B,
+};
 #define HID_DT_HID (USB_TYPE_CLASS | 0x01)
 #define HID_DT_REPORT (USB_TYPE_CLASS | 0x02)
 #define HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
diff --git a/libc/kernel/uapi/linux/i2c-dev.h b/libc/kernel/uapi/linux/i2c-dev.h
index 07fdda2..7a25e20 100644
--- a/libc/kernel/uapi/linux/i2c-dev.h
+++ b/libc/kernel/uapi/linux/i2c-dev.h
@@ -33,10 +33,10 @@
   __u8 read_write;
   __u8 command;
   __u32 size;
-  union i2c_smbus_data __user * data;
+  union i2c_smbus_data  * data;
 };
 struct i2c_rdwr_ioctl_data {
-  struct i2c_msg __user * msgs;
+  struct i2c_msg  * msgs;
   __u32 nmsgs;
 };
 #define I2C_RDWR_IOCTL_MAX_MSGS 42
diff --git a/libc/kernel/uapi/linux/i2o-dev.h b/libc/kernel/uapi/linux/i2o-dev.h
index fc8b26d..afaae74 100644
--- a/libc/kernel/uapi/linux/i2o-dev.h
+++ b/libc/kernel/uapi/linux/i2o-dev.h
@@ -42,38 +42,38 @@
 };
 struct i2o_cmd_passthru {
   unsigned int iop;
-  void __user * msg;
+  void  * msg;
 };
 struct i2o_cmd_hrtlct {
   unsigned int iop;
-  void __user * resbuf;
-  unsigned int __user * reslen;
+  void  * resbuf;
+  unsigned int  * reslen;
 };
 struct i2o_cmd_psetget {
   unsigned int iop;
   unsigned int tid;
-  void __user * opbuf;
+  void  * opbuf;
   unsigned int oplen;
-  void __user * resbuf;
-  unsigned int __user * reslen;
+  void  * resbuf;
+  unsigned int  * reslen;
 };
 struct i2o_sw_xfer {
   unsigned int iop;
   unsigned char flags;
   unsigned char sw_type;
   unsigned int sw_id;
-  void __user * buf;
-  unsigned int __user * swlen;
-  unsigned int __user * maxfrag;
-  unsigned int __user * curfrag;
+  void  * buf;
+  unsigned int  * swlen;
+  unsigned int  * maxfrag;
+  unsigned int  * curfrag;
 };
 struct i2o_html {
   unsigned int iop;
   unsigned int tid;
   unsigned int page;
-  void __user * resbuf;
-  unsigned int __user * reslen;
-  void __user * qbuf;
+  void  * resbuf;
+  unsigned int  * reslen;
+  void  * qbuf;
   unsigned int qlen;
 };
 #define I2O_EVT_Q_LEN 32
diff --git a/libc/kernel/uapi/linux/idxd.h b/libc/kernel/uapi/linux/idxd.h
index 26f41ab..01c62f2 100644
--- a/libc/kernel/uapi/linux/idxd.h
+++ b/libc/kernel/uapi/linux/idxd.h
@@ -38,6 +38,7 @@
   IDXD_SCMD_WQ_NO_SIZE = 0x800e0000,
   IDXD_SCMD_WQ_NO_PRIV = 0x800f0000,
   IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
+  IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
 };
 #define IDXD_SCMD_SOFTERR_MASK 0x80000000
 #define IDXD_SCMD_SOFTERR_SHIFT 16
@@ -90,14 +91,14 @@
   IAX_OPCODE_CRC64,
   IAX_OPCODE_ZERO_DECOMP_32 = 0x48,
   IAX_OPCODE_ZERO_DECOMP_16,
-  IAX_OPCODE_DECOMP_32 = 0x4c,
-  IAX_OPCODE_DECOMP_16,
+  IAX_OPCODE_ZERO_COMP_32 = 0x4c,
+  IAX_OPCODE_ZERO_COMP_16,
   IAX_OPCODE_SCAN = 0x50,
   IAX_OPCODE_SET_MEMBER,
   IAX_OPCODE_EXTRACT,
   IAX_OPCODE_SELECT,
   IAX_OPCODE_RLE_BURST,
-  IAX_OPCDE_FIND_UNIQUE,
+  IAX_OPCODE_FIND_UNIQUE,
   IAX_OPCODE_EXPAND,
 };
 enum dsa_completion_status {
@@ -275,7 +276,7 @@
       uint32_t rsvd2 : 8;
     };
     uint32_t delta_rec_size;
-    uint32_t crc_val;
+    uint64_t crc_val;
     struct {
       uint32_t dif_chk_ref_tag;
       uint16_t dif_chk_app_tag_mask;
diff --git a/libc/kernel/uapi/linux/if.h b/libc/kernel/uapi/linux/if.h
index 63c77eb..fc6d20d 100644
--- a/libc/kernel/uapi/linux/if.h
+++ b/libc/kernel/uapi/linux/if.h
@@ -130,14 +130,14 @@
   unsigned int type;
   unsigned int size;
   union {
-    raw_hdlc_proto __user * raw_hdlc;
-    cisco_proto __user * cisco;
-    fr_proto __user * fr;
-    fr_proto_pvc __user * fr_pvc;
-    fr_proto_pvc_info __user * fr_pvc_info;
-    x25_hdlc_proto __user * x25;
-    sync_serial_settings __user * sync;
-    te1_settings __user * te1;
+    raw_hdlc_proto  * raw_hdlc;
+    cisco_proto  * cisco;
+    fr_proto  * fr;
+    fr_proto_pvc  * fr_pvc;
+    fr_proto_pvc_info  * fr_pvc_info;
+    x25_hdlc_proto  * x25;
+    sync_serial_settings  * sync;
+    te1_settings  * te1;
   } ifs_ifsu;
 };
 #if __UAPI_DEF_IF_IFREQ
@@ -158,7 +158,7 @@
     struct ifmap ifru_map;
     char ifru_slave[IFNAMSIZ];
     char ifru_newname[IFNAMSIZ];
-    void __user * ifru_data;
+    void  * ifru_data;
     struct if_settings ifru_settings;
   } ifr_ifru;
 };
@@ -184,8 +184,8 @@
 struct ifconf {
   int ifc_len;
   union {
-    char __user * ifcu_buf;
-    struct ifreq __user * ifcu_req;
+    char  * ifcu_buf;
+    struct ifreq  * ifcu_req;
   } ifc_ifcu;
 };
 #endif
diff --git a/libc/kernel/uapi/linux/if_alg.h b/libc/kernel/uapi/linux/if_alg.h
index 6530a16..41ba868 100644
--- a/libc/kernel/uapi/linux/if_alg.h
+++ b/libc/kernel/uapi/linux/if_alg.h
@@ -35,7 +35,7 @@
 };
 struct af_alg_iv {
   __u32 ivlen;
-  __u8 iv[0];
+  __u8 iv[];
 };
 #define ALG_SET_KEY 1
 #define ALG_SET_IV 2
@@ -43,6 +43,7 @@
 #define ALG_SET_AEAD_ASSOCLEN 4
 #define ALG_SET_AEAD_AUTHSIZE 5
 #define ALG_SET_DRBG_ENTROPY 6
+#define ALG_SET_KEY_BY_KEY_SERIAL 7
 #define ALG_OP_DECRYPT 0
 #define ALG_OP_ENCRYPT 1
 #endif
diff --git a/libc/kernel/uapi/linux/if_arcnet.h b/libc/kernel/uapi/linux/if_arcnet.h
index 6aece37..65b07e1 100644
--- a/libc/kernel/uapi/linux/if_arcnet.h
+++ b/libc/kernel/uapi/linux/if_arcnet.h
@@ -40,18 +40,18 @@
   __u8 proto;
   __u8 split_flag;
   __be16 sequence;
-  __u8 payload[0];
+  __u8 payload[];
 };
 #define RFC1201_HDR_SIZE 4
 struct arc_rfc1051 {
   __u8 proto;
-  __u8 payload[0];
+  __u8 payload[];
 };
 #define RFC1051_HDR_SIZE 1
 struct arc_eth_encap {
   __u8 proto;
   struct ethhdr eth;
-  __u8 payload[0];
+  __u8 payload[];
 };
 #define ETH_ENCAP_HDR_SIZE 14
 struct arc_cap {
diff --git a/libc/kernel/uapi/linux/if_bridge.h b/libc/kernel/uapi/linux/if_bridge.h
index 0f08866..702363e 100644
--- a/libc/kernel/uapi/linux/if_bridge.h
+++ b/libc/kernel/uapi/linux/if_bridge.h
@@ -576,10 +576,25 @@
 enum {
   MDBE_ATTR_UNSPEC,
   MDBE_ATTR_SOURCE,
+  MDBE_ATTR_SRC_LIST,
+  MDBE_ATTR_GROUP_MODE,
+  MDBE_ATTR_RTPROT,
   __MDBE_ATTR_MAX,
 };
 #define MDBE_ATTR_MAX (__MDBE_ATTR_MAX - 1)
 enum {
+  MDBE_SRC_LIST_UNSPEC,
+  MDBE_SRC_LIST_ENTRY,
+  __MDBE_SRC_LIST_MAX,
+};
+#define MDBE_SRC_LIST_MAX (__MDBE_SRC_LIST_MAX - 1)
+enum {
+  MDBE_SRCATTR_UNSPEC,
+  MDBE_SRCATTR_ADDRESS,
+  __MDBE_SRCATTR_MAX,
+};
+#define MDBE_SRCATTR_MAX (__MDBE_SRCATTR_MAX - 1)
+enum {
   BRIDGE_XSTATS_UNSPEC,
   BRIDGE_XSTATS_VLAN,
   BRIDGE_XSTATS_MCAST,
diff --git a/libc/kernel/uapi/linux/if_ether.h b/libc/kernel/uapi/linux/if_ether.h
index bd8e045..6043921 100644
--- a/libc/kernel/uapi/linux/if_ether.h
+++ b/libc/kernel/uapi/linux/if_ether.h
@@ -97,6 +97,7 @@
 #define ETH_P_QINQ3 0x9300
 #define ETH_P_EDSA 0xDADA
 #define ETH_P_DSA_8021Q 0xDADB
+#define ETH_P_DSA_A5PSW 0xE001
 #define ETH_P_IFE 0xED3E
 #define ETH_P_AF_IUCV 0xFBFB
 #define ETH_P_802_3_MIN 0x0600
@@ -111,6 +112,7 @@
 #define ETH_P_LOCALTALK 0x0009
 #define ETH_P_CAN 0x000C
 #define ETH_P_CANFD 0x000D
+#define ETH_P_CANXL 0x000E
 #define ETH_P_PPPTALK 0x0010
 #define ETH_P_TR_802_2 0x0011
 #define ETH_P_MOBITEX 0x0015
diff --git a/libc/kernel/uapi/linux/if_link.h b/libc/kernel/uapi/linux/if_link.h
index fbe384e..19c6346 100644
--- a/libc/kernel/uapi/linux/if_link.h
+++ b/libc/kernel/uapi/linux/if_link.h
@@ -165,6 +165,8 @@
   IFLA_GRO_MAX_SIZE,
   IFLA_TSO_MAX_SIZE,
   IFLA_TSO_MAX_SEGS,
+  IFLA_ALLMULTI,
+  IFLA_DEVLINK_PORT,
   __IFLA_MAX
 };
 #define IFLA_MAX (__IFLA_MAX - 1)
@@ -304,6 +306,7 @@
   IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT,
   IFLA_BRPORT_MCAST_EHT_HOSTS_CNT,
   IFLA_BRPORT_LOCKED,
+  IFLA_BRPORT_MAB,
   __IFLA_BRPORT_MAX
 };
 #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
@@ -411,6 +414,7 @@
   IFLA_XFRM_UNSPEC,
   IFLA_XFRM_LINK,
   IFLA_XFRM_IF_ID,
+  IFLA_XFRM_COLLECT_METADATA,
   __IFLA_XFRM_MAX
 };
 #define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1)
@@ -639,6 +643,7 @@
   IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
   IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
   IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
+  IFLA_BOND_SLAVE_PRIO,
   __IFLA_BOND_SLAVE_MAX,
 };
 #define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1)
@@ -936,4 +941,10 @@
   __IFLA_MCTP_MAX,
 };
 #define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1)
+enum {
+  IFLA_DSA_UNSPEC,
+  IFLA_DSA_MASTER,
+  __IFLA_DSA_MAX,
+};
+#define IFLA_DSA_MAX (__IFLA_DSA_MAX - 1)
 #endif
diff --git a/libc/kernel/uapi/linux/if_macsec.h b/libc/kernel/uapi/linux/if_macsec.h
index e60d767..7b51f80 100644
--- a/libc/kernel/uapi/linux/if_macsec.h
+++ b/libc/kernel/uapi/linux/if_macsec.h
@@ -23,6 +23,7 @@
 #define MACSEC_GENL_VERSION 1
 #define MACSEC_MAX_KEY_LEN 128
 #define MACSEC_KEYID_LEN 16
+#define MACSEC_SALT_LEN 12
 #define MACSEC_CIPHER_ID_GCM_AES_128 0x0080C20001000001ULL
 #define MACSEC_CIPHER_ID_GCM_AES_256 0x0080C20001000002ULL
 #define MACSEC_CIPHER_ID_GCM_AES_XPN_128 0x0080C20001000003ULL
diff --git a/libc/kernel/uapi/linux/if_packet.h b/libc/kernel/uapi/linux/if_packet.h
index e7e7a33..340b2ee 100644
--- a/libc/kernel/uapi/linux/if_packet.h
+++ b/libc/kernel/uapi/linux/if_packet.h
@@ -75,6 +75,7 @@
 #define PACKET_FANOUT_EBPF 7
 #define PACKET_FANOUT_FLAG_ROLLOVER 0x1000
 #define PACKET_FANOUT_FLAG_UNIQUEID 0x2000
+#define PACKET_FANOUT_FLAG_IGNORE_OUTGOING 0x4000
 #define PACKET_FANOUT_FLAG_DEFRAG 0x8000
 struct tpacket_stats {
   unsigned int tp_packets;
diff --git a/libc/kernel/uapi/linux/if_pppox.h b/libc/kernel/uapi/linux/if_pppox.h
index 40d25e8..2acafdf 100644
--- a/libc/kernel/uapi/linux/if_pppox.h
+++ b/libc/kernel/uapi/linux/if_pppox.h
@@ -51,27 +51,27 @@
     struct pppoe_addr pppoe;
     struct pptp_addr pptp;
   } sa_addr;
-} __packed;
+} __attribute__((__packed__));
 struct sockaddr_pppol2tp {
   __kernel_sa_family_t sa_family;
   unsigned int sa_protocol;
   struct pppol2tp_addr pppol2tp;
-} __packed;
+} __attribute__((__packed__));
 struct sockaddr_pppol2tpin6 {
   __kernel_sa_family_t sa_family;
   unsigned int sa_protocol;
   struct pppol2tpin6_addr pppol2tp;
-} __packed;
+} __attribute__((__packed__));
 struct sockaddr_pppol2tpv3 {
   __kernel_sa_family_t sa_family;
   unsigned int sa_protocol;
   struct pppol2tpv3_addr pppol2tp;
-} __packed;
+} __attribute__((__packed__));
 struct sockaddr_pppol2tpv3in6 {
   __kernel_sa_family_t sa_family;
   unsigned int sa_protocol;
   struct pppol2tpv3in6_addr pppol2tp;
-} __packed;
+} __attribute__((__packed__));
 #define PPPOEIOCSFWD _IOW(0xB1, 0, size_t)
 #define PPPOEIOCDFWD _IO(0xB1, 1)
 #define PADI_CODE 0x09
@@ -82,7 +82,7 @@
 struct pppoe_tag {
   __be16 tag_type;
   __be16 tag_len;
-  char tag_data[0];
+  char tag_data[];
 } __attribute__((packed));
 #define PTT_EOL __cpu_to_be16(0x0000)
 #define PTT_SRV_NAME __cpu_to_be16(0x0101)
@@ -107,7 +107,7 @@
   __u8 code;
   __be16 sid;
   __be16 length;
-  struct pppoe_tag tag[0];
-} __packed;
+  struct pppoe_tag tag[];
+} __attribute__((__packed__));
 #define PPPOE_SES_HLEN 8
 #endif
diff --git a/libc/kernel/uapi/linux/if_tun.h b/libc/kernel/uapi/linux/if_tun.h
index d1a8f9e..93bac9c 100644
--- a/libc/kernel/uapi/linux/if_tun.h
+++ b/libc/kernel/uapi/linux/if_tun.h
@@ -57,6 +57,7 @@
 #define IFF_TAP 0x0002
 #define IFF_NAPI 0x0010
 #define IFF_NAPI_FRAGS 0x0020
+#define IFF_NO_CARRIER 0x0040
 #define IFF_NO_PI 0x1000
 #define IFF_ONE_QUEUE 0x2000
 #define IFF_VNET_HDR 0x4000
@@ -72,6 +73,8 @@
 #define TUN_F_TSO6 0x04
 #define TUN_F_TSO_ECN 0x08
 #define TUN_F_UFO 0x10
+#define TUN_F_USO4 0x20
+#define TUN_F_USO6 0x40
 #define TUN_PKT_STRIP 0x0001
 struct tun_pi {
   __u16 flags;
@@ -81,6 +84,6 @@
 struct tun_filter {
   __u16 flags;
   __u16 count;
-  __u8 addr[0][ETH_ALEN];
+  __u8 addr[][ETH_ALEN];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/if_tunnel.h b/libc/kernel/uapi/linux/if_tunnel.h
index 01c2dc9..9b85568 100644
--- a/libc/kernel/uapi/linux/if_tunnel.h
+++ b/libc/kernel/uapi/linux/if_tunnel.h
@@ -142,7 +142,7 @@
   __IFLA_GRE_MAX,
 };
 #define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1)
-#define VTI_ISVTI ((__force __be16) 0x0001)
+#define VTI_ISVTI (( __be16) 0x0001)
 enum {
   IFLA_VTI_UNSPEC,
   IFLA_VTI_LINK,
diff --git a/libc/kernel/uapi/linux/igmp.h b/libc/kernel/uapi/linux/igmp.h
index 885b0f8..71c2c8d 100644
--- a/libc/kernel/uapi/linux/igmp.h
+++ b/libc/kernel/uapi/linux/igmp.h
@@ -37,7 +37,7 @@
   __u8 grec_auxwords;
   __be16 grec_nsrcs;
   __be32 grec_mca;
-  __be32 grec_src[0];
+  __be32 grec_src[];
 };
 struct igmpv3_report {
   __u8 type;
@@ -45,7 +45,7 @@
   __sum16 csum;
   __be16 resv2;
   __be16 ngrec;
-  struct igmpv3_grec grec[0];
+  struct igmpv3_grec grec[];
 };
 struct igmpv3_query {
   __u8 type;
@@ -61,7 +61,7 @@
 #endif
   __u8 qqic;
   __be16 nsrcs;
-  __be32 srcs[0];
+  __be32 srcs[];
 };
 #define IGMP_HOST_MEMBERSHIP_QUERY 0x11
 #define IGMP_HOST_MEMBERSHIP_REPORT 0x12
diff --git a/libc/kernel/uapi/linux/iio/types.h b/libc/kernel/uapi/linux/iio/types.h
index aa66d50..af7bdda 100644
--- a/libc/kernel/uapi/linux/iio/types.h
+++ b/libc/kernel/uapi/linux/iio/types.h
@@ -101,6 +101,12 @@
   IIO_MOD_ETHANOL,
   IIO_MOD_H2,
   IIO_MOD_O2,
+  IIO_MOD_LINEAR_X,
+  IIO_MOD_LINEAR_Y,
+  IIO_MOD_LINEAR_Z,
+  IIO_MOD_PITCH,
+  IIO_MOD_YAW,
+  IIO_MOD_ROLL,
 };
 enum iio_event_type {
   IIO_EV_TYPE_THRESH,
@@ -110,11 +116,14 @@
   IIO_EV_TYPE_MAG_ADAPTIVE,
   IIO_EV_TYPE_CHANGE,
   IIO_EV_TYPE_MAG_REFERENCED,
+  IIO_EV_TYPE_GESTURE,
 };
 enum iio_event_direction {
   IIO_EV_DIR_EITHER,
   IIO_EV_DIR_RISING,
   IIO_EV_DIR_FALLING,
   IIO_EV_DIR_NONE,
+  IIO_EV_DIR_SINGLETAP,
+  IIO_EV_DIR_DOUBLETAP,
 };
 #endif
diff --git a/libc/kernel/uapi/linux/in.h b/libc/kernel/uapi/linux/in.h
index d4060e7..53d3074 100644
--- a/libc/kernel/uapi/linux/in.h
+++ b/libc/kernel/uapi/linux/in.h
@@ -22,6 +22,7 @@
 #include <bits/ip_mreq_source.h>
 #include <bits/in_addr.h>
 #include <linux/types.h>
+#include <linux/stddef.h>
 #include <linux/libc-compat.h>
 #include <linux/socket.h>
 #if __UAPI_DEF_IN_IPPROTO
@@ -68,6 +69,8 @@
 #define IPPROTO_PIM IPPROTO_PIM
   IPPROTO_COMP = 108,
 #define IPPROTO_COMP IPPROTO_COMP
+  IPPROTO_L2TP = 115,
+#define IPPROTO_L2TP IPPROTO_L2TP
   IPPROTO_SCTP = 132,
 #define IPPROTO_SCTP IPPROTO_SCTP
   IPPROTO_UDPLITE = 136,
diff --git a/libc/kernel/uapi/linux/inet_diag.h b/libc/kernel/uapi/linux/inet_diag.h
index 8656dd4..27f390b 100644
--- a/libc/kernel/uapi/linux/inet_diag.h
+++ b/libc/kernel/uapi/linux/inet_diag.h
@@ -89,7 +89,7 @@
   __u8 family;
   __u8 prefix_len;
   int port;
-  __be32 addr[0];
+  __be32 addr[];
 };
 struct inet_diag_markcond {
   __u32 mark;
diff --git a/libc/kernel/uapi/linux/inotify.h b/libc/kernel/uapi/linux/inotify.h
index eb9ac3c..3b4b577 100644
--- a/libc/kernel/uapi/linux/inotify.h
+++ b/libc/kernel/uapi/linux/inotify.h
@@ -25,7 +25,7 @@
   __u32 mask;
   __u32 cookie;
   __u32 len;
-  char name[0];
+  char name[];
 };
 #define IN_ACCESS 0x00000001
 #define IN_MODIFY 0x00000002
diff --git a/libc/kernel/uapi/linux/input-event-codes.h b/libc/kernel/uapi/linux/input-event-codes.h
index 4b251df..712a9db 100644
--- a/libc/kernel/uapi/linux/input-event-codes.h
+++ b/libc/kernel/uapi/linux/input-event-codes.h
@@ -551,6 +551,9 @@
 #define KEY_KBD_LAYOUT_NEXT 0x248
 #define KEY_EMOJI_PICKER 0x249
 #define KEY_DICTATE 0x24a
+#define KEY_CAMERA_ACCESS_ENABLE 0x24b
+#define KEY_CAMERA_ACCESS_DISABLE 0x24c
+#define KEY_CAMERA_ACCESS_TOGGLE 0x24d
 #define KEY_BRIGHTNESS_MIN 0x250
 #define KEY_BRIGHTNESS_MAX 0x251
 #define KEY_KBDINPUTASSIST_PREV 0x260
@@ -720,6 +723,7 @@
 #define ABS_TILT_Y 0x1b
 #define ABS_TOOL_WIDTH 0x1c
 #define ABS_VOLUME 0x20
+#define ABS_PROFILE 0x21
 #define ABS_MISC 0x28
 #define ABS_RESERVED 0x2e
 #define ABS_MT_SLOT 0x2f
diff --git a/libc/kernel/uapi/linux/input.h b/libc/kernel/uapi/linux/input.h
index 4858c81..1df1398 100644
--- a/libc/kernel/uapi/linux/input.h
+++ b/libc/kernel/uapi/linux/input.h
@@ -173,7 +173,7 @@
   __u16 phase;
   struct ff_envelope envelope;
   __u32 custom_len;
-  __s16 __user * custom_data;
+  __s16  * custom_data;
 };
 struct ff_rumble_effect {
   __u16 strong_magnitude;
diff --git a/libc/kernel/uapi/linux/io_uring.h b/libc/kernel/uapi/linux/io_uring.h
index 5dda702..5561448 100644
--- a/libc/kernel/uapi/linux/io_uring.h
+++ b/libc/kernel/uapi/linux/io_uring.h
@@ -20,6 +20,12 @@
 #define LINUX_IO_URING_H
 #include <linux/fs.h>
 #include <linux/types.h>
+#ifndef UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H
+#include <linux/time_types.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
 struct io_uring_sqe {
   __u8 opcode;
   __u8 flags;
@@ -56,6 +62,8 @@
     __u32 unlink_flags;
     __u32 hardlink_flags;
     __u32 xattr_flags;
+    __u32 msg_ring_flags;
+    __u32 uring_cmd_flags;
   };
   __u64 user_data;
   union {
@@ -66,6 +74,10 @@
   union {
     __s32 splice_fd_in;
     __u32 file_index;
+    struct {
+      __u16 addr_len;
+      __u16 __pad3[1];
+    };
   };
   union {
     struct {
@@ -104,6 +116,8 @@
 #define IORING_SETUP_TASKRUN_FLAG (1U << 9)
 #define IORING_SETUP_SQE128 (1U << 10)
 #define IORING_SETUP_CQE32 (1U << 11)
+#define IORING_SETUP_SINGLE_ISSUER (1U << 12)
+#define IORING_SETUP_DEFER_TASKRUN (1U << 13)
 enum io_uring_op {
   IORING_OP_NOP,
   IORING_OP_READV,
@@ -152,8 +166,11 @@
   IORING_OP_GETXATTR,
   IORING_OP_SOCKET,
   IORING_OP_URING_CMD,
+  IORING_OP_SEND_ZC,
+  IORING_OP_SENDMSG_ZC,
   IORING_OP_LAST,
 };
+#define IORING_URING_CMD_FIXED (1U << 0)
 #define IORING_FSYNC_DATASYNC (1U << 0)
 #define IORING_TIMEOUT_ABS (1U << 0)
 #define IORING_TIMEOUT_UPDATE (1U << 1)
@@ -167,11 +184,22 @@
 #define IORING_POLL_ADD_MULTI (1U << 0)
 #define IORING_POLL_UPDATE_EVENTS (1U << 1)
 #define IORING_POLL_UPDATE_USER_DATA (1U << 2)
+#define IORING_POLL_ADD_LEVEL (1U << 3)
 #define IORING_ASYNC_CANCEL_ALL (1U << 0)
 #define IORING_ASYNC_CANCEL_FD (1U << 1)
 #define IORING_ASYNC_CANCEL_ANY (1U << 2)
+#define IORING_ASYNC_CANCEL_FD_FIXED (1U << 3)
 #define IORING_RECVSEND_POLL_FIRST (1U << 0)
+#define IORING_RECV_MULTISHOT (1U << 1)
+#define IORING_RECVSEND_FIXED_BUF (1U << 2)
+#define IORING_SEND_ZC_REPORT_USAGE (1U << 3)
+#define IORING_NOTIF_USAGE_ZC_COPIED (1U << 31)
 #define IORING_ACCEPT_MULTISHOT (1U << 0)
+enum {
+  IORING_MSG_DATA,
+  IORING_MSG_SEND_FD,
+};
+#define IORING_MSG_RING_CQE_SKIP (1U << 0)
 struct io_uring_cqe {
   __u64 user_data;
   __s32 res;
@@ -181,6 +209,7 @@
 #define IORING_CQE_F_BUFFER (1U << 0)
 #define IORING_CQE_F_MORE (1U << 1)
 #define IORING_CQE_F_SOCK_NONEMPTY (1U << 2)
+#define IORING_CQE_F_NOTIF (1U << 3)
 enum {
   IORING_CQE_BUFFER_SHIFT = 16,
 };
@@ -268,6 +297,8 @@
   IORING_UNREGISTER_RING_FDS = 21,
   IORING_REGISTER_PBUF_RING = 22,
   IORING_UNREGISTER_PBUF_RING = 23,
+  IORING_REGISTER_SYNC_CANCEL = 24,
+  IORING_REGISTER_FILE_ALLOC_RANGE = 25,
   IORING_REGISTER_LAST
 };
 enum {
@@ -300,6 +331,17 @@
   __u32 nr;
   __u32 resv2;
 };
+struct io_uring_notification_slot {
+  __u64 tag;
+  __u64 resv[3];
+};
+struct io_uring_notification_register {
+  __u32 nr_slots;
+  __u32 resv;
+  __u64 resv2;
+  __u64 data;
+  __u64 resv3;
+};
 #define IORING_REGISTER_FILES_SKIP (- 2)
 #define IO_URING_OP_SUPPORTED (1U << 0)
 struct io_uring_probe_op {
@@ -313,7 +355,7 @@
   __u8 ops_len;
   __u16 resv;
   __u32 resv2[3];
-  struct io_uring_probe_op ops[0];
+  struct io_uring_probe_op ops[];
 };
 struct io_uring_restriction {
   __u16 opcode;
@@ -362,4 +404,25 @@
   __u32 pad;
   __u64 ts;
 };
+struct io_uring_sync_cancel_reg {
+  __u64 addr;
+  __s32 fd;
+  __u32 flags;
+  struct __kernel_timespec timeout;
+  __u64 pad[4];
+};
+struct io_uring_file_index_range {
+  __u32 off;
+  __u32 len;
+  __u64 resv;
+};
+struct io_uring_recvmsg_out {
+  __u32 namelen;
+  __u32 controllen;
+  __u32 payloadlen;
+  __u32 flags;
+};
+#ifdef __cplusplus
+}
+#endif
 #endif
diff --git a/libc/kernel/uapi/linux/iommufd.h b/libc/kernel/uapi/linux/iommufd.h
new file mode 100644
index 0000000..b7f5815
--- /dev/null
+++ b/libc/kernel/uapi/linux/iommufd.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_IOMMUFD_H
+#define _UAPI_IOMMUFD_H
+#include <linux/types.h>
+#include <linux/ioctl.h>
+#define IOMMUFD_TYPE (';')
+enum {
+  IOMMUFD_CMD_BASE = 0x80,
+  IOMMUFD_CMD_DESTROY = IOMMUFD_CMD_BASE,
+  IOMMUFD_CMD_IOAS_ALLOC,
+  IOMMUFD_CMD_IOAS_ALLOW_IOVAS,
+  IOMMUFD_CMD_IOAS_COPY,
+  IOMMUFD_CMD_IOAS_IOVA_RANGES,
+  IOMMUFD_CMD_IOAS_MAP,
+  IOMMUFD_CMD_IOAS_UNMAP,
+  IOMMUFD_CMD_OPTION,
+  IOMMUFD_CMD_VFIO_IOAS,
+};
+struct iommu_destroy {
+  __u32 size;
+  __u32 id;
+};
+#define IOMMU_DESTROY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_DESTROY)
+struct iommu_ioas_alloc {
+  __u32 size;
+  __u32 flags;
+  __u32 out_ioas_id;
+};
+#define IOMMU_IOAS_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOC)
+struct iommu_iova_range {
+  __aligned_u64 start;
+  __aligned_u64 last;
+};
+struct iommu_ioas_iova_ranges {
+  __u32 size;
+  __u32 ioas_id;
+  __u32 num_iovas;
+  __u32 __reserved;
+  __aligned_u64 allowed_iovas;
+  __aligned_u64 out_iova_alignment;
+};
+#define IOMMU_IOAS_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_IOVA_RANGES)
+struct iommu_ioas_allow_iovas {
+  __u32 size;
+  __u32 ioas_id;
+  __u32 num_iovas;
+  __u32 __reserved;
+  __aligned_u64 allowed_iovas;
+};
+#define IOMMU_IOAS_ALLOW_IOVAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOW_IOVAS)
+enum iommufd_ioas_map_flags {
+  IOMMU_IOAS_MAP_FIXED_IOVA = 1 << 0,
+  IOMMU_IOAS_MAP_WRITEABLE = 1 << 1,
+  IOMMU_IOAS_MAP_READABLE = 1 << 2,
+};
+struct iommu_ioas_map {
+  __u32 size;
+  __u32 flags;
+  __u32 ioas_id;
+  __u32 __reserved;
+  __aligned_u64 user_va;
+  __aligned_u64 length;
+  __aligned_u64 iova;
+};
+#define IOMMU_IOAS_MAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_MAP)
+struct iommu_ioas_copy {
+  __u32 size;
+  __u32 flags;
+  __u32 dst_ioas_id;
+  __u32 src_ioas_id;
+  __aligned_u64 length;
+  __aligned_u64 dst_iova;
+  __aligned_u64 src_iova;
+};
+#define IOMMU_IOAS_COPY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_COPY)
+struct iommu_ioas_unmap {
+  __u32 size;
+  __u32 ioas_id;
+  __aligned_u64 iova;
+  __aligned_u64 length;
+};
+#define IOMMU_IOAS_UNMAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_UNMAP)
+enum iommufd_option {
+  IOMMU_OPTION_RLIMIT_MODE = 0,
+  IOMMU_OPTION_HUGE_PAGES = 1,
+};
+enum iommufd_option_ops {
+  IOMMU_OPTION_OP_SET = 0,
+  IOMMU_OPTION_OP_GET = 1,
+};
+struct iommu_option {
+  __u32 size;
+  __u32 option_id;
+  __u16 op;
+  __u16 __reserved;
+  __u32 object_id;
+  __aligned_u64 val64;
+};
+#define IOMMU_OPTION _IO(IOMMUFD_TYPE, IOMMUFD_CMD_OPTION)
+enum iommufd_vfio_ioas_op {
+  IOMMU_VFIO_IOAS_GET = 0,
+  IOMMU_VFIO_IOAS_SET = 1,
+  IOMMU_VFIO_IOAS_CLEAR = 2,
+};
+struct iommu_vfio_ioas {
+  __u32 size;
+  __u32 ioas_id;
+  __u16 op;
+  __u16 __reserved;
+};
+#define IOMMU_VFIO_IOAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VFIO_IOAS)
+#endif
diff --git a/libc/kernel/uapi/linux/ip.h b/libc/kernel/uapi/linux/ip.h
index 9571cac..9249f5c 100644
--- a/libc/kernel/uapi/linux/ip.h
+++ b/libc/kernel/uapi/linux/ip.h
@@ -19,6 +19,7 @@
 #ifndef _UAPI_LINUX_IP_H
 #define _UAPI_LINUX_IP_H
 #include <linux/types.h>
+#include <linux/stddef.h>
 #include <asm/byteorder.h>
 #define IPTOS_TOS_MASK 0x1E
 #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
@@ -86,8 +87,9 @@
   __u8 ttl;
   __u8 protocol;
   __sum16 check;
-  __be32 saddr;
+  __struct_group(, addrs,, __be32 saddr;
   __be32 daddr;
+ );
 };
 struct ip_auth_hdr {
   __u8 nexthdr;
@@ -95,12 +97,12 @@
   __be16 reserved;
   __be32 spi;
   __be32 seq_no;
-  __u8 auth_data[0];
+  __u8 auth_data[];
 };
 struct ip_esp_hdr {
   __be32 spi;
   __be32 seq_no;
-  __u8 enc_data[0];
+  __u8 enc_data[];
 };
 struct ip_comp_hdr {
   __u8 nexthdr;
diff --git a/libc/kernel/uapi/linux/ip_vs.h b/libc/kernel/uapi/linux/ip_vs.h
index 6e3defe..916fcf0 100644
--- a/libc/kernel/uapi/linux/ip_vs.h
+++ b/libc/kernel/uapi/linux/ip_vs.h
@@ -159,11 +159,11 @@
   __be16 port;
   __u32 fwmark;
   unsigned int num_dests;
-  struct ip_vs_dest_entry entrytable[0];
+  struct ip_vs_dest_entry entrytable[];
 };
 struct ip_vs_get_services {
   unsigned int num_services;
-  struct ip_vs_service_entry entrytable[0];
+  struct ip_vs_service_entry entrytable[];
 };
 struct ip_vs_timeout_user {
   int tcp_timeout;
diff --git a/libc/kernel/uapi/linux/ipc.h b/libc/kernel/uapi/linux/ipc.h
index a0699cf..4ca9ee1 100644
--- a/libc/kernel/uapi/linux/ipc.h
+++ b/libc/kernel/uapi/linux/ipc.h
@@ -42,7 +42,7 @@
 #define IPC_OLD 0
 #define IPC_64 0x0100
 struct ipc_kludge {
-  struct msgbuf __user * msgp;
+  struct msgbuf  * msgp;
   long msgtyp;
 };
 #define SEMOP 1
diff --git a/libc/kernel/uapi/linux/ipmi.h b/libc/kernel/uapi/linux/ipmi.h
index dd88f2f..bd73b3c 100644
--- a/libc/kernel/uapi/linux/ipmi.h
+++ b/libc/kernel/uapi/linux/ipmi.h
@@ -65,7 +65,7 @@
   unsigned char netfn;
   unsigned char cmd;
   unsigned short data_len;
-  unsigned char __user * data;
+  unsigned char  * data;
 };
 struct kernel_ipmi_msg {
   unsigned char netfn;
@@ -86,7 +86,7 @@
 #define IPMI_MAINTENANCE_MODE_ON 2
 #define IPMI_IOC_MAGIC 'i'
 struct ipmi_req {
-  unsigned char __user * addr;
+  unsigned char  * addr;
   unsigned int addr_len;
   long msgid;
   struct ipmi_msg msg;
@@ -100,7 +100,7 @@
 #define IPMICTL_SEND_COMMAND_SETTIME _IOR(IPMI_IOC_MAGIC, 21, struct ipmi_req_settime)
 struct ipmi_recv {
   int recv_type;
-  unsigned char __user * addr;
+  unsigned char  * addr;
   unsigned int addr_len;
   long msgid;
   struct ipmi_msg msg;
diff --git a/libc/kernel/uapi/linux/ipmi_ssif_bmc.h b/libc/kernel/uapi/linux/ipmi_ssif_bmc.h
new file mode 100644
index 0000000..866ed17
--- /dev/null
+++ b/libc/kernel/uapi/linux/ipmi_ssif_bmc.h
@@ -0,0 +1,27 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_IPMI_SSIF_BMC_H
+#define _UAPI_LINUX_IPMI_SSIF_BMC_H
+#include <linux/types.h>
+#define IPMI_SSIF_PAYLOAD_MAX 254
+struct ipmi_ssif_msg {
+  unsigned int len;
+  __u8 payload[IPMI_SSIF_PAYLOAD_MAX];
+};
+#endif
diff --git a/libc/kernel/uapi/linux/ipv6.h b/libc/kernel/uapi/linux/ipv6.h
index 757cbda..d62d269 100644
--- a/libc/kernel/uapi/linux/ipv6.h
+++ b/libc/kernel/uapi/linux/ipv6.h
@@ -20,6 +20,7 @@
 #define _UAPI_IPV6_H
 #include <linux/libc-compat.h>
 #include <linux/types.h>
+#include <linux/stddef.h>
 #include <linux/in6.h>
 #include <asm/byteorder.h>
 #define IPV6_MIN_MTU 1280
@@ -87,8 +88,9 @@
   __be16 payload_len;
   __u8 nexthdr;
   __u8 hop_limit;
-  struct in6_addr saddr;
+  __struct_group(, addrs,, struct in6_addr saddr;
   struct in6_addr daddr;
+ );
 };
 enum {
   DEVCONF_FORWARDING = 0,
diff --git a/libc/kernel/uapi/linux/iso_fs.h b/libc/kernel/uapi/linux/iso_fs.h
index 8227031..f9c4f48 100644
--- a/libc/kernel/uapi/linux/iso_fs.h
+++ b/libc/kernel/uapi/linux/iso_fs.h
@@ -132,7 +132,7 @@
   __u8 name_len[2];
   __u8 extent[4];
   __u8 parent[2];
-  char name[0];
+  char name[];
 } __attribute__((packed));
 struct iso_directory_record {
   __u8 length[ISODCL(1, 1)];
@@ -145,7 +145,7 @@
   __u8 interleave[ISODCL(28, 28)];
   __u8 volume_sequence_number[ISODCL(29, 32)];
   __u8 name_len[ISODCL(33, 33)];
-  char name[0];
+  char name[];
 } __attribute__((packed));
 #define ISOFS_BLOCK_BITS 11
 #define ISOFS_BLOCK_SIZE 2048
diff --git a/libc/kernel/uapi/linux/ivtv.h b/libc/kernel/uapi/linux/ivtv.h
index 549d6a8..bdd526e 100644
--- a/libc/kernel/uapi/linux/ivtv.h
+++ b/libc/kernel/uapi/linux/ivtv.h
@@ -24,8 +24,8 @@
 struct ivtv_dma_frame {
   enum v4l2_buf_type type;
   __u32 pixelformat;
-  void __user * y_source;
-  void __user * uv_source;
+  void  * y_source;
+  void  * uv_source;
   struct v4l2_rect src;
   struct v4l2_rect dst;
   __u32 src_width;
diff --git a/libc/kernel/uapi/linux/ivtvfb.h b/libc/kernel/uapi/linux/ivtvfb.h
index 9addcbf..171be74 100644
--- a/libc/kernel/uapi/linux/ivtvfb.h
+++ b/libc/kernel/uapi/linux/ivtvfb.h
@@ -21,7 +21,7 @@
 #include <linux/compiler.h>
 #include <linux/types.h>
 struct ivtvfb_dma_frame {
-  void __user * source;
+  void  * source;
   unsigned long dest_offset;
   int count;
 };
diff --git a/libc/kernel/uapi/linux/jffs2.h b/libc/kernel/uapi/linux/jffs2.h
index 698f953..643aa2e 100644
--- a/libc/kernel/uapi/linux/jffs2.h
+++ b/libc/kernel/uapi/linux/jffs2.h
@@ -86,7 +86,7 @@
   __u8 unused[2];
   jint32_t node_crc;
   jint32_t name_crc;
-  __u8 name[0];
+  __u8 name[];
 };
 struct jffs2_raw_inode {
   jint16_t magic;
@@ -110,7 +110,7 @@
   jint16_t flags;
   jint32_t data_crc;
   jint32_t node_crc;
-  __u8 data[0];
+  __u8 data[];
 };
 struct jffs2_raw_xattr {
   jint16_t magic;
@@ -124,7 +124,7 @@
   jint16_t value_len;
   jint32_t data_crc;
   jint32_t node_crc;
-  __u8 data[0];
+  __u8 data[];
 } __attribute__((packed));
 struct jffs2_raw_xref {
   jint16_t magic;
@@ -146,7 +146,7 @@
   jint32_t padded;
   jint32_t sum_crc;
   jint32_t node_crc;
-  jint32_t sum[0];
+  jint32_t sum[];
 };
 union jffs2_node_union {
   struct jffs2_raw_inode i;
diff --git a/libc/kernel/uapi/linux/kcov.h b/libc/kernel/uapi/linux/kcov.h
index cf2660b..5b6f6b1 100644
--- a/libc/kernel/uapi/linux/kcov.h
+++ b/libc/kernel/uapi/linux/kcov.h
@@ -24,7 +24,7 @@
   __u32 area_size;
   __u32 num_handles;
   __aligned_u64 common_handle;
-  __aligned_u64 handles[0];
+  __aligned_u64 handles[];
 };
 #define KCOV_REMOTE_MAX_HANDLES 0x100
 #define KCOV_INIT_TRACE _IOR('c', 1, unsigned long)
diff --git a/libc/kernel/uapi/linux/kd.h b/libc/kernel/uapi/linux/kd.h
index 2385037..903681b 100644
--- a/libc/kernel/uapi/linux/kd.h
+++ b/libc/kernel/uapi/linux/kd.h
@@ -27,7 +27,7 @@
 struct consolefontdesc {
   unsigned short charcount;
   unsigned short charheight;
-  char __user * chardata;
+  char  * chardata;
 };
 #define PIO_FONTRESET 0x4B6D
 #define GIO_CMAP 0x4B70
@@ -68,7 +68,7 @@
 };
 struct unimapdesc {
   unsigned short entry_ct;
-  struct unipair __user * entries;
+  struct unipair  * entries;
 };
 #define PIO_UNIMAP 0x4B67
 #define PIO_UNIMAPCLR 0x4B68
@@ -147,7 +147,7 @@
   unsigned int flags;
   unsigned int width, height;
   unsigned int charcount;
-  unsigned char __user * data;
+  unsigned char  * data;
 };
 struct console_font {
   unsigned int width, height;
diff --git a/libc/kernel/uapi/linux/keyctl.h b/libc/kernel/uapi/linux/keyctl.h
index 01ea576..b534f5e 100644
--- a/libc/kernel/uapi/linux/keyctl.h
+++ b/libc/kernel/uapi/linux/keyctl.h
@@ -80,8 +80,8 @@
   __s32 base;
 };
 struct keyctl_kdf_params {
-  char __user * hashname;
-  char __user * otherinfo;
+  char  * hashname;
+  char  * otherinfo;
   __u32 otherinfolen;
   __u32 __spare[8];
 };
diff --git a/libc/kernel/uapi/linux/kfd_ioctl.h b/libc/kernel/uapi/linux/kfd_ioctl.h
index 8ec47f4..d21e0fc 100644
--- a/libc/kernel/uapi/linux/kfd_ioctl.h
+++ b/libc/kernel/uapi/linux/kfd_ioctl.h
@@ -21,7 +21,7 @@
 #include <drm/drm.h>
 #include <linux/ioctl.h>
 #define KFD_IOCTL_MAJOR_VERSION 1
-#define KFD_IOCTL_MINOR_VERSION 8
+#define KFD_IOCTL_MINOR_VERSION 11
 struct kfd_ioctl_get_version_args {
   __u32 major_version;
   __u32 minor_version;
@@ -72,6 +72,11 @@
   __u32 queue_id;
   __u32 pad;
 };
+struct kfd_ioctl_get_available_memory_args {
+  __u64 available;
+  __u32 gpu_id;
+  __u32 pad;
+};
 #define KFD_IOC_CACHE_POLICY_COHERENT 0
 #define KFD_IOC_CACHE_POLICY_NONCOHERENT 1
 struct kfd_ioctl_set_memory_policy_args {
@@ -295,6 +300,33 @@
   KFD_SMI_EVENT_THERMAL_THROTTLE = 2,
   KFD_SMI_EVENT_GPU_PRE_RESET = 3,
   KFD_SMI_EVENT_GPU_POST_RESET = 4,
+  KFD_SMI_EVENT_MIGRATE_START = 5,
+  KFD_SMI_EVENT_MIGRATE_END = 6,
+  KFD_SMI_EVENT_PAGE_FAULT_START = 7,
+  KFD_SMI_EVENT_PAGE_FAULT_END = 8,
+  KFD_SMI_EVENT_QUEUE_EVICTION = 9,
+  KFD_SMI_EVENT_QUEUE_RESTORE = 10,
+  KFD_SMI_EVENT_UNMAP_FROM_GPU = 11,
+  KFD_SMI_EVENT_ALL_PROCESS = 64
+};
+enum KFD_MIGRATE_TRIGGERS {
+  KFD_MIGRATE_TRIGGER_PREFETCH,
+  KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU,
+  KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU,
+  KFD_MIGRATE_TRIGGER_TTM_EVICTION
+};
+enum KFD_QUEUE_EVICTION_TRIGGERS {
+  KFD_QUEUE_EVICTION_TRIGGER_SVM,
+  KFD_QUEUE_EVICTION_TRIGGER_USERPTR,
+  KFD_QUEUE_EVICTION_TRIGGER_TTM,
+  KFD_QUEUE_EVICTION_TRIGGER_SUSPEND,
+  KFD_QUEUE_EVICTION_CRIU_CHECKPOINT,
+  KFD_QUEUE_EVICTION_CRIU_RESTORE
+};
+enum KFD_SVM_UNMAP_TRIGGERS {
+  KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY,
+  KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE,
+  KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU
 };
 #define KFD_SMI_EVENT_MASK_FROM_INDEX(i) (1ULL << ((i) - 1))
 #define KFD_SMI_EVENT_MSG_SIZE 96
@@ -346,6 +378,7 @@
 #define KFD_IOCTL_SVM_FLAG_GPU_RO 0x00000008
 #define KFD_IOCTL_SVM_FLAG_GPU_EXEC 0x00000010
 #define KFD_IOCTL_SVM_FLAG_GPU_READ_MOSTLY 0x00000020
+#define KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED 0x00000040
 enum kfd_ioctl_svm_op {
   KFD_IOCTL_SVM_OP_SET_ATTR,
   KFD_IOCTL_SVM_OP_GET_ATTR
@@ -417,6 +450,7 @@
 #define AMDKFD_IOC_SVM AMDKFD_IOWR(0x20, struct kfd_ioctl_svm_args)
 #define AMDKFD_IOC_SET_XNACK_MODE AMDKFD_IOWR(0x21, struct kfd_ioctl_set_xnack_mode_args)
 #define AMDKFD_IOC_CRIU_OP AMDKFD_IOWR(0x22, struct kfd_ioctl_criu_args)
+#define AMDKFD_IOC_AVAILABLE_MEMORY AMDKFD_IOWR(0x23, struct kfd_ioctl_get_available_memory_args)
 #define AMDKFD_COMMAND_START 0x01
-#define AMDKFD_COMMAND_END 0x23
+#define AMDKFD_COMMAND_END 0x24
 #endif
diff --git a/libc/kernel/uapi/linux/kvm.h b/libc/kernel/uapi/linux/kvm.h
index cc5495d..9d33399 100644
--- a/libc/kernel/uapi/linux/kvm.h
+++ b/libc/kernel/uapi/linux/kvm.h
@@ -77,12 +77,6 @@
   __u32 singlestep;
 };
 #define __KVM_DEPRECATED_VCPU_W_0x87 _IOW(KVMIO, 0x87, struct kvm_debug_guest)
-struct kvm_memory_region {
-  __u32 slot;
-  __u32 flags;
-  __u64 guest_phys_addr;
-  __u64 memory_size;
-};
 struct kvm_userspace_memory_region {
   __u32 slot;
   __u32 flags;
@@ -216,6 +210,8 @@
 #define KVM_EXIT_X86_BUS_LOCK 33
 #define KVM_EXIT_XEN 34
 #define KVM_EXIT_RISCV_SBI 35
+#define KVM_EXIT_RISCV_CSR 36
+#define KVM_EXIT_NOTIFY 37
 #define KVM_INTERNAL_ERROR_EMULATION 1
 #define KVM_INTERNAL_ERROR_SIMUL_EX 2
 #define KVM_INTERNAL_ERROR_DELIVERY_EV 3
@@ -368,6 +364,7 @@
 #define KVM_MSR_EXIT_REASON_INVAL (1 << 0)
 #define KVM_MSR_EXIT_REASON_UNKNOWN (1 << 1)
 #define KVM_MSR_EXIT_REASON_FILTER (1 << 2)
+#define KVM_MSR_EXIT_REASON_VALID_MASK (KVM_MSR_EXIT_REASON_INVAL | KVM_MSR_EXIT_REASON_UNKNOWN | KVM_MSR_EXIT_REASON_FILTER)
       __u32 reason;
       __u32 index;
       __u64 data;
@@ -379,6 +376,16 @@
       unsigned long args[6];
       unsigned long ret[2];
     } riscv_sbi;
+    struct {
+      unsigned long csr_num;
+      unsigned long new_value;
+      unsigned long write_mask;
+      unsigned long ret_value;
+    } riscv_csr;
+    struct {
+#define KVM_NOTIFY_CONTEXT_INVALID (1 << 0)
+      __u32 flags;
+    } notify;
     char padding[256];
   };
 #define SYNC_REGS_SIZE_BYTES 2048
@@ -408,7 +415,7 @@
 };
 struct kvm_coalesced_mmio_ring {
   __u32 first, last;
-  struct kvm_coalesced_mmio coalesced_mmio[0];
+  struct kvm_coalesced_mmio coalesced_mmio[];
 };
 #define KVM_COALESCED_MMIO_MAX ((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / sizeof(struct kvm_coalesced_mmio))
 struct kvm_translation {
@@ -450,7 +457,7 @@
   __u32 slot;
   __u32 padding1;
   union {
-    void __user * dirty_bitmap;
+    void  * dirty_bitmap;
     __u64 padding2;
   };
 };
@@ -459,13 +466,13 @@
   __u32 num_pages;
   __u64 first_page;
   union {
-    void __user * dirty_bitmap;
+    void  * dirty_bitmap;
     __u64 padding2;
   };
 };
 struct kvm_signal_mask {
   __u32 len;
-  __u8 sigset[0];
+  __u8 sigset[];
 };
 struct kvm_tpr_access_ctl {
   __u32 enabled;
@@ -910,6 +917,15 @@
 #define KVM_CAP_VM_TSC_CONTROL 214
 #define KVM_CAP_SYSTEM_EVENT_DATA 215
 #define KVM_CAP_ARM_SYSTEM_SUSPEND 216
+#define KVM_CAP_S390_PROTECTED_DUMP 217
+#define KVM_CAP_X86_TRIPLE_FAULT_EVENT 218
+#define KVM_CAP_X86_NOTIFY_VMEXIT 219
+#define KVM_CAP_VM_DISABLE_NX_HUGE_PAGES 220
+#define KVM_CAP_S390_ZPCI_OP 221
+#define KVM_CAP_S390_CPU_TOPOLOGY 222
+#define KVM_CAP_DIRTY_LOG_RING_ACQ_REL 223
+#define KVM_CAP_S390_PROTECTED_ASYNC_DISABLE 224
+#define KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP 225
 #ifdef KVM_CAP_IRQ_ROUTING
 struct kvm_irq_routing_irqchip {
   __u32 irqchip;
@@ -963,7 +979,7 @@
 struct kvm_irq_routing {
   __u32 nr;
   __u32 flags;
-  struct kvm_irq_routing_entry entries[0];
+  struct kvm_irq_routing_entry entries[];
 };
 #endif
 #ifdef KVM_CAP_MCE
@@ -984,6 +1000,7 @@
 #define KVM_XEN_HVM_CONFIG_RUNSTATE (1 << 3)
 #define KVM_XEN_HVM_CONFIG_EVTCHN_2LEVEL (1 << 4)
 #define KVM_XEN_HVM_CONFIG_EVTCHN_SEND (1 << 5)
+#define KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG (1 << 6)
 struct kvm_xen_hvm_config {
   __u32 flags;
   __u32 msr;
@@ -1049,7 +1066,7 @@
 #define KVM_REG_SIZE_U2048 0x0080000000000000ULL
 struct kvm_reg_list {
   __u64 n;
-  __u64 reg[0];
+  __u64 reg[];
 };
 struct kvm_one_reg {
   __u64 id;
@@ -1111,10 +1128,8 @@
   __s32 groupfd;
   __s32 tablefd;
 };
-#define KVM_SET_MEMORY_REGION _IOW(KVMIO, 0x40, struct kvm_memory_region)
 #define KVM_CREATE_VCPU _IO(KVMIO, 0x41)
 #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log)
-#define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias)
 #define KVM_SET_NR_MMU_PAGES _IO(KVMIO, 0x44)
 #define KVM_GET_NR_MMU_PAGES _IO(KVMIO, 0x45)
 #define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, struct kvm_userspace_memory_region)
@@ -1263,6 +1278,48 @@
   __u64 size;
   __u64 tweak;
 };
+enum pv_cmd_dmp_id {
+  KVM_PV_DUMP_INIT,
+  KVM_PV_DUMP_CONFIG_STOR_STATE,
+  KVM_PV_DUMP_COMPLETE,
+  KVM_PV_DUMP_CPU,
+};
+struct kvm_s390_pv_dmp {
+  __u64 subcmd;
+  __u64 buff_addr;
+  __u64 buff_len;
+  __u64 gaddr;
+  __u64 reserved[4];
+};
+enum pv_cmd_info_id {
+  KVM_PV_INFO_VM,
+  KVM_PV_INFO_DUMP,
+};
+struct kvm_s390_pv_info_dump {
+  __u64 dump_cpu_buffer_len;
+  __u64 dump_config_mem_buffer_per_1m;
+  __u64 dump_config_finalize_len;
+};
+struct kvm_s390_pv_info_vm {
+  __u64 inst_calls_list[4];
+  __u64 max_cpus;
+  __u64 max_guests;
+  __u64 max_guest_addr;
+  __u64 feature_indication;
+};
+struct kvm_s390_pv_info_header {
+  __u32 id;
+  __u32 len_max;
+  __u32 len_written;
+  __u32 reserved;
+};
+struct kvm_s390_pv_info {
+  struct kvm_s390_pv_info_header header;
+  union {
+    struct kvm_s390_pv_info_dump dump;
+    struct kvm_s390_pv_info_vm vm;
+  };
+};
 enum pv_cmd_id {
   KVM_PV_ENABLE,
   KVM_PV_DISABLE,
@@ -1271,6 +1328,10 @@
   KVM_PV_VERIFY,
   KVM_PV_PREP_RESET,
   KVM_PV_UNSHARE_ALL,
+  KVM_PV_INFO,
+  KVM_PV_DUMP,
+  KVM_PV_ASYNC_CLEANUP_PREPARE,
+  KVM_PV_ASYNC_CLEANUP_PERFORM,
 };
 struct kvm_pv_cmd {
   __u32 cmd;
@@ -1291,8 +1352,10 @@
   union {
     __u8 long_mode;
     __u8 vector;
+    __u8 runstate_update_flag;
     struct {
       __u64 gfn;
+#define KVM_XEN_INVALID_GFN ((__u64) - 1)
     } shared_info;
     struct {
       __u32 send_port;
@@ -1323,6 +1386,7 @@
 #define KVM_XEN_ATTR_TYPE_UPCALL_VECTOR 0x2
 #define KVM_XEN_ATTR_TYPE_EVTCHN 0x3
 #define KVM_XEN_ATTR_TYPE_XEN_VERSION 0x4
+#define KVM_XEN_ATTR_TYPE_RUNSTATE_UPDATE_FLAG 0x5
 #define KVM_XEN_VCPU_GET_ATTR _IOWR(KVMIO, 0xca, struct kvm_xen_vcpu_attr)
 #define KVM_XEN_VCPU_SET_ATTR _IOW(KVMIO, 0xcb, struct kvm_xen_vcpu_attr)
 #define KVM_XEN_HVM_EVTCHN_SEND _IOW(KVMIO, 0xd0, struct kvm_irq_routing_xen_evtchn)
@@ -1333,6 +1397,7 @@
   __u16 pad[3];
   union {
     __u64 gpa;
+#define KVM_XEN_INVALID_GPA ((__u64) - 1)
     __u64 pad[8];
     struct {
       __u64 state;
@@ -1575,4 +1640,28 @@
 };
 #define KVM_GET_STATS_FD _IO(KVMIO, 0xce)
 #define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave)
+#define KVM_S390_PV_CPU_COMMAND _IOWR(KVMIO, 0xd0, struct kvm_pv_cmd)
+#define KVM_X86_NOTIFY_VMEXIT_ENABLED (1ULL << 0)
+#define KVM_X86_NOTIFY_VMEXIT_USER (1ULL << 1)
+#define KVM_S390_ZPCI_OP _IOW(KVMIO, 0xd1, struct kvm_s390_zpci_op)
+struct kvm_s390_zpci_op {
+  __u32 fh;
+  __u8 op;
+  __u8 pad[3];
+  union {
+    struct {
+      __u64 ibv;
+      __u64 sb;
+      __u32 flags;
+      __u32 noi;
+      __u8 isc;
+      __u8 sbo;
+      __u16 pad;
+    } reg_aen;
+    __u64 reserved[8];
+  } u;
+};
+#define KVM_S390_ZPCIOP_REG_AEN 0
+#define KVM_S390_ZPCIOP_DEREG_AEN 1
+#define KVM_S390_ZPCIOP_REGAEN_HOST (1 << 0)
 #endif
diff --git a/libc/kernel/uapi/linux/l2tp.h b/libc/kernel/uapi/linux/l2tp.h
index a054819..dee634e 100644
--- a/libc/kernel/uapi/linux/l2tp.h
+++ b/libc/kernel/uapi/linux/l2tp.h
@@ -22,7 +22,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/in6.h>
-#define IPPROTO_L2TP 115
 #define __SOCK_SIZE__ 16
 struct sockaddr_l2tpip {
   __kernel_sa_family_t l2tp_family;
diff --git a/libc/kernel/uapi/linux/landlock.h b/libc/kernel/uapi/linux/landlock.h
index ea2fd74..c284ea4 100644
--- a/libc/kernel/uapi/linux/landlock.h
+++ b/libc/kernel/uapi/linux/landlock.h
@@ -44,4 +44,5 @@
 #define LANDLOCK_ACCESS_FS_MAKE_BLOCK (1ULL << 11)
 #define LANDLOCK_ACCESS_FS_MAKE_SYM (1ULL << 12)
 #define LANDLOCK_ACCESS_FS_REFER (1ULL << 13)
+#define LANDLOCK_ACCESS_FS_TRUNCATE (1ULL << 14)
 #endif
diff --git a/libc/kernel/uapi/linux/loadpin.h b/libc/kernel/uapi/linux/loadpin.h
new file mode 100644
index 0000000..2641939
--- /dev/null
+++ b/libc/kernel/uapi/linux/loadpin.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_LOOP_LOADPIN_H
+#define _UAPI_LINUX_LOOP_LOADPIN_H
+#define LOADPIN_IOC_MAGIC 'L'
+#define LOADPIN_IOC_SET_TRUSTED_VERITY_DIGESTS _IOW(LOADPIN_IOC_MAGIC, 0x00, unsigned int)
+#endif
diff --git a/libc/kernel/uapi/linux/lwtunnel.h b/libc/kernel/uapi/linux/lwtunnel.h
index e6fb536..94011dd 100644
--- a/libc/kernel/uapi/linux/lwtunnel.h
+++ b/libc/kernel/uapi/linux/lwtunnel.h
@@ -30,6 +30,7 @@
   LWTUNNEL_ENCAP_SEG6_LOCAL,
   LWTUNNEL_ENCAP_RPL,
   LWTUNNEL_ENCAP_IOAM6,
+  LWTUNNEL_ENCAP_XFRM,
   __LWTUNNEL_ENCAP_MAX,
 };
 #define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1)
@@ -107,4 +108,11 @@
 };
 #define LWT_BPF_MAX (__LWT_BPF_MAX - 1)
 #define LWT_BPF_MAX_HEADROOM 256
+enum {
+  LWT_XFRM_UNSPEC,
+  LWT_XFRM_IF_ID,
+  LWT_XFRM_LINK,
+  __LWT_XFRM_MAX,
+};
+#define LWT_XFRM_MAX (__LWT_XFRM_MAX - 1)
 #endif
diff --git a/libc/kernel/uapi/linux/magic.h b/libc/kernel/uapi/linux/magic.h
index 6563411..ac2a0f3 100644
--- a/libc/kernel/uapi/linux/magic.h
+++ b/libc/kernel/uapi/linux/magic.h
@@ -99,11 +99,7 @@
 #define AAFS_MAGIC 0x5a3c69f0
 #define ZONEFS_MAGIC 0x5a4f4653
 #define UDF_SUPER_MAGIC 0x15013346
-#define BALLOON_KVM_MAGIC 0x13661366
-#define ZSMALLOC_MAGIC 0x58295829
 #define DMA_BUF_MAGIC 0x444d4142
 #define DEVMEM_MAGIC 0x454d444d
-#define Z3FOLD_MAGIC 0x33
-#define PPC_CMM_MAGIC 0xc7571590
 #define SECRETMEM_MAGIC 0x5345434d
 #endif
diff --git a/libc/kernel/uapi/linux/media-bus-format.h b/libc/kernel/uapi/linux/media-bus-format.h
index 2542a32..87614cf 100644
--- a/libc/kernel/uapi/linux/media-bus-format.h
+++ b/libc/kernel/uapi/linux/media-bus-format.h
@@ -43,9 +43,13 @@
 #define MEDIA_BUS_FMT_RGB888_3X8_DELTA 0x101d
 #define MEDIA_BUS_FMT_RGB888_1X7X4_SPWG 0x1011
 #define MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA 0x1012
+#define MEDIA_BUS_FMT_RGB666_1X30_CPADLO 0x101e
+#define MEDIA_BUS_FMT_RGB888_1X30_CPADLO 0x101f
 #define MEDIA_BUS_FMT_ARGB8888_1X32 0x100d
 #define MEDIA_BUS_FMT_RGB888_1X32_PADHI 0x100f
 #define MEDIA_BUS_FMT_RGB101010_1X30 0x1018
+#define MEDIA_BUS_FMT_RGB666_1X36_CPADLO 0x1020
+#define MEDIA_BUS_FMT_RGB888_1X36_CPADLO 0x1021
 #define MEDIA_BUS_FMT_RGB121212_1X36 0x1019
 #define MEDIA_BUS_FMT_RGB161616_1X48 0x101a
 #define MEDIA_BUS_FMT_Y8_1X8 0x2001
@@ -70,6 +74,7 @@
 #define MEDIA_BUS_FMT_YUYV12_2X12 0x201e
 #define MEDIA_BUS_FMT_YVYU12_2X12 0x201f
 #define MEDIA_BUS_FMT_Y14_1X14 0x202d
+#define MEDIA_BUS_FMT_Y16_1X16 0x202e
 #define MEDIA_BUS_FMT_UYVY8_1X16 0x200f
 #define MEDIA_BUS_FMT_VYUY8_1X16 0x2010
 #define MEDIA_BUS_FMT_YUYV8_1X16 0x2011
diff --git a/libc/kernel/uapi/linux/media.h b/libc/kernel/uapi/linux/media.h
index 869d47b..fe97e90 100644
--- a/libc/kernel/uapi/linux/media.h
+++ b/libc/kernel/uapi/linux/media.h
@@ -125,8 +125,8 @@
 };
 struct media_links_enum {
   __u32 entity;
-  struct media_pad_desc __user * pads;
-  struct media_link_desc __user * links;
+  struct media_pad_desc  * pads;
+  struct media_link_desc  * links;
   __u32 reserved[4];
 };
 #define MEDIA_INTF_T_DVB_BASE 0x00000100
diff --git a/libc/kernel/uapi/linux/minix_fs.h b/libc/kernel/uapi/linux/minix_fs.h
index b6f1c69..0878efe 100644
--- a/libc/kernel/uapi/linux/minix_fs.h
+++ b/libc/kernel/uapi/linux/minix_fs.h
@@ -77,10 +77,10 @@
 };
 struct minix_dir_entry {
   __u16 inode;
-  char name[0];
+  char name[];
 };
 struct minix3_dir_entry {
   __u32 inode;
-  char name[0];
+  char name[];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/mmc/ioctl.h b/libc/kernel/uapi/linux/mmc/ioctl.h
index afea6a5..451134b 100644
--- a/libc/kernel/uapi/linux/mmc/ioctl.h
+++ b/libc/kernel/uapi/linux/mmc/ioctl.h
@@ -39,7 +39,7 @@
 #define mmc_ioc_cmd_set_data(ic,ptr) ic.data_ptr = (__u64) (unsigned long) ptr
 struct mmc_ioc_multi_cmd {
   __u64 num_of_cmds;
-  struct mmc_ioc_cmd cmds[0];
+  struct mmc_ioc_cmd cmds[];
 };
 #define MMC_IOC_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_cmd)
 #define MMC_IOC_MULTI_CMD _IOWR(MMC_BLOCK_MAJOR, 1, struct mmc_ioc_multi_cmd)
diff --git a/libc/kernel/uapi/linux/mptcp.h b/libc/kernel/uapi/linux/mptcp.h
index da1b5af..9f7215c 100644
--- a/libc/kernel/uapi/linux/mptcp.h
+++ b/libc/kernel/uapi/linux/mptcp.h
@@ -125,6 +125,8 @@
   MPTCP_EVENT_SUB_ESTABLISHED = 10,
   MPTCP_EVENT_SUB_CLOSED = 11,
   MPTCP_EVENT_SUB_PRIORITY = 13,
+  MPTCP_EVENT_LISTENER_CREATED = 15,
+  MPTCP_EVENT_LISTENER_CLOSED = 16,
 };
 enum mptcp_event_attr {
   MPTCP_ATTR_UNSPEC = 0,
diff --git a/libc/kernel/uapi/linux/ndctl.h b/libc/kernel/uapi/linux/ndctl.h
index 0fd3ac4..7e0d560 100644
--- a/libc/kernel/uapi/linux/ndctl.h
+++ b/libc/kernel/uapi/linux/ndctl.h
@@ -22,33 +22,33 @@
 struct nd_cmd_dimm_flags {
   __u32 status;
   __u32 flags;
-} __packed;
+} __attribute__((__packed__));
 struct nd_cmd_get_config_size {
   __u32 status;
   __u32 config_size;
   __u32 max_xfer;
-} __packed;
+} __attribute__((__packed__));
 struct nd_cmd_get_config_data_hdr {
   __u32 in_offset;
   __u32 in_length;
   __u32 status;
-  __u8 out_buf[0];
-} __packed;
+  __u8 out_buf[];
+} __attribute__((__packed__));
 struct nd_cmd_set_config_hdr {
   __u32 in_offset;
   __u32 in_length;
-  __u8 in_buf[0];
-} __packed;
+  __u8 in_buf[];
+} __attribute__((__packed__));
 struct nd_cmd_vendor_hdr {
   __u32 opcode;
   __u32 in_length;
-  __u8 in_buf[0];
-} __packed;
+  __u8 in_buf[];
+} __attribute__((__packed__));
 struct nd_cmd_vendor_tail {
   __u32 status;
   __u32 out_length;
-  __u8 out_buf[0];
-} __packed;
+  __u8 out_buf[];
+} __attribute__((__packed__));
 struct nd_cmd_ars_cap {
   __u64 address;
   __u64 length;
@@ -57,7 +57,7 @@
   __u32 clear_err_unit;
   __u16 flags;
   __u16 reserved;
-} __packed;
+} __attribute__((__packed__));
 struct nd_cmd_ars_start {
   __u64 address;
   __u64 length;
@@ -66,7 +66,7 @@
   __u8 reserved[5];
   __u32 status;
   __u32 scrub_time;
-} __packed;
+} __attribute__((__packed__));
 struct nd_cmd_ars_status {
   __u32 status;
   __u32 out_length;
@@ -82,15 +82,15 @@
     __u32 reserved;
     __u64 err_address;
     __u64 length;
-  } __packed records[0];
-} __packed;
+  } __attribute__((__packed__)) records[];
+} __attribute__((__packed__));
 struct nd_cmd_clear_error {
   __u64 address;
   __u64 length;
   __u32 status;
   __u8 reserved[4];
   __u64 cleared;
-} __packed;
+} __attribute__((__packed__));
 enum {
   ND_CMD_IMPLEMENTED = 0,
   ND_CMD_ARS_CAP = 1,
diff --git a/libc/kernel/uapi/linux/neighbour.h b/libc/kernel/uapi/linux/neighbour.h
index b5dcf2e..4b479a1 100644
--- a/libc/kernel/uapi/linux/neighbour.h
+++ b/libc/kernel/uapi/linux/neighbour.h
@@ -60,6 +60,7 @@
 #define NTF_STICKY (1 << 6)
 #define NTF_ROUTER (1 << 7)
 #define NTF_EXT_MANAGED (1 << 0)
+#define NTF_EXT_LOCKED (1 << 1)
 #define NUD_INCOMPLETE 0x01
 #define NUD_REACHABLE 0x02
 #define NUD_STALE 0x04
@@ -108,6 +109,7 @@
   NDTPA_QUEUE_LENBYTES,
   NDTPA_MCAST_REPROBES,
   NDTPA_PAD,
+  NDTPA_INTERVAL_PROBE_TIME_MS,
   __NDTPA_MAX
 };
 #define NDTPA_MAX (__NDTPA_MAX - 1)
diff --git a/libc/kernel/uapi/linux/net_dropmon.h b/libc/kernel/uapi/linux/net_dropmon.h
index 35f70a5..4d2c336 100644
--- a/libc/kernel/uapi/linux/net_dropmon.h
+++ b/libc/kernel/uapi/linux/net_dropmon.h
@@ -36,11 +36,11 @@
 };
 struct net_dm_config_msg {
   __u32 entries;
-  struct net_dm_config_entry options[0];
+  struct net_dm_config_entry options[];
 };
 struct net_dm_alert_msg {
   __u32 entries;
-  struct net_dm_drop_point points[0];
+  struct net_dm_drop_point points[];
 };
 struct net_dm_user_msg {
   union {
diff --git a/libc/kernel/uapi/linux/net_tstamp.h b/libc/kernel/uapi/linux/net_tstamp.h
index 510c0da..d79d98a 100644
--- a/libc/kernel/uapi/linux/net_tstamp.h
+++ b/libc/kernel/uapi/linux/net_tstamp.h
@@ -37,7 +37,8 @@
   SOF_TIMESTAMPING_OPT_PKTINFO = (1 << 13),
   SOF_TIMESTAMPING_OPT_TX_SWHW = (1 << 14),
   SOF_TIMESTAMPING_BIND_PHC = (1 << 15),
-  SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_BIND_PHC,
+  SOF_TIMESTAMPING_OPT_ID_TCP = (1 << 16),
+  SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_ID_TCP,
   SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | SOF_TIMESTAMPING_LAST
 };
 #define SOF_TIMESTAMPING_TX_RECORD_MASK (SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_TX_SOFTWARE | SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_ACK)
diff --git a/libc/kernel/uapi/linux/netfilter_arp/arp_tables.h b/libc/kernel/uapi/linux/netfilter_arp/arp_tables.h
index 340625f..b1fb537 100644
--- a/libc/kernel/uapi/linux/netfilter_arp/arp_tables.h
+++ b/libc/kernel/uapi/linux/netfilter_arp/arp_tables.h
@@ -72,7 +72,7 @@
   __u16 next_offset;
   unsigned int comefrom;
   struct xt_counters counters;
-  unsigned char elems[0];
+  unsigned char elems[];
 };
 #define ARPT_BASE_CTL 96
 #define ARPT_SO_SET_REPLACE (ARPT_BASE_CTL)
@@ -98,12 +98,12 @@
   unsigned int hook_entry[NF_ARP_NUMHOOKS];
   unsigned int underflow[NF_ARP_NUMHOOKS];
   unsigned int num_counters;
-  struct xt_counters __user * counters;
-  struct arpt_entry entries[0];
+  struct xt_counters  * counters;
+  struct arpt_entry entries[];
 };
 struct arpt_get_entries {
   char name[XT_TABLE_MAXNAMELEN];
   unsigned int size;
-  struct arpt_entry entrytable[0];
+  struct arpt_entry entrytable[];
 };
 #endif
diff --git a/libc/kernel/uapi/linux/netfilter_bridge/ebt_among.h b/libc/kernel/uapi/linux/netfilter_bridge/ebt_among.h
index 74cd550..aa39c5b 100644
--- a/libc/kernel/uapi/linux/netfilter_bridge/ebt_among.h
+++ b/libc/kernel/uapi/linux/netfilter_bridge/ebt_among.h
@@ -28,7 +28,7 @@
 struct ebt_mac_wormhash {
   int table[257];
   int poolsize;
-  struct ebt_mac_wormhash_tuple pool[0];
+  struct ebt_mac_wormhash_tuple pool[];
 };
 #define ebt_mac_wormhash_size(x) ((x) ? sizeof(struct ebt_mac_wormhash) + (x)->poolsize * sizeof(struct ebt_mac_wormhash_tuple) : 0)
 struct ebt_among_info {
diff --git a/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h b/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
index 7c8f435..d87d65e 100644
--- a/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
+++ b/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
@@ -42,10 +42,10 @@
   unsigned int valid_hooks;
   unsigned int nentries;
   unsigned int entries_size;
-  struct ebt_entries __user * hook_entry[NF_BR_NUMHOOKS];
+  struct ebt_entries  * hook_entry[NF_BR_NUMHOOKS];
   unsigned int num_counters;
-  struct ebt_counter __user * counters;
-  char __user * entries;
+  struct ebt_counter  * counters;
+  char  * entries;
 };
 struct ebt_replace_kernel {
   char name[EBT_TABLE_MAXNAMELEN];
diff --git a/libc/kernel/uapi/linux/netfilter_decnet.h b/libc/kernel/uapi/linux/netfilter_decnet.h
deleted file mode 100644
index c9c16ca..0000000
--- a/libc/kernel/uapi/linux/netfilter_decnet.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/****************************************************************************
- ****************************************************************************
- ***
- ***   This header was automatically generated from a Linux kernel header
- ***   of the same name, to make information necessary for userspace to
- ***   call into the kernel available to libc.  It contains only constants,
- ***   structures, and macros generated from the original header, and thus,
- ***   contains no copyrightable information.
- ***
- ***   To edit the content of this header, modify the corresponding
- ***   source file (e.g. under external/kernel-headers/original/) then
- ***   run bionic/libc/kernel/tools/update_all.py
- ***
- ***   Any manual change here will be lost the next time this script will
- ***   be run. You've been warned!
- ***
- ****************************************************************************
- ****************************************************************************/
-#ifndef __LINUX_DECNET_NETFILTER_H
-#define __LINUX_DECNET_NETFILTER_H
-#include <linux/netfilter.h>
-#include <limits.h>
-#define NF_DN_NUMHOOKS 7
-#define NF_DN_PRE_ROUTING 0
-#define NF_DN_LOCAL_IN 1
-#define NF_DN_FORWARD 2
-#define NF_DN_LOCAL_OUT 3
-#define NF_DN_POST_ROUTING 4
-#define NF_DN_HELLO 5
-#define NF_DN_ROUTE 6
-enum nf_dn_hook_priorities {
-  NF_DN_PRI_FIRST = INT_MIN,
-  NF_DN_PRI_CONNTRACK = - 200,
-  NF_DN_PRI_MANGLE = - 150,
-  NF_DN_PRI_NAT_DST = - 100,
-  NF_DN_PRI_FILTER = 0,
-  NF_DN_PRI_NAT_SRC = 100,
-  NF_DN_PRI_DNRTMSG = 200,
-  NF_DN_PRI_LAST = INT_MAX,
-};
-struct nf_dn_rtmsg {
-  int nfdn_ifindex;
-};
-#define NFDN_RTMSG(r) ((unsigned char *) (r) + NLMSG_ALIGN(sizeof(struct nf_dn_rtmsg)))
-#define DNRMG_L1_GROUP 0x01
-#define DNRMG_L2_GROUP 0x02
-enum {
-  DNRNG_NLGRP_NONE,
-#define DNRNG_NLGRP_NONE DNRNG_NLGRP_NONE
-  DNRNG_NLGRP_L1,
-#define DNRNG_NLGRP_L1 DNRNG_NLGRP_L1
-  DNRNG_NLGRP_L2,
-#define DNRNG_NLGRP_L2 DNRNG_NLGRP_L2
-  __DNRNG_NLGRP_MAX
-};
-#define DNRNG_NLGRP_MAX (__DNRNG_NLGRP_MAX - 1)
-#endif
diff --git a/libc/kernel/uapi/linux/netfilter_ipv4/ip_tables.h b/libc/kernel/uapi/linux/netfilter_ipv4/ip_tables.h
index d3e6304..5179be4 100644
--- a/libc/kernel/uapi/linux/netfilter_ipv4/ip_tables.h
+++ b/libc/kernel/uapi/linux/netfilter_ipv4/ip_tables.h
@@ -112,7 +112,7 @@
   unsigned int hook_entry[NF_INET_NUMHOOKS];
   unsigned int underflow[NF_INET_NUMHOOKS];
   unsigned int num_counters;
-  struct xt_counters __user * counters;
+  struct xt_counters  * counters;
   struct ipt_entry entries[];
 };
 struct ipt_get_entries {
@@ -123,4 +123,4 @@
 static __inline__ struct xt_entry_target * ipt_get_target(struct ipt_entry * e) {
   return(struct xt_entry_target *) ((char *) e + e->target_offset);
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/libc/kernel/uapi/linux/netfilter_ipv6/ipv6_tables.h b/libc/kernel/uapi/linux/netfilter_ipv6/ipv6_tables.h
index cc7dcd1..8c4ec88 100644
--- a/libc/kernel/uapi/linux/netfilter_ipv6/ipv6_tables.h
+++ b/libc/kernel/uapi/linux/netfilter_ipv6/ipv6_tables.h
@@ -132,7 +132,7 @@
   unsigned int hook_entry[NF_INET_NUMHOOKS];
   unsigned int underflow[NF_INET_NUMHOOKS];
   unsigned int num_counters;
-  struct xt_counters __user * counters;
+  struct xt_counters  * counters;
   struct ip6t_entry entries[];
 };
 struct ip6t_get_entries {
@@ -143,4 +143,4 @@
 static __inline__ struct xt_entry_target * ip6t_get_target(struct ip6t_entry * e) {
   return(struct xt_entry_target *) ((char *) e + e->target_offset);
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/libc/kernel/uapi/linux/netlink.h b/libc/kernel/uapi/linux/netlink.h
index bc3e749..17d5291 100644
--- a/libc/kernel/uapi/linux/netlink.h
+++ b/libc/kernel/uapi/linux/netlink.h
@@ -100,6 +100,8 @@
   NLMSGERR_ATTR_OFFS,
   NLMSGERR_ATTR_COOKIE,
   NLMSGERR_ATTR_POLICY,
+  NLMSGERR_ATTR_MISS_TYPE,
+  NLMSGERR_ATTR_MISS_NEST,
   __NLMSGERR_ATTR_MAX,
   NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
 };
diff --git a/libc/kernel/uapi/linux/nfs4_mount.h b/libc/kernel/uapi/linux/nfs4_mount.h
index 0f794dd..9b9c9f8 100644
--- a/libc/kernel/uapi/linux/nfs4_mount.h
+++ b/libc/kernel/uapi/linux/nfs4_mount.h
@@ -21,7 +21,7 @@
 #define NFS4_MOUNT_VERSION 1
 struct nfs_string {
   unsigned int len;
-  const char __user * data;
+  const char  * data;
 };
 struct nfs4_mount_data {
   int version;
@@ -38,10 +38,10 @@
   struct nfs_string mnt_path;
   struct nfs_string hostname;
   unsigned int host_addrlen;
-  struct sockaddr __user * host_addr;
+  struct sockaddr  * host_addr;
   int proto;
   int auth_flavourlen;
-  int __user * auth_flavours;
+  int  * auth_flavours;
 };
 #define NFS4_MOUNT_SOFT 0x0001
 #define NFS4_MOUNT_INTR 0x0002
diff --git a/libc/kernel/uapi/linux/nl80211.h b/libc/kernel/uapi/linux/nl80211.h
index 8655d5f..83fe597 100644
--- a/libc/kernel/uapi/linux/nl80211.h
+++ b/libc/kernel/uapi/linux/nl80211.h
@@ -185,6 +185,11 @@
   NL80211_CMD_COLOR_CHANGE_COMPLETED,
   NL80211_CMD_SET_FILS_AAD,
   NL80211_CMD_ASSOC_COMEBACK,
+  NL80211_CMD_ADD_LINK,
+  NL80211_CMD_REMOVE_LINK,
+  NL80211_CMD_ADD_LINK_STA,
+  NL80211_CMD_MODIFY_LINK_STA,
+  NL80211_CMD_REMOVE_LINK_STA,
   __NL80211_CMD_AFTER_LAST,
   NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
 };
@@ -513,6 +518,16 @@
   NL80211_ATTR_AP_SETTINGS_FLAGS,
   NL80211_ATTR_EHT_CAPABILITY,
   NL80211_ATTR_DISABLE_EHT,
+  NL80211_ATTR_MLO_LINKS,
+  NL80211_ATTR_MLO_LINK_ID,
+  NL80211_ATTR_MLD_ADDR,
+  NL80211_ATTR_MLO_SUPPORT,
+  NL80211_ATTR_MAX_NUM_AKM_SUITES,
+  NL80211_ATTR_EML_CAPABILITY,
+  NL80211_ATTR_MLD_CAPA_AND_OPS,
+  NL80211_ATTR_TX_HW_TIMESTAMP,
+  NL80211_ATTR_RX_HW_TIMESTAMP,
+  NL80211_ATTR_TD_BITMAP,
   __NL80211_ATTR_AFTER_LAST,
   NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
   NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
@@ -1103,6 +1118,8 @@
   NL80211_BSS_PARENT_BSSID,
   NL80211_BSS_CHAIN_SIGNAL,
   NL80211_BSS_FREQUENCY_OFFSET,
+  NL80211_BSS_MLO_LINK_ID,
+  NL80211_BSS_MLD_ADDR,
   __NL80211_BSS_AFTER_LAST,
   NL80211_BSS_MAX = __NL80211_BSS_AFTER_LAST - 1
 };
@@ -1515,6 +1532,7 @@
   NL80211_EXT_FEATURE_BSS_COLOR,
   NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD,
   NL80211_EXT_FEATURE_RADAR_BACKGROUND,
+  NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE,
   NUM_NL80211_EXT_FEATURES,
   MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1
 };
diff --git a/libc/kernel/uapi/linux/omap3isp.h b/libc/kernel/uapi/linux/omap3isp.h
index 53345e3..1834658 100644
--- a/libc/kernel/uapi/linux/omap3isp.h
+++ b/libc/kernel/uapi/linux/omap3isp.h
@@ -88,7 +88,7 @@
 };
 struct omap3isp_stat_data {
   struct timeval ts;
-  void __user * buf;
+  void  * buf;
   __struct_group(, frame,, __u32 buf_size;
   __u16 frame_number;
   __u16 cur_frame;
@@ -224,12 +224,12 @@
   __u16 update;
   __u16 flag;
   enum omap3isp_alaw_ipwidth alawip;
-  struct omap3isp_ccdc_bclamp __user * bclamp;
-  struct omap3isp_ccdc_blcomp __user * blcomp;
-  struct omap3isp_ccdc_fpc __user * fpc;
-  struct omap3isp_ccdc_lsc_config __user * lsc_cfg;
-  struct omap3isp_ccdc_culling __user * cull;
-  __u8 __user * lsc;
+  struct omap3isp_ccdc_bclamp  * bclamp;
+  struct omap3isp_ccdc_blcomp  * blcomp;
+  struct omap3isp_ccdc_fpc  * fpc;
+  struct omap3isp_ccdc_lsc_config  * lsc_cfg;
+  struct omap3isp_ccdc_culling  * cull;
+  __u8  * lsc;
 };
 #define OMAP3ISP_PREV_LUMAENH (1 << 0)
 #define OMAP3ISP_PREV_INVALAW (1 << 1)
@@ -323,17 +323,17 @@
   __u32 update;
   __u32 flag;
   __u32 shading_shift;
-  struct omap3isp_prev_luma __user * luma;
-  struct omap3isp_prev_hmed __user * hmed;
-  struct omap3isp_prev_cfa __user * cfa;
-  struct omap3isp_prev_csup __user * csup;
-  struct omap3isp_prev_wbal __user * wbal;
-  struct omap3isp_prev_blkadj __user * blkadj;
-  struct omap3isp_prev_rgbtorgb __user * rgb2rgb;
-  struct omap3isp_prev_csc __user * csc;
-  struct omap3isp_prev_yclimit __user * yclimit;
-  struct omap3isp_prev_dcor __user * dcor;
-  struct omap3isp_prev_nf __user * nf;
-  struct omap3isp_prev_gtables __user * gamma;
+  struct omap3isp_prev_luma  * luma;
+  struct omap3isp_prev_hmed  * hmed;
+  struct omap3isp_prev_cfa  * cfa;
+  struct omap3isp_prev_csup  * csup;
+  struct omap3isp_prev_wbal  * wbal;
+  struct omap3isp_prev_blkadj  * blkadj;
+  struct omap3isp_prev_rgbtorgb  * rgb2rgb;
+  struct omap3isp_prev_csc  * csc;
+  struct omap3isp_prev_yclimit  * yclimit;
+  struct omap3isp_prev_dcor  * dcor;
+  struct omap3isp_prev_nf  * nf;
+  struct omap3isp_prev_gtables  * gamma;
 };
 #endif
diff --git a/libc/kernel/uapi/linux/omapfb.h b/libc/kernel/uapi/linux/omapfb.h
index 6ebec08..632e468 100644
--- a/libc/kernel/uapi/linux/omapfb.h
+++ b/libc/kernel/uapi/linux/omapfb.h
@@ -153,7 +153,7 @@
   __u16 w;
   __u16 h;
   size_t buffer_size;
-  void __user * buffer;
+  void  * buffer;
 };
 struct omapfb_ovl_colormode {
   __u8 overlay_idx;
diff --git a/libc/kernel/uapi/linux/openvswitch.h b/libc/kernel/uapi/linux/openvswitch.h
index c7d719c..0226e93 100644
--- a/libc/kernel/uapi/linux/openvswitch.h
+++ b/libc/kernel/uapi/linux/openvswitch.h
@@ -44,6 +44,7 @@
   OVS_DP_ATTR_PAD,
   OVS_DP_ATTR_MASKS_CACHE_SIZE,
   OVS_DP_ATTR_PER_CPU_PIDS,
+  OVS_DP_ATTR_IFINDEX,
   __OVS_DP_ATTR_MAX
 };
 #define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1)
@@ -130,9 +131,16 @@
   OVS_VPORT_ATTR_PAD,
   OVS_VPORT_ATTR_IFINDEX,
   OVS_VPORT_ATTR_NETNSID,
+  OVS_VPORT_ATTR_UPCALL_STATS,
   __OVS_VPORT_ATTR_MAX
 };
 #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1)
+enum ovs_vport_upcall_attr {
+  OVS_VPORT_UPCALL_ATTR_SUCCESS,
+  OVS_VPORT_UPCALL_ATTR_FAIL,
+  __OVS_VPORT_UPCALL_ATTR_MAX
+};
+#define OVS_VPORT_UPCALL_ATTR_MAX (__OVS_VPORT_UPCALL_ATTR_MAX - 1)
 enum {
   OVS_VXLAN_EXT_UNSPEC,
   OVS_VXLAN_EXT_GBP,
diff --git a/libc/kernel/uapi/linux/pci_regs.h b/libc/kernel/uapi/linux/pci_regs.h
index e1a38a8..f932c18 100644
--- a/libc/kernel/uapi/linux/pci_regs.h
+++ b/libc/kernel/uapi/linux/pci_regs.h
@@ -635,7 +635,8 @@
 #define PCI_EXT_CAP_ID_DVSEC 0x23
 #define PCI_EXT_CAP_ID_DLF 0x25
 #define PCI_EXT_CAP_ID_PL_16GT 0x26
-#define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_PL_16GT
+#define PCI_EXT_CAP_ID_DOE 0x2E
+#define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_DOE
 #define PCI_EXT_CAP_DSN_SIZEOF 12
 #define PCI_EXT_CAP_MCAST_ENDPOINT_SIZEOF 40
 #define PCI_ERR_UNCOR_STATUS 0x04
@@ -901,6 +902,7 @@
 #define PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG 0x34
 #define PCI_PTM_CAP 0x04
 #define PCI_PTM_CAP_REQ 0x00000001
+#define PCI_PTM_CAP_RES 0x00000002
 #define PCI_PTM_CAP_ROOT 0x00000004
 #define PCI_PTM_GRANULARITY_MASK 0x0000FF00
 #define PCI_PTM_CTRL 0x08
@@ -938,4 +940,26 @@
 #define PCI_PL_16GT_LE_CTRL_DSP_TX_PRESET_MASK 0x0000000F
 #define PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_MASK 0x000000F0
 #define PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_SHIFT 4
+#define PCI_DOE_CAP 0x04
+#define PCI_DOE_CAP_INT_SUP 0x00000001
+#define PCI_DOE_CAP_INT_MSG_NUM 0x00000ffe
+#define PCI_DOE_CTRL 0x08
+#define PCI_DOE_CTRL_ABORT 0x00000001
+#define PCI_DOE_CTRL_INT_EN 0x00000002
+#define PCI_DOE_CTRL_GO 0x80000000
+#define PCI_DOE_STATUS 0x0c
+#define PCI_DOE_STATUS_BUSY 0x00000001
+#define PCI_DOE_STATUS_INT_STATUS 0x00000002
+#define PCI_DOE_STATUS_ERROR 0x00000004
+#define PCI_DOE_STATUS_DATA_OBJECT_READY 0x80000000
+#define PCI_DOE_WRITE 0x10
+#define PCI_DOE_READ 0x14
+#define PCI_DOE_CAP_SIZEOF 0x18
+#define PCI_DOE_DATA_OBJECT_HEADER_1_VID 0x0000ffff
+#define PCI_DOE_DATA_OBJECT_HEADER_1_TYPE 0x00ff0000
+#define PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH 0x0003ffff
+#define PCI_DOE_DATA_OBJECT_DISC_REQ_3_INDEX 0x000000ff
+#define PCI_DOE_DATA_OBJECT_DISC_RSP_3_VID 0x0000ffff
+#define PCI_DOE_DATA_OBJECT_DISC_RSP_3_PROTOCOL 0x00ff0000
+#define PCI_DOE_DATA_OBJECT_DISC_RSP_3_NEXT_INDEX 0xff000000
 #endif
diff --git a/libc/kernel/uapi/linux/perf_event.h b/libc/kernel/uapi/linux/perf_event.h
index bcc4e97..8f081ed 100644
--- a/libc/kernel/uapi/linux/perf_event.h
+++ b/libc/kernel/uapi/linux/perf_event.h
@@ -108,7 +108,6 @@
   PERF_SAMPLE_CODE_PAGE_SIZE = 1U << 23,
   PERF_SAMPLE_WEIGHT_STRUCT = 1U << 24,
   PERF_SAMPLE_MAX = 1U << 25,
-  __PERF_SAMPLE_CALLCHAIN_EARLY = 1ULL << 63,
 };
 #define PERF_SAMPLE_WEIGHT_TYPE (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT)
 enum perf_branch_sample_type_shift {
@@ -130,6 +129,7 @@
   PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15,
   PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16,
   PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17,
+  PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18,
   PERF_SAMPLE_BRANCH_MAX_SHIFT
 };
 enum perf_branch_sample_type {
@@ -151,6 +151,7 @@
   PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT,
   PERF_SAMPLE_BRANCH_TYPE_SAVE = 1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT,
   PERF_SAMPLE_BRANCH_HW_INDEX = 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT,
+  PERF_SAMPLE_BRANCH_PRIV_SAVE = 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT,
   PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
 };
 enum {
@@ -167,8 +168,40 @@
   PERF_BR_COND_RET = 10,
   PERF_BR_ERET = 11,
   PERF_BR_IRQ = 12,
+  PERF_BR_SERROR = 13,
+  PERF_BR_NO_TX = 14,
+  PERF_BR_EXTEND_ABI = 15,
   PERF_BR_MAX,
 };
+enum {
+  PERF_BR_SPEC_NA = 0,
+  PERF_BR_SPEC_WRONG_PATH = 1,
+  PERF_BR_NON_SPEC_CORRECT_PATH = 2,
+  PERF_BR_SPEC_CORRECT_PATH = 3,
+  PERF_BR_SPEC_MAX,
+};
+enum {
+  PERF_BR_NEW_FAULT_ALGN = 0,
+  PERF_BR_NEW_FAULT_DATA = 1,
+  PERF_BR_NEW_FAULT_INST = 2,
+  PERF_BR_NEW_ARCH_1 = 3,
+  PERF_BR_NEW_ARCH_2 = 4,
+  PERF_BR_NEW_ARCH_3 = 5,
+  PERF_BR_NEW_ARCH_4 = 6,
+  PERF_BR_NEW_ARCH_5 = 7,
+  PERF_BR_NEW_MAX,
+};
+enum {
+  PERF_BR_PRIV_UNKNOWN = 0,
+  PERF_BR_PRIV_USER = 1,
+  PERF_BR_PRIV_KERNEL = 2,
+  PERF_BR_PRIV_HV = 3,
+};
+#define PERF_BR_ARM64_FIQ PERF_BR_NEW_ARCH_1
+#define PERF_BR_ARM64_DEBUG_HALT PERF_BR_NEW_ARCH_2
+#define PERF_BR_ARM64_DEBUG_EXIT PERF_BR_NEW_ARCH_3
+#define PERF_BR_ARM64_DEBUG_INST PERF_BR_NEW_ARCH_4
+#define PERF_BR_ARM64_DEBUG_DATA PERF_BR_NEW_ARCH_5
 #define PERF_SAMPLE_BRANCH_PLM_ALL (PERF_SAMPLE_BRANCH_USER | PERF_SAMPLE_BRANCH_KERNEL | PERF_SAMPLE_BRANCH_HV)
 enum perf_sample_regs_abi {
   PERF_SAMPLE_REGS_ABI_NONE = 0,
@@ -193,7 +226,8 @@
   PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1,
   PERF_FORMAT_ID = 1U << 2,
   PERF_FORMAT_GROUP = 1U << 3,
-  PERF_FORMAT_MAX = 1U << 4,
+  PERF_FORMAT_LOST = 1U << 4,
+  PERF_FORMAT_MAX = 1U << 5,
 };
 #define PERF_ATTR_SIZE_VER0 64
 #define PERF_ATTR_SIZE_VER1 72
@@ -246,7 +280,7 @@
 struct perf_event_query_bpf {
   __u32 ids_len;
   __u32 prog_cnt;
-  __u32 ids[0];
+  __u32 ids[];
 };
 #define PERF_EVENT_IOC_ENABLE _IO('$', 0)
 #define PERF_EVENT_IOC_DISABLE _IO('$', 1)
@@ -434,6 +468,8 @@
 #define PERF_MEM_LVLNUM_L2 0x02
 #define PERF_MEM_LVLNUM_L3 0x03
 #define PERF_MEM_LVLNUM_L4 0x04
+#define PERF_MEM_LVLNUM_CXL 0x09
+#define PERF_MEM_LVLNUM_IO 0x0a
 #define PERF_MEM_LVLNUM_ANY_CACHE 0x0b
 #define PERF_MEM_LVLNUM_LFB 0x0c
 #define PERF_MEM_LVLNUM_RAM 0x0d
@@ -447,6 +483,7 @@
 #define PERF_MEM_SNOOP_HITM 0x10
 #define PERF_MEM_SNOOP_SHIFT 19
 #define PERF_MEM_SNOOPX_FWD 0x01
+#define PERF_MEM_SNOOPX_PEER 0x02
 #define PERF_MEM_SNOOPX_SHIFT 38
 #define PERF_MEM_LOCK_NA 0x01
 #define PERF_MEM_LOCK_LOCKED 0x02
@@ -472,7 +509,7 @@
 struct perf_branch_entry {
   __u64 from;
   __u64 to;
-  __u64 mispred : 1, predicted : 1, in_tx : 1, abort : 1, cycles : 16, type : 4, reserved : 40;
+  __u64 mispred : 1, predicted : 1, in_tx : 1, abort : 1, cycles : 16, type : 4, spec : 2, new_type : 4, priv : 3, reserved : 31;
 };
 union perf_sample_weight {
   __u64 full;
diff --git a/libc/kernel/uapi/linux/pkt_cls.h b/libc/kernel/uapi/linux/pkt_cls.h
index 1db5d32..876cb73 100644
--- a/libc/kernel/uapi/linux/pkt_cls.h
+++ b/libc/kernel/uapi/linux/pkt_cls.h
@@ -199,7 +199,7 @@
   short offoff;
   short hoff;
   __be32 hmask;
-  struct tc_u32_key keys[0];
+  struct tc_u32_key keys[];
 };
 struct tc_u32_mark {
   __u32 val;
@@ -209,7 +209,7 @@
 struct tc_u32_pcnt {
   __u64 rcnt;
   __u64 rhit;
-  __u64 kcnts[0];
+  __u64 kcnts[];
 };
 #define TC_U32_TERMINAL 1
 #define TC_U32_OFFSET 2
@@ -460,6 +460,9 @@
   TCA_FLOWER_KEY_HASH,
   TCA_FLOWER_KEY_HASH_MASK,
   TCA_FLOWER_KEY_NUM_OF_VLANS,
+  TCA_FLOWER_KEY_PPPOE_SID,
+  TCA_FLOWER_KEY_PPP_PROTO,
+  TCA_FLOWER_KEY_L2TPV3_SID,
   __TCA_FLOWER_MAX,
 };
 #define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
diff --git a/libc/kernel/uapi/linux/pkt_sched.h b/libc/kernel/uapi/linux/pkt_sched.h
index e298b74..c31b8bb 100644
--- a/libc/kernel/uapi/linux/pkt_sched.h
+++ b/libc/kernel/uapi/linux/pkt_sched.h
@@ -924,6 +924,13 @@
 #define TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST _BITUL(0)
 #define TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD _BITUL(1)
 enum {
+  TCA_TAPRIO_TC_ENTRY_UNSPEC,
+  TCA_TAPRIO_TC_ENTRY_INDEX,
+  TCA_TAPRIO_TC_ENTRY_MAX_SDU,
+  __TCA_TAPRIO_TC_ENTRY_CNT,
+  TCA_TAPRIO_TC_ENTRY_MAX = (__TCA_TAPRIO_TC_ENTRY_CNT - 1)
+};
+enum {
   TCA_TAPRIO_ATTR_UNSPEC,
   TCA_TAPRIO_ATTR_PRIOMAP,
   TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST,
@@ -936,6 +943,7 @@
   TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION,
   TCA_TAPRIO_ATTR_FLAGS,
   TCA_TAPRIO_ATTR_TXTIME_DELAY,
+  TCA_TAPRIO_ATTR_TC_ENTRY,
   __TCA_TAPRIO_ATTR_MAX,
 };
 #define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1)
diff --git a/libc/kernel/uapi/linux/ppp-ioctl.h b/libc/kernel/uapi/linux/ppp-ioctl.h
index 69c6e6d..165d447 100644
--- a/libc/kernel/uapi/linux/ppp-ioctl.h
+++ b/libc/kernel/uapi/linux/ppp-ioctl.h
@@ -56,7 +56,7 @@
   enum NPmode mode;
 };
 struct ppp_option_data {
-  __u8 __user * ptr;
+  __u8  * ptr;
   __u32 length;
   int transmit;
 };
diff --git a/libc/kernel/uapi/linux/pr.h b/libc/kernel/uapi/linux/pr.h
index 7a7b8b1..b3128ee 100644
--- a/libc/kernel/uapi/linux/pr.h
+++ b/libc/kernel/uapi/linux/pr.h
@@ -19,6 +19,14 @@
 #ifndef _UAPI_PR_H
 #define _UAPI_PR_H
 #include <linux/types.h>
+enum pr_status {
+  PR_STS_SUCCESS = 0x0,
+  PR_STS_IOERR = 0x2,
+  PR_STS_RESERVATION_CONFLICT = 0x18,
+  PR_STS_RETRY_PATH_FAILURE = 0xe0000,
+  PR_STS_PATH_FAST_FAILED = 0xf0000,
+  PR_STS_PATH_FAILED = 0x10000,
+};
 enum pr_type {
   PR_WRITE_EXCLUSIVE = 1,
   PR_EXCLUSIVE_ACCESS = 2,
diff --git a/libc/kernel/uapi/linux/psci.h b/libc/kernel/uapi/linux/psci.h
index 31e7465..ea8ce59 100644
--- a/libc/kernel/uapi/linux/psci.h
+++ b/libc/kernel/uapi/linux/psci.h
@@ -39,11 +39,23 @@
 #define PSCI_0_2_FN64_MIGRATE PSCI_0_2_FN64(5)
 #define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU PSCI_0_2_FN64(7)
 #define PSCI_1_0_FN_PSCI_FEATURES PSCI_0_2_FN(10)
+#define PSCI_1_0_FN_CPU_FREEZE PSCI_0_2_FN(11)
+#define PSCI_1_0_FN_CPU_DEFAULT_SUSPEND PSCI_0_2_FN(12)
+#define PSCI_1_0_FN_NODE_HW_STATE PSCI_0_2_FN(13)
 #define PSCI_1_0_FN_SYSTEM_SUSPEND PSCI_0_2_FN(14)
 #define PSCI_1_0_FN_SET_SUSPEND_MODE PSCI_0_2_FN(15)
+#define PSCI_1_0_FN_STAT_RESIDENCY PSCI_0_2_FN(16)
+#define PSCI_1_0_FN_STAT_COUNT PSCI_0_2_FN(17)
 #define PSCI_1_1_FN_SYSTEM_RESET2 PSCI_0_2_FN(18)
+#define PSCI_1_1_FN_MEM_PROTECT PSCI_0_2_FN(19)
+#define PSCI_1_1_FN_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN(20)
+#define PSCI_1_0_FN64_CPU_DEFAULT_SUSPEND PSCI_0_2_FN64(12)
+#define PSCI_1_0_FN64_NODE_HW_STATE PSCI_0_2_FN64(13)
 #define PSCI_1_0_FN64_SYSTEM_SUSPEND PSCI_0_2_FN64(14)
+#define PSCI_1_0_FN64_STAT_RESIDENCY PSCI_0_2_FN64(16)
+#define PSCI_1_0_FN64_STAT_COUNT PSCI_0_2_FN64(17)
 #define PSCI_1_1_FN64_SYSTEM_RESET2 PSCI_0_2_FN64(18)
+#define PSCI_1_1_FN64_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN64(20)
 #define PSCI_0_2_POWER_STATE_ID_MASK 0xffff
 #define PSCI_0_2_POWER_STATE_ID_SHIFT 0
 #define PSCI_0_2_POWER_STATE_TYPE_SHIFT 16
diff --git a/libc/kernel/uapi/linux/psp-sev.h b/libc/kernel/uapi/linux/psp-sev.h
index 6c4f73d..8c9ec80 100644
--- a/libc/kernel/uapi/linux/psp-sev.h
+++ b/libc/kernel/uapi/linux/psp-sev.h
@@ -66,37 +66,37 @@
   __u32 flags;
   __u8 build;
   __u32 guest_count;
-} __packed;
+} __attribute__((__packed__));
 #define SEV_STATUS_FLAGS_CONFIG_ES 0x0100
 struct sev_user_data_pek_csr {
   __u64 address;
   __u32 length;
-} __packed;
+} __attribute__((__packed__));
 struct sev_user_data_pek_cert_import {
   __u64 pek_cert_address;
   __u32 pek_cert_len;
   __u64 oca_cert_address;
   __u32 oca_cert_len;
-} __packed;
+} __attribute__((__packed__));
 struct sev_user_data_pdh_cert_export {
   __u64 pdh_cert_address;
   __u32 pdh_cert_len;
   __u64 cert_chain_address;
   __u32 cert_chain_len;
-} __packed;
+} __attribute__((__packed__));
 struct sev_user_data_get_id {
   __u8 socket1[64];
   __u8 socket2[64];
-} __packed;
+} __attribute__((__packed__));
 struct sev_user_data_get_id2 {
   __u64 address;
   __u32 length;
-} __packed;
+} __attribute__((__packed__));
 struct sev_issue_cmd {
   __u32 cmd;
   __u64 data;
   __u32 error;
-} __packed;
+} __attribute__((__packed__));
 #define SEV_IOC_TYPE 'S'
 #define SEV_ISSUE_CMD _IOWR(SEV_IOC_TYPE, 0x0, struct sev_issue_cmd)
 #endif
diff --git a/libc/kernel/uapi/linux/qrtr.h b/libc/kernel/uapi/linux/qrtr.h
index c0a4c72..ee56aca 100644
--- a/libc/kernel/uapi/linux/qrtr.h
+++ b/libc/kernel/uapi/linux/qrtr.h
@@ -54,5 +54,5 @@
       __le32 port;
     } client;
   };
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/linux/raid/md_p.h b/libc/kernel/uapi/linux/raid/md_p.h
index 4ad444a..dc3084a 100644
--- a/libc/kernel/uapi/linux/raid/md_p.h
+++ b/libc/kernel/uapi/linux/raid/md_p.h
@@ -168,7 +168,7 @@
   __le32 sb_csum;
   __le32 max_dev;
   __u8 pad3[64 - 32];
-  __le16 dev_roles[0];
+  __le16 dev_roles[];
 };
 #define MD_FEATURE_BITMAP_OFFSET 1
 #define MD_FEATURE_RECOVERY_OFFSET 2
diff --git a/libc/kernel/uapi/linux/random.h b/libc/kernel/uapi/linux/random.h
index 2d3cfef..8df411b 100644
--- a/libc/kernel/uapi/linux/random.h
+++ b/libc/kernel/uapi/linux/random.h
@@ -31,7 +31,7 @@
 struct rand_pool_info {
   int entropy_count;
   int buf_size;
-  __u32 buf[0];
+  __u32 buf[];
 };
 #define GRND_NONBLOCK 0x0001
 #define GRND_RANDOM 0x0002
diff --git a/libc/kernel/uapi/linux/rkisp1-config.h b/libc/kernel/uapi/linux/rkisp1-config.h
index cea14cd..7175c23 100644
--- a/libc/kernel/uapi/linux/rkisp1-config.h
+++ b/libc/kernel/uapi/linux/rkisp1-config.h
@@ -67,6 +67,37 @@
 #define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 81
 #define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12
 #define RKISP1_CIF_ISP_DPCC_METHODS_MAX 3
+#define RKISP1_CIF_ISP_DPCC_MODE_STAGE1_ENABLE (1U << 2)
+#define RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_STAGE1_INCL_G_CENTER (1U << 0)
+#define RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_STAGE1_INCL_RB_CENTER (1U << 1)
+#define RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_STAGE1_G_3X3 (1U << 2)
+#define RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_STAGE1_RB_3X3 (1U << 3)
+#define RKISP1_CIF_ISP_DPCC_SET_USE_STAGE1_USE_SET(n) ((n) << 0)
+#define RKISP1_CIF_ISP_DPCC_SET_USE_STAGE1_USE_FIX_SET (1U << 3)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_PG_GREEN_ENABLE (1U << 0)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_LC_GREEN_ENABLE (1U << 1)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RO_GREEN_ENABLE (1U << 2)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RND_GREEN_ENABLE (1U << 3)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RG_GREEN_ENABLE (1U << 4)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_PG_RED_BLUE_ENABLE (1U << 8)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_LC_RED_BLUE_ENABLE (1U << 9)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RO_RED_BLUE_ENABLE (1U << 10)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RND_RED_BLUE_ENABLE (1U << 11)
+#define RKISP1_CIF_ISP_DPCC_METHODS_SET_RG_RED_BLUE_ENABLE (1U << 12)
+#define RKISP1_CIF_ISP_DPCC_LINE_THRESH_G(v) ((v) << 0)
+#define RKISP1_CIF_ISP_DPCC_LINE_THRESH_RB(v) ((v) << 8)
+#define RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_G(v) ((v) << 0)
+#define RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_RB(v) ((v) << 8)
+#define RKISP1_CIF_ISP_DPCC_PG_FAC_G(v) ((v) << 0)
+#define RKISP1_CIF_ISP_DPCC_PG_FAC_RB(v) ((v) << 8)
+#define RKISP1_CIF_ISP_DPCC_RND_THRESH_G(v) ((v) << 0)
+#define RKISP1_CIF_ISP_DPCC_RND_THRESH_RB(v) ((v) << 8)
+#define RKISP1_CIF_ISP_DPCC_RG_FAC_G(v) ((v) << 0)
+#define RKISP1_CIF_ISP_DPCC_RG_FAC_RB(v) ((v) << 8)
+#define RKISP1_CIF_ISP_DPCC_RO_LIMITS_n_G(n,v) ((v) << ((n) * 4))
+#define RKISP1_CIF_ISP_DPCC_RO_LIMITS_n_RB(n,v) ((v) << ((n) * 4 + 2))
+#define RKISP1_CIF_ISP_DPCC_RND_OFFS_n_G(n,v) ((v) << ((n) * 4))
+#define RKISP1_CIF_ISP_DPCC_RND_OFFS_n_RB(n,v) ((v) << ((n) * 4 + 2))
 #define RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS 17
 #define RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS 6
 #define RKISP1_CIF_ISP_STAT_AWB (1U << 0)
diff --git a/libc/kernel/uapi/linux/romfs_fs.h b/libc/kernel/uapi/linux/romfs_fs.h
index 8e98714..bffbaf9 100644
--- a/libc/kernel/uapi/linux/romfs_fs.h
+++ b/libc/kernel/uapi/linux/romfs_fs.h
@@ -35,14 +35,14 @@
   __be32 word1;
   __be32 size;
   __be32 checksum;
-  char name[0];
+  char name[];
 };
 struct romfs_inode {
   __be32 next;
   __be32 spec;
   __be32 size;
   __be32 checksum;
-  char name[0];
+  char name[];
 };
 #define ROMFH_TYPE 7
 #define ROMFH_HRD 0
diff --git a/libc/kernel/uapi/linux/route.h b/libc/kernel/uapi/linux/route.h
index 4ba6023..f33327c 100644
--- a/libc/kernel/uapi/linux/route.h
+++ b/libc/kernel/uapi/linux/route.h
@@ -30,7 +30,7 @@
   unsigned long rt_pad3;
   void * rt_pad4;
   short rt_metric;
-  char __user * rt_dev;
+  char  * rt_dev;
   unsigned long rt_mtu;
 #define rt_mss rt_mtu
   unsigned long rt_window;
diff --git a/libc/kernel/uapi/linux/rtnetlink.h b/libc/kernel/uapi/linux/rtnetlink.h
index 321e487..7201827 100644
--- a/libc/kernel/uapi/linux/rtnetlink.h
+++ b/libc/kernel/uapi/linux/rtnetlink.h
@@ -323,7 +323,7 @@
 #define RTNH_DATA(rtnh) ((struct rtattr *) (((char *) (rtnh)) + RTNH_LENGTH(0)))
 struct rtvia {
   __kernel_sa_family_t rtvia_family;
-  __u8 rtvia_addr[0];
+  __u8 rtvia_addr[];
 };
 struct rta_cacheinfo {
   __u32 rta_clntref;
diff --git a/libc/kernel/uapi/linux/sctp.h b/libc/kernel/uapi/linux/sctp.h
index 765d6c9..4bf2412 100644
--- a/libc/kernel/uapi/linux/sctp.h
+++ b/libc/kernel/uapi/linux/sctp.h
@@ -210,7 +210,7 @@
   __u16 sac_outbound_streams;
   __u16 sac_inbound_streams;
   sctp_assoc_t sac_assoc_id;
-  __u8 sac_info[0];
+  __u8 sac_info[];
 };
 enum sctp_sac_state {
   SCTP_COMM_UP,
@@ -244,7 +244,7 @@
   __u32 sre_length;
   __be16 sre_error;
   sctp_assoc_t sre_assoc_id;
-  __u8 sre_data[0];
+  __u8 sre_data[];
 };
 struct sctp_send_failed {
   __u16 ssf_type;
@@ -253,7 +253,7 @@
   __u32 ssf_error;
   struct sctp_sndrcvinfo ssf_info;
   sctp_assoc_t ssf_assoc_id;
-  __u8 ssf_data[0];
+  __u8 ssf_data[];
 };
 struct sctp_send_failed_event {
   __u16 ssf_type;
@@ -262,7 +262,7 @@
   __u32 ssf_error;
   struct sctp_sndinfo ssfe_info;
   sctp_assoc_t ssf_assoc_id;
-  __u8 ssf_data[0];
+  __u8 ssf_data[];
 };
 enum sctp_ssf_flags {
   SCTP_DATA_UNSENT,
@@ -570,7 +570,7 @@
 struct sctp_getaddrs {
   sctp_assoc_t assoc_id;
   __u32 addr_num;
-  __u8 addrs[0];
+  __u8 addrs[];
 };
 struct sctp_assoc_stats {
   sctp_assoc_t sas_assoc_id;
diff --git a/libc/kernel/uapi/linux/sed-opal.h b/libc/kernel/uapi/linux/sed-opal.h
index a20197a..4c66231 100644
--- a/libc/kernel/uapi/linux/sed-opal.h
+++ b/libc/kernel/uapi/linux/sed-opal.h
@@ -46,6 +46,9 @@
   OPAL_RW = 0x02,
   OPAL_LK = 0x04,
 };
+enum opal_lock_flags {
+  OPAL_SAVE_FOR_LOCK = 0x01,
+};
 struct opal_key {
   __u8 lr;
   __u8 key_len;
@@ -74,7 +77,8 @@
 struct opal_lock_unlock {
   struct opal_session_info session;
   __u32 l_state;
-  __u8 __align[4];
+  __u16 flags;
+  __u8 __align[2];
 };
 struct opal_new_pw {
   struct opal_session_info session;
@@ -112,6 +116,16 @@
   __u64 flags;
   __u64 priv;
 };
+#define OPAL_FL_SUPPORTED 0x00000001
+#define OPAL_FL_LOCKING_SUPPORTED 0x00000002
+#define OPAL_FL_LOCKING_ENABLED 0x00000004
+#define OPAL_FL_LOCKED 0x00000008
+#define OPAL_FL_MBR_ENABLED 0x00000010
+#define OPAL_FL_MBR_DONE 0x00000020
+struct opal_status {
+  __u32 flags;
+  __u32 reserved;
+};
 #define IOC_OPAL_SAVE _IOW('p', 220, struct opal_lock_unlock)
 #define IOC_OPAL_LOCK_UNLOCK _IOW('p', 221, struct opal_lock_unlock)
 #define IOC_OPAL_TAKE_OWNERSHIP _IOW('p', 222, struct opal_key)
@@ -128,4 +142,5 @@
 #define IOC_OPAL_MBR_DONE _IOW('p', 233, struct opal_mbr_done)
 #define IOC_OPAL_WRITE_SHADOW_MBR _IOW('p', 234, struct opal_shadow_mbr)
 #define IOC_OPAL_GENERIC_TABLE_RW _IOW('p', 235, struct opal_read_write_table)
+#define IOC_OPAL_GET_STATUS _IOR('p', 236, struct opal_status)
 #endif
diff --git a/libc/kernel/uapi/linux/seg6.h b/libc/kernel/uapi/linux/seg6.h
index f180485..b8206cc 100644
--- a/libc/kernel/uapi/linux/seg6.h
+++ b/libc/kernel/uapi/linux/seg6.h
@@ -28,7 +28,7 @@
   __u8 first_segment;
   __u8 flags;
   __u16 tag;
-  struct in6_addr segments[0];
+  struct in6_addr segments[];
 };
 #define SR6_FLAG1_PROTECTED (1 << 6)
 #define SR6_FLAG1_OAM (1 << 5)
diff --git a/libc/kernel/uapi/linux/seg6_iptunnel.h b/libc/kernel/uapi/linux/seg6_iptunnel.h
index 1c1ad83..19d8ba4 100644
--- a/libc/kernel/uapi/linux/seg6_iptunnel.h
+++ b/libc/kernel/uapi/linux/seg6_iptunnel.h
@@ -27,12 +27,14 @@
 #define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1)
 struct seg6_iptunnel_encap {
   int mode;
-  struct ipv6_sr_hdr srh[0];
+  struct ipv6_sr_hdr srh[];
 };
 #define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(* x)) + (((x)->srh->hdrlen + 1) << 3))
 enum {
   SEG6_IPTUN_MODE_INLINE,
   SEG6_IPTUN_MODE_ENCAP,
   SEG6_IPTUN_MODE_L2ENCAP,
+  SEG6_IPTUN_MODE_ENCAP_RED,
+  SEG6_IPTUN_MODE_L2ENCAP_RED,
 };
 #endif
diff --git a/libc/kernel/uapi/linux/seg6_local.h b/libc/kernel/uapi/linux/seg6_local.h
index 61a8d97..4d062e8 100644
--- a/libc/kernel/uapi/linux/seg6_local.h
+++ b/libc/kernel/uapi/linux/seg6_local.h
@@ -31,6 +31,7 @@
   SEG6_LOCAL_BPF,
   SEG6_LOCAL_VRFTABLE,
   SEG6_LOCAL_COUNTERS,
+  SEG6_LOCAL_FLAVORS,
   __SEG6_LOCAL_MAX,
 };
 #define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
@@ -71,4 +72,21 @@
   __SEG6_LOCAL_CNT_MAX,
 };
 #define SEG6_LOCAL_CNT_MAX (__SEG6_LOCAL_CNT_MAX - 1)
+enum {
+  SEG6_LOCAL_FLV_UNSPEC,
+  SEG6_LOCAL_FLV_OPERATION,
+  SEG6_LOCAL_FLV_LCBLOCK_BITS,
+  SEG6_LOCAL_FLV_LCNODE_FN_BITS,
+  __SEG6_LOCAL_FLV_MAX,
+};
+#define SEG6_LOCAL_FLV_MAX (__SEG6_LOCAL_FLV_MAX - 1)
+enum {
+  SEG6_LOCAL_FLV_OP_UNSPEC,
+  SEG6_LOCAL_FLV_OP_PSP,
+  SEG6_LOCAL_FLV_OP_USP,
+  SEG6_LOCAL_FLV_OP_USD,
+  SEG6_LOCAL_FLV_OP_NEXT_CSID,
+  __SEG6_LOCAL_FLV_OP_MAX
+};
+#define SEG6_LOCAL_FLV_OP_MAX (__SEG6_LOCAL_FLV_OP_MAX - 1)
 #endif
diff --git a/libc/kernel/uapi/linux/sem.h b/libc/kernel/uapi/linux/sem.h
index 98ed1bf..c2f25e7 100644
--- a/libc/kernel/uapi/linux/sem.h
+++ b/libc/kernel/uapi/linux/sem.h
@@ -48,10 +48,10 @@
 };
 union __kernel_legacy_semun {
   int val;
-  struct __kernel_legacy_semid_ds __user * buf;
-  unsigned short __user * array;
-  struct seminfo __user * __buf;
-  void __user * __pad;
+  struct __kernel_legacy_semid_ds  * buf;
+  unsigned short  * array;
+  struct seminfo  * __buf;
+  void  * __pad;
 };
 struct seminfo {
   int semmap;
diff --git a/libc/kernel/uapi/linux/serial.h b/libc/kernel/uapi/linux/serial.h
index e4e903d..5a83c62 100644
--- a/libc/kernel/uapi/linux/serial.h
+++ b/libc/kernel/uapi/linux/serial.h
@@ -96,9 +96,20 @@
 #define SER_RS485_RTS_AFTER_SEND (1 << 2)
 #define SER_RS485_RX_DURING_TX (1 << 4)
 #define SER_RS485_TERMINATE_BUS (1 << 5)
+#define SER_RS485_ADDRB (1 << 6)
+#define SER_RS485_ADDR_RECV (1 << 7)
+#define SER_RS485_ADDR_DEST (1 << 8)
   __u32 delay_rts_before_send;
   __u32 delay_rts_after_send;
-  __u32 padding[5];
+  union {
+    __u32 padding[5];
+    struct {
+      __u8 addr_recv;
+      __u8 addr_dest;
+      __u8 padding0[2];
+      __u32 padding1[4];
+    };
+  };
 };
 struct serial_iso7816 {
   __u32 flags;
diff --git a/libc/kernel/uapi/linux/serial_core.h b/libc/kernel/uapi/linux/serial_core.h
index b99c7d4..1e04429 100644
--- a/libc/kernel/uapi/linux/serial_core.h
+++ b/libc/kernel/uapi/linux/serial_core.h
@@ -69,8 +69,6 @@
 #define PORT_IMX 62
 #define PORT_MPSC 63
 #define PORT_TXX9 64
-#define PORT_VR41XX_SIU 65
-#define PORT_VR41XX_DSIU 66
 #define PORT_S3C2400 67
 #define PORT_M32R_SIO 68
 #define PORT_JSM 69
diff --git a/libc/kernel/uapi/linux/serial_reg.h b/libc/kernel/uapi/linux/serial_reg.h
index b6648f8..e41e649 100644
--- a/libc/kernel/uapi/linux/serial_reg.h
+++ b/libc/kernel/uapi/linux/serial_reg.h
@@ -99,7 +99,7 @@
 #define UART_LSR_PE 0x04
 #define UART_LSR_OE 0x02
 #define UART_LSR_DR 0x01
-#define UART_LSR_BRK_ERROR_BITS 0x1E
+#define UART_LSR_BRK_ERROR_BITS (UART_LSR_BI | UART_LSR_FE | UART_LSR_PE | UART_LSR_OE)
 #define UART_MSR 6
 #define UART_MSR_DCD 0x80
 #define UART_MSR_RI 0x40
@@ -109,7 +109,7 @@
 #define UART_MSR_TERI 0x04
 #define UART_MSR_DDSR 0x02
 #define UART_MSR_DCTS 0x01
-#define UART_MSR_ANY_DELTA 0x0F
+#define UART_MSR_ANY_DELTA (UART_MSR_DDCD | UART_MSR_TERI | UART_MSR_DDSR | UART_MSR_DCTS)
 #define UART_SCR 7
 #define UART_DLL 0
 #define UART_DLM 1
diff --git a/libc/kernel/uapi/linux/smc.h b/libc/kernel/uapi/linux/smc.h
index be6b71f..200c9b6 100644
--- a/libc/kernel/uapi/linux/smc.h
+++ b/libc/kernel/uapi/linux/smc.h
@@ -112,6 +112,7 @@
   SMC_NLA_LGR_R_V2,
   SMC_NLA_LGR_R_NET_COOKIE,
   SMC_NLA_LGR_R_PAD,
+  SMC_NLA_LGR_R_BUF_TYPE,
   __SMC_NLA_LGR_R_MAX,
   SMC_NLA_LGR_R_MAX = __SMC_NLA_LGR_R_MAX - 1
 };
diff --git a/libc/kernel/uapi/linux/snmp.h b/libc/kernel/uapi/linux/snmp.h
index a503a7e..e3d6ee3 100644
--- a/libc/kernel/uapi/linux/snmp.h
+++ b/libc/kernel/uapi/linux/snmp.h
@@ -259,6 +259,7 @@
   LINUX_MIB_TCPDSACKIGNOREDDUBIOUS,
   LINUX_MIB_TCPMIGRATEREQSUCCESS,
   LINUX_MIB_TCPMIGRATEREQFAILURE,
+  LINUX_MIB_TCPPLBREHASH,
   __LINUX_MIB_MAX
 };
 enum {
@@ -305,6 +306,8 @@
   LINUX_MIB_TLSRXDEVICE,
   LINUX_MIB_TLSDECRYPTERROR,
   LINUX_MIB_TLSRXDEVICERESYNC,
+  LINUX_MIB_TLSDECRYPTRETRY,
+  LINUX_MIB_TLSRXNOPADVIOL,
   __LINUX_MIB_TLSMAX
 };
 #endif
diff --git a/libc/kernel/uapi/linux/stat.h b/libc/kernel/uapi/linux/stat.h
index a15b9b5..89304ce 100644
--- a/libc/kernel/uapi/linux/stat.h
+++ b/libc/kernel/uapi/linux/stat.h
@@ -78,7 +78,8 @@
   __u32 stx_dev_major;
   __u32 stx_dev_minor;
   __u64 stx_mnt_id;
-  __u64 __spare2;
+  __u32 stx_dio_mem_align;
+  __u32 stx_dio_offset_align;
   __u64 __spare3[12];
 };
 #define STATX_TYPE 0x00000001U
@@ -95,6 +96,7 @@
 #define STATX_BASIC_STATS 0x000007ffU
 #define STATX_BTIME 0x00000800U
 #define STATX_MNT_ID 0x00001000U
+#define STATX_DIOALIGN 0x00002000U
 #define STATX__RESERVED 0x80000000U
 #define STATX_ALL 0x00000fffU
 #define STATX_ATTR_COMPRESSED 0x00000004
diff --git a/libc/kernel/uapi/linux/stm.h b/libc/kernel/uapi/linux/stm.h
index 1c7f7f3..b1453f7 100644
--- a/libc/kernel/uapi/linux/stm.h
+++ b/libc/kernel/uapi/linux/stm.h
@@ -28,7 +28,7 @@
   __u16 width;
   __u16 __reserved_0;
   __u32 __reserved_1;
-  char id[0];
+  char id[];
 };
 #define STP_POLICY_ID_SET _IOWR('%', 0, struct stp_policy_id)
 #define STP_POLICY_ID_GET _IOR('%', 1, struct stp_policy_id)
diff --git a/libc/kernel/uapi/linux/swab.h b/libc/kernel/uapi/linux/swab.h
index e96085e..332023a 100644
--- a/libc/kernel/uapi/linux/swab.h
+++ b/libc/kernel/uapi/linux/swab.h
@@ -19,7 +19,7 @@
 #ifndef _UAPI_LINUX_SWAB_H
 #define _UAPI_LINUX_SWAB_H
 #include <linux/types.h>
-#include <linux/compiler.h>
+#include <linux/stddef.h>
 #include <asm/bitsperlong.h>
 #include <asm/swab.h>
 #define ___constant_swab16(x) ((__u16) ((((__u16) (x) & (__u16) 0x00ffU) << 8) | (((__u16) (x) & (__u16) 0xff00U) >> 8)))
diff --git a/libc/kernel/uapi/linux/sysctl.h b/libc/kernel/uapi/linux/sysctl.h
index ae9c2ba..5714323 100644
--- a/libc/kernel/uapi/linux/sysctl.h
+++ b/libc/kernel/uapi/linux/sysctl.h
@@ -23,11 +23,11 @@
 #include <linux/compiler.h>
 #define CTL_MAXNAME 10
 struct __sysctl_args {
-  int __user * name;
+  int  * name;
   int nlen;
-  void __user * oldval;
-  size_t __user * oldlenp;
-  void __user * newval;
+  void  * oldval;
+  size_t  * oldlenp;
+  void  * newval;
   size_t newlen;
   unsigned long __linux_unused[4];
 };
@@ -516,6 +516,7 @@
   NET_NEIGH_GC_THRESH3 = 16,
   NET_NEIGH_RETRANS_TIME_MS = 17,
   NET_NEIGH_REACHABLE_TIME_MS = 18,
+  NET_NEIGH_INTERVAL_PROBE_TIME_MS = 19,
 };
 enum {
   NET_DCCP_DEFAULT = 1,
diff --git a/libc/kernel/uapi/linux/target_core_user.h b/libc/kernel/uapi/linux/target_core_user.h
index dcba00e..83e155e 100644
--- a/libc/kernel/uapi/linux/target_core_user.h
+++ b/libc/kernel/uapi/linux/target_core_user.h
@@ -34,7 +34,7 @@
   __u32 cmdr_size;
   __u32 cmd_head;
   __u32 cmd_tail __attribute__((__aligned__(ALIGN_SIZE)));
-} __packed;
+} __attribute__((__packed__));
 enum tcmu_opcode {
   TCMU_OP_PAD = 0,
   TCMU_OP_CMD,
@@ -48,7 +48,7 @@
 #define TCMU_UFLAG_READ_LEN 0x2
 #define TCMU_UFLAG_KEEP_BUF 0x4
   __u8 uflags;
-} __packed;
+} __attribute__((__packed__));
 #define TCMU_OP_MASK 0x7
 #define TCMU_SENSE_BUFFERSIZE 96
 struct tcmu_cmd_entry {
@@ -71,7 +71,7 @@
       char sense_buffer[TCMU_SENSE_BUFFERSIZE];
     } rsp;
   };
-} __packed;
+} __attribute__((__packed__));
 struct tcmu_tmr_entry {
   struct tcmu_cmd_entry_hdr hdr;
 #define TCMU_TMR_UNKNOWN 0
@@ -89,8 +89,8 @@
   __u32 cmd_cnt;
   __u64 __pad3;
   __u64 __pad4;
-  __u16 cmd_ids[0];
-} __packed;
+  __u16 cmd_ids[];
+} __attribute__((__packed__));
 #define TCMU_OP_ALIGN_SIZE sizeof(__u64)
 enum tcmu_genl_cmd {
   TCMU_CMD_UNSPEC,
diff --git a/libc/kernel/uapi/linux/tc_act/tc_ct.h b/libc/kernel/uapi/linux/tc_act/tc_ct.h
index 0443b95..be83c60 100644
--- a/libc/kernel/uapi/linux/tc_act/tc_ct.h
+++ b/libc/kernel/uapi/linux/tc_act/tc_ct.h
@@ -37,6 +37,9 @@
   TCA_CT_NAT_PORT_MIN,
   TCA_CT_NAT_PORT_MAX,
   TCA_CT_PAD,
+  TCA_CT_HELPER_NAME,
+  TCA_CT_HELPER_FAMILY,
+  TCA_CT_HELPER_PROTO,
   __TCA_CT_MAX
 };
 #define TCA_CT_MAX (__TCA_CT_MAX - 1)
diff --git a/libc/kernel/uapi/linux/tcp.h b/libc/kernel/uapi/linux/tcp.h
index c96d695..7a93208 100644
--- a/libc/kernel/uapi/linux/tcp.h
+++ b/libc/kernel/uapi/linux/tcp.h
@@ -192,6 +192,8 @@
   __u32 tcpi_reord_seen;
   __u32 tcpi_rcv_ooopack;
   __u32 tcpi_snd_wnd;
+  __u32 tcpi_rcv_wnd;
+  __u32 tcpi_rehash;
 };
 enum {
   TCP_NLA_PAD,
@@ -221,6 +223,7 @@
   TCP_NLA_BYTES_NOTSENT,
   TCP_NLA_EDT,
   TCP_NLA_TTL,
+  TCP_NLA_REHASH,
 };
 #define TCP_MD5SIG_MAXKEYLEN 80
 #define TCP_MD5SIG_FLAG_PREFIX 0x1
diff --git a/libc/kernel/uapi/linux/tdx-guest.h b/libc/kernel/uapi/linux/tdx-guest.h
new file mode 100644
index 0000000..50f9c62
--- /dev/null
+++ b/libc/kernel/uapi/linux/tdx-guest.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_TDX_GUEST_H_
+#define _UAPI_LINUX_TDX_GUEST_H_
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#define TDX_REPORTDATA_LEN 64
+#define TDX_REPORT_LEN 1024
+struct tdx_report_req {
+  __u8 reportdata[TDX_REPORTDATA_LEN];
+  __u8 tdreport[TDX_REPORT_LEN];
+};
+#define TDX_CMD_GET_REPORT0 _IOWR('T', 1, struct tdx_report_req)
+#endif
diff --git a/libc/kernel/uapi/linux/time.h b/libc/kernel/uapi/linux/time.h
index df52295..55d0e6e 100644
--- a/libc/kernel/uapi/linux/time.h
+++ b/libc/kernel/uapi/linux/time.h
@@ -18,14 +18,11 @@
  ****************************************************************************/
 #ifndef _UAPI_LINUX_TIME_H
 #define _UAPI_LINUX_TIME_H
+#include <bits/timespec.h>
 #include <linux/types.h>
 #include <linux/time_types.h>
 #ifndef _STRUCT_TIMESPEC
 #define _STRUCT_TIMESPEC
-struct timespec {
-  __kernel_old_time_t tv_sec;
-  long tv_nsec;
-};
 #endif
 struct timeval {
   __kernel_old_time_t tv_sec;
diff --git a/libc/kernel/uapi/linux/tls.h b/libc/kernel/uapi/linux/tls.h
index 4501cda..fcab74b 100644
--- a/libc/kernel/uapi/linux/tls.h
+++ b/libc/kernel/uapi/linux/tls.h
@@ -22,6 +22,7 @@
 #define TLS_TX 1
 #define TLS_RX 2
 #define TLS_TX_ZEROCOPY_RO 3
+#define TLS_RX_EXPECT_NO_PAD 4
 #define TLS_VERSION_MINOR(ver) ((ver) & 0xFF)
 #define TLS_VERSION_MAJOR(ver) (((ver) >> 8) & 0xFF)
 #define TLS_VERSION_NUMBER(id) ((((id ##_VERSION_MAJOR) & 0xFF) << 8) | ((id ##_VERSION_MINOR) & 0xFF))
@@ -67,6 +68,18 @@
 #define TLS_CIPHER_SM4_CCM_SALT_SIZE 4
 #define TLS_CIPHER_SM4_CCM_TAG_SIZE 16
 #define TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE 8
+#define TLS_CIPHER_ARIA_GCM_128 57
+#define TLS_CIPHER_ARIA_GCM_128_IV_SIZE 8
+#define TLS_CIPHER_ARIA_GCM_128_KEY_SIZE 16
+#define TLS_CIPHER_ARIA_GCM_128_SALT_SIZE 4
+#define TLS_CIPHER_ARIA_GCM_128_TAG_SIZE 16
+#define TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE 8
+#define TLS_CIPHER_ARIA_GCM_256 58
+#define TLS_CIPHER_ARIA_GCM_256_IV_SIZE 8
+#define TLS_CIPHER_ARIA_GCM_256_KEY_SIZE 32
+#define TLS_CIPHER_ARIA_GCM_256_SALT_SIZE 4
+#define TLS_CIPHER_ARIA_GCM_256_TAG_SIZE 16
+#define TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE 8
 #define TLS_SET_RECORD_TYPE 1
 #define TLS_GET_RECORD_TYPE 2
 struct tls_crypto_info {
@@ -115,6 +128,20 @@
   unsigned char salt[TLS_CIPHER_SM4_CCM_SALT_SIZE];
   unsigned char rec_seq[TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE];
 };
+struct tls12_crypto_info_aria_gcm_128 {
+  struct tls_crypto_info info;
+  unsigned char iv[TLS_CIPHER_ARIA_GCM_128_IV_SIZE];
+  unsigned char key[TLS_CIPHER_ARIA_GCM_128_KEY_SIZE];
+  unsigned char salt[TLS_CIPHER_ARIA_GCM_128_SALT_SIZE];
+  unsigned char rec_seq[TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE];
+};
+struct tls12_crypto_info_aria_gcm_256 {
+  struct tls_crypto_info info;
+  unsigned char iv[TLS_CIPHER_ARIA_GCM_256_IV_SIZE];
+  unsigned char key[TLS_CIPHER_ARIA_GCM_256_KEY_SIZE];
+  unsigned char salt[TLS_CIPHER_ARIA_GCM_256_SALT_SIZE];
+  unsigned char rec_seq[TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE];
+};
 enum {
   TLS_INFO_UNSPEC,
   TLS_INFO_VERSION,
@@ -122,6 +149,7 @@
   TLS_INFO_TXCONF,
   TLS_INFO_RXCONF,
   TLS_INFO_ZC_RO_TX,
+  TLS_INFO_RX_NO_PAD,
   __TLS_INFO_MAX,
 };
 #define TLS_INFO_MAX (__TLS_INFO_MAX - 1)
diff --git a/libc/kernel/uapi/linux/ublk_cmd.h b/libc/kernel/uapi/linux/ublk_cmd.h
new file mode 100644
index 0000000..8c9cbeb
--- /dev/null
+++ b/libc/kernel/uapi/linux/ublk_cmd.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef USER_BLK_DRV_CMD_INC_H
+#define USER_BLK_DRV_CMD_INC_H
+#include <linux/types.h>
+#define UBLK_CMD_GET_QUEUE_AFFINITY 0x01
+#define UBLK_CMD_GET_DEV_INFO 0x02
+#define UBLK_CMD_ADD_DEV 0x04
+#define UBLK_CMD_DEL_DEV 0x05
+#define UBLK_CMD_START_DEV 0x06
+#define UBLK_CMD_STOP_DEV 0x07
+#define UBLK_CMD_SET_PARAMS 0x08
+#define UBLK_CMD_GET_PARAMS 0x09
+#define UBLK_CMD_START_USER_RECOVERY 0x10
+#define UBLK_CMD_END_USER_RECOVERY 0x11
+#define UBLK_IO_FETCH_REQ 0x20
+#define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21
+#define UBLK_IO_NEED_GET_DATA 0x22
+#define UBLK_IO_RES_OK 0
+#define UBLK_IO_RES_NEED_GET_DATA 1
+#define UBLK_IO_RES_ABORT (- ENODEV)
+#define UBLKSRV_CMD_BUF_OFFSET 0
+#define UBLKSRV_IO_BUF_OFFSET 0x80000000
+#define UBLK_MAX_QUEUE_DEPTH 4096
+#define UBLK_F_SUPPORT_ZERO_COPY (1ULL << 0)
+#define UBLK_F_URING_CMD_COMP_IN_TASK (1ULL << 1)
+#define UBLK_F_NEED_GET_DATA (1UL << 2)
+#define UBLK_F_USER_RECOVERY (1UL << 3)
+#define UBLK_F_USER_RECOVERY_REISSUE (1UL << 4)
+#define UBLK_S_DEV_DEAD 0
+#define UBLK_S_DEV_LIVE 1
+#define UBLK_S_DEV_QUIESCED 2
+struct ublksrv_ctrl_cmd {
+  __u32 dev_id;
+  __u16 queue_id;
+  __u16 len;
+  __u64 addr;
+  __u64 data[2];
+};
+struct ublksrv_ctrl_dev_info {
+  __u16 nr_hw_queues;
+  __u16 queue_depth;
+  __u16 state;
+  __u16 pad0;
+  __u32 max_io_buf_bytes;
+  __u32 dev_id;
+  __s32 ublksrv_pid;
+  __u32 pad1;
+  __u64 flags;
+  __u64 ublksrv_flags;
+  __u64 reserved0;
+  __u64 reserved1;
+  __u64 reserved2;
+};
+#define UBLK_IO_OP_READ 0
+#define UBLK_IO_OP_WRITE 1
+#define UBLK_IO_OP_FLUSH 2
+#define UBLK_IO_OP_DISCARD 3
+#define UBLK_IO_OP_WRITE_SAME 4
+#define UBLK_IO_OP_WRITE_ZEROES 5
+#define UBLK_IO_F_FAILFAST_DEV (1U << 8)
+#define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
+#define UBLK_IO_F_FAILFAST_DRIVER (1U << 10)
+#define UBLK_IO_F_META (1U << 11)
+#define UBLK_IO_F_FUA (1U << 13)
+#define UBLK_IO_F_NOUNMAP (1U << 15)
+#define UBLK_IO_F_SWAP (1U << 16)
+struct ublksrv_io_desc {
+  __u32 op_flags;
+  __u32 nr_sectors;
+  __u64 start_sector;
+  __u64 addr;
+};
+struct ublksrv_io_cmd {
+  __u16 q_id;
+  __u16 tag;
+  __s32 result;
+  __u64 addr;
+};
+struct ublk_param_basic {
+#define UBLK_ATTR_READ_ONLY (1 << 0)
+#define UBLK_ATTR_ROTATIONAL (1 << 1)
+#define UBLK_ATTR_VOLATILE_CACHE (1 << 2)
+#define UBLK_ATTR_FUA (1 << 3)
+  __u32 attrs;
+  __u8 logical_bs_shift;
+  __u8 physical_bs_shift;
+  __u8 io_opt_shift;
+  __u8 io_min_shift;
+  __u32 max_sectors;
+  __u32 chunk_sectors;
+  __u64 dev_sectors;
+  __u64 virt_boundary_mask;
+};
+struct ublk_param_discard {
+  __u32 discard_alignment;
+  __u32 discard_granularity;
+  __u32 max_discard_sectors;
+  __u32 max_write_zeroes_sectors;
+  __u16 max_discard_segments;
+  __u16 reserved0;
+};
+struct ublk_params {
+  __u32 len;
+#define UBLK_PARAM_TYPE_BASIC (1 << 0)
+#define UBLK_PARAM_TYPE_DISCARD (1 << 1)
+  __u32 types;
+  struct ublk_param_basic basic;
+  struct ublk_param_discard discard;
+};
+#endif
diff --git a/libc/kernel/uapi/linux/uhid.h b/libc/kernel/uapi/linux/uhid.h
index 228ee50..1d471f8 100644
--- a/libc/kernel/uapi/linux/uhid.h
+++ b/libc/kernel/uapi/linux/uhid.h
@@ -106,7 +106,7 @@
   __u8 name[128];
   __u8 phys[64];
   __u8 uniq[64];
-  __u8 __user * rd_data;
+  __u8  * rd_data;
   __u16 rd_size;
   __u16 bus;
   __u32 vendor;
diff --git a/libc/kernel/uapi/linux/uio.h b/libc/kernel/uapi/linux/uio.h
index fa955cd..04814c7 100644
--- a/libc/kernel/uapi/linux/uio.h
+++ b/libc/kernel/uapi/linux/uio.h
@@ -21,7 +21,7 @@
 #include <linux/compiler.h>
 #include <linux/types.h>
 struct iovec {
-  void __user * iov_base;
+  void  * iov_base;
   __kernel_size_t iov_len;
 };
 #define UIO_FASTIOV 8
diff --git a/libc/kernel/uapi/linux/usb/audio.h b/libc/kernel/uapi/linux/usb/audio.h
index 7d36157..bfda540 100644
--- a/libc/kernel/uapi/linux/usb/audio.h
+++ b/libc/kernel/uapi/linux/usb/audio.h
@@ -186,7 +186,7 @@
   __u8 bUnitID;
   __u8 bSourceID;
   __u8 bControlSize;
-  __u8 bmaControls[0];
+  __u8 bmaControls[];
 } __attribute__((packed));
 struct uac_processing_unit_descriptor {
   __u8 bLength;
diff --git a/libc/kernel/uapi/linux/usb/cdc.h b/libc/kernel/uapi/linux/usb/cdc.h
index 59c9488..bbfc4db 100644
--- a/libc/kernel/uapi/linux/usb/cdc.h
+++ b/libc/kernel/uapi/linux/usb/cdc.h
@@ -131,7 +131,7 @@
   __u8 bDescriptorType;
   __u8 bDescriptorSubType;
   __u8 bGuidDescriptorType;
-  __u8 bDetailData[0];
+  __u8 bDetailData[];
 } __attribute__((packed));
 struct usb_cdc_obex_desc {
   __u8 bLength;
@@ -201,6 +201,8 @@
 #define USB_CDC_SPACE_PARITY 4
   __u8 bDataBits;
 } __attribute__((packed));
+#define USB_CDC_CTRL_DTR (1 << 0)
+#define USB_CDC_CTRL_RTS (1 << 1)
 #define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0)
 #define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1)
 #define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2)
@@ -217,6 +219,13 @@
   __le16 wIndex;
   __le16 wLength;
 } __attribute__((packed));
+#define USB_CDC_SERIAL_STATE_DCD (1 << 0)
+#define USB_CDC_SERIAL_STATE_DSR (1 << 1)
+#define USB_CDC_SERIAL_STATE_BREAK (1 << 2)
+#define USB_CDC_SERIAL_STATE_RING_SIGNAL (1 << 3)
+#define USB_CDC_SERIAL_STATE_FRAMING (1 << 4)
+#define USB_CDC_SERIAL_STATE_PARITY (1 << 5)
+#define USB_CDC_SERIAL_STATE_OVERRUN (1 << 6)
 struct usb_cdc_speed_change {
   __le32 DLBitRRate;
   __le32 ULBitRate;
@@ -267,7 +276,7 @@
   __le32 dwSignature;
   __le16 wLength;
   __le16 wNextNdpIndex;
-  struct usb_cdc_ncm_dpe16 dpe16[0];
+  struct usb_cdc_ncm_dpe16 dpe16[];
 } __attribute__((packed));
 struct usb_cdc_ncm_dpe32 {
   __le32 dwDatagramIndex;
@@ -279,7 +288,7 @@
   __le16 wReserved6;
   __le32 dwNextNdpIndex;
   __le32 dwReserved12;
-  struct usb_cdc_ncm_dpe32 dpe32[0];
+  struct usb_cdc_ncm_dpe32 dpe32[];
 } __attribute__((packed));
 #define USB_CDC_NCM_NDP16_INDEX_MIN 0x000C
 #define USB_CDC_NCM_NDP32_INDEX_MIN 0x0010
diff --git a/libc/kernel/uapi/linux/usb/ch9.h b/libc/kernel/uapi/linux/usb/ch9.h
index f1dade9..49eb5fa 100644
--- a/libc/kernel/uapi/linux/usb/ch9.h
+++ b/libc/kernel/uapi/linux/usb/ch9.h
@@ -324,7 +324,7 @@
   __u8 bDescriptorType;
   __u8 tTKID[3];
   __u8 bReserved;
-  __u8 bKeyData[0];
+  __u8 bKeyData[];
 } __attribute__((packed));
 struct usb_encryption_descriptor {
   __u8 bLength;
diff --git a/libc/kernel/uapi/linux/usb/g_uvc.h b/libc/kernel/uapi/linux/usb/g_uvc.h
index 0aeba3d..40fad1d 100644
--- a/libc/kernel/uapi/linux/usb/g_uvc.h
+++ b/libc/kernel/uapi/linux/usb/g_uvc.h
@@ -29,6 +29,8 @@
 #define UVC_EVENT_SETUP (V4L2_EVENT_PRIVATE_START + 4)
 #define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5)
 #define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 5)
+#define UVC_STRING_CONTROL_IDX 0
+#define UVC_STRING_STREAMING_IDX 1
 struct uvc_request_data {
   __s32 length;
   __u8 data[60];
diff --git a/libc/kernel/uapi/linux/usb/raw_gadget.h b/libc/kernel/uapi/linux/usb/raw_gadget.h
index 70d5a26..8b60c8d 100644
--- a/libc/kernel/uapi/linux/usb/raw_gadget.h
+++ b/libc/kernel/uapi/linux/usb/raw_gadget.h
@@ -35,7 +35,7 @@
 struct usb_raw_event {
   __u32 type;
   __u32 length;
-  __u8 data[0];
+  __u8 data[];
 };
 #define USB_RAW_IO_FLAGS_ZERO 0x0001
 #define USB_RAW_IO_FLAGS_MASK 0x0001
@@ -43,7 +43,7 @@
   __u16 ep;
   __u16 flags;
   __u32 length;
-  __u8 data[0];
+  __u8 data[];
 };
 #define USB_RAW_EPS_NUM_MAX 30
 #define USB_RAW_EP_NAME_MAX 16
diff --git a/libc/kernel/uapi/linux/usb/tmc.h b/libc/kernel/uapi/linux/usb/tmc.h
index 6d0add1..b267290 100644
--- a/libc/kernel/uapi/linux/usb/tmc.h
+++ b/libc/kernel/uapi/linux/usb/tmc.h
@@ -46,7 +46,7 @@
 } __attribute__((packed));
 struct usbtmc_ctrlrequest {
   struct usbtmc_request req;
-  void __user * data;
+  void  * data;
 } __attribute__((packed));
 struct usbtmc_termchar {
   __u8 term_char;
@@ -59,7 +59,7 @@
   __u32 transfer_size;
   __u32 transferred;
   __u32 flags;
-  void __user * message;
+  void  * message;
 } __attribute__((packed));
 #define USBTMC_IOC_NR 91
 #define USBTMC_IOCTL_INDICATOR_PULSE _IO(USBTMC_IOC_NR, 1)
diff --git a/libc/kernel/uapi/linux/usb/video.h b/libc/kernel/uapi/linux/usb/video.h
index b45bada..c3d360a 100644
--- a/libc/kernel/uapi/linux/usb/video.h
+++ b/libc/kernel/uapi/linux/usb/video.h
@@ -316,7 +316,7 @@
   __u8 bDefaultFrameIndex;
   __u8 bAspectRatioX;
   __u8 bAspectRatioY;
-  __u8 bmInterfaceFlags;
+  __u8 bmInterlaceFlags;
   __u8 bCopyProtect;
 } __attribute__((__packed__));
 #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27
@@ -349,7 +349,7 @@
   __u8 bDefaultFrameIndex;
   __u8 bAspectRatioX;
   __u8 bAspectRatioY;
-  __u8 bmInterfaceFlags;
+  __u8 bmInterlaceFlags;
   __u8 bCopyProtect;
 } __attribute__((__packed__));
 #define UVC_DT_FORMAT_MJPEG_SIZE 11
diff --git a/libc/kernel/uapi/linux/usbdevice_fs.h b/libc/kernel/uapi/linux/usbdevice_fs.h
index 7936ad9..af8681b 100644
--- a/libc/kernel/uapi/linux/usbdevice_fs.h
+++ b/libc/kernel/uapi/linux/usbdevice_fs.h
@@ -27,13 +27,13 @@
   __u16 wIndex;
   __u16 wLength;
   __u32 timeout;
-  void __user * data;
+  void  * data;
 };
 struct usbdevfs_bulktransfer {
   unsigned int ep;
   unsigned int len;
   unsigned int timeout;
-  void __user * data;
+  void  * data;
 };
 struct usbdevfs_setinterface {
   unsigned int interface;
@@ -41,7 +41,7 @@
 };
 struct usbdevfs_disconnectsignal {
   unsigned int signr;
-  void __user * context;
+  void  * context;
 };
 #define USBDEVFS_MAXDRIVERNAME 255
 struct usbdevfs_getdriver {
@@ -80,7 +80,7 @@
   unsigned char endpoint;
   int status;
   unsigned int flags;
-  void __user * buffer;
+  void  * buffer;
   int buffer_length;
   int actual_length;
   int start_frame;
@@ -90,13 +90,13 @@
   };
   int error_count;
   unsigned int signr;
-  void __user * usercontext;
-  struct usbdevfs_iso_packet_desc iso_frame_desc[0];
+  void  * usercontext;
+  struct usbdevfs_iso_packet_desc iso_frame_desc[];
 };
 struct usbdevfs_ioctl {
   int ifno;
   int ioctl_code;
-  void __user * data;
+  void  * data;
 };
 struct usbdevfs_hub_portinfo {
   char nports;
@@ -121,7 +121,7 @@
 struct usbdevfs_streams {
   unsigned int num_streams;
   unsigned int num_eps;
-  unsigned char eps[0];
+  unsigned char eps[];
 };
 #define USBDEVFS_CONTROL _IOWR('U', 0, struct usbdevfs_ctrltransfer)
 #define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32)
diff --git a/libc/kernel/uapi/linux/usbip.h b/libc/kernel/uapi/linux/usbip.h
index ae18347..b0c1067 100644
--- a/libc/kernel/uapi/linux/usbip.h
+++ b/libc/kernel/uapi/linux/usbip.h
@@ -27,4 +27,21 @@
   VDEV_ST_USED,
   VDEV_ST_ERROR
 };
+#define USBIP_URB_SHORT_NOT_OK 0x0001
+#define USBIP_URB_ISO_ASAP 0x0002
+#define USBIP_URB_NO_TRANSFER_DMA_MAP 0x0004
+#define USBIP_URB_ZERO_PACKET 0x0040
+#define USBIP_URB_NO_INTERRUPT 0x0080
+#define USBIP_URB_FREE_BUFFER 0x0100
+#define USBIP_URB_DIR_IN 0x0200
+#define USBIP_URB_DIR_OUT 0
+#define USBIP_URB_DIR_MASK USBIP_URB_DIR_IN
+#define USBIP_URB_DMA_MAP_SINGLE 0x00010000
+#define USBIP_URB_DMA_MAP_PAGE 0x00020000
+#define USBIP_URB_DMA_MAP_SG 0x00040000
+#define USBIP_URB_MAP_LOCAL 0x00080000
+#define USBIP_URB_SETUP_MAP_SINGLE 0x00100000
+#define USBIP_URB_SETUP_MAP_LOCAL 0x00200000
+#define USBIP_URB_DMA_SG_COMBINED 0x00400000
+#define USBIP_URB_ALIGNED_TEMP_BUFFER 0x00800000
 #endif
diff --git a/libc/kernel/uapi/linux/userfaultfd.h b/libc/kernel/uapi/linux/userfaultfd.h
index 46d7472..09e0d80 100644
--- a/libc/kernel/uapi/linux/userfaultfd.h
+++ b/libc/kernel/uapi/linux/userfaultfd.h
@@ -19,6 +19,8 @@
 #ifndef _LINUX_USERFAULTFD_H
 #define _LINUX_USERFAULTFD_H
 #include <linux/types.h>
+#define USERFAULTFD_IOC 0xAA
+#define USERFAULTFD_IOC_NEW _IO(USERFAULTFD_IOC, 0x00)
 #define UFFD_API ((__u64) 0xAA)
 #define UFFD_API_REGISTER_MODES (UFFDIO_REGISTER_MODE_MISSING | UFFDIO_REGISTER_MODE_WP | UFFDIO_REGISTER_MODE_MINOR)
 #define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP | UFFD_FEATURE_EVENT_FORK | UFFD_FEATURE_EVENT_REMAP | UFFD_FEATURE_EVENT_REMOVE | UFFD_FEATURE_EVENT_UNMAP | UFFD_FEATURE_MISSING_HUGETLBFS | UFFD_FEATURE_MISSING_SHMEM | UFFD_FEATURE_SIGBUS | UFFD_FEATURE_THREAD_ID | UFFD_FEATURE_MINOR_HUGETLBFS | UFFD_FEATURE_MINOR_SHMEM | UFFD_FEATURE_EXACT_ADDRESS | UFFD_FEATURE_WP_HUGETLBFS_SHMEM)
@@ -73,7 +75,7 @@
       __u64 reserved3;
     } reserved;
   } arg;
-} __packed;
+} __attribute__((__packed__));
 #define UFFD_EVENT_PAGEFAULT 0x12
 #define UFFD_EVENT_FORK 0x13
 #define UFFD_EVENT_REMAP 0x14
diff --git a/libc/kernel/uapi/linux/uvcvideo.h b/libc/kernel/uapi/linux/uvcvideo.h
index 719147a..f15ed78 100644
--- a/libc/kernel/uapi/linux/uvcvideo.h
+++ b/libc/kernel/uapi/linux/uvcvideo.h
@@ -49,7 +49,7 @@
   __u8 offset;
   __u32 v4l2_type;
   __u32 data_type;
-  struct uvc_menu_info __user * menu_info;
+  struct uvc_menu_info  * menu_info;
   __u32 menu_count;
   __u32 reserved[4];
 };
@@ -58,7 +58,7 @@
   __u8 selector;
   __u8 query;
   __u16 size;
-  __u8 __user * data;
+  __u8  * data;
 };
 #define UVCIOC_CTRL_MAP _IOWR('u', 0x20, struct uvc_xu_control_mapping)
 #define UVCIOC_CTRL_QUERY _IOWR('u', 0x21, struct uvc_xu_control_query)
@@ -68,5 +68,5 @@
   __u8 length;
   __u8 flags;
   __u8 buf[];
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/linux/v4l2-controls.h b/libc/kernel/uapi/linux/v4l2-controls.h
index 30a0553..a6e70c0 100644
--- a/libc/kernel/uapi/linux/v4l2-controls.h
+++ b/libc/kernel/uapi/linux/v4l2-controls.h
@@ -120,6 +120,8 @@
 #define V4L2_CID_USER_CCS_BASE (V4L2_CID_USER_BASE + 0x10f0)
 #define V4L2_CID_USER_ALLEGRO_BASE (V4L2_CID_USER_BASE + 0x1170)
 #define V4L2_CID_USER_ISL7998X_BASE (V4L2_CID_USER_BASE + 0x1180)
+#define V4L2_CID_USER_DW100_BASE (V4L2_CID_USER_BASE + 0x1190)
+#define V4L2_CID_USER_ASPEED_BASE (V4L2_CID_USER_BASE + 0x11a0)
 #define V4L2_CID_CODEC_BASE (V4L2_CTRL_CLASS_CODEC | 0x900)
 #define V4L2_CID_CODEC_CLASS (V4L2_CTRL_CLASS_CODEC | 1)
 #define V4L2_CID_MPEG_STREAM_TYPE (V4L2_CID_CODEC_BASE + 0)
@@ -849,6 +851,7 @@
 #define V4L2_CAMERA_ORIENTATION_BACK 1
 #define V4L2_CAMERA_ORIENTATION_EXTERNAL 2
 #define V4L2_CID_CAMERA_SENSOR_ROTATION (V4L2_CID_CAMERA_CLASS_BASE + 35)
+#define V4L2_CID_HDR_SENSOR_MODE (V4L2_CID_CAMERA_CLASS_BASE + 36)
 #define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900)
 #define V4L2_CID_FM_TX_CLASS (V4L2_CTRL_CLASS_FM_TX | 1)
 #define V4L2_CID_RDS_TX_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 1)
@@ -1331,6 +1334,204 @@
   __u8 chroma_intra_quantiser_matrix[64];
   __u8 chroma_non_intra_quantiser_matrix[64];
 };
+#define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400)
+#define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401)
+#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402)
+#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_STATELESS_BASE + 403)
+#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 404)
+#define V4L2_CID_STATELESS_HEVC_DECODE_MODE (V4L2_CID_CODEC_STATELESS_BASE + 405)
+#define V4L2_CID_STATELESS_HEVC_START_CODE (V4L2_CID_CODEC_STATELESS_BASE + 406)
+#define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (V4L2_CID_CODEC_STATELESS_BASE + 407)
+enum v4l2_stateless_hevc_decode_mode {
+  V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED,
+  V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED,
+};
+enum v4l2_stateless_hevc_start_code {
+  V4L2_STATELESS_HEVC_START_CODE_NONE,
+  V4L2_STATELESS_HEVC_START_CODE_ANNEX_B,
+};
+#define V4L2_HEVC_SLICE_TYPE_B 0
+#define V4L2_HEVC_SLICE_TYPE_P 1
+#define V4L2_HEVC_SLICE_TYPE_I 2
+#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0)
+#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1)
+#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2)
+#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3)
+#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4)
+#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5)
+#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6)
+#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7)
+#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8)
+struct v4l2_ctrl_hevc_sps {
+  __u8 video_parameter_set_id;
+  __u8 seq_parameter_set_id;
+  __u16 pic_width_in_luma_samples;
+  __u16 pic_height_in_luma_samples;
+  __u8 bit_depth_luma_minus8;
+  __u8 bit_depth_chroma_minus8;
+  __u8 log2_max_pic_order_cnt_lsb_minus4;
+  __u8 sps_max_dec_pic_buffering_minus1;
+  __u8 sps_max_num_reorder_pics;
+  __u8 sps_max_latency_increase_plus1;
+  __u8 log2_min_luma_coding_block_size_minus3;
+  __u8 log2_diff_max_min_luma_coding_block_size;
+  __u8 log2_min_luma_transform_block_size_minus2;
+  __u8 log2_diff_max_min_luma_transform_block_size;
+  __u8 max_transform_hierarchy_depth_inter;
+  __u8 max_transform_hierarchy_depth_intra;
+  __u8 pcm_sample_bit_depth_luma_minus1;
+  __u8 pcm_sample_bit_depth_chroma_minus1;
+  __u8 log2_min_pcm_luma_coding_block_size_minus3;
+  __u8 log2_diff_max_min_pcm_luma_coding_block_size;
+  __u8 num_short_term_ref_pic_sets;
+  __u8 num_long_term_ref_pics_sps;
+  __u8 chroma_format_idc;
+  __u8 sps_max_sub_layers_minus1;
+  __u8 reserved[6];
+  __u64 flags;
+};
+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0)
+#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1)
+#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2)
+#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3)
+#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4)
+#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5)
+#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6)
+#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7)
+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8)
+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9)
+#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10)
+#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11)
+#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12)
+#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13)
+#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14)
+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15)
+#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16)
+#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17)
+#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18)
+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19)
+#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20)
+struct v4l2_ctrl_hevc_pps {
+  __u8 pic_parameter_set_id;
+  __u8 num_extra_slice_header_bits;
+  __u8 num_ref_idx_l0_default_active_minus1;
+  __u8 num_ref_idx_l1_default_active_minus1;
+  __s8 init_qp_minus26;
+  __u8 diff_cu_qp_delta_depth;
+  __s8 pps_cb_qp_offset;
+  __s8 pps_cr_qp_offset;
+  __u8 num_tile_columns_minus1;
+  __u8 num_tile_rows_minus1;
+  __u8 column_width_minus1[20];
+  __u8 row_height_minus1[22];
+  __s8 pps_beta_offset_div2;
+  __s8 pps_tc_offset_div2;
+  __u8 log2_parallel_merge_level_minus2;
+  __u8 reserved;
+  __u64 flags;
+};
+#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01
+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME 0
+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_FIELD 1
+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_FIELD 2
+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM 3
+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP 4
+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM_TOP 5
+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM 6
+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING 7
+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING 8
+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_PREVIOUS_BOTTOM 9
+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_PREVIOUS_TOP 10
+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_NEXT_BOTTOM 11
+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_NEXT_TOP 12
+#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16
+struct v4l2_hevc_dpb_entry {
+  __u64 timestamp;
+  __u8 flags;
+  __u8 field_pic;
+  __u16 reserved;
+  __s32 pic_order_cnt_val;
+};
+struct v4l2_hevc_pred_weight_table {
+  __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2];
+  __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2];
+  __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2];
+  __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2];
+  __u8 luma_log2_weight_denom;
+  __s8 delta_chroma_log2_weight_denom;
+};
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8)
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9)
+struct v4l2_ctrl_hevc_slice_params {
+  __u32 bit_size;
+  __u32 data_byte_offset;
+  __u32 num_entry_point_offsets;
+  __u8 nal_unit_type;
+  __u8 nuh_temporal_id_plus1;
+  __u8 slice_type;
+  __u8 colour_plane_id;
+  __s32 slice_pic_order_cnt;
+  __u8 num_ref_idx_l0_active_minus1;
+  __u8 num_ref_idx_l1_active_minus1;
+  __u8 collocated_ref_idx;
+  __u8 five_minus_max_num_merge_cand;
+  __s8 slice_qp_delta;
+  __s8 slice_cb_qp_offset;
+  __s8 slice_cr_qp_offset;
+  __s8 slice_act_y_qp_offset;
+  __s8 slice_act_cb_qp_offset;
+  __s8 slice_act_cr_qp_offset;
+  __s8 slice_beta_offset_div2;
+  __s8 slice_tc_offset_div2;
+  __u8 pic_struct;
+  __u8 reserved0[3];
+  __u32 slice_segment_addr;
+  __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u16 short_term_ref_pic_set_size;
+  __u16 long_term_ref_pic_set_size;
+  struct v4l2_hevc_pred_weight_table pred_weight_table;
+  __u8 reserved1[2];
+  __u64 flags;
+};
+#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1
+#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2
+#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4
+struct v4l2_ctrl_hevc_decode_params {
+  __s32 pic_order_cnt_val;
+  __u16 short_term_ref_pic_set_size;
+  __u16 long_term_ref_pic_set_size;
+  __u8 num_active_dpb_entries;
+  __u8 num_poc_st_curr_before;
+  __u8 num_poc_st_curr_after;
+  __u8 num_poc_lt_curr;
+  __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u8 reserved[4];
+  struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
+  __u64 flags;
+};
+struct v4l2_ctrl_hevc_scaling_matrix {
+  __u8 scaling_list_4x4[6][16];
+  __u8 scaling_list_8x8[6][64];
+  __u8 scaling_list_16x16[6][64];
+  __u8 scaling_list_32x32[2][64];
+  __u8 scaling_list_dc_coef_16x16[6];
+  __u8 scaling_list_dc_coef_32x32[2];
+};
 #define V4L2_CID_COLORIMETRY_CLASS_BASE (V4L2_CTRL_CLASS_COLORIMETRY | 0x900)
 #define V4L2_CID_COLORIMETRY_CLASS (V4L2_CTRL_CLASS_COLORIMETRY | 1)
 #define V4L2_CID_COLORIMETRY_HDR10_CLL_INFO (V4L2_CID_COLORIMETRY_CLASS_BASE + 0)
diff --git a/libc/kernel/uapi/linux/vbox_vmmdev_types.h b/libc/kernel/uapi/linux/vbox_vmmdev_types.h
index 009f9a6..777a2bb 100644
--- a/libc/kernel/uapi/linux/vbox_vmmdev_types.h
+++ b/libc/kernel/uapi/linux/vbox_vmmdev_types.h
@@ -157,7 +157,7 @@
       __u32 offset;
     } page_list;
   } u;
-} __packed;
+} __attribute__((__packed__));
 struct vmmdev_hgcm_function_parameter64 {
   enum vmmdev_hgcm_function_parameter_type type;
   union {
@@ -169,13 +169,13 @@
         __u64 phys_addr;
         __u64 linear_addr;
       } u;
-    } __packed pointer;
+    } __attribute__((__packed__)) pointer;
     struct {
       __u32 size;
       __u32 offset;
     } page_list;
-  } __packed u;
-} __packed;
+  } __attribute__((__packed__)) u;
+} __attribute__((__packed__));
 #if __BITS_PER_LONG == 64
 #define vmmdev_hgcm_function_parameter vmmdev_hgcm_function_parameter64
 #else
diff --git a/libc/kernel/uapi/linux/vdpa.h b/libc/kernel/uapi/linux/vdpa.h
index 8b3be00..989a61b 100644
--- a/libc/kernel/uapi/linux/vdpa.h
+++ b/libc/kernel/uapi/linux/vdpa.h
@@ -52,6 +52,7 @@
   VDPA_ATTR_DEV_QUEUE_INDEX,
   VDPA_ATTR_DEV_VENDOR_ATTR_NAME,
   VDPA_ATTR_DEV_VENDOR_ATTR_VALUE,
+  VDPA_ATTR_DEV_FEATURES,
   VDPA_ATTR_MAX,
 };
 #endif
diff --git a/libc/kernel/uapi/linux/vduse.h b/libc/kernel/uapi/linux/vduse.h
index 2dc8c82..f0b6d6b 100644
--- a/libc/kernel/uapi/linux/vduse.h
+++ b/libc/kernel/uapi/linux/vduse.h
@@ -90,6 +90,22 @@
 };
 #define VDUSE_VQ_SETUP_KICKFD _IOW(VDUSE_BASE, 0x16, struct vduse_vq_eventfd)
 #define VDUSE_VQ_INJECT_IRQ _IOW(VDUSE_BASE, 0x17, __u32)
+struct vduse_iova_umem {
+  __u64 uaddr;
+  __u64 iova;
+  __u64 size;
+  __u64 reserved[3];
+};
+#define VDUSE_IOTLB_REG_UMEM _IOW(VDUSE_BASE, 0x18, struct vduse_iova_umem)
+#define VDUSE_IOTLB_DEREG_UMEM _IOW(VDUSE_BASE, 0x19, struct vduse_iova_umem)
+struct vduse_iova_info {
+  __u64 start;
+  __u64 last;
+#define VDUSE_IOVA_CAP_UMEM (1 << 0)
+  __u64 capability;
+  __u64 reserved[3];
+};
+#define VDUSE_IOTLB_GET_INFO _IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)
 enum vduse_req_type {
   VDUSE_GET_VQ_STATE,
   VDUSE_SET_STATUS,
diff --git a/libc/kernel/uapi/linux/version.h b/libc/kernel/uapi/linux/version.h
index 62874da..0d50613 100644
--- a/libc/kernel/uapi/linux/version.h
+++ b/libc/kernel/uapi/linux/version.h
@@ -16,8 +16,8 @@
  ***
  ****************************************************************************
  ****************************************************************************/
-#define LINUX_VERSION_CODE 332544
+#define LINUX_VERSION_CODE 393728
 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
-#define LINUX_VERSION_MAJOR 5
-#define LINUX_VERSION_PATCHLEVEL 19
+#define LINUX_VERSION_MAJOR 6
+#define LINUX_VERSION_PATCHLEVEL 2
 #define LINUX_VERSION_SUBLEVEL 0
diff --git a/libc/kernel/uapi/linux/vfio.h b/libc/kernel/uapi/linux/vfio.h
index 8075408..3c1821c 100644
--- a/libc/kernel/uapi/linux/vfio.h
+++ b/libc/kernel/uapi/linux/vfio.h
@@ -289,6 +289,7 @@
   __aligned_u64 flags;
 #define VFIO_MIGRATION_STOP_COPY (1 << 0)
 #define VFIO_MIGRATION_P2P (1 << 1)
+#define VFIO_MIGRATION_PRE_COPY (1 << 2)
 };
 #define VFIO_DEVICE_FEATURE_MIGRATION 1
 struct vfio_device_feature_mig_state {
@@ -303,7 +304,46 @@
   VFIO_DEVICE_STATE_STOP_COPY = 3,
   VFIO_DEVICE_STATE_RESUMING = 4,
   VFIO_DEVICE_STATE_RUNNING_P2P = 5,
+  VFIO_DEVICE_STATE_PRE_COPY = 6,
+  VFIO_DEVICE_STATE_PRE_COPY_P2P = 7,
 };
+struct vfio_precopy_info {
+  __u32 argsz;
+  __u32 flags;
+  __aligned_u64 initial_bytes;
+  __aligned_u64 dirty_bytes;
+};
+#define VFIO_MIG_GET_PRECOPY_INFO _IO(VFIO_TYPE, VFIO_BASE + 21)
+#define VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY 3
+struct vfio_device_low_power_entry_with_wakeup {
+  __s32 wakeup_eventfd;
+  __u32 reserved;
+};
+#define VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP 4
+#define VFIO_DEVICE_FEATURE_LOW_POWER_EXIT 5
+struct vfio_device_feature_dma_logging_control {
+  __aligned_u64 page_size;
+  __u32 num_ranges;
+  __u32 __reserved;
+  __aligned_u64 ranges;
+};
+struct vfio_device_feature_dma_logging_range {
+  __aligned_u64 iova;
+  __aligned_u64 length;
+};
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_START 6
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_STOP 7
+struct vfio_device_feature_dma_logging_report {
+  __aligned_u64 iova;
+  __aligned_u64 length;
+  __aligned_u64 page_size;
+  __aligned_u64 bitmap;
+};
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_REPORT 8
+struct vfio_device_feature_mig_data_size {
+  __aligned_u64 stop_copy_length;
+};
+#define VFIO_DEVICE_FEATURE_MIG_DATA_SIZE 9
 struct vfio_iommu_type1_info {
   __u32 argsz;
   __u32 flags;
@@ -350,7 +390,7 @@
 struct vfio_bitmap {
   __u64 pgsize;
   __u64 size;
-  __u64 __user * data;
+  __u64  * data;
 };
 struct vfio_iommu_type1_dma_unmap {
   __u32 argsz;
diff --git a/libc/kernel/uapi/linux/vfio_ccw.h b/libc/kernel/uapi/linux/vfio_ccw.h
index a6defc5..7bf08f5 100644
--- a/libc/kernel/uapi/linux/vfio_ccw.h
+++ b/libc/kernel/uapi/linux/vfio_ccw.h
@@ -27,19 +27,19 @@
 #define IRB_AREA_SIZE 96
   __u8 irb_area[IRB_AREA_SIZE];
   __u32 ret_code;
-} __packed;
+} __attribute__((__packed__));
 #define VFIO_CCW_ASYNC_CMD_HSCH (1 << 0)
 #define VFIO_CCW_ASYNC_CMD_CSCH (1 << 1)
 struct ccw_cmd_region {
   __u32 command;
   __u32 ret_code;
-} __packed;
+} __attribute__((__packed__));
 struct ccw_schib_region {
 #define SCHIB_AREA_SIZE 52
   __u8 schib_area[SCHIB_AREA_SIZE];
-} __packed;
+} __attribute__((__packed__));
 struct ccw_crw_region {
   __u32 crw;
   __u32 pad;
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/linux/vfio_zdev.h b/libc/kernel/uapi/linux/vfio_zdev.h
index c678e9a..1c3a943 100644
--- a/libc/kernel/uapi/linux/vfio_zdev.h
+++ b/libc/kernel/uapi/linux/vfio_zdev.h
@@ -29,6 +29,7 @@
   __u16 fmb_length;
   __u8 pft;
   __u8 gid;
+  __u32 fh;
 };
 struct vfio_device_info_cap_zpci_group {
   struct vfio_info_cap_header header;
@@ -40,6 +41,8 @@
   __u16 noi;
   __u16 maxstbl;
   __u8 version;
+  __u8 reserved;
+  __u16 imaxstbl;
 };
 struct vfio_device_info_cap_zpci_util {
   struct vfio_info_cap_header header;
diff --git a/libc/kernel/uapi/linux/vhost.h b/libc/kernel/uapi/linux/vhost.h
index 3bf1372..e5b1327 100644
--- a/libc/kernel/uapi/linux/vhost.h
+++ b/libc/kernel/uapi/linux/vhost.h
@@ -68,4 +68,5 @@
 #define VHOST_VDPA_GET_AS_NUM _IOR(VHOST_VIRTIO, 0x7A, unsigned int)
 #define VHOST_VDPA_GET_VRING_GROUP _IOWR(VHOST_VIRTIO, 0x7B, struct vhost_vring_state)
 #define VHOST_VDPA_SET_GROUP_ASID _IOW(VHOST_VIRTIO, 0x7C, struct vhost_vring_state)
+#define VHOST_VDPA_SUSPEND _IO(VHOST_VIRTIO, 0x7D)
 #endif
diff --git a/libc/kernel/uapi/linux/vhost_types.h b/libc/kernel/uapi/linux/vhost_types.h
index 772a1cc..32efa85 100644
--- a/libc/kernel/uapi/linux/vhost_types.h
+++ b/libc/kernel/uapi/linux/vhost_types.h
@@ -82,7 +82,7 @@
 struct vhost_memory {
   __u32 nregions;
   __u32 padding;
-  struct vhost_memory_region regions[0];
+  struct vhost_memory_region regions[];
 };
 #define VHOST_SCSI_ABI_VERSION 1
 struct vhost_scsi_target {
@@ -94,7 +94,7 @@
 struct vhost_vdpa_config {
   __u32 off;
   __u32 len;
-  __u8 buf[0];
+  __u8 buf[];
 };
 struct vhost_vdpa_iova_range {
   __u64 first;
@@ -105,4 +105,5 @@
 #define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1
 #define VHOST_BACKEND_F_IOTLB_BATCH 0x2
 #define VHOST_BACKEND_F_IOTLB_ASID 0x3
+#define VHOST_BACKEND_F_SUSPEND 0x4
 #endif
diff --git a/libc/kernel/uapi/linux/videodev2.h b/libc/kernel/uapi/linux/videodev2.h
index d4107bc..4fb0a25 100644
--- a/libc/kernel/uapi/linux/videodev2.h
+++ b/libc/kernel/uapi/linux/videodev2.h
@@ -185,7 +185,6 @@
 #define V4L2_CAP_SDR_OUTPUT 0x00400000
 #define V4L2_CAP_META_CAPTURE 0x00800000
 #define V4L2_CAP_READWRITE 0x01000000
-#define V4L2_CAP_ASYNCIO 0x02000000
 #define V4L2_CAP_STREAMING 0x04000000
 #define V4L2_CAP_META_OUTPUT 0x08000000
 #define V4L2_CAP_TOUCH 0x10000000
@@ -273,6 +272,8 @@
 #define V4L2_PIX_FMT_XYUV32 v4l2_fourcc('X', 'Y', 'U', 'V')
 #define V4L2_PIX_FMT_VUYA32 v4l2_fourcc('V', 'U', 'Y', 'A')
 #define V4L2_PIX_FMT_VUYX32 v4l2_fourcc('V', 'U', 'Y', 'X')
+#define V4L2_PIX_FMT_YUVA32 v4l2_fourcc('Y', 'U', 'V', 'A')
+#define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')
 #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')
 #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')
 #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1')
@@ -280,6 +281,7 @@
 #define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1')
 #define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')
 #define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2')
+#define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0')
 #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2')
 #define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1')
 #define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6')
@@ -299,6 +301,9 @@
 #define V4L2_PIX_FMT_NV12_4L4 v4l2_fourcc('V', 'T', '1', '2')
 #define V4L2_PIX_FMT_NV12_16L16 v4l2_fourcc('H', 'M', '1', '2')
 #define V4L2_PIX_FMT_NV12_32L32 v4l2_fourcc('S', 'T', '1', '2')
+#define V4L2_PIX_FMT_P010_4L4 v4l2_fourcc('T', '0', '1', '0')
+#define V4L2_PIX_FMT_NV12_8L128 v4l2_fourcc('A', 'T', '1', '2')
+#define V4L2_PIX_FMT_NV12_10BE_8L128 v4l2_fourcc_be('A', 'X', '1', '2')
 #define V4L2_PIX_FMT_NV12MT v4l2_fourcc('T', 'M', '1', '2')
 #define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2')
 #define V4L2_PIX_FMT_NV12M_8L128 v4l2_fourcc('N', 'A', '1', '2')
@@ -368,6 +373,7 @@
 #define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T')
 #define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H')
 #define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4')
+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5')
 #define V4L2_PIX_FMT_CPIA1 v4l2_fourcc('C', 'P', 'I', 'A')
 #define V4L2_PIX_FMT_WNVA v4l2_fourcc('W', 'N', 'V', 'A')
 #define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S', '9', '1', '0')
@@ -404,6 +410,7 @@
 #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H', 'I', '2', '4')
 #define V4L2_PIX_FMT_QC08C v4l2_fourcc('Q', '0', '8', 'C')
 #define V4L2_PIX_FMT_QC10C v4l2_fourcc('Q', '1', '0', 'C')
+#define V4L2_PIX_FMT_AJPG v4l2_fourcc('A', 'J', 'P', 'G')
 #define V4L2_PIX_FMT_IPU3_SBGGR10 v4l2_fourcc('i', 'p', '3', 'b')
 #define V4L2_PIX_FMT_IPU3_SGBRG10 v4l2_fourcc('i', 'p', '3', 'g')
 #define V4L2_PIX_FMT_IPU3_SGRBG10 v4l2_fourcc('i', 'p', '3', 'G')
@@ -643,7 +650,7 @@
 #define V4L2_FBUF_FLAG_SRC_CHROMAKEY 0x0040
 struct v4l2_clip {
   struct v4l2_rect c;
-  struct v4l2_clip __user * next;
+  struct v4l2_clip  * next;
 };
 struct v4l2_window {
   struct v4l2_rect w;
@@ -651,7 +658,7 @@
   __u32 chromakey;
   struct v4l2_clip * clips;
   __u32 clipcount;
-  void __user * bitmap;
+  void  * bitmap;
   __u8 global_alpha;
 };
 struct v4l2_captureparm {
@@ -787,7 +794,7 @@
 #define V4L2_DV_FL_CAN_DETECT_REDUCED_FPS (1 << 9)
 #define V4L2_DV_BT_BLANKING_WIDTH(bt) ((bt)->hfrontporch + (bt)->hsync + (bt)->hbackporch)
 #define V4L2_DV_BT_FRAME_WIDTH(bt) ((bt)->width + V4L2_DV_BT_BLANKING_WIDTH(bt))
-#define V4L2_DV_BT_BLANKING_HEIGHT(bt) ((bt)->vfrontporch + (bt)->vsync + (bt)->vbackporch + (bt)->il_vfrontporch + (bt)->il_vsync + (bt)->il_vbackporch)
+#define V4L2_DV_BT_BLANKING_HEIGHT(bt) ((bt)->vfrontporch + (bt)->vsync + (bt)->vbackporch + ((bt)->interlaced ? ((bt)->il_vfrontporch + (bt)->il_vsync + (bt)->il_vbackporch) : 0))
 #define V4L2_DV_BT_FRAME_HEIGHT(bt) ((bt)->height + V4L2_DV_BT_BLANKING_HEIGHT(bt))
 struct v4l2_dv_timings {
   __u32 type;
@@ -888,25 +895,32 @@
   union {
     __s32 value;
     __s64 value64;
-    char __user * string;
-    __u8 __user * p_u8;
-    __u16 __user * p_u16;
-    __u32 __user * p_u32;
-    struct v4l2_area __user * p_area;
-    struct v4l2_ctrl_h264_sps __user * p_h264_sps;
+    char  * string;
+    __u8  * p_u8;
+    __u16  * p_u16;
+    __u32  * p_u32;
+    __u32  * p_s32;
+    __u32  * p_s64;
+    struct v4l2_area  * p_area;
+    struct v4l2_ctrl_h264_sps  * p_h264_sps;
     struct v4l2_ctrl_h264_pps * p_h264_pps;
-    struct v4l2_ctrl_h264_scaling_matrix __user * p_h264_scaling_matrix;
-    struct v4l2_ctrl_h264_pred_weights __user * p_h264_pred_weights;
-    struct v4l2_ctrl_h264_slice_params __user * p_h264_slice_params;
-    struct v4l2_ctrl_h264_decode_params __user * p_h264_decode_params;
-    struct v4l2_ctrl_fwht_params __user * p_fwht_params;
-    struct v4l2_ctrl_vp8_frame __user * p_vp8_frame;
-    struct v4l2_ctrl_mpeg2_sequence __user * p_mpeg2_sequence;
-    struct v4l2_ctrl_mpeg2_picture __user * p_mpeg2_picture;
-    struct v4l2_ctrl_mpeg2_quantisation __user * p_mpeg2_quantisation;
-    struct v4l2_ctrl_vp9_compressed_hdr __user * p_vp9_compressed_hdr_probs;
-    struct v4l2_ctrl_vp9_frame __user * p_vp9_frame;
-    void __user * ptr;
+    struct v4l2_ctrl_h264_scaling_matrix  * p_h264_scaling_matrix;
+    struct v4l2_ctrl_h264_pred_weights  * p_h264_pred_weights;
+    struct v4l2_ctrl_h264_slice_params  * p_h264_slice_params;
+    struct v4l2_ctrl_h264_decode_params  * p_h264_decode_params;
+    struct v4l2_ctrl_fwht_params  * p_fwht_params;
+    struct v4l2_ctrl_vp8_frame  * p_vp8_frame;
+    struct v4l2_ctrl_mpeg2_sequence  * p_mpeg2_sequence;
+    struct v4l2_ctrl_mpeg2_picture  * p_mpeg2_picture;
+    struct v4l2_ctrl_mpeg2_quantisation  * p_mpeg2_quantisation;
+    struct v4l2_ctrl_vp9_compressed_hdr  * p_vp9_compressed_hdr_probs;
+    struct v4l2_ctrl_vp9_frame  * p_vp9_frame;
+    struct v4l2_ctrl_hevc_sps  * p_hevc_sps;
+    struct v4l2_ctrl_hevc_pps  * p_hevc_pps;
+    struct v4l2_ctrl_hevc_slice_params  * p_hevc_slice_params;
+    struct v4l2_ctrl_hevc_scaling_matrix  * p_hevc_scaling_matrix;
+    struct v4l2_ctrl_hevc_decode_params  * p_hevc_decode_params;
+    void  * ptr;
   };
 } __attribute__((packed));
 struct v4l2_ext_controls {
@@ -958,6 +972,11 @@
   V4L2_CTRL_TYPE_MPEG2_PICTURE = 0x0252,
   V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR = 0x0260,
   V4L2_CTRL_TYPE_VP9_FRAME = 0x0261,
+  V4L2_CTRL_TYPE_HEVC_SPS = 0x0270,
+  V4L2_CTRL_TYPE_HEVC_PPS = 0x0271,
+  V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 0x0272,
+  V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273,
+  V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274,
 };
 struct v4l2_queryctrl {
   __u32 id;
@@ -1005,6 +1024,7 @@
 #define V4L2_CTRL_FLAG_HAS_PAYLOAD 0x0100
 #define V4L2_CTRL_FLAG_EXECUTE_ON_WRITE 0x0200
 #define V4L2_CTRL_FLAG_MODIFY_LAYOUT 0x0400
+#define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800
 #define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000
 #define V4L2_CTRL_FLAG_NEXT_COMPOUND 0x40000000
 #define V4L2_CID_MAX_CTRLS 1024
@@ -1308,6 +1328,7 @@
 #define V4L2_EVENT_CTRL_CH_VALUE (1 << 0)
 #define V4L2_EVENT_CTRL_CH_FLAGS (1 << 1)
 #define V4L2_EVENT_CTRL_CH_RANGE (1 << 2)
+#define V4L2_EVENT_CTRL_CH_DIMENSIONS (1 << 3)
 struct v4l2_event_ctrl {
   __u32 changes;
   __u32 type;
@@ -1479,4 +1500,5 @@
 #define BASE_VIDIOC_PRIVATE 192
 #define V4L2_PIX_FMT_HM12 V4L2_PIX_FMT_NV12_16L16
 #define V4L2_PIX_FMT_SUNXI_TILED_NV12 V4L2_PIX_FMT_NV12_32L32
+#define V4L2_CAP_ASYNCIO 0x02000000
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_9p.h b/libc/kernel/uapi/linux/virtio_9p.h
index 1d9dfb1..2e05786 100644
--- a/libc/kernel/uapi/linux/virtio_9p.h
+++ b/libc/kernel/uapi/linux/virtio_9p.h
@@ -24,6 +24,6 @@
 #define VIRTIO_9P_MOUNT_TAG 0
 struct virtio_9p_config {
   __virtio16 tag_len;
-  __u8 tag[0];
+  __u8 tag[];
 } __attribute__((packed));
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_blk.h b/libc/kernel/uapi/linux/virtio_blk.h
index f2f0381..0dd08c5 100644
--- a/libc/kernel/uapi/linux/virtio_blk.h
+++ b/libc/kernel/uapi/linux/virtio_blk.h
@@ -31,6 +31,7 @@
 #define VIRTIO_BLK_F_MQ 12
 #define VIRTIO_BLK_F_DISCARD 13
 #define VIRTIO_BLK_F_WRITE_ZEROES 14
+#define VIRTIO_BLK_F_SECURE_ERASE 16
 #ifndef VIRTIO_BLK_NO_LEGACY
 #define VIRTIO_BLK_F_BARRIER 0
 #define VIRTIO_BLK_F_SCSI 7
@@ -63,6 +64,9 @@
   __virtio32 max_write_zeroes_seg;
   __u8 write_zeroes_may_unmap;
   __u8 unused1[3];
+  __virtio32 max_secure_erase_sectors;
+  __virtio32 max_secure_erase_seg;
+  __virtio32 secure_erase_sector_alignment;
 } __attribute__((packed));
 #define VIRTIO_BLK_T_IN 0
 #define VIRTIO_BLK_T_OUT 1
@@ -73,6 +77,7 @@
 #define VIRTIO_BLK_T_GET_ID 8
 #define VIRTIO_BLK_T_DISCARD 11
 #define VIRTIO_BLK_T_WRITE_ZEROES 13
+#define VIRTIO_BLK_T_SECURE_ERASE 14
 #ifndef VIRTIO_BLK_NO_LEGACY
 #define VIRTIO_BLK_T_BARRIER 0x80000000
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_bt.h b/libc/kernel/uapi/linux/virtio_bt.h
index 7e29eaa..9049adc 100644
--- a/libc/kernel/uapi/linux/virtio_bt.h
+++ b/libc/kernel/uapi/linux/virtio_bt.h
@@ -22,6 +22,7 @@
 #define VIRTIO_BT_F_VND_HCI 0
 #define VIRTIO_BT_F_MSFT_EXT 1
 #define VIRTIO_BT_F_AOSP_EXT 2
+#define VIRTIO_BT_F_CONFIG_V2 3
 enum virtio_bt_config_type {
   VIRTIO_BT_CONFIG_TYPE_PRIMARY = 0,
   VIRTIO_BT_CONFIG_TYPE_AMP = 1,
@@ -37,4 +38,10 @@
   __u16 vendor;
   __u16 msft_opcode;
 } __attribute__((packed));
+struct virtio_bt_config_v2 {
+  __u8 type;
+  __u8 alignment;
+  __u16 vendor;
+  __u16 msft_opcode;
+};
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_config.h b/libc/kernel/uapi/linux/virtio_config.h
index 30e552b..bdd2e73 100644
--- a/libc/kernel/uapi/linux/virtio_config.h
+++ b/libc/kernel/uapi/linux/virtio_config.h
@@ -26,7 +26,7 @@
 #define VIRTIO_CONFIG_S_NEEDS_RESET 0x40
 #define VIRTIO_CONFIG_S_FAILED 0x80
 #define VIRTIO_TRANSPORT_F_START 28
-#define VIRTIO_TRANSPORT_F_END 38
+#define VIRTIO_TRANSPORT_F_END 41
 #ifndef VIRTIO_CONFIG_NO_LEGACY
 #define VIRTIO_F_NOTIFY_ON_EMPTY 24
 #define VIRTIO_F_ANY_LAYOUT 27
@@ -38,4 +38,5 @@
 #define VIRTIO_F_IN_ORDER 35
 #define VIRTIO_F_ORDER_PLATFORM 36
 #define VIRTIO_F_SR_IOV 37
+#define VIRTIO_F_RING_RESET 40
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_net.h b/libc/kernel/uapi/linux/virtio_net.h
index 2d92904..da7285e 100644
--- a/libc/kernel/uapi/linux/virtio_net.h
+++ b/libc/kernel/uapi/linux/virtio_net.h
@@ -45,6 +45,10 @@
 #define VIRTIO_NET_F_GUEST_ANNOUNCE 21
 #define VIRTIO_NET_F_MQ 22
 #define VIRTIO_NET_F_CTRL_MAC_ADDR 23
+#define VIRTIO_NET_F_NOTF_COAL 53
+#define VIRTIO_NET_F_GUEST_USO4 54
+#define VIRTIO_NET_F_GUEST_USO6 55
+#define VIRTIO_NET_F_HOST_USO 56
 #define VIRTIO_NET_F_HASH_REPORT 57
 #define VIRTIO_NET_F_RSS 60
 #define VIRTIO_NET_F_RSC_EXT 61
@@ -84,6 +88,7 @@
 #define VIRTIO_NET_HDR_GSO_TCPV4 1
 #define VIRTIO_NET_HDR_GSO_UDP 3
 #define VIRTIO_NET_HDR_GSO_TCPV6 4
+#define VIRTIO_NET_HDR_GSO_UDP_L4 5
 #define VIRTIO_NET_HDR_GSO_ECN 0x80
   __u8 gso_type;
   __virtio16 hdr_len;
@@ -186,4 +191,15 @@
 #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG 2
 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5
 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0
+#define VIRTIO_NET_CTRL_NOTF_COAL 6
+struct virtio_net_ctrl_coal_tx {
+  __le32 tx_max_packets;
+  __le32 tx_usecs;
+};
+#define VIRTIO_NET_CTRL_NOTF_COAL_TX_SET 0
+struct virtio_net_ctrl_coal_rx {
+  __le32 rx_max_packets;
+  __le32 rx_usecs;
+};
+#define VIRTIO_NET_CTRL_NOTF_COAL_RX_SET 1
 #endif
diff --git a/libc/kernel/uapi/linux/virtio_pci.h b/libc/kernel/uapi/linux/virtio_pci.h
index e6d2731..94ca0a2 100644
--- a/libc/kernel/uapi/linux/virtio_pci.h
+++ b/libc/kernel/uapi/linux/virtio_pci.h
@@ -117,5 +117,7 @@
 #define VIRTIO_PCI_COMMON_Q_AVAILHI 44
 #define VIRTIO_PCI_COMMON_Q_USEDLO 48
 #define VIRTIO_PCI_COMMON_Q_USEDHI 52
+#define VIRTIO_PCI_COMMON_Q_NDATA 56
+#define VIRTIO_PCI_COMMON_Q_RESET 58
 #endif
 #endif
diff --git a/libc/kernel/uapi/linux/wireless.h b/libc/kernel/uapi/linux/wireless.h
index ca31dd2..eb57fff 100644
--- a/libc/kernel/uapi/linux/wireless.h
+++ b/libc/kernel/uapi/linux/wireless.h
@@ -264,7 +264,7 @@
   __u16 flags;
 };
 struct iw_point {
-  void __user * pointer;
+  void  * pointer;
   __u16 length;
   __u16 flags;
 };
diff --git a/libc/kernel/uapi/linux/wmi.h b/libc/kernel/uapi/linux/wmi.h
index 26f54d9..7b72056 100644
--- a/libc/kernel/uapi/linux/wmi.h
+++ b/libc/kernel/uapi/linux/wmi.h
@@ -30,17 +30,17 @@
   __u16 cmd_select;
   volatile __u32 input[4];
   volatile __u32 output[4];
-} __packed;
+} __attribute__((__packed__));
 struct dell_wmi_extensions {
   __u32 argattrib;
   __u32 blength;
   __u8 data[];
-} __packed;
+} __attribute__((__packed__));
 struct dell_wmi_smbios_buffer {
   __u64 length;
   struct calling_interface_buffer std;
   struct dell_wmi_extensions ext;
-} __packed;
+} __attribute__((__packed__));
 #define CLASS_TOKEN_READ 0
 #define CLASS_TOKEN_WRITE 1
 #define SELECT_TOKEN_STD 0
diff --git a/libc/kernel/uapi/linux/xfrm.h b/libc/kernel/uapi/linux/xfrm.h
index f4df95f..b8a2efc 100644
--- a/libc/kernel/uapi/linux/xfrm.h
+++ b/libc/kernel/uapi/linux/xfrm.h
@@ -35,7 +35,7 @@
   __u8 ctx_alg;
   __u16 ctx_len;
   __u32 ctx_sid;
-  char ctx_str[0];
+  char ctx_str[];
 };
 #define XFRM_SC_DOI_RESERVED 0
 #define XFRM_SC_DOI_LSM 1
@@ -85,24 +85,24 @@
   __u32 oseq_hi;
   __u32 seq_hi;
   __u32 replay_window;
-  __u32 bmp[0];
+  __u32 bmp[];
 };
 struct xfrm_algo {
   char alg_name[64];
   unsigned int alg_key_len;
-  char alg_key[0];
+  char alg_key[];
 };
 struct xfrm_algo_auth {
   char alg_name[64];
   unsigned int alg_key_len;
   unsigned int alg_trunc_len;
-  char alg_key[0];
+  char alg_key[];
 };
 struct xfrm_algo_aead {
   char alg_name[64];
   unsigned int alg_key_len;
   unsigned int alg_icv_len;
-  char alg_key[0];
+  char alg_key[];
 };
 struct xfrm_stats {
   __u32 replay_window;
@@ -435,6 +435,7 @@
 };
 #define XFRM_OFFLOAD_IPV6 1
 #define XFRM_OFFLOAD_INBOUND 2
+#define XFRM_OFFLOAD_PACKET 4
 struct xfrm_userpolicy_default {
 #define XFRM_USERPOLICY_UNSPEC 0
 #define XFRM_USERPOLICY_BLOCK 1
diff --git a/libc/kernel/uapi/linux/zorro.h b/libc/kernel/uapi/linux/zorro.h
index f8e47a1..86320aa 100644
--- a/libc/kernel/uapi/linux/zorro.h
+++ b/libc/kernel/uapi/linux/zorro.h
@@ -42,7 +42,7 @@
   __u8 ln_Type;
   __s8 ln_Pri;
   __be32 ln_Name;
-} __packed;
+} __attribute__((__packed__));
 struct ExpansionRom {
   __u8 er_Type;
   __u8 er_Product;
@@ -55,7 +55,7 @@
   __u8 er_Reserved0d;
   __u8 er_Reserved0e;
   __u8 er_Reserved0f;
-} __packed;
+} __attribute__((__packed__));
 #define ERT_TYPEMASK 0xc0
 #define ERT_ZORROII 0xc0
 #define ERT_ZORROIII 0x80
@@ -73,6 +73,6 @@
   __be32 cd_Driver;
   __be32 cd_NextCD;
   __be32 cd_Unused[4];
-} __packed;
+} __attribute__((__packed__));
 #define ZORRO_NUM_AUTO 16
 #endif
diff --git a/libc/kernel/uapi/misc/fastrpc.h b/libc/kernel/uapi/misc/fastrpc.h
index e82b961..336ecf2 100644
--- a/libc/kernel/uapi/misc/fastrpc.h
+++ b/libc/kernel/uapi/misc/fastrpc.h
@@ -27,6 +27,7 @@
 #define FASTRPC_IOCTL_MMAP _IOWR('R', 6, struct fastrpc_req_mmap)
 #define FASTRPC_IOCTL_MUNMAP _IOWR('R', 7, struct fastrpc_req_munmap)
 #define FASTRPC_IOCTL_INIT_ATTACH_SNS _IO('R', 8)
+#define FASTRPC_IOCTL_INIT_CREATE_STATIC _IOWR('R', 9, struct fastrpc_init_create_static)
 #define FASTRPC_IOCTL_MEM_MAP _IOWR('R', 10, struct fastrpc_mem_map)
 #define FASTRPC_IOCTL_MEM_UNMAP _IOWR('R', 11, struct fastrpc_mem_unmap)
 #define FASTRPC_IOCTL_GET_DSP_INFO _IOWR('R', 13, struct fastrpc_ioctl_capability)
@@ -66,6 +67,11 @@
   __u32 siglen;
   __u64 file;
 };
+struct fastrpc_init_create_static {
+  __u32 namelen;
+  __u32 memlen;
+  __u64 name;
+};
 struct fastrpc_alloc_dma_buf {
   __s32 fd;
   __u32 flags;
diff --git a/libc/kernel/uapi/misc/habanalabs.h b/libc/kernel/uapi/misc/habanalabs.h
index 2d18d7e..b25c833 100644
--- a/libc/kernel/uapi/misc/habanalabs.h
+++ b/libc/kernel/uapi/misc/habanalabs.h
@@ -159,6 +159,270 @@
   GAUDI_QUEUE_ID_NIC_9_3 = 112,
   GAUDI_QUEUE_ID_SIZE
 };
+enum gaudi2_queue_id {
+  GAUDI2_QUEUE_ID_PDMA_0_0 = 0,
+  GAUDI2_QUEUE_ID_PDMA_0_1 = 1,
+  GAUDI2_QUEUE_ID_PDMA_0_2 = 2,
+  GAUDI2_QUEUE_ID_PDMA_0_3 = 3,
+  GAUDI2_QUEUE_ID_PDMA_1_0 = 4,
+  GAUDI2_QUEUE_ID_PDMA_1_1 = 5,
+  GAUDI2_QUEUE_ID_PDMA_1_2 = 6,
+  GAUDI2_QUEUE_ID_PDMA_1_3 = 7,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0 = 8,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1 = 9,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2 = 10,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3 = 11,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0 = 12,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1 = 13,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2 = 14,
+  GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3 = 15,
+  GAUDI2_QUEUE_ID_DCORE0_MME_0_0 = 16,
+  GAUDI2_QUEUE_ID_DCORE0_MME_0_1 = 17,
+  GAUDI2_QUEUE_ID_DCORE0_MME_0_2 = 18,
+  GAUDI2_QUEUE_ID_DCORE0_MME_0_3 = 19,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 = 20,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_0_1 = 21,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_0_2 = 22,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_0_3 = 23,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_1_0 = 24,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_1_1 = 25,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_1_2 = 26,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_1_3 = 27,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_2_0 = 28,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_2_1 = 29,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_2_2 = 30,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_2_3 = 31,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_3_0 = 32,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_3_1 = 33,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_3_2 = 34,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_3_3 = 35,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_4_0 = 36,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_4_1 = 37,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_4_2 = 38,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_4_3 = 39,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_5_0 = 40,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_5_1 = 41,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_5_2 = 42,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_5_3 = 43,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_6_0 = 44,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_6_1 = 45,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_6_2 = 46,
+  GAUDI2_QUEUE_ID_DCORE0_TPC_6_3 = 47,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0 = 48,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1 = 49,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2 = 50,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3 = 51,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0 = 52,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1 = 53,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2 = 54,
+  GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3 = 55,
+  GAUDI2_QUEUE_ID_DCORE1_MME_0_0 = 56,
+  GAUDI2_QUEUE_ID_DCORE1_MME_0_1 = 57,
+  GAUDI2_QUEUE_ID_DCORE1_MME_0_2 = 58,
+  GAUDI2_QUEUE_ID_DCORE1_MME_0_3 = 59,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 = 60,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_0_1 = 61,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_0_2 = 62,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_0_3 = 63,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_1_0 = 64,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_1_1 = 65,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_1_2 = 66,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_1_3 = 67,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_2_0 = 68,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_2_1 = 69,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_2_2 = 70,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_2_3 = 71,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_3_0 = 72,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_3_1 = 73,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_3_2 = 74,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_3_3 = 75,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_4_0 = 76,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_4_1 = 77,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_4_2 = 78,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_4_3 = 79,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_5_0 = 80,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_5_1 = 81,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_5_2 = 82,
+  GAUDI2_QUEUE_ID_DCORE1_TPC_5_3 = 83,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0 = 84,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1 = 85,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2 = 86,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3 = 87,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0 = 88,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1 = 89,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2 = 90,
+  GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3 = 91,
+  GAUDI2_QUEUE_ID_DCORE2_MME_0_0 = 92,
+  GAUDI2_QUEUE_ID_DCORE2_MME_0_1 = 93,
+  GAUDI2_QUEUE_ID_DCORE2_MME_0_2 = 94,
+  GAUDI2_QUEUE_ID_DCORE2_MME_0_3 = 95,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 = 96,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_0_1 = 97,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_0_2 = 98,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_0_3 = 99,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_1_0 = 100,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_1_1 = 101,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_1_2 = 102,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_1_3 = 103,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_2_0 = 104,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_2_1 = 105,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_2_2 = 106,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_2_3 = 107,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_3_0 = 108,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_3_1 = 109,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_3_2 = 110,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_3_3 = 111,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_4_0 = 112,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_4_1 = 113,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_4_2 = 114,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_4_3 = 115,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_5_0 = 116,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_5_1 = 117,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_5_2 = 118,
+  GAUDI2_QUEUE_ID_DCORE2_TPC_5_3 = 119,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0 = 120,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1 = 121,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2 = 122,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3 = 123,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0 = 124,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1 = 125,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2 = 126,
+  GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3 = 127,
+  GAUDI2_QUEUE_ID_DCORE3_MME_0_0 = 128,
+  GAUDI2_QUEUE_ID_DCORE3_MME_0_1 = 129,
+  GAUDI2_QUEUE_ID_DCORE3_MME_0_2 = 130,
+  GAUDI2_QUEUE_ID_DCORE3_MME_0_3 = 131,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 = 132,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_0_1 = 133,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_0_2 = 134,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_0_3 = 135,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_1_0 = 136,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_1_1 = 137,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_1_2 = 138,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_1_3 = 139,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_2_0 = 140,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_2_1 = 141,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_2_2 = 142,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_2_3 = 143,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_3_0 = 144,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_3_1 = 145,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_3_2 = 146,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_3_3 = 147,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_4_0 = 148,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_4_1 = 149,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_4_2 = 150,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_4_3 = 151,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_5_0 = 152,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_5_1 = 153,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_5_2 = 154,
+  GAUDI2_QUEUE_ID_DCORE3_TPC_5_3 = 155,
+  GAUDI2_QUEUE_ID_NIC_0_0 = 156,
+  GAUDI2_QUEUE_ID_NIC_0_1 = 157,
+  GAUDI2_QUEUE_ID_NIC_0_2 = 158,
+  GAUDI2_QUEUE_ID_NIC_0_3 = 159,
+  GAUDI2_QUEUE_ID_NIC_1_0 = 160,
+  GAUDI2_QUEUE_ID_NIC_1_1 = 161,
+  GAUDI2_QUEUE_ID_NIC_1_2 = 162,
+  GAUDI2_QUEUE_ID_NIC_1_3 = 163,
+  GAUDI2_QUEUE_ID_NIC_2_0 = 164,
+  GAUDI2_QUEUE_ID_NIC_2_1 = 165,
+  GAUDI2_QUEUE_ID_NIC_2_2 = 166,
+  GAUDI2_QUEUE_ID_NIC_2_3 = 167,
+  GAUDI2_QUEUE_ID_NIC_3_0 = 168,
+  GAUDI2_QUEUE_ID_NIC_3_1 = 169,
+  GAUDI2_QUEUE_ID_NIC_3_2 = 170,
+  GAUDI2_QUEUE_ID_NIC_3_3 = 171,
+  GAUDI2_QUEUE_ID_NIC_4_0 = 172,
+  GAUDI2_QUEUE_ID_NIC_4_1 = 173,
+  GAUDI2_QUEUE_ID_NIC_4_2 = 174,
+  GAUDI2_QUEUE_ID_NIC_4_3 = 175,
+  GAUDI2_QUEUE_ID_NIC_5_0 = 176,
+  GAUDI2_QUEUE_ID_NIC_5_1 = 177,
+  GAUDI2_QUEUE_ID_NIC_5_2 = 178,
+  GAUDI2_QUEUE_ID_NIC_5_3 = 179,
+  GAUDI2_QUEUE_ID_NIC_6_0 = 180,
+  GAUDI2_QUEUE_ID_NIC_6_1 = 181,
+  GAUDI2_QUEUE_ID_NIC_6_2 = 182,
+  GAUDI2_QUEUE_ID_NIC_6_3 = 183,
+  GAUDI2_QUEUE_ID_NIC_7_0 = 184,
+  GAUDI2_QUEUE_ID_NIC_7_1 = 185,
+  GAUDI2_QUEUE_ID_NIC_7_2 = 186,
+  GAUDI2_QUEUE_ID_NIC_7_3 = 187,
+  GAUDI2_QUEUE_ID_NIC_8_0 = 188,
+  GAUDI2_QUEUE_ID_NIC_8_1 = 189,
+  GAUDI2_QUEUE_ID_NIC_8_2 = 190,
+  GAUDI2_QUEUE_ID_NIC_8_3 = 191,
+  GAUDI2_QUEUE_ID_NIC_9_0 = 192,
+  GAUDI2_QUEUE_ID_NIC_9_1 = 193,
+  GAUDI2_QUEUE_ID_NIC_9_2 = 194,
+  GAUDI2_QUEUE_ID_NIC_9_3 = 195,
+  GAUDI2_QUEUE_ID_NIC_10_0 = 196,
+  GAUDI2_QUEUE_ID_NIC_10_1 = 197,
+  GAUDI2_QUEUE_ID_NIC_10_2 = 198,
+  GAUDI2_QUEUE_ID_NIC_10_3 = 199,
+  GAUDI2_QUEUE_ID_NIC_11_0 = 200,
+  GAUDI2_QUEUE_ID_NIC_11_1 = 201,
+  GAUDI2_QUEUE_ID_NIC_11_2 = 202,
+  GAUDI2_QUEUE_ID_NIC_11_3 = 203,
+  GAUDI2_QUEUE_ID_NIC_12_0 = 204,
+  GAUDI2_QUEUE_ID_NIC_12_1 = 205,
+  GAUDI2_QUEUE_ID_NIC_12_2 = 206,
+  GAUDI2_QUEUE_ID_NIC_12_3 = 207,
+  GAUDI2_QUEUE_ID_NIC_13_0 = 208,
+  GAUDI2_QUEUE_ID_NIC_13_1 = 209,
+  GAUDI2_QUEUE_ID_NIC_13_2 = 210,
+  GAUDI2_QUEUE_ID_NIC_13_3 = 211,
+  GAUDI2_QUEUE_ID_NIC_14_0 = 212,
+  GAUDI2_QUEUE_ID_NIC_14_1 = 213,
+  GAUDI2_QUEUE_ID_NIC_14_2 = 214,
+  GAUDI2_QUEUE_ID_NIC_14_3 = 215,
+  GAUDI2_QUEUE_ID_NIC_15_0 = 216,
+  GAUDI2_QUEUE_ID_NIC_15_1 = 217,
+  GAUDI2_QUEUE_ID_NIC_15_2 = 218,
+  GAUDI2_QUEUE_ID_NIC_15_3 = 219,
+  GAUDI2_QUEUE_ID_NIC_16_0 = 220,
+  GAUDI2_QUEUE_ID_NIC_16_1 = 221,
+  GAUDI2_QUEUE_ID_NIC_16_2 = 222,
+  GAUDI2_QUEUE_ID_NIC_16_3 = 223,
+  GAUDI2_QUEUE_ID_NIC_17_0 = 224,
+  GAUDI2_QUEUE_ID_NIC_17_1 = 225,
+  GAUDI2_QUEUE_ID_NIC_17_2 = 226,
+  GAUDI2_QUEUE_ID_NIC_17_3 = 227,
+  GAUDI2_QUEUE_ID_NIC_18_0 = 228,
+  GAUDI2_QUEUE_ID_NIC_18_1 = 229,
+  GAUDI2_QUEUE_ID_NIC_18_2 = 230,
+  GAUDI2_QUEUE_ID_NIC_18_3 = 231,
+  GAUDI2_QUEUE_ID_NIC_19_0 = 232,
+  GAUDI2_QUEUE_ID_NIC_19_1 = 233,
+  GAUDI2_QUEUE_ID_NIC_19_2 = 234,
+  GAUDI2_QUEUE_ID_NIC_19_3 = 235,
+  GAUDI2_QUEUE_ID_NIC_20_0 = 236,
+  GAUDI2_QUEUE_ID_NIC_20_1 = 237,
+  GAUDI2_QUEUE_ID_NIC_20_2 = 238,
+  GAUDI2_QUEUE_ID_NIC_20_3 = 239,
+  GAUDI2_QUEUE_ID_NIC_21_0 = 240,
+  GAUDI2_QUEUE_ID_NIC_21_1 = 241,
+  GAUDI2_QUEUE_ID_NIC_21_2 = 242,
+  GAUDI2_QUEUE_ID_NIC_21_3 = 243,
+  GAUDI2_QUEUE_ID_NIC_22_0 = 244,
+  GAUDI2_QUEUE_ID_NIC_22_1 = 245,
+  GAUDI2_QUEUE_ID_NIC_22_2 = 246,
+  GAUDI2_QUEUE_ID_NIC_22_3 = 247,
+  GAUDI2_QUEUE_ID_NIC_23_0 = 248,
+  GAUDI2_QUEUE_ID_NIC_23_1 = 249,
+  GAUDI2_QUEUE_ID_NIC_23_2 = 250,
+  GAUDI2_QUEUE_ID_NIC_23_3 = 251,
+  GAUDI2_QUEUE_ID_ROT_0_0 = 252,
+  GAUDI2_QUEUE_ID_ROT_0_1 = 253,
+  GAUDI2_QUEUE_ID_ROT_0_2 = 254,
+  GAUDI2_QUEUE_ID_ROT_0_3 = 255,
+  GAUDI2_QUEUE_ID_ROT_1_0 = 256,
+  GAUDI2_QUEUE_ID_ROT_1_1 = 257,
+  GAUDI2_QUEUE_ID_ROT_1_2 = 258,
+  GAUDI2_QUEUE_ID_ROT_1_3 = 259,
+  GAUDI2_QUEUE_ID_CPU_PQ = 260,
+  GAUDI2_QUEUE_ID_SIZE
+};
 enum goya_engine_id {
   GOYA_ENGINE_ID_DMA_0 = 0,
   GOYA_ENGINE_ID_DMA_1,
@@ -209,6 +473,88 @@
   GAUDI_ENGINE_ID_NIC_9,
   GAUDI_ENGINE_ID_SIZE
 };
+enum gaudi2_engine_id {
+  GAUDI2_DCORE0_ENGINE_ID_EDMA_0 = 0,
+  GAUDI2_DCORE0_ENGINE_ID_EDMA_1,
+  GAUDI2_DCORE0_ENGINE_ID_MME,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_0,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_1,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_2,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_3,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_4,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_5,
+  GAUDI2_DCORE0_ENGINE_ID_DEC_0,
+  GAUDI2_DCORE0_ENGINE_ID_DEC_1,
+  GAUDI2_DCORE1_ENGINE_ID_EDMA_0,
+  GAUDI2_DCORE1_ENGINE_ID_EDMA_1,
+  GAUDI2_DCORE1_ENGINE_ID_MME,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_0,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_1,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_2,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_3,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_4,
+  GAUDI2_DCORE1_ENGINE_ID_TPC_5,
+  GAUDI2_DCORE1_ENGINE_ID_DEC_0,
+  GAUDI2_DCORE1_ENGINE_ID_DEC_1,
+  GAUDI2_DCORE2_ENGINE_ID_EDMA_0,
+  GAUDI2_DCORE2_ENGINE_ID_EDMA_1,
+  GAUDI2_DCORE2_ENGINE_ID_MME,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_0,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_1,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_2,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_3,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_4,
+  GAUDI2_DCORE2_ENGINE_ID_TPC_5,
+  GAUDI2_DCORE2_ENGINE_ID_DEC_0,
+  GAUDI2_DCORE2_ENGINE_ID_DEC_1,
+  GAUDI2_DCORE3_ENGINE_ID_EDMA_0,
+  GAUDI2_DCORE3_ENGINE_ID_EDMA_1,
+  GAUDI2_DCORE3_ENGINE_ID_MME,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_0,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_1,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_2,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_3,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_4,
+  GAUDI2_DCORE3_ENGINE_ID_TPC_5,
+  GAUDI2_DCORE3_ENGINE_ID_DEC_0,
+  GAUDI2_DCORE3_ENGINE_ID_DEC_1,
+  GAUDI2_DCORE0_ENGINE_ID_TPC_6,
+  GAUDI2_ENGINE_ID_PDMA_0,
+  GAUDI2_ENGINE_ID_PDMA_1,
+  GAUDI2_ENGINE_ID_ROT_0,
+  GAUDI2_ENGINE_ID_ROT_1,
+  GAUDI2_PCIE_ENGINE_ID_DEC_0,
+  GAUDI2_PCIE_ENGINE_ID_DEC_1,
+  GAUDI2_ENGINE_ID_NIC0_0,
+  GAUDI2_ENGINE_ID_NIC0_1,
+  GAUDI2_ENGINE_ID_NIC1_0,
+  GAUDI2_ENGINE_ID_NIC1_1,
+  GAUDI2_ENGINE_ID_NIC2_0,
+  GAUDI2_ENGINE_ID_NIC2_1,
+  GAUDI2_ENGINE_ID_NIC3_0,
+  GAUDI2_ENGINE_ID_NIC3_1,
+  GAUDI2_ENGINE_ID_NIC4_0,
+  GAUDI2_ENGINE_ID_NIC4_1,
+  GAUDI2_ENGINE_ID_NIC5_0,
+  GAUDI2_ENGINE_ID_NIC5_1,
+  GAUDI2_ENGINE_ID_NIC6_0,
+  GAUDI2_ENGINE_ID_NIC6_1,
+  GAUDI2_ENGINE_ID_NIC7_0,
+  GAUDI2_ENGINE_ID_NIC7_1,
+  GAUDI2_ENGINE_ID_NIC8_0,
+  GAUDI2_ENGINE_ID_NIC8_1,
+  GAUDI2_ENGINE_ID_NIC9_0,
+  GAUDI2_ENGINE_ID_NIC9_1,
+  GAUDI2_ENGINE_ID_NIC10_0,
+  GAUDI2_ENGINE_ID_NIC10_1,
+  GAUDI2_ENGINE_ID_NIC11_0,
+  GAUDI2_ENGINE_ID_NIC11_1,
+  GAUDI2_ENGINE_ID_PCIE,
+  GAUDI2_ENGINE_ID_PSOC,
+  GAUDI2_ENGINE_ID_ARC_FARM,
+  GAUDI2_ENGINE_ID_KDMA,
+  GAUDI2_ENGINE_ID_SIZE
+};
 enum hl_goya_pll_index {
   HL_GOYA_CPU_PLL = 0,
   HL_GOYA_IC_PLL,
@@ -232,21 +578,58 @@
   HL_GAUDI_IF_PLL,
   HL_GAUDI_PLL_MAX
 };
+enum hl_gaudi2_pll_index {
+  HL_GAUDI2_CPU_PLL = 0,
+  HL_GAUDI2_PCI_PLL,
+  HL_GAUDI2_SRAM_PLL,
+  HL_GAUDI2_HBM_PLL,
+  HL_GAUDI2_NIC_PLL,
+  HL_GAUDI2_DMA_PLL,
+  HL_GAUDI2_MESH_PLL,
+  HL_GAUDI2_MME_PLL,
+  HL_GAUDI2_TPC_PLL,
+  HL_GAUDI2_IF_PLL,
+  HL_GAUDI2_VID_PLL,
+  HL_GAUDI2_MSS_PLL,
+  HL_GAUDI2_PLL_MAX
+};
+enum hl_goya_dma_direction {
+  HL_DMA_HOST_TO_DRAM,
+  HL_DMA_HOST_TO_SRAM,
+  HL_DMA_DRAM_TO_SRAM,
+  HL_DMA_SRAM_TO_DRAM,
+  HL_DMA_SRAM_TO_HOST,
+  HL_DMA_DRAM_TO_HOST,
+  HL_DMA_DRAM_TO_DRAM,
+  HL_DMA_SRAM_TO_SRAM,
+  HL_DMA_ENUM_MAX
+};
 enum hl_device_status {
   HL_DEVICE_STATUS_OPERATIONAL,
   HL_DEVICE_STATUS_IN_RESET,
   HL_DEVICE_STATUS_MALFUNCTION,
   HL_DEVICE_STATUS_NEEDS_RESET,
   HL_DEVICE_STATUS_IN_DEVICE_CREATION,
-  HL_DEVICE_STATUS_LAST = HL_DEVICE_STATUS_IN_DEVICE_CREATION
+  HL_DEVICE_STATUS_IN_RESET_AFTER_DEVICE_RELEASE,
+  HL_DEVICE_STATUS_LAST = HL_DEVICE_STATUS_IN_RESET_AFTER_DEVICE_RELEASE
 };
 enum hl_server_type {
   HL_SERVER_TYPE_UNKNOWN = 0,
   HL_SERVER_GAUDI_HLS1 = 1,
   HL_SERVER_GAUDI_HLS1H = 2,
   HL_SERVER_GAUDI_TYPE1 = 3,
-  HL_SERVER_GAUDI_TYPE2 = 4
+  HL_SERVER_GAUDI_TYPE2 = 4,
+  HL_SERVER_GAUDI2_HLS2 = 5
 };
+#define HL_NOTIFIER_EVENT_TPC_ASSERT (1ULL << 0)
+#define HL_NOTIFIER_EVENT_UNDEFINED_OPCODE (1ULL << 1)
+#define HL_NOTIFIER_EVENT_DEVICE_RESET (1ULL << 2)
+#define HL_NOTIFIER_EVENT_CS_TIMEOUT (1ULL << 3)
+#define HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE (1ULL << 4)
+#define HL_NOTIFIER_EVENT_USER_ENGINE_ERR (1ULL << 5)
+#define HL_NOTIFIER_EVENT_GENERAL_HW_ERR (1ULL << 6)
+#define HL_NOTIFIER_EVENT_RAZWI (1ULL << 7)
+#define HL_NOTIFIER_EVENT_PAGE_FAULT (1ULL << 8)
 #define HL_INFO_HW_IP_INFO 0
 #define HL_INFO_HW_EVENTS 1
 #define HL_INFO_DRAM_USAGE 2
@@ -271,11 +654,17 @@
 #define HL_INFO_CS_TIMEOUT_EVENT 24
 #define HL_INFO_RAZWI_EVENT 25
 #define HL_INFO_DEV_MEM_ALLOC_PAGE_SIZES 26
+#define HL_INFO_SECURED_ATTESTATION 27
 #define HL_INFO_REGISTER_EVENTFD 28
 #define HL_INFO_UNREGISTER_EVENTFD 29
 #define HL_INFO_GET_EVENTS 30
+#define HL_INFO_UNDEFINED_OPCODE_EVENT 31
+#define HL_INFO_ENGINE_STATUS 32
+#define HL_INFO_PAGE_FAULT_EVENT 33
+#define HL_INFO_USER_MAPPINGS 34
 #define HL_INFO_VERSION_MAX_LEN 128
 #define HL_INFO_CARD_NAME_MAX_LEN 16
+#define HL_ENGINES_DATA_MAX_SIZE SZ_1M
 struct hl_info_hw_ip_info {
   __u64 sram_base_address;
   __u64 dram_base_address;
@@ -284,7 +673,7 @@
   __u32 num_of_events;
   __u32 device_id;
   __u32 module_id;
-  __u32 reserved;
+  __u32 decoder_enabled_mask;
   __u16 first_available_interrupt_id;
   __u16 server_type;
   __u32 cpld_version;
@@ -294,22 +683,29 @@
   __u32 psoc_pci_pll_div_factor;
   __u8 tpc_enabled_mask;
   __u8 dram_enabled;
-  __u8 pad[2];
+  __u8 security_enabled;
+  __u8 mme_master_slave_mode;
   __u8 cpucp_version[HL_INFO_VERSION_MAX_LEN];
   __u8 card_name[HL_INFO_CARD_NAME_MAX_LEN];
-  __u64 reserved2;
+  __u64 tpc_enabled_mask_ext;
   __u64 dram_page_size;
-  __u32 reserved3;
+  __u32 edma_enabled_mask;
   __u16 number_of_user_interrupts;
   __u16 pad2;
   __u64 reserved4;
   __u64 device_mem_alloc_default_page_size;
+  __u64 reserved5;
+  __u64 reserved6;
+  __u32 reserved7;
+  __u8 reserved8;
+  __u8 revision_id;
+  __u8 pad[2];
 };
 struct hl_info_dram_usage {
   __u64 dram_free_mem;
   __u64 ctx_dram_mem;
 };
-#define HL_BUSY_ENGINES_MASK_EXT_SIZE 2
+#define HL_BUSY_ENGINES_MASK_EXT_SIZE 4
 struct hl_info_hw_idle {
   __u32 is_idle;
   __u32 busy_engines_mask;
@@ -397,20 +793,66 @@
   __s64 timestamp;
   __u64 seq;
 };
-#define HL_RAZWI_PAGE_FAULT 0
-#define HL_RAZWI_MMU_ACCESS_ERROR 1
+#define HL_RAZWI_NA_ENG_ID U16_MAX
+#define HL_RAZWI_MAX_NUM_OF_ENGINES_PER_RTR 128
+#define HL_RAZWI_READ BIT(0)
+#define HL_RAZWI_WRITE BIT(1)
+#define HL_RAZWI_LBW BIT(2)
+#define HL_RAZWI_HBW BIT(3)
+#define HL_RAZWI_RR BIT(4)
+#define HL_RAZWI_ADDR_DEC BIT(5)
 struct hl_info_razwi_event {
   __s64 timestamp;
   __u64 addr;
-  __u16 engine_id_1;
-  __u16 engine_id_2;
-  __u8 no_engine_id;
-  __u8 error_type;
-  __u8 pad[2];
+  __u16 engine_id[HL_RAZWI_MAX_NUM_OF_ENGINES_PER_RTR];
+  __u16 num_of_possible_engines;
+  __u8 flags;
+  __u8 pad[5];
+};
+#define MAX_QMAN_STREAMS_INFO 4
+#define OPCODE_INFO_MAX_ADDR_SIZE 8
+struct hl_info_undefined_opcode_event {
+  __s64 timestamp;
+  __u64 cb_addr_streams[MAX_QMAN_STREAMS_INFO][OPCODE_INFO_MAX_ADDR_SIZE];
+  __u64 cq_addr;
+  __u32 cq_size;
+  __u32 cb_addr_streams_len;
+  __u32 engine_id;
+  __u32 stream_id;
 };
 struct hl_info_dev_memalloc_page_sizes {
   __u64 page_order_bitmask;
 };
+#define SEC_PCR_DATA_BUF_SZ 256
+#define SEC_PCR_QUOTE_BUF_SZ 510
+#define SEC_SIGNATURE_BUF_SZ 255
+#define SEC_PUB_DATA_BUF_SZ 510
+#define SEC_CERTIFICATE_BUF_SZ 2046
+struct hl_info_sec_attest {
+  __u32 nonce;
+  __u16 pcr_quote_len;
+  __u16 pub_data_len;
+  __u16 certificate_len;
+  __u8 pcr_num_reg;
+  __u8 pcr_reg_len;
+  __u8 quote_sig_len;
+  __u8 pcr_data[SEC_PCR_DATA_BUF_SZ];
+  __u8 pcr_quote[SEC_PCR_QUOTE_BUF_SZ];
+  __u8 quote_sig[SEC_SIGNATURE_BUF_SZ];
+  __u8 public_data[SEC_PUB_DATA_BUF_SZ];
+  __u8 certificate[SEC_CERTIFICATE_BUF_SZ];
+  __u8 pad0[2];
+};
+struct hl_page_fault_info {
+  __s64 timestamp;
+  __u64 addr;
+  __u16 engine_id;
+  __u8 pad[6];
+};
+struct hl_user_mapping {
+  __u64 dev_va;
+  __u64 size;
+};
 enum gaudi_dcores {
   HL_GAUDI_WS_DCORE,
   HL_GAUDI_WN_DCORE,
@@ -427,6 +869,9 @@
     __u32 period_ms;
     __u32 pll_index;
     __u32 eventfd;
+    __u32 user_buffer_actual_size;
+    __u32 sec_attest_nonce;
+    __u32 array_size;
   };
   __u32 pad;
 };
@@ -489,11 +934,23 @@
 #define HL_CS_FLAGS_ENCAP_SIGNALS 0x800
 #define HL_CS_FLAGS_RESERVE_SIGNALS_ONLY 0x1000
 #define HL_CS_FLAGS_UNRESERVE_SIGNALS_ONLY 0x2000
+#define HL_CS_FLAGS_ENGINE_CORE_COMMAND 0x4000
 #define HL_CS_STATUS_SUCCESS 0
 #define HL_MAX_JOBS_PER_CS 512
+#define HL_ENGINE_CORE_HALT (1 << 0)
+#define HL_ENGINE_CORE_RUN (1 << 1)
 struct hl_cs_in {
-  __u64 chunks_restore;
-  __u64 chunks_execute;
+  union {
+    struct {
+      __u64 chunks_restore;
+      __u64 chunks_execute;
+    };
+    struct {
+      __u64 engine_cores;
+      __u32 num_engine_cores;
+      __u32 core_command;
+    };
+  };
   union {
     __u64 seq;
     __u32 encaps_sig_handle_id;
@@ -507,6 +964,7 @@
   __u32 timeout;
   __u32 cs_flags;
   __u32 ctx_id;
+  __u8 pad[4];
 };
 struct hl_cs_out {
   union {
@@ -527,6 +985,8 @@
 };
 #define HL_WAIT_CS_FLAGS_INTERRUPT 0x2
 #define HL_WAIT_CS_FLAGS_INTERRUPT_MASK 0xFFF00000
+#define HL_WAIT_CS_FLAGS_ANY_CQ_INTERRUPT 0xFFF00000
+#define HL_WAIT_CS_FLAGS_ANY_DEC_INTERRUPT 0xFFE00000
 #define HL_WAIT_CS_FLAGS_MULTI_CS 0x4
 #define HL_WAIT_CS_FLAGS_INTERRUPT_KERNEL_CQ 0x10
 #define HL_WAIT_CS_FLAGS_REGISTER_INTERRUPT 0x20
@@ -664,12 +1124,18 @@
   __u32 bw_win;
   __u32 win_capture;
   __u32 id;
-  __u32 pad;
+  __u32 control;
+  __u64 start_addr2;
+  __u64 end_addr2;
+  __u64 start_addr3;
+  __u64 end_addr3;
 };
 struct hl_debug_params_spmu {
   __u64 event_types[HL_DEBUG_MAX_AUX_VALUES];
   __u32 event_types_num;
-  __u32 pad;
+  __u32 pmtrc_val;
+  __u32 trc_ctrl_host_val;
+  __u32 trc_en_host_val;
 };
 #define HL_DEBUG_OP_ETR 0
 #define HL_DEBUG_OP_ETF 1
@@ -689,7 +1155,6 @@
   __u32 enable;
   __u32 ctx_id;
 };
-#define HL_NOTIFIER_EVENT_TPC_ASSERT (1 << 0)
 #define HL_IOCTL_INFO _IOWR('H', 0x01, struct hl_info_args)
 #define HL_IOCTL_CB _IOWR('H', 0x02, union hl_cb_args)
 #define HL_IOCTL_CS _IOWR('H', 0x03, union hl_cs_args)
diff --git a/libc/kernel/uapi/misc/uacce/hisi_qm.h b/libc/kernel/uapi/misc/uacce/hisi_qm.h
index 87757a9..d2509d0 100644
--- a/libc/kernel/uapi/misc/uacce/hisi_qm.h
+++ b/libc/kernel/uapi/misc/uacce/hisi_qm.h
@@ -23,8 +23,15 @@
   __u16 id;
   __u16 qc_type;
 };
+struct hisi_qp_info {
+  __u32 sqe_size;
+  __u16 sq_depth;
+  __u16 cq_depth;
+  __u64 reserved;
+};
 #define HISI_QM_API_VER_BASE "hisi_qm_v1"
 #define HISI_QM_API_VER2_BASE "hisi_qm_v2"
 #define HISI_QM_API_VER3_BASE "hisi_qm_v3"
 #define UACCE_CMD_QM_SET_QP_CTX _IOWR('H', 10, struct hisi_qp_ctx)
+#define UACCE_CMD_QM_SET_QP_INFO _IOWR('H', 11, struct hisi_qp_info)
 #endif
diff --git a/libc/kernel/uapi/mtd/mtd-abi.h b/libc/kernel/uapi/mtd/mtd-abi.h
index 50ae565..aed2acc 100644
--- a/libc/kernel/uapi/mtd/mtd-abi.h
+++ b/libc/kernel/uapi/mtd/mtd-abi.h
@@ -30,7 +30,7 @@
 struct mtd_oob_buf {
   __u32 start;
   __u32 length;
-  unsigned char __user * ptr;
+  unsigned char  * ptr;
 };
 struct mtd_oob_buf64 {
   __u64 start;
@@ -52,6 +52,21 @@
   __u8 mode;
   __u8 padding[7];
 };
+struct mtd_read_req_ecc_stats {
+  __u32 uncorrectable_errors;
+  __u32 corrected_bitflips;
+  __u32 max_bitflips;
+};
+struct mtd_read_req {
+  __u64 start;
+  __u64 len;
+  __u64 ooblen;
+  __u64 usr_data;
+  __u64 usr_oob;
+  __u8 mode;
+  __u8 padding[7];
+  struct mtd_read_req_ecc_stats ecc_stats;
+};
 #define MTD_ABSENT 0
 #define MTD_RAM 1
 #define MTD_ROM 2
@@ -122,6 +137,7 @@
 #define MEMISLOCKED _IOR('M', 23, struct erase_info_user)
 #define MEMWRITE _IOWR('M', 24, struct mtd_write_req)
 #define OTPERASE _IOW('M', 25, struct otp_info)
+#define MEMREAD _IOWR('M', 26, struct mtd_read_req)
 struct nand_oobinfo {
   __u32 useecc;
   __u32 eccbytes;
diff --git a/libc/kernel/uapi/mtd/ubi-user.h b/libc/kernel/uapi/mtd/ubi-user.h
index 866fbd2..db203d5 100644
--- a/libc/kernel/uapi/mtd/ubi-user.h
+++ b/libc/kernel/uapi/mtd/ubi-user.h
@@ -56,7 +56,8 @@
   __s32 mtd_num;
   __s32 vid_hdr_offset;
   __s16 max_beb_per1024;
-  __s8 padding[10];
+  __s8 disable_fm;
+  __s8 padding[9];
 };
 enum {
   UBI_VOL_SKIP_CRC_CHECK_FLG = 0x1,
@@ -71,11 +72,11 @@
   __s16 name_len;
   __s8 padding2[4];
   char name[UBI_MAX_VOLUME_NAME + 1];
-} __packed;
+} __attribute__((__packed__));
 struct ubi_rsvol_req {
   __s64 bytes;
   __s32 vol_id;
-} __packed;
+} __attribute__((__packed__));
 struct ubi_rnvol_req {
   __s32 count;
   __s8 padding1[12];
@@ -85,24 +86,24 @@
     __s8 padding2[2];
     char name[UBI_MAX_VOLUME_NAME + 1];
   } ents[UBI_MAX_RNVOL];
-} __packed;
+} __attribute__((__packed__));
 struct ubi_leb_change_req {
   __s32 lnum;
   __s32 bytes;
   __s8 dtype;
   __s8 padding[7];
-} __packed;
+} __attribute__((__packed__));
 struct ubi_map_req {
   __s32 lnum;
   __s8 dtype;
   __s8 padding[3];
-} __packed;
+} __attribute__((__packed__));
 struct ubi_set_vol_prop_req {
   __u8 property;
   __u8 padding[7];
   __u64 value;
-} __packed;
+} __attribute__((__packed__));
 struct ubi_blkcreate_req {
   __s8 padding[128];
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/rdma/efa-abi.h b/libc/kernel/uapi/rdma/efa-abi.h
index 4b6842b..bfb3f18 100644
--- a/libc/kernel/uapi/rdma/efa-abi.h
+++ b/libc/kernel/uapi/rdma/efa-abi.h
@@ -49,6 +49,7 @@
 };
 enum {
   EFA_CREATE_CQ_WITH_COMPLETION_CHANNEL = 1 << 0,
+  EFA_CREATE_CQ_WITH_SGID = 1 << 1,
 };
 struct efa_ibv_create_cq {
   __u32 comp_mask;
@@ -102,6 +103,7 @@
   EFA_QUERY_DEVICE_CAPS_RDMA_READ = 1 << 0,
   EFA_QUERY_DEVICE_CAPS_RNR_RETRY = 1 << 1,
   EFA_QUERY_DEVICE_CAPS_CQ_NOTIFICATIONS = 1 << 2,
+  EFA_QUERY_DEVICE_CAPS_CQ_WITH_SGID = 1 << 3,
 };
 struct efa_ibv_ex_query_device_resp {
   __u32 comp_mask;
diff --git a/libc/kernel/uapi/rdma/erdma-abi.h b/libc/kernel/uapi/rdma/erdma-abi.h
new file mode 100644
index 0000000..4df1757
--- /dev/null
+++ b/libc/kernel/uapi/rdma/erdma-abi.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ERDMA_USER_H__
+#define __ERDMA_USER_H__
+#include <linux/types.h>
+#define ERDMA_ABI_VERSION 1
+struct erdma_ureq_create_cq {
+  __aligned_u64 db_record_va;
+  __aligned_u64 qbuf_va;
+  __u32 qbuf_len;
+  __u32 rsvd0;
+};
+struct erdma_uresp_create_cq {
+  __u32 cq_id;
+  __u32 num_cqe;
+};
+struct erdma_ureq_create_qp {
+  __aligned_u64 db_record_va;
+  __aligned_u64 qbuf_va;
+  __u32 qbuf_len;
+  __u32 rsvd0;
+};
+struct erdma_uresp_create_qp {
+  __u32 qp_id;
+  __u32 num_sqe;
+  __u32 num_rqe;
+  __u32 rq_offset;
+};
+struct erdma_uresp_alloc_ctx {
+  __u32 dev_id;
+  __u32 pad;
+  __u32 sdb_type;
+  __u32 sdb_offset;
+  __aligned_u64 sdb;
+  __aligned_u64 rdb;
+  __aligned_u64 cdb;
+};
+#endif
diff --git a/libc/kernel/uapi/rdma/hfi/hfi1_user.h b/libc/kernel/uapi/rdma/hfi/hfi1_user.h
index 3352907..6d58600 100644
--- a/libc/kernel/uapi/rdma/hfi/hfi1_user.h
+++ b/libc/kernel/uapi/rdma/hfi/hfi1_user.h
@@ -80,7 +80,7 @@
 struct hfi1_status {
   __aligned_u64 dev;
   __aligned_u64 port;
-  char freezemsg[0];
+  char freezemsg[];
 };
 enum sdma_req_opcode {
   EXPECTED = 0,
diff --git a/libc/kernel/uapi/rdma/hns-abi.h b/libc/kernel/uapi/rdma/hns-abi.h
index 9c8d028..0407571 100644
--- a/libc/kernel/uapi/rdma/hns-abi.h
+++ b/libc/kernel/uapi/rdma/hns-abi.h
@@ -60,11 +60,23 @@
   __aligned_u64 cap_flags;
   __aligned_u64 dwqe_mmap_key;
 };
+enum {
+  HNS_ROCE_EXSGE_FLAGS = 1 << 0,
+};
+enum {
+  HNS_ROCE_RSP_EXSGE_FLAGS = 1 << 0,
+};
 struct hns_roce_ib_alloc_ucontext_resp {
   __u32 qp_tab_size;
   __u32 cqe_size;
   __u32 srq_tab_size;
   __u32 reserved;
+  __u32 config;
+  __u32 max_inline_data;
+};
+struct hns_roce_ib_alloc_ucontext {
+  __u32 config;
+  __u32 reserved;
 };
 struct hns_roce_ib_alloc_pd_resp {
   __u32 pdn;
diff --git a/libc/kernel/uapi/rdma/ib_user_ioctl_verbs.h b/libc/kernel/uapi/rdma/ib_user_ioctl_verbs.h
index 3b94907..6b9a436 100644
--- a/libc/kernel/uapi/rdma/ib_user_ioctl_verbs.h
+++ b/libc/kernel/uapi/rdma/ib_user_ioctl_verbs.h
@@ -37,6 +37,8 @@
   IB_UVERBS_ACCESS_ZERO_BASED = 1 << 5,
   IB_UVERBS_ACCESS_ON_DEMAND = 1 << 6,
   IB_UVERBS_ACCESS_HUGETLB = 1 << 7,
+  IB_UVERBS_ACCESS_FLUSH_GLOBAL = 1 << 8,
+  IB_UVERBS_ACCESS_FLUSH_PERSISTENT = 1 << 9,
   IB_UVERBS_ACCESS_RELAXED_ORDERING = IB_UVERBS_ACCESS_OPTIONAL_FIRST,
   IB_UVERBS_ACCESS_OPTIONAL_RANGE = ((IB_UVERBS_ACCESS_OPTIONAL_LAST << 1) - 1) & ~(IB_UVERBS_ACCESS_OPTIONAL_FIRST - 1)
 };
@@ -191,6 +193,8 @@
   RDMA_DRIVER_QIB,
   RDMA_DRIVER_EFA,
   RDMA_DRIVER_SIW,
+  RDMA_DRIVER_ERDMA,
+  RDMA_DRIVER_MANA,
 };
 enum ib_uverbs_gid_type {
   IB_UVERBS_GID_TYPE_IB,
diff --git a/libc/kernel/uapi/rdma/ib_user_verbs.h b/libc/kernel/uapi/rdma/ib_user_verbs.h
index e24410e..6894bf1 100644
--- a/libc/kernel/uapi/rdma/ib_user_verbs.h
+++ b/libc/kernel/uapi/rdma/ib_user_verbs.h
@@ -78,6 +78,14 @@
   IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL,
   IB_USER_VERBS_EX_CMD_MODIFY_CQ
 };
+enum ib_placement_type {
+  IB_FLUSH_GLOBAL = 1U << 0,
+  IB_FLUSH_PERSISTENT = 1U << 1,
+};
+enum ib_selectivity_level {
+  IB_FLUSH_RANGE = 0,
+  IB_FLUSH_MR,
+};
 struct ib_uverbs_async_event_desc {
   __aligned_u64 element;
   __u32 event_type;
@@ -106,16 +114,16 @@
 };
 struct ib_uverbs_get_context {
   __aligned_u64 response;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_get_context_resp {
   __u32 async_fd;
   __u32 num_comp_vectors;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_device {
   __aligned_u64 response;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_device_resp {
   __aligned_u64 fw_ver;
@@ -208,7 +216,7 @@
   __aligned_u64 response;
   __u8 port_num;
   __u8 reserved[7];
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_port_resp {
   __u32 port_cap_flags;
@@ -236,11 +244,11 @@
 };
 struct ib_uverbs_alloc_pd {
   __aligned_u64 response;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_alloc_pd_resp {
   __u32 pd_handle;
-  __u32 driver_data[0];
+  __u32 driver_data[];
 };
 struct ib_uverbs_dealloc_pd {
   __u32 pd_handle;
@@ -249,11 +257,11 @@
   __aligned_u64 response;
   __u32 fd;
   __u32 oflags;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_open_xrcd_resp {
   __u32 xrcd_handle;
-  __u32 driver_data[0];
+  __u32 driver_data[];
 };
 struct ib_uverbs_close_xrcd {
   __u32 xrcd_handle;
@@ -265,13 +273,13 @@
   __aligned_u64 hca_va;
   __u32 pd_handle;
   __u32 access_flags;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_reg_mr_resp {
   __u32 mr_handle;
   __u32 lkey;
   __u32 rkey;
-  __u32 driver_data[0];
+  __u32 driver_data[];
 };
 struct ib_uverbs_rereg_mr {
   __aligned_u64 response;
@@ -282,12 +290,12 @@
   __aligned_u64 hca_va;
   __u32 pd_handle;
   __u32 access_flags;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_rereg_mr_resp {
   __u32 lkey;
   __u32 rkey;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_dereg_mr {
   __u32 mr_handle;
@@ -297,12 +305,12 @@
   __u32 pd_handle;
   __u8 mw_type;
   __u8 reserved[3];
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_alloc_mw_resp {
   __u32 mw_handle;
   __u32 rkey;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_dealloc_mw {
   __u32 mw_handle;
@@ -320,7 +328,7 @@
   __u32 comp_vector;
   __s32 comp_channel;
   __u32 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 enum ib_uverbs_ex_create_cq_flags {
   IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION = 1 << 0,
@@ -349,12 +357,12 @@
   __aligned_u64 response;
   __u32 cq_handle;
   __u32 cqe;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_resize_cq_resp {
   __u32 cqe;
   __u32 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_poll_cq {
   __aligned_u64 response;
@@ -370,6 +378,8 @@
   IB_UVERBS_WC_BIND_MW = 5,
   IB_UVERBS_WC_LOCAL_INV = 6,
   IB_UVERBS_WC_TSO = 7,
+  IB_UVERBS_WC_FLUSH = 8,
+  IB_UVERBS_WC_ATOMIC_WRITE = 9,
 };
 struct ib_uverbs_wc {
   __aligned_u64 wr_id;
@@ -394,7 +404,7 @@
 struct ib_uverbs_poll_cq_resp {
   __u32 count;
   __u32 reserved;
-  struct ib_uverbs_wc wc[0];
+  struct ib_uverbs_wc wc[];
 };
 struct ib_uverbs_req_notify_cq {
   __u32 cq_handle;
@@ -476,7 +486,7 @@
   __u8 qp_type;
   __u8 is_srq;
   __u8 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 enum ib_uverbs_create_qp_mask {
   IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1UL << 0,
@@ -511,7 +521,7 @@
   __u32 qpn;
   __u8 qp_type;
   __u8 reserved[7];
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_create_qp_resp {
   __u32 qp_handle;
@@ -547,7 +557,7 @@
   __aligned_u64 response;
   __u32 qp_handle;
   __u32 attr_mask;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_qp_resp {
   struct ib_uverbs_qp_dest dest;
@@ -580,7 +590,7 @@
   __u8 alt_timeout;
   __u8 sq_sig_all;
   __u8 reserved[5];
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_modify_qp {
   struct ib_uverbs_qp_dest dest;
@@ -648,6 +658,8 @@
   IB_UVERBS_WR_RDMA_READ_WITH_INV = 11,
   IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,
   IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,
+  IB_UVERBS_WR_FLUSH = 14,
+  IB_UVERBS_WR_ATOMIC_WRITE = 15,
 };
 struct ib_uverbs_send_wr {
   __aligned_u64 wr_id;
@@ -685,7 +697,7 @@
   __u32 wr_count;
   __u32 sge_count;
   __u32 wqe_size;
-  struct ib_uverbs_send_wr send_wr[0];
+  struct ib_uverbs_send_wr send_wr[];
 };
 struct ib_uverbs_post_send_resp {
   __u32 bad_wr;
@@ -701,7 +713,7 @@
   __u32 wr_count;
   __u32 sge_count;
   __u32 wqe_size;
-  struct ib_uverbs_recv_wr recv_wr[0];
+  struct ib_uverbs_recv_wr recv_wr[];
 };
 struct ib_uverbs_post_recv_resp {
   __u32 bad_wr;
@@ -712,7 +724,7 @@
   __u32 wr_count;
   __u32 sge_count;
   __u32 wqe_size;
-  struct ib_uverbs_recv_wr recv[0];
+  struct ib_uverbs_recv_wr recv[];
 };
 struct ib_uverbs_post_srq_recv_resp {
   __u32 bad_wr;
@@ -723,11 +735,11 @@
   __u32 pd_handle;
   __u32 reserved;
   struct ib_uverbs_ah_attr attr;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_create_ah_resp {
   __u32 ah_handle;
-  __u32 driver_data[0];
+  __u32 driver_data[];
 };
 struct ib_uverbs_destroy_ah {
   __u32 ah_handle;
@@ -737,14 +749,14 @@
   __u32 qp_handle;
   __u16 mlid;
   __u16 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_detach_mcast {
   __u8 gid[16];
   __u32 qp_handle;
   __u16 mlid;
   __u16 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_flow_spec_hdr {
   __u32 type;
@@ -944,7 +956,7 @@
   __u8 reserved[2];
   __u8 port;
   __u32 flags;
-  struct ib_uverbs_flow_spec_hdr flow_specs[0];
+  struct ib_uverbs_flow_spec_hdr flow_specs[];
 };
 struct ib_uverbs_create_flow {
   __u32 comp_mask;
@@ -966,7 +978,7 @@
   __u32 max_wr;
   __u32 max_sge;
   __u32 srq_limit;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_create_xsrq {
   __aligned_u64 response;
@@ -979,27 +991,27 @@
   __u32 max_num_tags;
   __u32 xrcd_handle;
   __u32 cq_handle;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_create_srq_resp {
   __u32 srq_handle;
   __u32 max_wr;
   __u32 max_sge;
   __u32 srqn;
-  __u32 driver_data[0];
+  __u32 driver_data[];
 };
 struct ib_uverbs_modify_srq {
   __u32 srq_handle;
   __u32 attr_mask;
   __u32 max_wr;
   __u32 srq_limit;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_srq {
   __aligned_u64 response;
   __u32 srq_handle;
   __u32 reserved;
-  __aligned_u64 driver_data[0];
+  __aligned_u64 driver_data[];
 };
 struct ib_uverbs_query_srq_resp {
   __u32 max_wr;
@@ -1056,7 +1068,7 @@
 struct ib_uverbs_ex_create_rwq_ind_table {
   __u32 comp_mask;
   __u32 log_ind_tbl_size;
-  __u32 wq_handles[0];
+  __u32 wq_handles[];
 };
 struct ib_uverbs_ex_create_rwq_ind_table_resp {
   __u32 comp_mask;
@@ -1105,6 +1117,9 @@
   IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 1 << 29,
   IB_UVERBS_DEVICE_RAW_SCATTER_FCS = 1ULL << 34,
   IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 1ULL << 36,
+  IB_UVERBS_DEVICE_FLUSH_GLOBAL = 1ULL << 38,
+  IB_UVERBS_DEVICE_FLUSH_PERSISTENT = 1ULL << 39,
+  IB_UVERBS_DEVICE_ATOMIC_WRITE = 1ULL << 40,
 };
 enum ib_uverbs_raw_packet_caps {
   IB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1 << 0,
diff --git a/libc/kernel/uapi/rdma/mana-abi.h b/libc/kernel/uapi/rdma/mana-abi.h
new file mode 100644
index 0000000..4f1a73f
--- /dev/null
+++ b/libc/kernel/uapi/rdma/mana-abi.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef MANA_ABI_USER_H
+#define MANA_ABI_USER_H
+#include <linux/types.h>
+#include <rdma/ib_user_ioctl_verbs.h>
+#define MANA_IB_UVERBS_ABI_VERSION 1
+struct mana_ib_create_cq {
+  __aligned_u64 buf_addr;
+};
+struct mana_ib_create_qp {
+  __aligned_u64 sq_buf_addr;
+  __u32 sq_buf_size;
+  __u32 port;
+};
+struct mana_ib_create_qp_resp {
+  __u32 sqid;
+  __u32 cqid;
+  __u32 tx_vp_offset;
+  __u32 reserved;
+};
+struct mana_ib_create_wq {
+  __aligned_u64 wq_buf_addr;
+  __u32 wq_buf_size;
+  __u32 reserved;
+};
+enum mana_ib_rx_hash_function_flags {
+  MANA_IB_RX_HASH_FUNC_TOEPLITZ = 1 << 0,
+};
+struct mana_ib_create_qp_rss {
+  __aligned_u64 rx_hash_fields_mask;
+  __u8 rx_hash_function;
+  __u8 reserved[7];
+  __u32 rx_hash_key_len;
+  __u8 rx_hash_key[40];
+  __u32 port;
+};
+struct rss_resp_entry {
+  __u32 cqid;
+  __u32 wqid;
+};
+struct mana_ib_create_qp_rss_resp {
+  __aligned_u64 num_entries;
+  struct rss_resp_entry entries[64];
+};
+#endif
diff --git a/libc/kernel/uapi/rdma/mlx5-abi.h b/libc/kernel/uapi/rdma/mlx5-abi.h
index aadb20e..f41c887 100644
--- a/libc/kernel/uapi/rdma/mlx5-abi.h
+++ b/libc/kernel/uapi/rdma/mlx5-abi.h
@@ -70,6 +70,7 @@
   MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_ECE = 1UL << 2,
   MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_SQD2RTS = 1UL << 3,
   MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_REAL_TIME_TS = 1UL << 4,
+  MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_MKEY_UPDATE_TAG = 1UL << 5,
 };
 enum mlx5_user_cmds_supp_uhw {
   MLX5_USER_CMDS_SUPP_UHW_QUERY_DEVICE = 1 << 0,
diff --git a/libc/kernel/uapi/rdma/mlx5_user_ioctl_cmds.h b/libc/kernel/uapi/rdma/mlx5_user_ioctl_cmds.h
index 862abcb..c060482 100644
--- a/libc/kernel/uapi/rdma/mlx5_user_ioctl_cmds.h
+++ b/libc/kernel/uapi/rdma/mlx5_user_ioctl_cmds.h
@@ -135,6 +135,7 @@
   MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
   MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
   MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP,
+  MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD,
 };
 enum mlx5_ib_devx_umem_dereg_attrs {
   MLX5_IB_ATTR_DEVX_UMEM_DEREG_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
@@ -179,6 +180,7 @@
   MLX5_IB_OBJECT_VAR,
   MLX5_IB_OBJECT_PP,
   MLX5_IB_OBJECT_UAR,
+  MLX5_IB_OBJECT_STEERING_ANCHOR,
 };
 enum mlx5_ib_flow_matcher_create_attrs {
   MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
@@ -195,6 +197,19 @@
   MLX5_IB_METHOD_FLOW_MATCHER_CREATE = (1U << UVERBS_ID_NS_SHIFT),
   MLX5_IB_METHOD_FLOW_MATCHER_DESTROY,
 };
+enum mlx5_ib_flow_steering_anchor_create_attrs {
+  MLX5_IB_ATTR_STEERING_ANCHOR_CREATE_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+  MLX5_IB_ATTR_STEERING_ANCHOR_FT_TYPE,
+  MLX5_IB_ATTR_STEERING_ANCHOR_PRIORITY,
+  MLX5_IB_ATTR_STEERING_ANCHOR_FT_ID,
+};
+enum mlx5_ib_flow_steering_anchor_destroy_attrs {
+  MLX5_IB_ATTR_STEERING_ANCHOR_DESTROY_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+};
+enum mlx5_ib_steering_anchor_methods {
+  MLX5_IB_METHOD_STEERING_ANCHOR_CREATE = (1U << UVERBS_ID_NS_SHIFT),
+  MLX5_IB_METHOD_STEERING_ANCHOR_DESTROY,
+};
 enum mlx5_ib_device_query_context_attrs {
   MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX = (1U << UVERBS_ID_NS_SHIFT),
 };
diff --git a/libc/kernel/uapi/rdma/mlx5_user_ioctl_verbs.h b/libc/kernel/uapi/rdma/mlx5_user_ioctl_verbs.h
index c3c3f89..f68c0b3 100644
--- a/libc/kernel/uapi/rdma/mlx5_user_ioctl_verbs.h
+++ b/libc/kernel/uapi/rdma/mlx5_user_ioctl_verbs.h
@@ -43,6 +43,7 @@
   MLX5_IB_UAPI_DM_TYPE_MEMIC,
   MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM,
   MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM,
+  MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_PATTERN_SW_ICM,
 };
 enum mlx5_ib_uapi_devx_create_event_channel_flags {
   MLX5_IB_UAPI_DEVX_CR_EV_CH_FLAGS_OMIT_DATA = 1 << 0,
diff --git a/libc/kernel/uapi/rdma/rdma_user_cm.h b/libc/kernel/uapi/rdma/rdma_user_cm.h
index 7b1f7ee..37927f8 100644
--- a/libc/kernel/uapi/rdma/rdma_user_cm.h
+++ b/libc/kernel/uapi/rdma/rdma_user_cm.h
@@ -145,7 +145,7 @@
 struct rdma_ucm_query_path_resp {
   __u32 num_paths;
   __u32 reserved;
-  struct ib_path_rec_data path_data[0];
+  struct ib_path_rec_data path_data[];
 };
 struct rdma_ucm_conn_param {
   __u32 qp_num;
diff --git a/libc/kernel/uapi/rdma/rdma_user_ioctl_cmds.h b/libc/kernel/uapi/rdma/rdma_user_ioctl_cmds.h
index 22adfaa..dbaf9ed 100644
--- a/libc/kernel/uapi/rdma/rdma_user_ioctl_cmds.h
+++ b/libc/kernel/uapi/rdma/rdma_user_ioctl_cmds.h
@@ -50,6 +50,6 @@
   __aligned_u64 reserved1;
   __u32 driver_id;
   __u32 reserved2;
-  struct ib_uverbs_attr attrs[0];
+  struct ib_uverbs_attr attrs[];
 };
 #endif
diff --git a/libc/kernel/uapi/rdma/rdma_user_rxe.h b/libc/kernel/uapi/rdma/rdma_user_rxe.h
index cdb00c7..e7619d8 100644
--- a/libc/kernel/uapi/rdma/rdma_user_rxe.h
+++ b/libc/kernel/uapi/rdma/rdma_user_rxe.h
@@ -52,7 +52,7 @@
 };
 struct rxe_send_wr {
   __aligned_u64 wr_id;
-  __u32 num_sge;
+  __u32 reserved;
   __u32 opcode;
   __u32 send_flags;
   union {
@@ -62,6 +62,13 @@
   union {
     struct {
       __aligned_u64 remote_addr;
+      __u32 length;
+      __u32 rkey;
+      __u8 type;
+      __u8 level;
+    } flush;
+    struct {
+      __aligned_u64 remote_addr;
       __u32 rkey;
       __u32 reserved;
     } rdma;
@@ -110,6 +117,7 @@
   __u32 reserved;
   union {
     __DECLARE_FLEX_ARRAY(__u8, inline_data);
+    __DECLARE_FLEX_ARRAY(__u8, atomic_wr);
     __DECLARE_FLEX_ARRAY(struct rxe_sge, sge);
   };
 };
@@ -128,7 +136,7 @@
 };
 struct rxe_recv_wqe {
   __aligned_u64 wr_id;
-  __u32 num_sge;
+  __u32 reserved;
   __u32 padding;
   struct rxe_dma_info dma;
 };
diff --git a/libc/kernel/uapi/scsi/fc/fc_els.h b/libc/kernel/uapi/scsi/fc/fc_els.h
index 04ae5b8..d29287d 100644
--- a/libc/kernel/uapi/scsi/fc/fc_els.h
+++ b/libc/kernel/uapi/scsi/fc/fc_els.h
@@ -142,7 +142,7 @@
 struct fc_tlv_desc {
   __be32 desc_tag;
   __be32 desc_len;
-  __u8 desc_value[0];
+  __u8 desc_value[];
 };
 #define FC_TLV_DESC_HDR_SZ sizeof(struct fc_tlv_desc)
 #define FC_TLV_DESC_LENGTH_FROM_SZ(desc) (sizeof(desc) - FC_TLV_DESC_HDR_SZ)
@@ -618,7 +618,7 @@
   __be32 event_threshold;
   __be32 event_count;
   __be32 pname_count;
-  __be64 pname_list[0];
+  __be64 pname_list[];
 };
 struct fc_fn_deli_desc {
   __be32 desc_tag;
@@ -636,7 +636,7 @@
   __be16 event_modifier;
   __be32 event_period;
   __be32 pname_count;
-  __be64 pname_list[0];
+  __be64 pname_list[];
 };
 struct fc_fn_congn_desc {
   __be32 desc_tag;
@@ -651,25 +651,25 @@
   __u8 fpin_cmd;
   __u8 fpin_zero[3];
   __be32 desc_len;
-  struct fc_tlv_desc fpin_desc[0];
+  struct fc_tlv_desc fpin_desc[];
 };
 struct fc_df_desc_fpin_reg {
   __be32 desc_tag;
   __be32 desc_len;
   __be32 count;
-  __be32 desc_tags[0];
+  __be32 desc_tags[];
 };
 struct fc_els_rdf {
   __u8 fpin_cmd;
   __u8 fpin_zero[3];
   __be32 desc_len;
-  struct fc_tlv_desc desc[0];
+  struct fc_tlv_desc desc[];
 };
 struct fc_els_rdf_resp {
   struct fc_els_ls_acc acc_hdr;
   __be32 desc_list_len;
   struct fc_els_lsri_desc lsri;
-  struct fc_tlv_desc desc[0];
+  struct fc_tlv_desc desc[];
 };
 struct fc_diag_lnkflt_desc {
   __be32 desc_tag;
@@ -707,12 +707,12 @@
   __u8 edc_cmd;
   __u8 edc_zero[3];
   __be32 desc_len;
-  struct fc_tlv_desc desc[0];
+  struct fc_tlv_desc desc[];
 };
 struct fc_els_edc_resp {
   struct fc_els_ls_acc acc_hdr;
   __be32 desc_list_len;
   struct fc_els_lsri_desc lsri;
-  struct fc_tlv_desc desc[0];
+  struct fc_tlv_desc desc[];
 };
 #endif
diff --git a/libc/kernel/uapi/scsi/scsi_bsg_fc.h b/libc/kernel/uapi/scsi/scsi_bsg_fc.h
index 8966f61..2647249 100644
--- a/libc/kernel/uapi/scsi/scsi_bsg_fc.h
+++ b/libc/kernel/uapi/scsi/scsi_bsg_fc.h
@@ -66,7 +66,7 @@
 };
 struct fc_bsg_host_vendor {
   __u64 vendor_id;
-  __u32 vendor_cmd[0];
+  __u32 vendor_cmd[];
 };
 struct fc_bsg_host_vendor_reply {
   __u32 vendor_rsp[0];
diff --git a/libc/kernel/uapi/scsi/scsi_netlink_fc.h b/libc/kernel/uapi/scsi/scsi_netlink_fc.h
index ff92877..6eeb866 100644
--- a/libc/kernel/uapi/scsi/scsi_netlink_fc.h
+++ b/libc/kernel/uapi/scsi/scsi_netlink_fc.h
@@ -30,6 +30,9 @@
   __u16 event_datalen;
   __u32 event_num;
   __u32 event_code;
-  __u32 event_data;
+  union {
+    __u32 event_data;
+    __DECLARE_FLEX_ARRAY(__u8, event_data_flex);
+  };
 } __attribute__((aligned(sizeof(__u64))));
 #endif
diff --git a/libc/kernel/uapi/sound/asequencer.h b/libc/kernel/uapi/sound/asequencer.h
index ac72736..01a5058 100644
--- a/libc/kernel/uapi/sound/asequencer.h
+++ b/libc/kernel/uapi/sound/asequencer.h
@@ -209,13 +209,13 @@
 #define SNDRV_SEQ_CLIENT_DUMMY 14
 #define SNDRV_SEQ_CLIENT_OSS 15
 typedef int __bitwise snd_seq_client_type_t;
-#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
-#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
-#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
-#define SNDRV_SEQ_FILTER_BROADCAST (1 << 0)
-#define SNDRV_SEQ_FILTER_MULTICAST (1 << 1)
-#define SNDRV_SEQ_FILTER_BOUNCE (1 << 2)
-#define SNDRV_SEQ_FILTER_USE_EVENT (1 << 31)
+#define NO_CLIENT (( snd_seq_client_type_t) 0)
+#define USER_CLIENT (( snd_seq_client_type_t) 1)
+#define KERNEL_CLIENT (( snd_seq_client_type_t) 2)
+#define SNDRV_SEQ_FILTER_BROADCAST (1U << 0)
+#define SNDRV_SEQ_FILTER_MULTICAST (1U << 1)
+#define SNDRV_SEQ_FILTER_BOUNCE (1U << 2)
+#define SNDRV_SEQ_FILTER_USE_EVENT (1U << 31)
 struct snd_seq_client_info {
   int client;
   snd_seq_client_type_t type;
diff --git a/libc/kernel/uapi/sound/asoc.h b/libc/kernel/uapi/sound/asoc.h
index eeb12b0..1940e5d 100644
--- a/libc/kernel/uapi/sound/asoc.h
+++ b/libc/kernel/uapi/sound/asoc.h
@@ -356,7 +356,7 @@
   __le32 pcm_elems;
   __le32 dai_link_elems;
   struct snd_soc_tplg_private priv;
-} __packed;
+} __attribute__((__packed__));
 struct snd_soc_tplg_stream_caps_v4 {
   __le32 size;
   char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
@@ -372,7 +372,7 @@
   __le32 period_size_max;
   __le32 buffer_size_min;
   __le32 buffer_size_max;
-} __packed;
+} __attribute__((__packed__));
 struct snd_soc_tplg_pcm_v4 {
   __le32 size;
   char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
@@ -385,11 +385,11 @@
   struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX];
   __le32 num_streams;
   struct snd_soc_tplg_stream_caps_v4 caps[2];
-} __packed;
+} __attribute__((__packed__));
 struct snd_soc_tplg_link_config_v4 {
   __le32 size;
   __le32 id;
   struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX];
   __le32 num_streams;
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/sound/asound.h b/libc/kernel/uapi/sound/asound.h
index b0e47c1..9c1a3ae 100644
--- a/libc/kernel/uapi/sound/asound.h
+++ b/libc/kernel/uapi/sound/asound.h
@@ -96,7 +96,7 @@
 struct snd_hwdep_dsp_image {
   unsigned int index;
   unsigned char name[64];
-  unsigned char __user * image;
+  unsigned char  * image;
   size_t length;
   unsigned long driver_data;
 };
@@ -125,64 +125,64 @@
   SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
 };
 typedef int __bitwise snd_pcm_access_t;
-#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((__force snd_pcm_access_t) 0)
-#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((__force snd_pcm_access_t) 1)
-#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((__force snd_pcm_access_t) 2)
-#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((__force snd_pcm_access_t) 3)
-#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((__force snd_pcm_access_t) 4)
+#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED (( snd_pcm_access_t) 0)
+#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED (( snd_pcm_access_t) 1)
+#define SNDRV_PCM_ACCESS_MMAP_COMPLEX (( snd_pcm_access_t) 2)
+#define SNDRV_PCM_ACCESS_RW_INTERLEAVED (( snd_pcm_access_t) 3)
+#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED (( snd_pcm_access_t) 4)
 #define SNDRV_PCM_ACCESS_LAST SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
 typedef int __bitwise snd_pcm_format_t;
-#define SNDRV_PCM_FORMAT_S8 ((__force snd_pcm_format_t) 0)
-#define SNDRV_PCM_FORMAT_U8 ((__force snd_pcm_format_t) 1)
-#define SNDRV_PCM_FORMAT_S16_LE ((__force snd_pcm_format_t) 2)
-#define SNDRV_PCM_FORMAT_S16_BE ((__force snd_pcm_format_t) 3)
-#define SNDRV_PCM_FORMAT_U16_LE ((__force snd_pcm_format_t) 4)
-#define SNDRV_PCM_FORMAT_U16_BE ((__force snd_pcm_format_t) 5)
-#define SNDRV_PCM_FORMAT_S24_LE ((__force snd_pcm_format_t) 6)
-#define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7)
-#define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8)
-#define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9)
-#define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10)
-#define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11)
-#define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12)
-#define SNDRV_PCM_FORMAT_U32_BE ((__force snd_pcm_format_t) 13)
-#define SNDRV_PCM_FORMAT_FLOAT_LE ((__force snd_pcm_format_t) 14)
-#define SNDRV_PCM_FORMAT_FLOAT_BE ((__force snd_pcm_format_t) 15)
-#define SNDRV_PCM_FORMAT_FLOAT64_LE ((__force snd_pcm_format_t) 16)
-#define SNDRV_PCM_FORMAT_FLOAT64_BE ((__force snd_pcm_format_t) 17)
-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18)
-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19)
-#define SNDRV_PCM_FORMAT_MU_LAW ((__force snd_pcm_format_t) 20)
-#define SNDRV_PCM_FORMAT_A_LAW ((__force snd_pcm_format_t) 21)
-#define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22)
-#define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23)
-#define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24)
-#define SNDRV_PCM_FORMAT_S20_LE ((__force snd_pcm_format_t) 25)
-#define SNDRV_PCM_FORMAT_S20_BE ((__force snd_pcm_format_t) 26)
-#define SNDRV_PCM_FORMAT_U20_LE ((__force snd_pcm_format_t) 27)
-#define SNDRV_PCM_FORMAT_U20_BE ((__force snd_pcm_format_t) 28)
-#define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31)
-#define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32)
-#define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33)
-#define SNDRV_PCM_FORMAT_U24_3LE ((__force snd_pcm_format_t) 34)
-#define SNDRV_PCM_FORMAT_U24_3BE ((__force snd_pcm_format_t) 35)
-#define SNDRV_PCM_FORMAT_S20_3LE ((__force snd_pcm_format_t) 36)
-#define SNDRV_PCM_FORMAT_S20_3BE ((__force snd_pcm_format_t) 37)
-#define SNDRV_PCM_FORMAT_U20_3LE ((__force snd_pcm_format_t) 38)
-#define SNDRV_PCM_FORMAT_U20_3BE ((__force snd_pcm_format_t) 39)
-#define SNDRV_PCM_FORMAT_S18_3LE ((__force snd_pcm_format_t) 40)
-#define SNDRV_PCM_FORMAT_S18_3BE ((__force snd_pcm_format_t) 41)
-#define SNDRV_PCM_FORMAT_U18_3LE ((__force snd_pcm_format_t) 42)
-#define SNDRV_PCM_FORMAT_U18_3BE ((__force snd_pcm_format_t) 43)
-#define SNDRV_PCM_FORMAT_G723_24 ((__force snd_pcm_format_t) 44)
-#define SNDRV_PCM_FORMAT_G723_24_1B ((__force snd_pcm_format_t) 45)
-#define SNDRV_PCM_FORMAT_G723_40 ((__force snd_pcm_format_t) 46)
-#define SNDRV_PCM_FORMAT_G723_40_1B ((__force snd_pcm_format_t) 47)
-#define SNDRV_PCM_FORMAT_DSD_U8 ((__force snd_pcm_format_t) 48)
-#define SNDRV_PCM_FORMAT_DSD_U16_LE ((__force snd_pcm_format_t) 49)
-#define SNDRV_PCM_FORMAT_DSD_U32_LE ((__force snd_pcm_format_t) 50)
-#define SNDRV_PCM_FORMAT_DSD_U16_BE ((__force snd_pcm_format_t) 51)
-#define SNDRV_PCM_FORMAT_DSD_U32_BE ((__force snd_pcm_format_t) 52)
+#define SNDRV_PCM_FORMAT_S8 (( snd_pcm_format_t) 0)
+#define SNDRV_PCM_FORMAT_U8 (( snd_pcm_format_t) 1)
+#define SNDRV_PCM_FORMAT_S16_LE (( snd_pcm_format_t) 2)
+#define SNDRV_PCM_FORMAT_S16_BE (( snd_pcm_format_t) 3)
+#define SNDRV_PCM_FORMAT_U16_LE (( snd_pcm_format_t) 4)
+#define SNDRV_PCM_FORMAT_U16_BE (( snd_pcm_format_t) 5)
+#define SNDRV_PCM_FORMAT_S24_LE (( snd_pcm_format_t) 6)
+#define SNDRV_PCM_FORMAT_S24_BE (( snd_pcm_format_t) 7)
+#define SNDRV_PCM_FORMAT_U24_LE (( snd_pcm_format_t) 8)
+#define SNDRV_PCM_FORMAT_U24_BE (( snd_pcm_format_t) 9)
+#define SNDRV_PCM_FORMAT_S32_LE (( snd_pcm_format_t) 10)
+#define SNDRV_PCM_FORMAT_S32_BE (( snd_pcm_format_t) 11)
+#define SNDRV_PCM_FORMAT_U32_LE (( snd_pcm_format_t) 12)
+#define SNDRV_PCM_FORMAT_U32_BE (( snd_pcm_format_t) 13)
+#define SNDRV_PCM_FORMAT_FLOAT_LE (( snd_pcm_format_t) 14)
+#define SNDRV_PCM_FORMAT_FLOAT_BE (( snd_pcm_format_t) 15)
+#define SNDRV_PCM_FORMAT_FLOAT64_LE (( snd_pcm_format_t) 16)
+#define SNDRV_PCM_FORMAT_FLOAT64_BE (( snd_pcm_format_t) 17)
+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE (( snd_pcm_format_t) 18)
+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE (( snd_pcm_format_t) 19)
+#define SNDRV_PCM_FORMAT_MU_LAW (( snd_pcm_format_t) 20)
+#define SNDRV_PCM_FORMAT_A_LAW (( snd_pcm_format_t) 21)
+#define SNDRV_PCM_FORMAT_IMA_ADPCM (( snd_pcm_format_t) 22)
+#define SNDRV_PCM_FORMAT_MPEG (( snd_pcm_format_t) 23)
+#define SNDRV_PCM_FORMAT_GSM (( snd_pcm_format_t) 24)
+#define SNDRV_PCM_FORMAT_S20_LE (( snd_pcm_format_t) 25)
+#define SNDRV_PCM_FORMAT_S20_BE (( snd_pcm_format_t) 26)
+#define SNDRV_PCM_FORMAT_U20_LE (( snd_pcm_format_t) 27)
+#define SNDRV_PCM_FORMAT_U20_BE (( snd_pcm_format_t) 28)
+#define SNDRV_PCM_FORMAT_SPECIAL (( snd_pcm_format_t) 31)
+#define SNDRV_PCM_FORMAT_S24_3LE (( snd_pcm_format_t) 32)
+#define SNDRV_PCM_FORMAT_S24_3BE (( snd_pcm_format_t) 33)
+#define SNDRV_PCM_FORMAT_U24_3LE (( snd_pcm_format_t) 34)
+#define SNDRV_PCM_FORMAT_U24_3BE (( snd_pcm_format_t) 35)
+#define SNDRV_PCM_FORMAT_S20_3LE (( snd_pcm_format_t) 36)
+#define SNDRV_PCM_FORMAT_S20_3BE (( snd_pcm_format_t) 37)
+#define SNDRV_PCM_FORMAT_U20_3LE (( snd_pcm_format_t) 38)
+#define SNDRV_PCM_FORMAT_U20_3BE (( snd_pcm_format_t) 39)
+#define SNDRV_PCM_FORMAT_S18_3LE (( snd_pcm_format_t) 40)
+#define SNDRV_PCM_FORMAT_S18_3BE (( snd_pcm_format_t) 41)
+#define SNDRV_PCM_FORMAT_U18_3LE (( snd_pcm_format_t) 42)
+#define SNDRV_PCM_FORMAT_U18_3BE (( snd_pcm_format_t) 43)
+#define SNDRV_PCM_FORMAT_G723_24 (( snd_pcm_format_t) 44)
+#define SNDRV_PCM_FORMAT_G723_24_1B (( snd_pcm_format_t) 45)
+#define SNDRV_PCM_FORMAT_G723_40 (( snd_pcm_format_t) 46)
+#define SNDRV_PCM_FORMAT_G723_40_1B (( snd_pcm_format_t) 47)
+#define SNDRV_PCM_FORMAT_DSD_U8 (( snd_pcm_format_t) 48)
+#define SNDRV_PCM_FORMAT_DSD_U16_LE (( snd_pcm_format_t) 49)
+#define SNDRV_PCM_FORMAT_DSD_U32_LE (( snd_pcm_format_t) 50)
+#define SNDRV_PCM_FORMAT_DSD_U16_BE (( snd_pcm_format_t) 51)
+#define SNDRV_PCM_FORMAT_DSD_U32_BE (( snd_pcm_format_t) 52)
 #define SNDRV_PCM_FORMAT_LAST SNDRV_PCM_FORMAT_DSD_U32_BE
 #define SNDRV_PCM_FORMAT_FIRST SNDRV_PCM_FORMAT_S8
 #ifdef SNDRV_LITTLE_ENDIAN
@@ -212,7 +212,7 @@
 #define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_BE
 #endif
 typedef int __bitwise snd_pcm_subformat_t;
-#define SNDRV_PCM_SUBFORMAT_STD ((__force snd_pcm_subformat_t) 0)
+#define SNDRV_PCM_SUBFORMAT_STD (( snd_pcm_subformat_t) 0)
 #define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD
 #define SNDRV_PCM_INFO_MMAP 0x00000001
 #define SNDRV_PCM_INFO_MMAP_VALID 0x00000002
@@ -243,15 +243,15 @@
 #define __SND_STRUCT_TIME64
 #endif
 typedef int __bitwise snd_pcm_state_t;
-#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0)
-#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1)
-#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2)
-#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3)
-#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4)
-#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5)
-#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6)
-#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7)
-#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8)
+#define SNDRV_PCM_STATE_OPEN (( snd_pcm_state_t) 0)
+#define SNDRV_PCM_STATE_SETUP (( snd_pcm_state_t) 1)
+#define SNDRV_PCM_STATE_PREPARED (( snd_pcm_state_t) 2)
+#define SNDRV_PCM_STATE_RUNNING (( snd_pcm_state_t) 3)
+#define SNDRV_PCM_STATE_XRUN (( snd_pcm_state_t) 4)
+#define SNDRV_PCM_STATE_DRAINING (( snd_pcm_state_t) 5)
+#define SNDRV_PCM_STATE_PAUSED (( snd_pcm_state_t) 6)
+#define SNDRV_PCM_STATE_SUSPENDED (( snd_pcm_state_t) 7)
+#define SNDRV_PCM_STATE_DISCONNECTED (( snd_pcm_state_t) 8)
 #define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
 enum {
   SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
@@ -475,12 +475,12 @@
 };
 struct snd_xferi {
   snd_pcm_sframes_t result;
-  void __user * buf;
+  void  * buf;
   snd_pcm_uframes_t frames;
 };
 struct snd_xfern {
   snd_pcm_sframes_t result;
-  void __user * __user * bufs;
+  void  *  * bufs;
   snd_pcm_uframes_t frames;
 };
 enum {
@@ -605,7 +605,7 @@
   __u32 tv_nsec;
   __u64 tv_sec;
   __u8 data[SNDRV_RAWMIDI_FRAMING_DATA_LENGTH];
-} __packed;
+} __attribute__((__packed__));
 struct snd_rawmidi_params {
   int stream;
   size_t buffer_size;
@@ -776,22 +776,22 @@
   unsigned char components[128];
 };
 typedef int __bitwise snd_ctl_elem_type_t;
-#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0)
-#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1)
-#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2)
-#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3)
-#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4)
-#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5)
-#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6)
+#define SNDRV_CTL_ELEM_TYPE_NONE (( snd_ctl_elem_type_t) 0)
+#define SNDRV_CTL_ELEM_TYPE_BOOLEAN (( snd_ctl_elem_type_t) 1)
+#define SNDRV_CTL_ELEM_TYPE_INTEGER (( snd_ctl_elem_type_t) 2)
+#define SNDRV_CTL_ELEM_TYPE_ENUMERATED (( snd_ctl_elem_type_t) 3)
+#define SNDRV_CTL_ELEM_TYPE_BYTES (( snd_ctl_elem_type_t) 4)
+#define SNDRV_CTL_ELEM_TYPE_IEC958 (( snd_ctl_elem_type_t) 5)
+#define SNDRV_CTL_ELEM_TYPE_INTEGER64 (( snd_ctl_elem_type_t) 6)
 #define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
 typedef int __bitwise snd_ctl_elem_iface_t;
-#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0)
-#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1)
-#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2)
-#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3)
-#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4)
-#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5)
-#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6)
+#define SNDRV_CTL_ELEM_IFACE_CARD (( snd_ctl_elem_iface_t) 0)
+#define SNDRV_CTL_ELEM_IFACE_HWDEP (( snd_ctl_elem_iface_t) 1)
+#define SNDRV_CTL_ELEM_IFACE_MIXER (( snd_ctl_elem_iface_t) 2)
+#define SNDRV_CTL_ELEM_IFACE_PCM (( snd_ctl_elem_iface_t) 3)
+#define SNDRV_CTL_ELEM_IFACE_RAWMIDI (( snd_ctl_elem_iface_t) 4)
+#define SNDRV_CTL_ELEM_IFACE_TIMER (( snd_ctl_elem_iface_t) 5)
+#define SNDRV_CTL_ELEM_IFACE_SEQUENCER (( snd_ctl_elem_iface_t) 6)
 #define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
 #define SNDRV_CTL_ELEM_ACCESS_READ (1 << 0)
 #define SNDRV_CTL_ELEM_ACCESS_WRITE (1 << 1)
@@ -826,7 +826,7 @@
   unsigned int space;
   unsigned int used;
   unsigned int count;
-  struct snd_ctl_elem_id __user * pids;
+  struct snd_ctl_elem_id  * pids;
   unsigned char reserved[50];
 };
 struct snd_ctl_elem_info {
@@ -884,7 +884,7 @@
 struct snd_ctl_tlv {
   unsigned int numid;
   unsigned int length;
-  unsigned int tlv[0];
+  unsigned int tlv[];
 };
 #define SNDRV_CTL_IOCTL_PVERSION _IOR('U', 0x00, int)
 #define SNDRV_CTL_IOCTL_CARD_INFO _IOR('U', 0x01, struct snd_ctl_card_info)
diff --git a/libc/kernel/uapi/sound/firewire.h b/libc/kernel/uapi/sound/firewire.h
index 198a8f4..d26d722 100644
--- a/libc/kernel/uapi/sound/firewire.h
+++ b/libc/kernel/uapi/sound/firewire.h
@@ -46,11 +46,11 @@
   __be32 category;
   __be32 command;
   __be32 status;
-  __be32 params[0];
+  __be32 params[];
 };
 struct snd_firewire_event_efw_response {
   unsigned int type;
-  __be32 response[0];
+  __be32 response[];
 };
 struct snd_firewire_event_digi00x_message {
   unsigned int type;
@@ -67,7 +67,7 @@
 };
 struct snd_firewire_event_tascam_control {
   unsigned int type;
-  struct snd_firewire_tascam_change changes[0];
+  struct snd_firewire_tascam_change changes[];
 };
 struct snd_firewire_event_motu_register_dsp_change {
   unsigned int type;
diff --git a/libc/kernel/uapi/sound/skl-tplg-interface.h b/libc/kernel/uapi/sound/skl-tplg-interface.h
index b516a08..6dd9655 100644
--- a/libc/kernel/uapi/sound/skl-tplg-interface.h
+++ b/libc/kernel/uapi/sound/skl-tplg-interface.h
@@ -110,8 +110,8 @@
   __u32 rsvd : 30;
   __u32 param_id;
   __u32 max;
-  char params[0];
-} __packed;
+  char params[];
+} __attribute__((__packed__));
 enum skl_tkn_dir {
   SKL_DIR_IN,
   SKL_DIR_OUT
@@ -123,7 +123,7 @@
 struct skl_dfw_v4_module_pin {
   __u16 module_id;
   __u16 instance_id;
-} __packed;
+} __attribute__((__packed__));
 struct skl_dfw_v4_module_fmt {
   __u32 channels;
   __u32 freq;
@@ -133,21 +133,21 @@
   __u32 interleaving_style;
   __u32 sample_type;
   __u32 ch_map;
-} __packed;
+} __attribute__((__packed__));
 struct skl_dfw_v4_module_caps {
   __u32 set_params : 2;
   __u32 rsvd : 30;
   __u32 param_id;
   __u32 caps_size;
   __u32 caps[HDA_SST_CFG_MAX];
-} __packed;
+} __attribute__((__packed__));
 struct skl_dfw_v4_pipe {
   __u8 pipe_id;
   __u8 pipe_priority;
   __u16 conn_type : 4;
   __u16 rsvd : 4;
   __u16 memory_pages : 8;
-} __packed;
+} __attribute__((__packed__));
 struct skl_dfw_v4_module {
   char uuid[SKL_UUID_STR_SZ];
   __u16 module_id;
@@ -181,5 +181,5 @@
   struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
   struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
   struct skl_dfw_v4_module_caps caps;
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/sound/snd_ar_tokens.h b/libc/kernel/uapi/sound/snd_ar_tokens.h
index 39c0684..7b87caa 100644
--- a/libc/kernel/uapi/sound/snd_ar_tokens.h
+++ b/libc/kernel/uapi/sound/snd_ar_tokens.h
@@ -68,6 +68,27 @@
 #define AR_TKN_U32_MODULE_DST_IN_PORT_ID 207
 #define AR_TKN_U32_MODULE_SRC_INSTANCE_ID 208
 #define AR_TKN_U32_MODULE_DST_INSTANCE_ID 209
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID1 210
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID1 211
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID1 212
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID2 213
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID2 214
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID2 215
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID3 216
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID3 217
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID3 218
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID4 219
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID4 220
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID4 221
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID5 222
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID5 223
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID5 224
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID6 225
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID6 226
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID6 227
+#define AR_TKN_U32_MODULE_SRC_OP_PORT_ID7 228
+#define AR_TKN_U32_MODULE_DST_IN_PORT_ID7 229
+#define AR_TKN_U32_MODULE_DST_INSTANCE_ID7 230
 #define AR_TKN_U32_MODULE_HW_IF_IDX 250
 #define AR_TKN_U32_MODULE_HW_IF_TYPE 251
 #define AR_TKN_U32_MODULE_FMT_INTERLEAVE 252
diff --git a/libc/kernel/uapi/sound/sof/abi.h b/libc/kernel/uapi/sound/sof/abi.h
index 091c8ed..dc4e525 100644
--- a/libc/kernel/uapi/sound/sof/abi.h
+++ b/libc/kernel/uapi/sound/sof/abi.h
@@ -18,8 +18,9 @@
  ****************************************************************************/
 #ifndef __INCLUDE_UAPI_SOUND_SOF_ABI_H__
 #define __INCLUDE_UAPI_SOUND_SOF_ABI_H__
+#include <linux/types.h>
 #define SOF_ABI_MAJOR 3
-#define SOF_ABI_MINOR 21
+#define SOF_ABI_MINOR 23
 #define SOF_ABI_PATCH 0
 #define SOF_ABI_MAJOR_SHIFT 24
 #define SOF_ABI_MAJOR_MASK 0xff
diff --git a/libc/kernel/uapi/sound/sof/fw.h b/libc/kernel/uapi/sound/sof/fw.h
index c36c2b9..97b7de3 100644
--- a/libc/kernel/uapi/sound/sof/fw.h
+++ b/libc/kernel/uapi/sound/sof/fw.h
@@ -46,7 +46,7 @@
   enum snd_sof_fw_blk_type type;
   __u32 size;
   __u32 offset;
-} __packed;
+} __attribute__((__packed__));
 enum snd_sof_fw_mod_type {
   SOF_FW_BASE = 0,
   SOF_FW_MODULE = 1,
@@ -55,11 +55,11 @@
   enum snd_sof_fw_mod_type type;
   __u32 size;
   __u32 num_blocks;
-} __packed;
+} __attribute__((__packed__));
 struct snd_sof_fw_header {
   unsigned char sig[SND_SOF_FW_SIG_SIZE];
   __u32 file_size;
   __u32 num_modules;
   __u32 abi;
-} __packed;
+} __attribute__((__packed__));
 #endif
diff --git a/libc/kernel/uapi/sound/sof/header.h b/libc/kernel/uapi/sound/sof/header.h
index 3fbd4a4..7514550 100644
--- a/libc/kernel/uapi/sound/sof/header.h
+++ b/libc/kernel/uapi/sound/sof/header.h
@@ -25,6 +25,19 @@
   __u32 size;
   __u32 abi;
   __u32 reserved[4];
-  __u32 data[0];
-} __packed;
+  __u32 data[];
+} __attribute__((__packed__));
+#define SOF_MANIFEST_DATA_TYPE_NHLT 1
+struct sof_manifest_tlv {
+  __le32 type;
+  __le32 size;
+  __u8 data[];
+};
+struct sof_manifest {
+  __le16 abi_major;
+  __le16 abi_minor;
+  __le16 abi_patch;
+  __le16 count;
+  struct sof_manifest_tlv items[];
+};
 #endif
diff --git a/libc/kernel/uapi/sound/sof/tokens.h b/libc/kernel/uapi/sound/sof/tokens.h
index 856281a..3726546 100644
--- a/libc/kernel/uapi/sound/sof/tokens.h
+++ b/libc/kernel/uapi/sound/sof/tokens.h
@@ -37,8 +37,13 @@
 #define SOF_TKN_SCHED_FRAMES 204
 #define SOF_TKN_SCHED_TIME_DOMAIN 205
 #define SOF_TKN_SCHED_DYNAMIC_PIPELINE 206
+#define SOF_TKN_SCHED_LP_MODE 207
+#define SOF_TKN_SCHED_MEM_USAGE 208
 #define SOF_TKN_VOLUME_RAMP_STEP_TYPE 250
 #define SOF_TKN_VOLUME_RAMP_STEP_MS 251
+#define SOF_TKN_GAIN_RAMP_TYPE 260
+#define SOF_TKN_GAIN_RAMP_DURATION 261
+#define SOF_TKN_GAIN_VAL 262
 #define SOF_TKN_SRC_RATE_IN 300
 #define SOF_TKN_SRC_RATE_OUT 301
 #define SOF_TKN_ASRC_RATE_IN 320
@@ -51,6 +56,13 @@
 #define SOF_TKN_COMP_FORMAT 402
 #define SOF_TKN_COMP_CORE_ID 404
 #define SOF_TKN_COMP_UUID 405
+#define SOF_TKN_COMP_CPC 406
+#define SOF_TKN_COMP_IS_PAGES 409
+#define SOF_TKN_COMP_NUM_AUDIO_FORMATS 410
+#define SOF_TKN_COMP_NUM_SINK_PINS 411
+#define SOF_TKN_COMP_NUM_SOURCE_PINS 412
+#define SOF_TKN_COMP_SINK_PIN_BINDING_WNAME 413
+#define SOF_TKN_COMP_SRC_PIN_BINDING_WNAME 414
 #define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
 #define SOF_TKN_INTEL_SSP_MCLK_ID 501
 #define SOF_TKN_INTEL_SSP_SAMPLE_BITS 502
@@ -90,4 +102,32 @@
 #define SOF_TKN_MEDIATEK_AFE_RATE 1600
 #define SOF_TKN_MEDIATEK_AFE_CH 1601
 #define SOF_TKN_MEDIATEK_AFE_FORMAT 1602
+#define SOF_TKN_MIXER_TYPE 1700
+#define SOF_TKN_AMD_ACPDMIC_RATE 1800
+#define SOF_TKN_AMD_ACPDMIC_CH 1801
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_RATE 1900
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_BIT_DEPTH 1901
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_VALID_BIT 1902
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CHANNELS 1903
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CH_MAP 1904
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_CH_CFG 1905
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_INTERLEAVING_STYLE 1906
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG 1907
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_SAMPLE_TYPE 1908
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_RATE 1930
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_BIT_DEPTH 1931
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_VALID_BIT 1932
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CHANNELS 1933
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CH_MAP 1934
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_CH_CFG 1935
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_INTERLEAVING_STYLE 1936
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG 1937
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_SAMPLE_TYPE 1938
+#define SOF_TKN_CAVS_AUDIO_FORMAT_IBS 1970
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OBS 1971
+#define SOF_TKN_CAVS_AUDIO_FORMAT_DMA_BUFFER_SIZE 1972
+#define SOF_TKN_INTEL_COPIER_NODE_TYPE 1980
+#define SOF_TKN_AMD_ACPI2S_RATE 1700
+#define SOF_TKN_AMD_ACPI2S_CH 1701
+#define SOF_TKN_AMD_ACPI2S_TDM_MODE 1702
 #endif
diff --git a/libc/kernel/uapi/sound/usb_stream.h b/libc/kernel/uapi/sound/usb_stream.h
index bb7fe80..ac87c31 100644
--- a/libc/kernel/uapi/sound/usb_stream.h
+++ b/libc/kernel/uapi/sound/usb_stream.h
@@ -49,7 +49,7 @@
   unsigned inpacket_split_at;
   unsigned next_inpacket_split;
   unsigned next_inpacket_split_at;
-  struct usb_stream_packet inpacket[0];
+  struct usb_stream_packet inpacket[];
 };
 enum usb_stream_state {
   usb_stream_invalid,
diff --git a/libc/kernel/uapi/xen/gntdev.h b/libc/kernel/uapi/xen/gntdev.h
index 1e78ac3..eada73c 100644
--- a/libc/kernel/uapi/xen/gntdev.h
+++ b/libc/kernel/uapi/xen/gntdev.h
@@ -55,7 +55,7 @@
 };
 struct gntdev_grant_copy_segment {
   union {
-    void __user * virt;
+    void  * virt;
     struct {
       grant_ref_t ref;
       __u16 offset;
@@ -69,7 +69,7 @@
 #define IOCTL_GNTDEV_GRANT_COPY _IOC(_IOC_NONE, 'G', 8, sizeof(struct ioctl_gntdev_grant_copy))
 struct ioctl_gntdev_grant_copy {
   unsigned int count;
-  struct gntdev_grant_copy_segment __user * segments;
+  struct gntdev_grant_copy_segment  * segments;
 };
 #define UNMAP_NOTIFY_CLEAR_BYTE 0x1
 #define UNMAP_NOTIFY_SEND_EVENT 0x2
diff --git a/libc/kernel/uapi/xen/privcmd.h b/libc/kernel/uapi/xen/privcmd.h
index 145446b..21d9f84 100644
--- a/libc/kernel/uapi/xen/privcmd.h
+++ b/libc/kernel/uapi/xen/privcmd.h
@@ -33,13 +33,13 @@
 struct privcmd_mmap {
   int num;
   domid_t dom;
-  struct privcmd_mmap_entry __user * entry;
+  struct privcmd_mmap_entry  * entry;
 };
 struct privcmd_mmapbatch {
   int num;
   domid_t dom;
   __u64 addr;
-  xen_pfn_t __user * arr;
+  xen_pfn_t  * arr;
 };
 #define PRIVCMD_MMAPBATCH_MFN_ERROR 0xf0000000U
 #define PRIVCMD_MMAPBATCH_PAGED_ERROR 0x80000000U
@@ -47,17 +47,17 @@
   unsigned int num;
   domid_t dom;
   __u64 addr;
-  const xen_pfn_t __user * arr;
-  int __user * err;
+  const xen_pfn_t  * arr;
+  int  * err;
 };
 struct privcmd_dm_op_buf {
-  void __user * uptr;
+  void  * uptr;
   size_t size;
 };
 struct privcmd_dm_op {
   domid_t dom;
   __u16 num;
-  const struct privcmd_dm_op_buf __user * ubufs;
+  const struct privcmd_dm_op_buf  * ubufs;
 };
 struct privcmd_mmap_resource {
   domid_t dom;
diff --git a/libc/libc.map.txt b/libc/libc.map.txt
index 0f41878..0102b30 100644
--- a/libc/libc.map.txt
+++ b/libc/libc.map.txt
@@ -680,28 +680,28 @@
     nftw64; # introduced=21
     nice;
     nrand48;
-    ns_format_ttl; # arm64 x86_64 introduced=22
-    ns_get16; # arm64 x86_64 introduced=22
-    ns_get32; # arm64 x86_64 introduced=22
-    ns_initparse; # arm64 x86_64 introduced=22
-    ns_makecanon; # arm64 x86_64 introduced=22
-    ns_msg_getflag; # arm64 x86_64 introduced=22
-    ns_name_compress; # arm64 x86_64 introduced=22
-    ns_name_ntol; # arm64 x86_64 introduced=22
-    ns_name_ntop; # arm64 x86_64 introduced=22
-    ns_name_pack; # arm64 x86_64 introduced=22
-    ns_name_pton; # arm64 x86_64 introduced=22
-    ns_name_rollback; # arm64 x86_64 introduced=22
-    ns_name_skip; # arm64 x86_64 introduced=22
-    ns_name_uncompress; # arm64 x86_64 introduced=22
-    ns_name_unpack; # arm64 x86_64 introduced=22
-    ns_parserr; # arm64 x86_64 introduced=22
-    ns_put16; # arm64 x86_64 introduced=22
-    ns_put32; # arm64 x86_64 introduced=22
-    ns_samename; # arm64 x86_64 introduced=22
-    ns_skiprr; # arm64 x86_64 introduced=22
-    ns_sprintrr; # arm64 x86_64 introduced=22
-    ns_sprintrrf; # arm64 x86_64 introduced=22
+    ns_format_ttl; # arm64 x86_64 riscv64 introduced=22
+    ns_get16; # arm64 x86_64 riscv64 introduced=22
+    ns_get32; # arm64 x86_64 riscv64 introduced=22
+    ns_initparse; # arm64 x86_64 riscv64 introduced=22
+    ns_makecanon; # arm64 x86_64 riscv64 introduced=22
+    ns_msg_getflag; # arm64 x86_64 riscv64 introduced=22
+    ns_name_compress; # arm64 x86_64 riscv64 introduced=22
+    ns_name_ntol; # arm64 x86_64 riscv64 introduced=22
+    ns_name_ntop; # arm64 x86_64 riscv64 introduced=22
+    ns_name_pack; # arm64 x86_64 riscv64 introduced=22
+    ns_name_pton; # arm64 x86_64 riscv64 introduced=22
+    ns_name_rollback; # arm64 x86_64 riscv64 introduced=22
+    ns_name_skip; # arm64 x86_64 riscv64 introduced=22
+    ns_name_uncompress; # arm64 x86_64 riscv64 introduced=22
+    ns_name_unpack; # arm64 x86_64 riscv64 introduced=22
+    ns_parserr; # arm64 x86_64 riscv64 introduced=22
+    ns_put16; # arm64 x86_64 riscv64 introduced=22
+    ns_put32; # arm64 x86_64 riscv64 introduced=22
+    ns_samename; # arm64 x86_64 riscv64 introduced=22
+    ns_skiprr; # arm64 x86_64 riscv64 introduced=22
+    ns_sprintrr; # arm64 x86_64 riscv64 introduced=22
+    ns_sprintrrf; # arm64 x86_64 riscv64 introduced=22
     nsdispatch;
     ntohl; # introduced=21
     ntohs; # introduced=21
@@ -740,7 +740,7 @@
     pread;
     pread64; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
     printf;
-    prlimit; # arm64 x86_64
+    prlimit; # arm64 x86_64 riscv64
     prlimit64; # introduced=21
     process_vm_readv; # introduced=23
     process_vm_writev; # introduced=23
@@ -1037,12 +1037,10 @@
     strtold_l; # introduced=21
     strtoll;
     strtoll_l; # introduced=21
-    strtoq; # introduced=21
     strtoul;
     strtoull;
     strtoull_l; # introduced=21
     strtoumax;
-    strtouq; # introduced=21
     strxfrm;
     strxfrm_l; # introduced=21
     swapoff; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
@@ -1449,7 +1447,7 @@
     ___tls_get_addr; # x86
     __aeabi_read_tp; # arm
     __res_randomid;
-    __tls_get_addr; # arm x86_64
+    __tls_get_addr; # arm riscv64 x86_64
     android_fdsan_close_with_tag;
     android_fdsan_create_owner_tag;
     android_fdsan_exchange_owner_tag;
@@ -1520,34 +1518,34 @@
     tss_set;
 
     # Unwinder implementation
-    __aeabi_unwind_cpp_pr0; # apex llndk arm
-    __aeabi_unwind_cpp_pr1; # apex llndk arm
-    __aeabi_unwind_cpp_pr2; # apex llndk arm
-    __deregister_frame; # apex llndk arm64 x86 x86_64
-    __gnu_unwind_frame; # apex llndk arm
-    __register_frame; # apex llndk arm64 x86 x86_64
-    _Unwind_Backtrace; # apex llndk
-    _Unwind_Complete; # apex llndk arm
-    _Unwind_DeleteException; # apex llndk
-    _Unwind_Find_FDE; # apex llndk
-    _Unwind_FindEnclosingFunction; # apex llndk
-    _Unwind_ForcedUnwind; # apex llndk arm64 x86 x86_64
-    _Unwind_GetCFA; # apex llndk
-    _Unwind_GetDataRelBase; # apex llndk
-    _Unwind_GetGR; # apex llndk
-    _Unwind_GetIP; # apex llndk
-    _Unwind_GetIPInfo; # apex llndk
-    _Unwind_GetLanguageSpecificData; # apex llndk
-    _Unwind_GetRegionStart; # apex llndk
-    _Unwind_GetTextRelBase; # apex llndk
-    _Unwind_RaiseException; # apex llndk
-    _Unwind_Resume; # apex llndk
-    _Unwind_Resume_or_Rethrow; # apex llndk
-    _Unwind_SetGR; # apex llndk
-    _Unwind_SetIP; # apex llndk
-    _Unwind_VRS_Get; # apex llndk arm
-    _Unwind_VRS_Pop; # apex llndk arm
-    _Unwind_VRS_Set; # apex llndk arm
+    __aeabi_unwind_cpp_pr0; # arm
+    __aeabi_unwind_cpp_pr1; # arm
+    __aeabi_unwind_cpp_pr2; # arm
+    __deregister_frame; # arm64 x86 x86_64
+    __gnu_unwind_frame; # arm
+    __register_frame; # arm64 x86 x86_64
+    _Unwind_Backtrace;
+    _Unwind_Complete; # arm
+    _Unwind_DeleteException;
+    _Unwind_Find_FDE;
+    _Unwind_FindEnclosingFunction;
+    _Unwind_ForcedUnwind; # arm64 x86 x86_64
+    _Unwind_GetCFA;
+    _Unwind_GetDataRelBase;
+    _Unwind_GetGR;
+    _Unwind_GetIP;
+    _Unwind_GetIPInfo;
+    _Unwind_GetLanguageSpecificData;
+    _Unwind_GetRegionStart;
+    _Unwind_GetTextRelBase;
+    _Unwind_RaiseException;
+    _Unwind_Resume;
+    _Unwind_Resume_or_Rethrow;
+    _Unwind_SetGR;
+    _Unwind_SetIP;
+    _Unwind_VRS_Get; # arm
+    _Unwind_VRS_Pop; # arm
+    _Unwind_VRS_Set; # arm
 } LIBC_Q;
 
 LIBC_S { # introduced=S
@@ -1578,11 +1576,19 @@
 
 LIBC_U { # introduced=UpsideDownCake
   global:
+    __freadahead;
     close_range;
     copy_file_range;
     memset_explicit;
+    posix_spawn_file_actions_addchdir_np;
+    posix_spawn_file_actions_addfchdir_np;
 } LIBC_T;
 
+LIBC_V { # introduced=VanillaIceCream
+  global:
+    timespec_getres;
+} LIBC_U;
+
 LIBC_PRIVATE {
   global:
     __accept4; # arm x86
diff --git a/libc/libstdc++.map.txt b/libc/libstdc++.map.txt
index bb7040f..8af3b91 100644
--- a/libc/libstdc++.map.txt
+++ b/libc/libstdc++.map.txt
@@ -7,12 +7,12 @@
     _ZdlPvRKSt9nothrow_t; # weak
     _Znaj; # arm x86 weak
     _ZnajRKSt9nothrow_t; # arm x86 weak
-    _Znam; # arm64 x86_64 weak
-    _ZnamRKSt9nothrow_t; # arm64 x86_64 weak
+    _Znam; # arm64 x86_64 riscv64 weak
+    _ZnamRKSt9nothrow_t; # arm64 x86_64 riscv64 weak
     _Znwj; # arm x86 weak
     _ZnwjRKSt9nothrow_t; # arm x86 weak
-    _Znwm; # arm64 x86_64 weak
-    _ZnwmRKSt9nothrow_t; # arm64 x86_64 weak
+    _Znwm; # arm64 x86_64 riscv64 weak
+    _ZnwmRKSt9nothrow_t; # arm64 x86_64 riscv64 weak
     __cxa_guard_abort;
     __cxa_guard_acquire;
     __cxa_guard_release;
diff --git a/libc/malloc_debug/Android.bp b/libc/malloc_debug/Android.bp
index e7a157e..373d497 100644
--- a/libc/malloc_debug/Android.bp
+++ b/libc/malloc_debug/Android.bp
@@ -176,6 +176,11 @@
         "bionic_libc_platform_headers",
     ],
 
+    // The clang-analyzer-unix.Malloc and other warnings in these
+    // unit tests are either false positive or in
+    // negative tests that can be ignored.
+    tidy: false,
+
     srcs: [
         "tests/malloc_debug_system_tests.cpp",
     ],
diff --git a/libc/malloc_debug/Config.cpp b/libc/malloc_debug/Config.cpp
index 6a81277..be577bc 100644
--- a/libc/malloc_debug/Config.cpp
+++ b/libc/malloc_debug/Config.cpp
@@ -87,35 +87,65 @@
         {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceSize},
     },
     {
+        "bt_sz",
+        {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceSize},
+    },
+    {
         "backtrace_min_size",
         {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMinSize},
     },
     {
+        "bt_min_sz",
+        {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMinSize},
+    },
+    {
         "backtrace_max_size",
         {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMaxSize},
     },
-
+    {
+        "bt_max_sz",
+        {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMaxSize},
+    },
     {
         "backtrace",
         {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
     },
     {
+        "bt",
+        {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
+    },
+    {
         "backtrace_enable_on_signal",
         {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktraceEnableOnSignal},
     },
-
+    {
+        "bt_en_on_sig",
+        {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktraceEnableOnSignal},
+    },
     {
         "backtrace_dump_on_exit",
         {0, &Config::SetBacktraceDumpOnExit},
     },
     {
+        "bt_dmp_on_ex",
+        {0, &Config::SetBacktraceDumpOnExit},
+    },
+    {
         "backtrace_dump_prefix",
         {0, &Config::SetBacktraceDumpPrefix},
     },
     {
+        "bt_dmp_pre",
+        {0, &Config::SetBacktraceDumpPrefix},
+    },
+    {
         "backtrace_full",
         {BACKTRACE_FULL, &Config::VerifyValueEmpty},
     },
+    {
+        "bt_full",
+        {BACKTRACE_FULL, &Config::VerifyValueEmpty},
+    },
 
     {
         "fill",
diff --git a/libc/malloc_debug/PointerData.cpp b/libc/malloc_debug/PointerData.cpp
index 5ab2232..e3a35a6 100644
--- a/libc/malloc_debug/PointerData.cpp
+++ b/libc/malloc_debug/PointerData.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <errno.h>
 #include <inttypes.h>
 #include <signal.h>
@@ -54,8 +55,6 @@
 #include "malloc_debug.h"
 #include "UnwindBacktrace.h"
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 std::atomic_uint8_t PointerData::backtrace_enabled_;
 std::atomic_bool PointerData::backtrace_dump_;
 
@@ -617,8 +616,8 @@
         if (frame.function_name.empty()) {
           dprintf(fd, " \"\" 0}");
         } else {
-          char* demangled_name = __cxa_demangle(frame.function_name.c_str(), nullptr, nullptr,
-                                                nullptr);
+          char* demangled_name =
+              abi::__cxa_demangle(frame.function_name.c_str(), nullptr, nullptr, nullptr);
           const char* name;
           if (demangled_name != nullptr) {
             name = demangled_name;
diff --git a/libc/malloc_debug/README.md b/libc/malloc_debug/README.md
index 3667624..fddc4a3 100644
--- a/libc/malloc_debug/README.md
+++ b/libc/malloc_debug/README.md
@@ -200,6 +200,20 @@
 that is extra thorough and can unwind through Java frames. This will run
 slower than the normal backtracing function.
 
+### bt, bt\_dmp\_on\_ex, bt\_dmp\_pre, bt\_en\_on\_sig, bt\_full, bt\_max\_sz, bt\_min\_sz, bt\_sz
+As of U, add shorter aliases for backtrace related options to avoid property length restrictions.
+
+| Alias           | Option                        |
+|:----------------|:------------------------------|
+| bt              | backtrace                     |
+| bt\_dmp\_on\_ex | backtrace\_dump\_on\_exit     |
+| bt\_dmp\_pre    | backtrace\_dump\_prefix       |
+| bt\_en\_on\_sig | backtrace\_enable\_on\_signal |
+| bt\_full        | backtrace\_full               |
+| bt\_max\_sz     | backtrace\_max\_size          |
+| bt\_min\_sz     | backtrace\_min\_size          |
+| bt\_sz          | backtrace\_size               |
+
 ### check\_unreachable\_on\_signal
 As of Android U, this option will trigger a check for unreachable memory
 in a process. Specifically, if the signal SIGRTMAX - 16 (which is 48 on
diff --git a/libc/malloc_debug/RecordData.cpp b/libc/malloc_debug/RecordData.cpp
index a829a09..8a77170 100644
--- a/libc/malloc_debug/RecordData.cpp
+++ b/libc/malloc_debug/RecordData.cpp
@@ -28,6 +28,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <pthread.h>
 #include <stdatomic.h>
 #include <stdint.h>
@@ -52,40 +53,51 @@
   return dprintf(fd, "%d: thread_done 0x0\n", tid_) > 0;
 }
 
-AllocEntry::AllocEntry(void* pointer) : pointer_(pointer) {}
+AllocEntry::AllocEntry(void* pointer, uint64_t start_ns, uint64_t end_ns)
+    : pointer_(pointer), start_ns_(start_ns), end_ns_(end_ns) {}
 
-MallocEntry::MallocEntry(void* pointer, size_t size) : AllocEntry(pointer), size_(size) {}
+MallocEntry::MallocEntry(void* pointer, size_t size, uint64_t start_ns, uint64_t end_ns)
+    : AllocEntry(pointer, start_ns, end_ns), size_(size) {}
 
 bool MallocEntry::Write(int fd) const {
-  return dprintf(fd, "%d: malloc %p %zu\n", tid_, pointer_, size_) > 0;
+  return dprintf(fd, "%d: malloc %p %zu %" PRIu64 " %" PRIu64 "\n", tid_, pointer_, size_,
+                 start_ns_, end_ns_) > 0;
 }
 
-FreeEntry::FreeEntry(void* pointer) : AllocEntry(pointer) {}
+FreeEntry::FreeEntry(void* pointer, uint64_t start_ns, uint64_t end_ns)
+    : AllocEntry(pointer, start_ns, end_ns) {}
 
 bool FreeEntry::Write(int fd) const {
-  return dprintf(fd, "%d: free %p\n", tid_, pointer_) > 0;
+  return dprintf(fd, "%d: free %p %" PRIu64 " %" PRIu64 "\n", tid_, pointer_, start_ns_, end_ns_) >
+         0;
 }
 
-CallocEntry::CallocEntry(void* pointer, size_t nmemb, size_t size)
-    : MallocEntry(pointer, size), nmemb_(nmemb) {}
+CallocEntry::CallocEntry(void* pointer, size_t nmemb, size_t size, uint64_t start_ns,
+                         uint64_t end_ns)
+    : MallocEntry(pointer, size, start_ns, end_ns), nmemb_(nmemb) {}
 
 bool CallocEntry::Write(int fd) const {
-  return dprintf(fd, "%d: calloc %p %zu %zu\n", tid_, pointer_, nmemb_, size_) > 0;
+  return dprintf(fd, "%d: calloc %p %zu %zu %" PRIu64 " %" PRIu64 "\n", tid_, pointer_, nmemb_,
+                 size_, start_ns_, end_ns_) > 0;
 }
 
-ReallocEntry::ReallocEntry(void* pointer, size_t size, void* old_pointer)
-    : MallocEntry(pointer, size), old_pointer_(old_pointer) {}
+ReallocEntry::ReallocEntry(void* pointer, size_t size, void* old_pointer, uint64_t start_ns,
+                           uint64_t end_ns)
+    : MallocEntry(pointer, size, start_ns, end_ns), old_pointer_(old_pointer) {}
 
 bool ReallocEntry::Write(int fd) const {
-  return dprintf(fd, "%d: realloc %p %p %zu\n", tid_, pointer_, old_pointer_, size_) > 0;
+  return dprintf(fd, "%d: realloc %p %p %zu %" PRIu64 " %" PRIu64 "\n", tid_, pointer_,
+                 old_pointer_, size_, start_ns_, end_ns_) > 0;
 }
 
 // aligned_alloc, posix_memalign, memalign, pvalloc, valloc all recorded with this class.
-MemalignEntry::MemalignEntry(void* pointer, size_t size, size_t alignment)
-    : MallocEntry(pointer, size), alignment_(alignment) {}
+MemalignEntry::MemalignEntry(void* pointer, size_t size, size_t alignment, uint64_t start_ns,
+                             uint64_t end_ns)
+    : MallocEntry(pointer, size, start_ns, end_ns), alignment_(alignment) {}
 
 bool MemalignEntry::Write(int fd) const {
-  return dprintf(fd, "%d: memalign %p %zu %zu\n", tid_, pointer_, alignment_, size_) > 0;
+  return dprintf(fd, "%d: memalign %p %zu %zu %" PRIu64 " %" PRIu64 "\n", tid_, pointer_,
+                 alignment_, size_, start_ns_, end_ns_) > 0;
 }
 
 struct ThreadData {
diff --git a/libc/malloc_debug/RecordData.h b/libc/malloc_debug/RecordData.h
index 43dba6a..a02c956 100644
--- a/libc/malloc_debug/RecordData.h
+++ b/libc/malloc_debug/RecordData.h
@@ -68,19 +68,23 @@
 
 class AllocEntry : public RecordEntry {
  public:
-  explicit AllocEntry(void* pointer);
+  explicit AllocEntry(void* pointer, uint64_t st, uint64_t et);
   virtual ~AllocEntry() = default;
 
  protected:
   void* pointer_;
 
+  // The start/end time of this operation.
+  uint64_t start_ns_;
+  uint64_t end_ns_;
+
  private:
   BIONIC_DISALLOW_COPY_AND_ASSIGN(AllocEntry);
 };
 
 class MallocEntry : public AllocEntry {
  public:
-  MallocEntry(void* pointer, size_t size);
+  MallocEntry(void* pointer, size_t size, uint64_t st, uint64_t et);
   virtual ~MallocEntry() = default;
 
   bool Write(int fd) const override;
@@ -94,7 +98,7 @@
 
 class FreeEntry : public AllocEntry {
  public:
-  explicit FreeEntry(void* pointer);
+  explicit FreeEntry(void* pointer, uint64_t st, uint64_t et);
   virtual ~FreeEntry() = default;
 
   bool Write(int fd) const override;
@@ -105,7 +109,7 @@
 
 class CallocEntry : public MallocEntry {
  public:
-  CallocEntry(void* pointer, size_t size, size_t nmemb);
+  CallocEntry(void* pointer, size_t nmemb, size_t size, uint64_t st, uint64_t et);
   virtual ~CallocEntry() = default;
 
   bool Write(int fd) const override;
@@ -119,7 +123,7 @@
 
 class ReallocEntry : public MallocEntry {
  public:
-  ReallocEntry(void* pointer, size_t size, void* old_pointer);
+  ReallocEntry(void* pointer, size_t size, void* old_pointer, uint64_t st, uint64_t et);
   virtual ~ReallocEntry() = default;
 
   bool Write(int fd) const override;
@@ -134,7 +138,7 @@
 // aligned_alloc, posix_memalign, memalign, pvalloc, valloc all recorded with this class.
 class MemalignEntry : public MallocEntry {
  public:
-  MemalignEntry(void* pointer, size_t size, size_t alignment);
+  MemalignEntry(void* pointer, size_t size, size_t alignment, uint64_t st, uint64_t et);
   virtual ~MemalignEntry() = default;
 
   bool Write(int fd) const override;
diff --git a/libc/malloc_debug/UnwindBacktrace.cpp b/libc/malloc_debug/UnwindBacktrace.cpp
index c892a39..8a6ff7b 100644
--- a/libc/malloc_debug/UnwindBacktrace.cpp
+++ b/libc/malloc_debug/UnwindBacktrace.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <inttypes.h>
 #include <pthread.h>
 #include <stdint.h>
@@ -48,8 +49,6 @@
 #define PAD_PTR "08" PRIx64
 #endif
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 bool Unwind(std::vector<uintptr_t>* frames, std::vector<unwindstack::FrameData>* frame_info,
             size_t max_frames) {
   [[clang::no_destroy]] static unwindstack::AndroidLocalUnwinder unwinder(
@@ -89,7 +88,8 @@
 
     if (!info->function_name.empty()) {
       line += " (";
-      char* demangled_name = __cxa_demangle(info->function_name.c_str(), nullptr, nullptr, nullptr);
+      char* demangled_name =
+          abi::__cxa_demangle(info->function_name.c_str(), nullptr, nullptr, nullptr);
       if (demangled_name != nullptr) {
         line += demangled_name;
         free(demangled_name);
diff --git a/libc/malloc_debug/backtrace.cpp b/libc/malloc_debug/backtrace.cpp
index ab5c505..ecb3a80 100644
--- a/libc/malloc_debug/backtrace.cpp
+++ b/libc/malloc_debug/backtrace.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <dlfcn.h>
 #include <errno.h>
 #include <inttypes.h>
@@ -48,8 +49,6 @@
 
 typedef struct _Unwind_Context __unwind_context;
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 static MapData g_map_data;
 static const MapEntry* g_current_code_map = nullptr;
 
@@ -83,41 +82,24 @@
 
   uintptr_t ip = _Unwind_GetIP(context);
 
-  // The instruction pointer is pointing at the instruction after the return
-  // call on all architectures.
-  // Modify the pc to point at the real function.
-  if (ip != 0) {
-#if defined(__arm__)
-    // If the ip is suspiciously low, do nothing to avoid a segfault trying
-    // to access this memory.
-    if (ip >= 4096) {
-      // Check bits [15:11] of the first halfword assuming the instruction
-      // is 32 bits long. If the bits are any of these values, then our
-      // assumption was correct:
-      //  b11101
-      //  b11110
-      //  b11111
-      // Otherwise, this is a 16 bit instruction.
-      uint16_t value = (*reinterpret_cast<uint16_t*>(ip - 2)) >> 11;
-      if (value == 0x1f || value == 0x1e || value == 0x1d) {
-        ip -= 4;
-      } else {
-        ip -= 2;
-      }
-    }
-#elif defined(__aarch64__)
-    // All instructions are 4 bytes long, skip back one instruction.
-    ip -= 4;
+  // `ip` is the address of the instruction *after* the call site in
+  // `context`, so we want to back up by one instruction. This is hard for
+  // every architecture except arm64, so we just make sure we're *inside*
+  // that instruction, not necessarily at the start of it. (If the value
+  // is too low to be valid, we just leave it alone.)
+  if (ip >= 4096) {
+#if defined(__aarch64__)
+    ip -= 4;  // Exactly.
+#elif defined(__arm__) || defined(__riscv)
+    ip -= 2;  // At least.
 #elif defined(__i386__) || defined(__x86_64__)
-    // It's difficult to decode exactly where the previous instruction is,
-    // so subtract 1 to estimate where the instruction lives.
-    ip--;
+    ip -= 1;  // At least.
 #endif
+  }
 
-    // Do not record the frames that fall in our own shared library.
-    if (g_current_code_map && (ip >= g_current_code_map->start) && ip < g_current_code_map->end) {
-      return _URC_NO_REASON;
-    }
+  // Do not record the frames that fall in our own shared library.
+  if (g_current_code_map && (ip >= g_current_code_map->start) && ip < g_current_code_map->end) {
+    return _URC_NO_REASON;
   }
 
   state->frames[state->cur_frame++] = ip;
@@ -162,7 +144,7 @@
 
     char buf[1024];
     if (symbol != nullptr) {
-      char* demangled_name = __cxa_demangle(symbol, nullptr, nullptr, nullptr);
+      char* demangled_name = abi::__cxa_demangle(symbol, nullptr, nullptr, nullptr);
       const char* name;
       if (demangled_name != nullptr) {
         name = demangled_name;
diff --git a/libc/malloc_debug/malloc_debug.cpp b/libc/malloc_debug/malloc_debug.cpp
index 617858a..b06ec9e 100644
--- a/libc/malloc_debug/malloc_debug.cpp
+++ b/libc/malloc_debug/malloc_debug.cpp
@@ -68,6 +68,100 @@
 bool* g_zygote_child;
 
 const MallocDispatch* g_dispatch;
+
+static __always_inline uint64_t Nanotime() {
+  struct timespec t = {};
+  clock_gettime(CLOCK_MONOTONIC, &t);
+  return static_cast<uint64_t>(t.tv_sec) * 1000000000LL + t.tv_nsec;
+}
+
+namespace {
+// A TimedResult contains the result of from malloc end_ns al. functions and the
+// start/end timestamps.
+struct TimedResult {
+  uint64_t start_ns = 0;
+  uint64_t end_ns = 0;
+  union {
+    size_t s;
+    int i;
+    void* p;
+  } v;
+
+  uint64_t GetStartTimeNS() const { return start_ns; }
+  uint64_t GetEndTimeNS() const { return end_ns; }
+  void SetStartTimeNS(uint64_t t) { start_ns = t; }
+  void SetEndTimeNS(uint64_t t) { end_ns = t; }
+
+  template <typename T>
+  void setValue(T);
+  template <>
+  void setValue(size_t s) {
+    v.s = s;
+  }
+  template <>
+  void setValue(int i) {
+    v.i = i;
+  }
+  template <>
+  void setValue(void* p) {
+    v.p = p;
+  }
+
+  template <typename T>
+  T getValue() const;
+  template <>
+  size_t getValue<size_t>() const {
+    return v.s;
+  }
+  template <>
+  int getValue<int>() const {
+    return v.i;
+  }
+  template <>
+  void* getValue<void*>() const {
+    return v.p;
+  }
+};
+
+class ScopedTimer {
+ public:
+  ScopedTimer(TimedResult& res) : res_(res) { res_.start_ns = Nanotime(); }
+
+  ~ScopedTimer() { res_.end_ns = Nanotime(); }
+
+ private:
+  TimedResult& res_;
+};
+
+}  // namespace
+
+template <typename MallocFn, typename... Args>
+static TimedResult TimerCall(MallocFn fn, Args... args) {
+  TimedResult ret;
+  decltype((g_dispatch->*fn)(args...)) r;
+  if (g_debug->config().options() & RECORD_ALLOCS) {
+    ScopedTimer t(ret);
+    r = (g_dispatch->*fn)(args...);
+  } else {
+    r = (g_dispatch->*fn)(args...);
+  }
+  ret.setValue<decltype(r)>(r);
+  return ret;
+}
+
+template <typename MallocFn, typename... Args>
+static TimedResult TimerCallVoid(MallocFn fn, Args... args) {
+  TimedResult ret;
+  {
+    ScopedTimer t(ret);
+    (g_dispatch->*fn)(args...);
+  }
+  return ret;
+}
+
+#define TCALL(FUNC, ...) TimerCall(&MallocDispatch::FUNC, __VA_ARGS__);
+#define TCALLVOID(FUNC, ...) TimerCallVoid(&MallocDispatch::FUNC, __VA_ARGS__);
+
 // ------------------------------------------------------------------------
 
 // ------------------------------------------------------------------------
@@ -400,6 +494,9 @@
 
 void debug_free_malloc_leak_info(uint8_t* info) {
   g_dispatch->free(info);
+  // Purge the memory that was freed since a significant amount of
+  // memory could have been allocated and freed.
+  g_dispatch->mallopt(M_PURGE_ALL, 0);
 }
 
 size_t debug_malloc_usable_size(void* pointer) {
@@ -419,7 +516,7 @@
   return InternalMallocUsableSize(pointer);
 }
 
-static void* InternalMalloc(size_t size) {
+static TimedResult InternalMalloc(size_t size) {
   if ((g_debug->config().options() & BACKTRACE) && g_debug->pointer->ShouldDumpAndReset()) {
     debug_dump_heap(android::base::StringPrintf(
                         "%s.%d.txt", g_debug->config().backtrace_dump_prefix().c_str(), getpid())
@@ -430,30 +527,35 @@
     size = 1;
   }
 
+  TimedResult result;
+
   size_t real_size = size + g_debug->extra_bytes();
   if (real_size < size) {
     // Overflow.
     errno = ENOMEM;
-    return nullptr;
+    result.setValue<void*>(nullptr);
+    return result;
   }
 
   if (size > PointerInfoType::MaxSize()) {
     errno = ENOMEM;
-    return nullptr;
+    result.setValue<void*>(nullptr);
+    return result;
   }
 
-  void* pointer;
   if (g_debug->HeaderEnabled()) {
-    Header* header =
-        reinterpret_cast<Header*>(g_dispatch->memalign(MINIMUM_ALIGNMENT_BYTES, real_size));
+    result = TCALL(memalign, MINIMUM_ALIGNMENT_BYTES, real_size);
+    Header* header = reinterpret_cast<Header*>(result.getValue<void*>());
     if (header == nullptr) {
-      return nullptr;
+      return result;
     }
-    pointer = InitHeader(header, header, size);
+    result.setValue<void*>(InitHeader(header, header, size));
   } else {
-    pointer = g_dispatch->malloc(real_size);
+    result = TCALL(malloc, real_size);
   }
 
+  void* pointer = result.getValue<void*>();
+
   if (pointer != nullptr) {
     if (g_debug->TrackPointers()) {
       PointerData::Add(pointer, size);
@@ -466,7 +568,8 @@
       memset(pointer, g_debug->config().fill_alloc_value(), bytes);
     }
   }
-  return pointer;
+
+  return result;
 }
 
 void* debug_malloc(size_t size) {
@@ -479,16 +582,17 @@
   ScopedDisableDebugCalls disable;
   ScopedBacktraceSignalBlocker blocked;
 
-  void* pointer = InternalMalloc(size);
+  TimedResult result = InternalMalloc(size);
 
   if (g_debug->config().options() & RECORD_ALLOCS) {
-    g_debug->record->AddEntry(new MallocEntry(pointer, size));
+    g_debug->record->AddEntry(new MallocEntry(result.getValue<void*>(), size,
+                                              result.GetStartTimeNS(), result.GetEndTimeNS()));
   }
 
-  return pointer;
+  return result.getValue<void*>();
 }
 
-static void InternalFree(void* pointer) {
+static TimedResult InternalFree(void* pointer) {
   if ((g_debug->config().options() & BACKTRACE) && g_debug->pointer->ShouldDumpAndReset()) {
     debug_dump_heap(android::base::StringPrintf(
                         "%s.%d.txt", g_debug->config().backtrace_dump_prefix().c_str(), getpid())
@@ -530,6 +634,7 @@
     PointerData::Remove(pointer);
   }
 
+  TimedResult result;
   if (g_debug->config().options() & FREE_TRACK) {
     // Do not add the allocation until we are done modifying the pointer
     // itself. This avoids a race if a lot of threads are all doing
@@ -537,15 +642,15 @@
     // pointer from another thread, while still trying to free it in
     // this function.
     pointer = PointerData::AddFreed(pointer, bytes);
-    if (pointer != nullptr) {
-      if (g_debug->HeaderEnabled()) {
-        pointer = g_debug->GetHeader(pointer)->orig_pointer;
-      }
-      g_dispatch->free(pointer);
+    if (pointer != nullptr && g_debug->HeaderEnabled()) {
+      pointer = g_debug->GetHeader(pointer)->orig_pointer;
     }
+    result = TCALLVOID(free, pointer);
   } else {
-    g_dispatch->free(free_pointer);
+    result = TCALLVOID(free, free_pointer);
   }
+
+  return result;
 }
 
 void debug_free(void* pointer) {
@@ -558,15 +663,16 @@
   ScopedDisableDebugCalls disable;
   ScopedBacktraceSignalBlocker blocked;
 
-  if (g_debug->config().options() & RECORD_ALLOCS) {
-    g_debug->record->AddEntry(new FreeEntry(pointer));
-  }
-
   if (!VerifyPointer(pointer, "free")) {
     return;
   }
 
-  InternalFree(pointer);
+  TimedResult result = InternalFree(pointer);
+
+  if (g_debug->config().options() & RECORD_ALLOCS) {
+    g_debug->record->AddEntry(
+        new FreeEntry(pointer, result.GetStartTimeNS(), result.GetEndTimeNS()));
+  }
 }
 
 void* debug_memalign(size_t alignment, size_t bytes) {
@@ -588,6 +694,7 @@
     return nullptr;
   }
 
+  TimedResult result;
   void* pointer;
   if (g_debug->HeaderEnabled()) {
     // Make the alignment a power of two.
@@ -610,7 +717,8 @@
       return nullptr;
     }
 
-    pointer = g_dispatch->malloc(real_size);
+    result = TCALL(malloc, real_size);
+    pointer = result.getValue<void*>();
     if (pointer == nullptr) {
       return nullptr;
     }
@@ -620,6 +728,7 @@
     value += (-value % alignment);
 
     Header* header = g_debug->GetHeader(reinterpret_cast<void*>(value));
+    // Don't need to update `result` here because we only need the timestamps.
     pointer = InitHeader(header, pointer, bytes);
   } else {
     size_t real_size = bytes + g_debug->extra_bytes();
@@ -628,7 +737,8 @@
       errno = ENOMEM;
       return nullptr;
     }
-    pointer = g_dispatch->memalign(alignment, real_size);
+    result = TCALL(memalign, alignment, real_size);
+    pointer = result.getValue<void*>();
   }
 
   if (pointer != nullptr) {
@@ -644,7 +754,8 @@
     }
 
     if (g_debug->config().options() & RECORD_ALLOCS) {
-      g_debug->record->AddEntry(new MemalignEntry(pointer, bytes, alignment));
+      g_debug->record->AddEntry(new MemalignEntry(pointer, bytes, alignment,
+                                                  result.GetStartTimeNS(), result.GetEndTimeNS()));
     }
   }
 
@@ -662,10 +773,12 @@
   ScopedBacktraceSignalBlocker blocked;
 
   if (pointer == nullptr) {
-    pointer = InternalMalloc(bytes);
+    TimedResult result = InternalMalloc(bytes);
     if (g_debug->config().options() & RECORD_ALLOCS) {
-      g_debug->record->AddEntry(new ReallocEntry(pointer, bytes, nullptr));
+      g_debug->record->AddEntry(new ReallocEntry(result.getValue<void*>(), bytes, nullptr,
+                                                 result.GetStartTimeNS(), result.GetEndTimeNS()));
     }
+    pointer = result.getValue<void*>();
     return pointer;
   }
 
@@ -674,11 +787,13 @@
   }
 
   if (bytes == 0) {
+    TimedResult result = InternalFree(pointer);
+
     if (g_debug->config().options() & RECORD_ALLOCS) {
-      g_debug->record->AddEntry(new ReallocEntry(nullptr, bytes, pointer));
+      g_debug->record->AddEntry(new ReallocEntry(nullptr, bytes, pointer, result.GetStartTimeNS(),
+                                                 result.GetEndTimeNS()));
     }
 
-    InternalFree(pointer);
     return nullptr;
   }
 
@@ -697,6 +812,7 @@
     return nullptr;
   }
 
+  TimedResult result;
   void* new_pointer;
   size_t prev_size;
   if (g_debug->HeaderEnabled()) {
@@ -730,7 +846,8 @@
     }
 
     // Allocate the new size.
-    new_pointer = InternalMalloc(bytes);
+    result = InternalMalloc(bytes);
+    new_pointer = result.getValue<void*>();
     if (new_pointer == nullptr) {
       errno = ENOMEM;
       return nullptr;
@@ -738,14 +855,18 @@
 
     prev_size = header->usable_size;
     memcpy(new_pointer, pointer, prev_size);
-    InternalFree(pointer);
+    TimedResult free_time = InternalFree(pointer);
+    // `realloc` is split into two steps, update the end time to the finish time
+    // of the second operation.
+    result.SetEndTimeNS(free_time.GetEndTimeNS());
   } else {
     if (g_debug->TrackPointers()) {
       PointerData::Remove(pointer);
     }
 
     prev_size = g_dispatch->malloc_usable_size(pointer);
-    new_pointer = g_dispatch->realloc(pointer, real_size);
+    result = TCALL(realloc, pointer, real_size);
+    new_pointer = result.getValue<void*>();
     if (new_pointer == nullptr) {
       return nullptr;
     }
@@ -767,7 +888,8 @@
   }
 
   if (g_debug->config().options() & RECORD_ALLOCS) {
-    g_debug->record->AddEntry(new ReallocEntry(new_pointer, bytes, pointer));
+    g_debug->record->AddEntry(new ReallocEntry(new_pointer, bytes, pointer, result.GetStartTimeNS(),
+                                               result.GetEndTimeNS()));
   }
 
   return new_pointer;
@@ -807,21 +929,24 @@
   }
 
   void* pointer;
+  TimedResult result;
   if (g_debug->HeaderEnabled()) {
     // Need to guarantee the alignment of the header.
-    Header* header =
-        reinterpret_cast<Header*>(g_dispatch->memalign(MINIMUM_ALIGNMENT_BYTES, real_size));
+    result = TCALL(memalign, MINIMUM_ALIGNMENT_BYTES, real_size);
+    Header* header = reinterpret_cast<Header*>(result.getValue<void*>());
     if (header == nullptr) {
       return nullptr;
     }
     memset(header, 0, g_dispatch->malloc_usable_size(header));
     pointer = InitHeader(header, header, size);
   } else {
-    pointer = g_dispatch->calloc(1, real_size);
+    result = TCALL(calloc, 1, real_size);
+    pointer = result.getValue<void*>();
   }
 
   if (g_debug->config().options() & RECORD_ALLOCS) {
-    g_debug->record->AddEntry(new CallocEntry(pointer, bytes, nmemb));
+    g_debug->record->AddEntry(
+        new CallocEntry(pointer, nmemb, bytes, result.GetStartTimeNS(), result.GetEndTimeNS()));
   }
 
   if (pointer != nullptr && g_debug->TrackPointers()) {
@@ -995,6 +1120,10 @@
     dprintf(fd, "%s", content.c_str());
   }
   dprintf(fd, "END\n");
+
+  // Purge the memory that was allocated and freed during this operation
+  // since it can be large enough to expand the RSS significantly.
+  g_dispatch->mallopt(M_PURGE_ALL, 0);
 }
 
 bool debug_write_malloc_leak_info(FILE* fp) {
diff --git a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
index 0a0eaef..bc7af6d 100644
--- a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
+++ b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
@@ -215,6 +215,13 @@
   ASSERT_FALSE(config->backtrace_enable_on_signal());
   ASSERT_FALSE(config->backtrace_dump_on_exit());
 
+  ASSERT_TRUE(InitConfig("bt=23")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+  ASSERT_EQ(23U, config->backtrace_frames());
+  ASSERT_TRUE(config->backtrace_enabled());
+  ASSERT_FALSE(config->backtrace_enable_on_signal());
+  ASSERT_FALSE(config->backtrace_dump_on_exit());
+
   ASSERT_TRUE(InitConfig("backtrace")) << getFakeLogPrint();
   ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
   ASSERT_EQ(16U, config->backtrace_frames());
@@ -222,6 +229,13 @@
   ASSERT_FALSE(config->backtrace_enable_on_signal());
   ASSERT_FALSE(config->backtrace_dump_on_exit());
 
+  ASSERT_TRUE(InitConfig("bt")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+  ASSERT_EQ(16U, config->backtrace_frames());
+  ASSERT_TRUE(config->backtrace_enabled());
+  ASSERT_FALSE(config->backtrace_enable_on_signal());
+  ASSERT_FALSE(config->backtrace_dump_on_exit());
+
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
 }
@@ -234,6 +248,13 @@
   ASSERT_TRUE(config->backtrace_enable_on_signal());
   ASSERT_FALSE(config->backtrace_dump_on_exit());
 
+  ASSERT_TRUE(InitConfig("bt_en_on_sig=64")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+  ASSERT_EQ(64U, config->backtrace_frames());
+  ASSERT_FALSE(config->backtrace_enabled());
+  ASSERT_TRUE(config->backtrace_enable_on_signal());
+  ASSERT_FALSE(config->backtrace_dump_on_exit());
+
   ASSERT_TRUE(InitConfig("backtrace_enable_on_signal")) << getFakeLogPrint();
   ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
   ASSERT_EQ(16U, config->backtrace_frames());
@@ -241,6 +262,13 @@
   ASSERT_TRUE(config->backtrace_enable_on_signal());
   ASSERT_FALSE(config->backtrace_dump_on_exit());
 
+  ASSERT_TRUE(InitConfig("bt_en_on_sig")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+  ASSERT_EQ(16U, config->backtrace_frames());
+  ASSERT_FALSE(config->backtrace_enabled());
+  ASSERT_TRUE(config->backtrace_enable_on_signal());
+  ASSERT_FALSE(config->backtrace_dump_on_exit());
+
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
 }
@@ -288,6 +316,10 @@
   ASSERT_EQ(0U, config->options());
   ASSERT_TRUE(config->backtrace_dump_on_exit());
 
+  ASSERT_TRUE(InitConfig("bt_dmp_on_ex")) << getFakeLogPrint();
+  ASSERT_EQ(0U, config->options());
+  ASSERT_TRUE(config->backtrace_dump_on_exit());
+
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
 }
@@ -307,10 +339,18 @@
   ASSERT_EQ(0U, config->options());
   ASSERT_EQ("/data/local/tmp/backtrace_heap", config->backtrace_dump_prefix());
 
+  ASSERT_TRUE(InitConfig("bt_dmp_pre")) << getFakeLogPrint();
+  ASSERT_EQ(0U, config->options());
+  ASSERT_EQ("/data/local/tmp/backtrace_heap", config->backtrace_dump_prefix());
+
   ASSERT_TRUE(InitConfig("backtrace_dump_prefix=/fake/location")) << getFakeLogPrint();
   ASSERT_EQ(0U, config->options());
   ASSERT_EQ("/fake/location", config->backtrace_dump_prefix());
 
+  ASSERT_TRUE(InitConfig("bt_dmp_pre=/fake/location")) << getFakeLogPrint();
+  ASSERT_EQ(0U, config->options());
+  ASSERT_EQ("/fake/location", config->backtrace_dump_prefix());
+
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
 }
@@ -319,6 +359,9 @@
   ASSERT_TRUE(InitConfig("backtrace_full")) << getFakeLogPrint();
   ASSERT_EQ(BACKTRACE_FULL, config->options());
 
+  ASSERT_TRUE(InitConfig("bt_full")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE_FULL, config->options());
+
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
 }
@@ -786,6 +829,11 @@
   ASSERT_EQ(37U, config->backtrace_min_size_bytes());
   ASSERT_EQ(37U, config->backtrace_max_size_bytes());
 
+  ASSERT_TRUE(InitConfig("bt_sz=39")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+  ASSERT_EQ(39U, config->backtrace_min_size_bytes());
+  ASSERT_EQ(39U, config->backtrace_max_size_bytes());
+
   ASSERT_FALSE(InitConfig("backtrace_size")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_size=0")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_size=-1")) << getFakeLogPrint();
@@ -808,6 +856,11 @@
   ASSERT_EQ(9U, config->backtrace_min_size_bytes());
   ASSERT_EQ(SIZE_MAX, config->backtrace_max_size_bytes());
 
+  ASSERT_TRUE(InitConfig("bt_min_sz=11")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+  ASSERT_EQ(11U, config->backtrace_min_size_bytes());
+  ASSERT_EQ(SIZE_MAX, config->backtrace_max_size_bytes());
+
   ASSERT_FALSE(InitConfig("backtrace_min_size")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_min_size=0")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_min_size=-1")) << getFakeLogPrint();
@@ -830,6 +883,11 @@
   ASSERT_EQ(0U, config->backtrace_min_size_bytes());
   ASSERT_EQ(13U, config->backtrace_max_size_bytes());
 
+  ASSERT_TRUE(InitConfig("bt_max_sz=15")) << getFakeLogPrint();
+  ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+  ASSERT_EQ(0U, config->backtrace_min_size_bytes());
+  ASSERT_EQ(15U, config->backtrace_max_size_bytes());
+
   ASSERT_FALSE(InitConfig("backtrace_max_size")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_max_size=0")) << getFakeLogPrint();
   ASSERT_FALSE(InitConfig("backtrace_max_size=-1")) << getFakeLogPrint();
diff --git a/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp b/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp
index c6378f5..bf3ed14 100644
--- a/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp
+++ b/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp
@@ -184,6 +184,23 @@
   return diff;
 }
 
+static void VerifyRecords(std::vector<std::string>& expected, std::string& actual) {
+  size_t offset = 0;
+  for (std::string& str : expected) {
+    ASSERT_STREQ(str.c_str(), actual.substr(offset, str.size()).c_str());
+    if (str.find("thread_done") != std::string::npos) {
+      offset = actual.find_first_of("\n", offset) + 1;
+      continue;
+    }
+    offset += str.size() + 1;
+    uint64_t st = strtoull(&actual[offset], nullptr, 10);
+    offset = actual.find_first_of(" ", offset) + 1;
+    uint64_t et = strtoull(&actual[offset], nullptr, 10);
+    ASSERT_GT(et, st);
+    offset = actual.find_first_of("\n", offset) + 1;
+  }
+}
+
 void VerifyAllocCalls(bool all_options) {
   size_t alloc_size = 1024;
 
@@ -2171,61 +2188,61 @@
 #endif
 
 void VerifyRecordAllocs(const std::string& record_filename) {
-  std::string expected;
+  std::vector<std::string> expected;
 
   void* pointer = debug_malloc(10);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 10\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 10", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
-  pointer = debug_calloc(1, 20);
+  pointer = debug_calloc(20, 1);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: calloc %p 20 1\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: calloc %p 20 1", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   pointer = debug_realloc(nullptr, 30);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: realloc %p 0x0 30\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: realloc %p 0x0 30", getpid(), pointer));
   void* old_pointer = pointer;
   pointer = debug_realloc(pointer, 2048);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: realloc %p %p 2048\n", getpid(),
-                                          pointer, old_pointer);
+  expected.push_back(
+      android::base::StringPrintf("%d: realloc %p %p 2048", getpid(), pointer, old_pointer));
   debug_realloc(pointer, 0);
-  expected += android::base::StringPrintf("%d: realloc 0x0 %p 0\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: realloc 0x0 %p 0", getpid(), pointer));
 
   pointer = debug_memalign(16, 40);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: memalign %p 16 40\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: memalign %p 16 40", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   pointer = debug_aligned_alloc(32, 64);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: memalign %p 32 64\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: memalign %p 32 64", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   ASSERT_EQ(0, debug_posix_memalign(&pointer, 32, 50));
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: memalign %p 32 50\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: memalign %p 32 50", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
 #if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
   pointer = debug_pvalloc(60);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: memalign %p 4096 4096\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: memalign %p 4096 4096", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   pointer = debug_valloc(70);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: memalign %p 4096 70\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: memalign %p 4096 70", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 #endif
 
   // Dump all of the data accumulated so far.
@@ -2235,7 +2252,7 @@
   std::string actual;
   ASSERT_TRUE(android::base::ReadFileToString(record_filename, &actual));
 
-  ASSERT_STREQ(expected.c_str(), actual.c_str());
+  VerifyRecords(expected, actual);
 
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
@@ -2256,23 +2273,23 @@
 TEST_F(MallocDebugTest, record_allocs_max) {
   InitRecordAllocs("record_allocs=5");
 
-  std::string expected;
+  std::vector<std::string> expected;
 
   void* pointer = debug_malloc(10);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 10\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 10", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   pointer = debug_malloc(20);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 20\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 20", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   pointer = debug_malloc(1024);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 1024\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 1024", getpid(), pointer));
   debug_free(pointer);
 
   // Dump all of the data accumulated so far.
@@ -2282,7 +2299,7 @@
   std::string actual;
   ASSERT_TRUE(android::base::ReadFileToString(record_filename, &actual));
 
-  ASSERT_STREQ(expected.c_str(), actual.c_str());
+  VerifyRecords(expected, actual);
 
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ(
@@ -2303,9 +2320,10 @@
   });
   thread.join();
 
-  std::string expected = android::base::StringPrintf("%d: malloc %p 100\n", tid, pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", tid, pointer);
-  expected += android::base::StringPrintf("%d: thread_done 0x0\n", tid);
+  std::vector<std::string> expected;
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 100", tid, pointer));
+  expected.push_back(android::base::StringPrintf("%d: free %p", tid, pointer));
+  expected.push_back(android::base::StringPrintf("%d: thread_done 0x0", tid));
 
   // Dump all of the data accumulated so far.
   ASSERT_TRUE(kill(getpid(), SIGRTMAX - 18) == 0);
@@ -2314,7 +2332,7 @@
   std::string actual;
   ASSERT_TRUE(android::base::ReadFileToString(record_filename, &actual));
 
-  ASSERT_STREQ(expected.c_str(), actual.c_str());
+  VerifyRecords(expected, actual);
 
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
@@ -2329,13 +2347,13 @@
 
   ASSERT_EQ(0, symlink("/data/local/tmp/does_not_exist", record_filename.c_str()));
 
-  std::string expected;
+  std::vector<std::string> expected;
 
   void* pointer = debug_malloc(10);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 10\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 10", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   // Dump all of the data accumulated so far.
   ASSERT_TRUE(kill(getpid(), SIGRTMAX - 18) == 0);
@@ -2351,7 +2369,8 @@
   ASSERT_TRUE(kill(getpid(), SIGRTMAX - 18) == 0);
 
   ASSERT_TRUE(android::base::ReadFileToString(record_filename, &actual));
-  ASSERT_STREQ(expected.c_str(), actual.c_str());
+
+  VerifyRecords(expected, actual);
 
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   std::string expected_log = android::base::StringPrintf(
@@ -2375,13 +2394,13 @@
 TEST_F(MallocDebugTest, record_allocs_write_entries_does_not_allocate) {
   InitRecordAllocs("record_allocs=5");
 
-  std::string expected;
+  std::vector<std::string> expected;
 
   void* pointer = debug_malloc(10);
   ASSERT_TRUE(pointer != nullptr);
-  expected += android::base::StringPrintf("%d: malloc %p 10\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: malloc %p 10", getpid(), pointer));
   debug_free(pointer);
-  expected += android::base::StringPrintf("%d: free %p\n", getpid(), pointer);
+  expected.push_back(android::base::StringPrintf("%d: free %p", getpid(), pointer));
 
   malloc_disable();
   kill(getpid(), SIGRTMAX - 18);
@@ -2389,7 +2408,8 @@
 
   std::string actual;
   ASSERT_TRUE(android::base::ReadFileToString(record_filename, &actual));
-  ASSERT_STREQ(expected.c_str(), actual.c_str());
+
+  VerifyRecords(expected, actual);
 
   ASSERT_STREQ("", getFakeLogBuf().c_str());
   ASSERT_STREQ("", getFakeLogPrint().c_str());
diff --git a/libc/malloc_hooks/Android.bp b/libc/malloc_hooks/Android.bp
index 01394da..6b4e606 100644
--- a/libc/malloc_hooks/Android.bp
+++ b/libc/malloc_hooks/Android.bp
@@ -59,6 +59,11 @@
     name: "malloc_hooks_system_tests",
     isolated: true,
 
+    // The clang-analyzer-unix.Malloc and other warnings in these
+    // unit tests are either false positive or in
+    // negative tests that can be ignored.
+    tidy: false,
+
     srcs: [
         "tests/malloc_hooks_tests.cpp",
     ],
diff --git a/libc/platform/bionic/macros.h b/libc/platform/bionic/macros.h
index 076cff1..9e13e0d 100644
--- a/libc/platform/bionic/macros.h
+++ b/libc/platform/bionic/macros.h
@@ -55,6 +55,8 @@
 #define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined x30")
 #elif defined(__i386__)
 #define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%eip")
+#elif defined(__riscv)
+#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined ra")
 #elif defined(__x86_64__)
 #define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%rip")
 #endif
diff --git a/libc/platform/bionic/malloc.h b/libc/platform/bionic/malloc.h
index ecc8743..3c290fc 100644
--- a/libc/platform/bionic/malloc.h
+++ b/libc/platform/bionic/malloc.h
@@ -121,15 +121,28 @@
   // apply to system apps. They use the "libc.debug.gwp_asan.*.system_default"
   // sysprops.
   enum Action {
-    // The app has opted-in to GWP-ASan, and should always have it enabled. This
-    // should only be used by apps.
+    // Enable GWP-ASan. This is used by apps that have `gwpAsanMode=always` in
+    // the manifest.
     TURN_ON_FOR_APP,
-    // System processes apps have GWP-ASan enabled by default, but use the
-    // process sampling method.
+    // Enable GWP-ASan, but only a small percentage of the time. This is used by
+    // system processes and system apps, and we use a lottery to determine which
+    // processes have GWP-ASan enabled. This allows us to mitigate system-wide
+    // memory overhead concerns, as each GWP-ASan enabled process uses ~70KiB of
+    // extra memory.
     TURN_ON_WITH_SAMPLING,
-    // Non-system apps don't have GWP-ASan by default.
+    // Don't enable GWP-ASan, unless overwritten by a system property or
+    // environment variable. This is used by apps that have `gwpAsanMode=never`
+    // in the manifest. Prior to Android 14, this also was used by non-system
+    // apps that didn't specify a `gwpAsanMode` in their manifest.
     DONT_TURN_ON_UNLESS_OVERRIDDEN,
-    // Note: GWP-ASan cannot be disabled once it's been enabled.
+    // Enable GWP-ASan, but only a small percentage of the time, and enable it
+    // in the non-crashing ("recoverable") mode. In Android 14, this is used by
+    // apps that don't specify `gwpAsanMode` (or use `gwpAsanMode=default`) in
+    // their manifest. GWP-ASan will detect heap memory safety bugs in this
+    // mode, and bug reports will be created by debuggerd, however the process
+    // will recover and continue to function as if the memory safety bug wasn't
+    // detected.
+    TURN_ON_FOR_APP_SAMPLED_NON_CRASHING,
   };
 
   Action desire = DONT_TURN_ON_UNLESS_OVERRIDDEN;
diff --git a/libc/platform/bionic/tls.h b/libc/platform/bionic/tls.h
index bf9e65b..e01eccd 100644
--- a/libc/platform/bionic/tls.h
+++ b/libc/platform/bionic/tls.h
@@ -34,6 +34,8 @@
 # define __get_tls() ({ void** __val; __asm__("mrc p15, 0, %0, c13, c0, 3" : "=r"(__val)); __val; })
 #elif defined(__i386__)
 # define __get_tls() ({ void** __val; __asm__("movl %%gs:0, %0" : "=r"(__val)); __val; })
+#elif defined(__riscv)
+# define __get_tls() ({ void** __val; __asm__("mv %0, tp" : "=r"(__val)); __val; })
 #elif defined(__x86_64__)
 # define __get_tls() ({ void** __val; __asm__("mov %%fs:0, %0" : "=r"(__val)); __val; })
 #else
diff --git a/libc/platform/bionic/tls_defines.h b/libc/platform/bionic/tls_defines.h
index 78099b3..3e2efa3 100644
--- a/libc/platform/bionic/tls_defines.h
+++ b/libc/platform/bionic/tls_defines.h
@@ -114,6 +114,28 @@
 #define TLS_SLOT_BIONIC_TLS       9
 #define MAX_TLS_SLOT              9 // update this value when reserving a slot
 
+#elif defined(__riscv)
+
+// RISC-V ELF Specification[1] specifies that RISC-V uses Variant I as described
+// by the ELF TLS specification, with tp containing the address one past the end
+// of the TCB.
+//
+// [1]: RISC-V ELF Specification. Section: Thread Local Storage
+// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#thread-local-storage
+
+#define MIN_TLS_SLOT             (-9) // update this value when reserving a slot
+
+#define TLS_SLOT_BIONIC_TLS      (-9)
+#define TLS_SLOT_DTV             (-8)
+#define TLS_SLOT_THREAD_ID       (-7)
+#define TLS_SLOT_APP             (-6)
+#define TLS_SLOT_OPENGL          (-5)
+#define TLS_SLOT_OPENGL_API      (-4)
+#define TLS_SLOT_STACK_GUARD     (-3)
+#define TLS_SLOT_SANITIZER       (-2)
+#define TLS_SLOT_ART_THREAD_SELF (-1)
+#define MAX_TLS_SLOT             (-1)
+
 #endif
 
 #define BIONIC_TLS_SLOTS (MAX_TLS_SLOT - MIN_TLS_SLOT + 1)
diff --git a/libc/private/bionic_asm.h b/libc/private/bionic_asm.h
index d68a2d6..78e5046 100644
--- a/libc/private/bionic_asm.h
+++ b/libc/private/bionic_asm.h
@@ -45,6 +45,8 @@
 #include <private/bionic_asm_arm.h>
 #elif defined(__i386__)
 #include <private/bionic_asm_x86.h>
+#elif defined(__riscv)
+#include <private/bionic_asm_riscv64.h>
 #elif defined(__x86_64__)
 #include <private/bionic_asm_x86_64.h>
 #endif
diff --git a/libc/private/bionic_asm_riscv64.h b/libc/private/bionic_asm_riscv64.h
new file mode 100644
index 0000000..463ca31
--- /dev/null
+++ b/libc/private/bionic_asm_riscv64.h
@@ -0,0 +1,43 @@
+/*	$OpenBSD: asm.h,v 1.1 2004/02/01 05:09:49 drahn Exp $	*/
+/*	$NetBSD: asm.h,v 1.4 2001/07/16 05:43:32 matt Exp $	*/
+
+/*
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	from: @(#)asm.h	5.5 (Berkeley) 5/7/91
+ */
+
+#pragma once
+
+#define __bionic_asm_align 16
+
+#undef __bionic_asm_function_type
+#define __bionic_asm_function_type %function
diff --git a/libc/private/bionic_constants.h b/libc/private/bionic_constants.h
index 09294b6..d7f4474 100644
--- a/libc/private/bionic_constants.h
+++ b/libc/private/bionic_constants.h
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-#ifndef _BIONIC_CONSTANTS_H_
-#define _BIONIC_CONSTANTS_H_
+#pragma once
 
 #define NS_PER_S 1000000000
 
-// Size of the shadow call stack. This must be a power of 2.
+// Size of the shadow call stack. This can be small because these stacks only
+// contain return addresses. This must be a power of 2 so the mask trick works.
+// See the SCS commentary in pthread_internal.h for more detail.
 #define SCS_SIZE (8 * 1024)
+#define SCS_MASK (SCS_SIZE - 1)
 
 // The shadow call stack is allocated at an aligned address within a guard region of this size. The
 // guard region must be large enough that we can allocate an SCS_SIZE-aligned SCS while ensuring
 // that there is at least one guard page after the SCS so that a stack overflow results in a SIGSEGV
 // instead of corrupting the allocation that comes after it.
 #define SCS_GUARD_REGION_SIZE (16 * 1024 * 1024)
-
-#endif // _BIONIC_CONSTANTS_H_
diff --git a/libc/private/bionic_elf_tls.h b/libc/private/bionic_elf_tls.h
index e0ec7b5..79ffcc4 100644
--- a/libc/private/bionic_elf_tls.h
+++ b/libc/private/bionic_elf_tls.h
@@ -201,3 +201,18 @@
 struct bionic_tcb;
 void __free_dynamic_tls(bionic_tcb* tcb);
 void __notify_thread_exit_callbacks();
+
+#if defined(__riscv)
+// TLS_DTV_OFFSET is a constant used in relocation fields, defined in RISC-V ELF Specification[1]
+// The front of the TCB contains a pointer to the DTV, and each pointer in DTV
+// points to 0x800 past the start of a TLS block to make full use of the range
+// of load/store instructions, refer to [2].
+//
+// [1]: RISC-V ELF Specification.
+// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#constants
+// [2]: Documentation of TLS data structures
+// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/53
+#define TLS_DTV_OFFSET 0x800
+#else
+#define TLS_DTV_OFFSET 0
+#endif
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
index c7e951d..c375cc4 100644
--- a/libc/private/bionic_globals.h
+++ b/libc/private/bionic_globals.h
@@ -107,10 +107,14 @@
 
   const gwp_asan::AllocatorState* gwp_asan_state = nullptr;
   const gwp_asan::AllocationMetadata* gwp_asan_metadata = nullptr;
+  bool (*debuggerd_needs_gwp_asan_recovery)(void* fault_addr) = nullptr;
+  void (*debuggerd_gwp_asan_pre_crash_report)(void* fault_addr) = nullptr;
+  void (*debuggerd_gwp_asan_post_crash_report)(void* fault_addr) = nullptr;
 
   const char* scudo_stack_depot = nullptr;
   const char* scudo_region_info = nullptr;
   const char* scudo_ring_buffer = nullptr;
+  size_t scudo_ring_buffer_size = 0;
 
   HeapTaggingLevel initial_heap_tagging_level = M_HEAP_TAGGING_LEVEL_NONE;
   bool initial_memtag_stack = false;
diff --git a/libc/seccomp/seccomp_bpfs.h b/libc/seccomp/seccomp_bpfs.h
index 3bdffa9..34219e2 100644
--- a/libc/seccomp/seccomp_bpfs.h
+++ b/libc/seccomp/seccomp_bpfs.h
@@ -33,6 +33,13 @@
 extern const struct sock_filter arm64_system_filter[];
 extern const size_t arm64_system_filter_size;
 
+extern const struct sock_filter riscv64_app_filter[];
+extern const size_t riscv64_app_filter_size;
+extern const struct sock_filter riscv64_app_zygote_filter[];
+extern const size_t riscv64_app_zygote_filter_size;
+extern const struct sock_filter riscv64_system_filter[];
+extern const size_t riscv64_system_filter_size;
+
 extern const struct sock_filter x86_app_filter[];
 extern const size_t x86_app_filter_size;
 extern const struct sock_filter x86_app_zygote_filter[];
diff --git a/libc/seccomp/seccomp_policy.cpp b/libc/seccomp/seccomp_policy.cpp
index a42816e..1ca4eec 100644
--- a/libc/seccomp/seccomp_policy.cpp
+++ b/libc/seccomp/seccomp_policy.cpp
@@ -25,13 +25,13 @@
 #include <vector>
 
 #include <android-base/logging.h>
+#include <android-base/macros.h>
 
 #include "func_to_syscall_nrs.h"
 #include "seccomp_bpfs.h"
 
 #if defined __arm__ || defined __aarch64__
 
-#define DUAL_ARCH
 #define PRIMARY_ARCH AUDIT_ARCH_AARCH64
 static const struct sock_filter* primary_app_filter = arm64_app_filter;
 static const size_t primary_app_filter_size = arm64_app_filter_size;
@@ -52,9 +52,9 @@
 
 static const long secondary_setresgid = __arm_setresgid;
 static const long secondary_setresuid = __arm_setresuid;
+
 #elif defined __i386__ || defined __x86_64__
 
-#define DUAL_ARCH
 #define PRIMARY_ARCH AUDIT_ARCH_X86_64
 static const struct sock_filter* primary_app_filter = x86_64_app_filter;
 static const size_t primary_app_filter_size = x86_64_app_filter_size;
@@ -75,6 +75,20 @@
 
 static const long secondary_setresgid = __x86_setresgid;
 static const long secondary_setresuid = __x86_setresuid;
+
+#elif defined(__riscv)
+
+#define PRIMARY_ARCH AUDIT_ARCH_RISCV64
+static const struct sock_filter* primary_app_filter = riscv64_app_filter;
+static const size_t primary_app_filter_size = riscv64_app_filter_size;
+static const struct sock_filter* primary_app_zygote_filter = riscv64_app_zygote_filter;
+static const size_t primary_app_zygote_filter_size = riscv64_app_zygote_filter_size;
+static const struct sock_filter* primary_system_filter = riscv64_system_filter;
+static const size_t primary_system_filter_size = riscv64_system_filter_size;
+
+static const long primary_setresgid = __riscv64_setresgid;
+static const long primary_setresuid = __riscv64_setresuid;
+
 #else
 #error No architecture was defined!
 #endif
@@ -98,7 +112,7 @@
     f.push_back(BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_nr));
 }
 
-#ifdef DUAL_ARCH
+#if defined(SECONDARY_ARCH)
 static bool SetValidateArchitectureJumpTarget(size_t offset, filter& f) {
     size_t jump_length = f.size() - offset - 1;
     auto u8_jump_length = (__u8) jump_length;
@@ -149,9 +163,17 @@
 // that's the only system call we need to check here. A CTS test ensures the other
 // calls will remain blocked.
 static void ValidateSetUidGid(filter& f, uint32_t uid_gid_min, uint32_t uid_gid_max, bool primary) {
+#if defined(SECONDARY_ARCH)
+    __u32 setresuid_nr = primary ? primary_setresuid : secondary_setresuid;
+    __u32 setresgid_nr = primary ? primary_setresgid : secondary_setresgid;
+#else
+    __u32 setresuid_nr = primary_setresuid;
+    __u32 setresgid_nr = primary_setresgid;
+    UNUSED(primary);
+#endif
+
     // Check setresuid(ruid, euid, sguid) fall within range
     ExamineSyscall(f);
-    __u32 setresuid_nr = primary ? primary_setresuid : secondary_setresuid;
     f.push_back(BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, setresuid_nr, 0, 12));
     for (int arg = 0; arg < 3; arg++) {
         ValidateSyscallArgInRange(f, arg, uid_gid_min, uid_gid_max);
@@ -159,7 +181,6 @@
 
     // Check setresgid(rgid, egid, sgid) fall within range
     ExamineSyscall(f);
-    __u32 setresgid_nr = primary ? primary_setresgid : secondary_setresgid;
     f.push_back(BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, setresgid_nr, 0, 12));
     for (int arg = 0; arg < 3; arg++) {
         ValidateSyscallArgInRange(f, arg, uid_gid_min, uid_gid_max);
@@ -184,7 +205,7 @@
 
 bool _install_setuidgid_filter(uint32_t uid_gid_min, uint32_t uid_gid_max) {
     filter f;
-#ifdef DUAL_ARCH
+#if defined(SECONDARY_ARCH)
     // Note that for mixed 64/32 bit architectures, ValidateArchitecture inserts a
     // jump that must be changed to point to the start of the 32-bit policy
     // 32 bit syscalls will not hit the policy between here and the call to SetJump
@@ -195,7 +216,7 @@
 
     ValidateSetUidGid(f, uid_gid_min, uid_gid_max, true /* primary */);
 
-#ifdef DUAL_ARCH
+#if defined(SECONDARY_ARCH)
     if (!SetValidateArchitectureJumpTarget(offset_to_secondary_filter, f)) {
         return false;
     }
@@ -213,32 +234,43 @@
 };
 
 bool _set_seccomp_filter(FilterType type) {
-    const sock_filter *p, *s;
-    size_t p_size, s_size;
     filter f;
 
+    const sock_filter* p;
+    size_t p_size;
+#if defined(SECONDARY_ARCH)
+    const sock_filter* s;
+    size_t s_size;
+#endif
+
     switch (type) {
       case APP:
         p = primary_app_filter;
         p_size = primary_app_filter_size;
+#if defined(SECONDARY_ARCH)
         s = secondary_app_filter;
         s_size = secondary_app_filter_size;
+#endif
         break;
       case APP_ZYGOTE:
         p = primary_app_zygote_filter;
         p_size = primary_app_zygote_filter_size;
+#if defined(SECONDARY_ARCH)
         s = secondary_app_zygote_filter;
         s_size = secondary_app_zygote_filter_size;
+#endif
         break;
       case SYSTEM:
         p = primary_system_filter;
         p_size = primary_system_filter_size;
+#if defined(SECONDARY_ARCH)
         s = secondary_system_filter;
         s_size = secondary_system_filter_size;
+#endif
         break;
     }
 
-#ifdef DUAL_ARCH
+#if defined(SECONDARY_ARCH)
     // Note that for mixed 64/32 bit architectures, ValidateArchitecture inserts a
     // jump that must be changed to point to the start of the 32-bit policy
     // 32 bit syscalls will not hit the policy between here and the call to SetJump
@@ -254,7 +286,7 @@
     }
     Disallow(f);
 
-#ifdef DUAL_ARCH
+#if defined(SECONDARY_ARCH)
     if (!SetValidateArchitectureJumpTarget(offset_to_secondary_filter, f)) {
         return false;
     }
diff --git a/libc/stdio/local.h b/libc/stdio/local.h
index 6ffda49..2fc12a0 100644
--- a/libc/stdio/local.h
+++ b/libc/stdio/local.h
@@ -170,7 +170,6 @@
 #define _EXT(fp) __BIONIC_CAST(reinterpret_cast, struct __sfileext*, (fp)->_ext._base)
 
 #define _UB(fp) _EXT(fp)->_ub
-#define _FLOCK(fp) _EXT(fp)->_lock
 
 #define _FILEEXT_SETUP(fp, fext)                                              \
   do {                                                                        \
diff --git a/libc/stdio/printf_common.h b/libc/stdio/printf_common.h
index e761835..365728b 100644
--- a/libc/stdio/printf_common.h
+++ b/libc/stdio/printf_common.h
@@ -528,6 +528,29 @@
       case 'b':
         ADDUARG();
         break;
+      case 'w': {
+        n = 0;
+        bool fast = false;
+        ch = *fmt++;
+        if (ch == 'f') {
+          fast = true;
+          ch = *fmt++;
+        }
+        while (is_digit(ch)) {
+          APPEND_DIGIT(n, ch);
+          ch = *fmt++;
+        }
+        if (n == 64) {
+          flags |= LLONGINT;
+        } else {
+          if (n != 8 && fast) {
+#if defined(__LP64__)
+            flags |= LLONGINT;
+#endif
+          }
+        }
+        goto reswitch;
+      }
       default: /* "%?" prints ?, unless ? is NUL */
         if (ch == '\0') goto done;
         break;
@@ -813,4 +836,15 @@
     return convbuf;
   }
 
+  // Trasnlate a fixed size integer argument for the %w/%wf format to a
+  // flag representation. Supported sizes are 8, 16, 32, and 64 so far.
+  // See details in bionic/libc/include/stdint.h
+  static int w_to_flag(int size, bool fast) {
+    static constexpr int fast_size = sizeof(void*) == 8 ? LLONGINT : 0;
+    if (size == 8) return CHARINT;
+    if (size == 16) return fast ? fast_size : SHORTINT;
+    if (size == 32) return fast ? fast_size : 0;
+    if (size == 64) return LLONGINT;
+    __fortify_fatal("%%w%s%d is unsupported", fast ? "f" : "", size);
+  }
 };
diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp
index 27813a6..645aefa 100644
--- a/libc/stdio/stdio.cpp
+++ b/libc/stdio/stdio.cpp
@@ -197,7 +197,7 @@
 	fp->_lb._size = 0;
 
 	memset(_EXT(fp), 0, sizeof(struct __sfileext));
-	_FLOCK(fp) = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+	_EXT(fp)->_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 	_EXT(fp)->_caller_handles_locking = false;
 
 	// Caller sets cookie, _read/_write etc.
@@ -884,7 +884,7 @@
 
 void perror(const char* msg) {
   if (msg == nullptr) msg = "";
-  fprintf(stderr, "%s%s%s\n", msg, (*msg == '\0') ? "" : ": ", strerror(errno));
+  fprintf(stderr, "%s%s%m\n", msg, (*msg == '\0') ? "" : ": ");
 }
 
 int printf(const char* fmt, ...) {
@@ -1239,6 +1239,23 @@
   return __FILE_close(fp);
 }
 
+void flockfile(FILE* fp) {
+  CHECK_FP(fp);
+  pthread_mutex_lock(&_EXT(fp)->_lock);
+}
+
+int ftrylockfile(FILE* fp) {
+  CHECK_FP(fp);
+  // The specification for ftrylockfile() says it returns 0 on success,
+  // or non-zero on error. We don't bother canonicalizing to 0/-1...
+  return pthread_mutex_trylock(&_EXT(fp)->_lock);
+}
+
+void funlockfile(FILE* fp) {
+  CHECK_FP(fp);
+  pthread_mutex_unlock(&_EXT(fp)->_lock);
+}
+
 namespace {
 
 namespace phony {
diff --git a/libc/stdio/stdio_ext.cpp b/libc/stdio/stdio_ext.cpp
index 945813e..99a8af7 100644
--- a/libc/stdio/stdio_ext.cpp
+++ b/libc/stdio/stdio_ext.cpp
@@ -67,6 +67,12 @@
   return fp->_p - fp->_bf._base;
 }
 
+size_t __freadahead(FILE* fp) {
+  // Normally _r is the amount of input already available.
+  // When there's ungetc() data, _r counts that and _ur is the previous _r.
+  return fp->_r + (HASUB(fp) ? fp->_ur : 0);
+}
+
 void _flushlbf() {
   // If we flush all streams, we know we've flushed all the line-buffered streams.
   fflush(nullptr);
diff --git a/libc/stdio/vfprintf.cpp b/libc/stdio/vfprintf.cpp
index d83a5bf..994269b 100644
--- a/libc/stdio/vfprintf.cpp
+++ b/libc/stdio/vfprintf.cpp
@@ -521,6 +521,21 @@
         _umax = UARG();
         base = DEC;
         goto nosign;
+      case 'w': {
+        n = 0;
+        bool fast = false;
+        ch = *fmt++;
+        if (ch == 'f') {
+          fast = true;
+          ch = *fmt++;
+        }
+        while (is_digit(ch)) {
+          APPEND_DIGIT(n, ch);
+          ch = *fmt++;
+        }
+        flags |= helpers::w_to_flag(n, fast);
+        goto reswitch;
+      }
       case 'X':
         xdigs = xdigs_upper;
         goto hex;
diff --git a/libc/stdio/vfwprintf.cpp b/libc/stdio/vfwprintf.cpp
index 9819a73..0caeb2d 100644
--- a/libc/stdio/vfwprintf.cpp
+++ b/libc/stdio/vfwprintf.cpp
@@ -510,6 +510,21 @@
         _umax = UARG();
         base = DEC;
         goto nosign;
+      case 'w': {
+        n = 0;
+        bool fast = false;
+        ch = *fmt++;
+        if (ch == 'f') {
+          fast = true;
+          ch = *fmt++;
+        }
+        while (is_digit(ch)) {
+          APPEND_DIGIT(n, ch);
+          ch = *fmt++;
+        }
+        flags |= helpers::w_to_flag(n, fast);
+        goto reswitch;
+      }
       case 'X':
         xdigs = xdigs_upper;
         goto hex;
diff --git a/libc/tools/genfunctosyscallnrs.py b/libc/tools/genfunctosyscallnrs.py
index fa48844..9b8f7ee 100755
--- a/libc/tools/genfunctosyscallnrs.py
+++ b/libc/tools/genfunctosyscallnrs.py
@@ -21,12 +21,12 @@
 
 
 def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs):
-    for arch in SupportedArchitectures:
+    for arch in syscall_NRs.keys():
         base_names = load_syscall_names_from_file(base_syscall_file, arch)
 
         for func, syscall in base_names.items():
             out_file.write("#define __" + arch + "_" + func + " " +
-                           str(syscall_NRs[arch][syscall]) + ";\n")
+                           str(syscall_NRs[arch][syscall]) + "\n")
 
 
 def main():
diff --git a/libc/tools/genseccomp.py b/libc/tools/genseccomp.py
index 33bf470..8a07caf 100755
--- a/libc/tools/genseccomp.py
+++ b/libc/tools/genseccomp.py
@@ -5,9 +5,10 @@
 import operator
 import os
 import re
+import sys
 import textwrap
 
-from gensyscalls import SupportedArchitectures, SysCallsTxtParser
+from gensyscalls import SysCallsTxtParser
 
 
 BPF_JGE = "BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, {0}, {1}, {2})"
@@ -84,42 +85,46 @@
   #    #define __(ARM_)?NR_${NAME} ${VALUE}
   #
   # Where ${VALUE} is a preprocessor expression.
+  #
+  # Newer architectures have things like this though:
+  #
+  #    #define __NR3264_fcntl 25
+  #    #define __NR_fcntl __NR3264_fcntl
+  #
+  # So we need to keep track of the __NR3264_* constants and substitute them.
 
-  constant_re = re.compile(
-      r'^\s*#define\s+([A-Za-z_][A-Za-z0-9_]+)\s+(.+)\s*$')
+  line_re = re.compile(r'^# \d+ ".*".*')
+  undef_re = re.compile(r'^#undef\s.*')
+  define_re = re.compile(r'^\s*#define\s+([A-Za-z0-9_(,)]+)(?:\s+(.+))?\s*$')
   token_re = re.compile(r'\b[A-Za-z_][A-Za-z0-9_]+\b')
   constants = {}
+  nr3264s = {}
   with open(names_path) as f:
     for line in f:
-      m = constant_re.match(line)
-      if m is None:
-        continue
-      try:
+      line = line.strip()
+      m = define_re.match(line)
+      if m:
         name = m.group(1)
-        # eval() takes care of any arithmetic that may be done
-        value = eval(token_re.sub(lambda x: str(constants[x.group(0)]),
-                                  m.group(2)))
+        value = m.group(2)
+        if name.startswith('__NR3264'):
+          nr3264s[name] = value
+        elif name.startswith('__NR_') or name.startswith('__ARM_NR_'):
+          if value in nr3264s:
+            value = nr3264s[value]
+          # eval() takes care of any arithmetic that may be done
+          value = eval(token_re.sub(lambda x: str(constants[x.group(0)]), value))
 
-        constants[name] = value
-      except:  # pylint: disable=bare-except
-        # TODO: This seems wrong.
-        # Key error doesn't seem like the error the original author was trying
-        # to catch. It looks like the intent was to catch IndexError from
-        # match.group() for non-matching lines, but that's impossible because
-        # the match object is checked and continued if not matched. What
-        # actually happens is that KeyError is thrown by constants[x.group(0)]
-        # on at least the first run because the dict is empty.
-        #
-        # It's also matching syntax errors because not all C integer literals
-        # are valid Python integer literals, e.g. 10L.
-        logging.debug('Failed to parse %s', line)
+          constants[name] = value
+      else:
+        if not line_re.match(line) and not undef_re.match(line) and line:
+          print('%s: failed to parse line `%s`' % (names_path, line))
+          sys.exit(1)
 
   syscalls = {}
   for name, value in constants.items():
-    if not name.startswith("__NR_") and not name.startswith("__ARM_NR"):
-      continue
+    # Remove the __NR_ prefix.
+    # TODO: why not __ARM_NR too?
     if name.startswith("__NR_"):
-      # Remote the __NR_ prefix
       name = name[len("__NR_"):]
     syscalls[name] = value
 
@@ -237,7 +242,7 @@
 
 def gen_policy(name_modifier, out_dir, base_syscall_file, syscall_files,
                syscall_NRs, priority_file):
-  for arch in SupportedArchitectures:
+  for arch in syscall_NRs.keys():
     base_names = load_syscall_names_from_file(base_syscall_file, arch)
     allowlist_names = set()
     blocklist_names = set()
@@ -251,11 +256,11 @@
       priorities = load_syscall_priorities_from_file(priority_file)
 
     allowed_syscalls = []
-    for name in merge_names(base_names, allowlist_names, blocklist_names):
+    for name in sorted(merge_names(base_names, allowlist_names, blocklist_names)):
       try:
         allowed_syscalls.append((name, syscall_NRs[arch][name]))
       except:
-        logging.exception("Failed to find %s in %s", name, arch)
+        logging.exception("Failed to find %s in %s (%s)", name, arch, syscall_NRs[arch])
         raise
     output = construct_bpf(allowed_syscalls, arch, name_modifier, priorities)
 
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index baaa52d..558b004 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -15,7 +15,7 @@
 import tempfile
 
 
-SupportedArchitectures = [ "arm", "arm64", "x86", "x86_64" ]
+SupportedArchitectures = [ "arm", "arm64", "riscv64", "x86", "x86_64" ]
 
 syscall_stub_header = \
 """
@@ -80,6 +80,24 @@
 
 
 #
+# RISC-V64 assembler templates for each syscall stub
+#
+
+riscv64_call = syscall_stub_header + """\
+    li      a7, %(__NR_name)s
+    ecall
+
+    li      a7, -MAX_ERRNO
+    bgtu    a0, a7, 1f
+
+    ret
+1:
+    neg     a0, a0
+    tail    __set_errno_internal
+END(%(func)s)
+"""
+
+#
 # x86 assembler templates for each syscall stub
 #
 
@@ -228,6 +246,10 @@
     return arm64_call % syscall
 
 
+def riscv64_genstub(syscall):
+    return riscv64_call % syscall
+
+
 def x86_genstub(syscall):
     result     = syscall_stub_header % syscall
 
@@ -311,10 +333,12 @@
 class SysCallsTxtParser:
     def __init__(self):
         self.syscalls = []
-        self.lineno   = 0
+        self.lineno = 0
+        self.errors = False
 
     def E(self, msg):
         print("%d: %s" % (self.lineno, msg))
+        self.errors = True
 
     def parse_line(self, line):
         """ parse a syscall spec line.
@@ -421,6 +445,8 @@
             if not line: continue
             if line[0] == '#': continue
             self.parse_line(line)
+        if self.errors:
+            sys.exit(1)
 
     def parse_file(self, file_path):
         with open(file_path) as fp:
@@ -440,6 +466,9 @@
         if "arm64" in syscall:
             syscall["asm-arm64"] = add_footer(64, arm64_genstub(syscall), syscall)
 
+        if "riscv64" in syscall:
+            syscall["asm-riscv64"] = add_footer(64, riscv64_genstub(syscall), syscall)
+
         if "x86" in syscall:
             if syscall["socketcall_id"] >= 0:
                 syscall["asm-x86"] = add_footer(32, x86_genstub_socketcall(syscall), syscall)
diff --git a/libc/tzcode/asctime.c b/libc/tzcode/asctime.c
index ce5d4be..4cdfd13 100644
--- a/libc/tzcode/asctime.c
+++ b/libc/tzcode/asctime.c
@@ -17,12 +17,6 @@
 #include <stdio.h>
 
 /*
-** Some systems only handle "%.2d"; others only handle "%02d";
-** "%02.2d" makes (most) everybody happy.
-** At least some versions of gcc warn about the %02.2d;
-** we conditionalize below to avoid the warning.
-*/
-/*
 ** All years associated with 32-bit time_t values are exactly four digits long;
 ** some years associated with 64-bit time_t values are not.
 ** Vintage programs are coded for years that are always four digits long
@@ -34,24 +28,16 @@
 ** The ISO C and POSIX standards prohibit padding the year,
 ** but many implementations pad anyway; most likely the standards are buggy.
 */
-#ifdef __GNUC__
-#define ASCTIME_FMT	"%s %s%3d %2.2d:%2.2d:%2.2d %-4s\n"
-#else /* !defined __GNUC__ */
-#define ASCTIME_FMT	"%s %s%3d %02.2d:%02.2d:%02.2d %-4s\n"
-#endif /* !defined __GNUC__ */
+static char const ASCTIME_FMT[] = "%s %s%3d %.2d:%.2d:%.2d %-4s\n";
 /*
 ** For years that are more than four digits we put extra spaces before the year
 ** so that code trying to overwrite the newline won't end up overwriting
 ** a digit within a year and truncating the year (operating on the assumption
 ** that no output is better than wrong output).
 */
-#ifdef __GNUC__
-#define ASCTIME_FMT_B	"%s %s%3d %2.2d:%2.2d:%2.2d     %s\n"
-#else /* !defined __GNUC__ */
-#define ASCTIME_FMT_B	"%s %s%3d %02.2d:%02.2d:%02.2d     %s\n"
-#endif /* !defined __GNUC__ */
+static char const ASCTIME_FMT_B[] = "%s %s%3d %.2d:%.2d:%.2d     %s\n";
 
-#define STD_ASCTIME_BUF_SIZE	26
+enum { STD_ASCTIME_BUF_SIZE = 26 };
 /*
 ** Big enough for something such as
 ** ??? ???-2147483648 -2147483648:-2147483648:-2147483648     -2147483648\n
@@ -59,15 +45,23 @@
 ** seven explicit spaces, two explicit colons, a newline,
 ** and a trailing NUL byte).
 ** The values above are for systems where an int is 32 bits and are provided
-** as an example; the define below calculates the maximum for the system at
+** as an example; the size expression below is a bound for the system at
 ** hand.
 */
-#define MAX_ASCTIME_BUF_SIZE	(2*3+5*INT_STRLEN_MAXIMUM(int)+7+2+1+1)
+static char buf_asctime[2*3 + 5*INT_STRLEN_MAXIMUM(int) + 7 + 2 + 1 + 1];
 
-static char	buf_asctime[MAX_ASCTIME_BUF_SIZE];
+/* A similar buffer for ctime.
+   C89 requires that they be the same buffer.
+   This requirement was removed in C99, so support it only if requested,
+   as support is more likely to lead to bugs in badly written programs.  */
+#if SUPPORT_C89
+# define buf_ctime buf_asctime
+#else
+static char buf_ctime[sizeof buf_asctime];
+#endif
 
 char *
-asctime_r(register const struct tm *timeptr, char *buf)
+asctime_r(struct tm const *restrict timeptr, char *restrict buf)
 {
 	static const char	wday_name[][4] = {
 		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
@@ -79,7 +73,7 @@
 	register const char *	wn;
 	register const char *	mn;
 	char			year[INT_STRLEN_MAXIMUM(int) + 2];
-	char			result[MAX_ASCTIME_BUF_SIZE];
+	char result[sizeof buf_asctime];
 
 	if (timeptr == NULL) {
 		errno = EINVAL;
@@ -107,7 +101,8 @@
 		timeptr->tm_mday, timeptr->tm_hour,
 		timeptr->tm_min, timeptr->tm_sec,
 		year);
-	if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime)
+	if (strlen(result) < STD_ASCTIME_BUF_SIZE
+	    || buf == buf_ctime || buf == buf_asctime)
 		return strcpy(buf, result);
 	else {
 		errno = EOVERFLOW;
@@ -120,3 +115,17 @@
 {
 	return asctime_r(timeptr, buf_asctime);
 }
+
+char *
+ctime_r(const time_t *timep, char *buf)
+{
+  struct tm mytm;
+  struct tm *tmp = localtime_r(timep, &mytm);
+  return tmp ? asctime_r(tmp, buf) : NULL;
+}
+
+char *
+ctime(const time_t *timep)
+{
+  return ctime_r(timep, buf_ctime);
+}
diff --git a/libc/tzcode/localedef.h b/libc/tzcode/localedef.h
new file mode 100644
index 0000000..19d4df9
--- /dev/null
+++ b/libc/tzcode/localedef.h
@@ -0,0 +1,106 @@
+/*	$OpenBSD: localedef.h,v 1.1 2016/05/23 00:05:15 guenther Exp $	*/
+/*	$NetBSD: localedef.h,v 1.4 1996/04/09 20:55:31 cgd Exp $	*/
+
+/*
+ * Copyright (c) 1994 Winning Strategies, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Winning Strategies, Inc.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LOCALEDEF_H_
+#define _LOCALEDEF_H_
+
+#include <sys/types.h>
+
+typedef struct
+{
+	char *yesexpr;
+	char *noexpr;
+	char *yesstr;
+	char *nostr;
+} _MessagesLocale;
+
+
+typedef struct
+{
+	char *int_curr_symbol;
+	char *currency_symbol;
+	char *mon_decimal_point;
+	char *mon_thousands_sep;
+	char *mon_grouping;
+	char *positive_sign;
+	char *negative_sign;
+	char int_frac_digits;
+	char frac_digits;
+	char p_cs_precedes;
+	char p_sep_by_space;
+	char n_cs_precedes;
+	char n_sep_by_space;
+	char p_sign_posn;
+	char n_sign_posn;
+	char int_p_cs_precedes;
+	char int_p_sep_by_space;
+	char int_n_cs_precedes;
+	char int_n_sep_by_space;
+	char int_p_sign_posn;
+	char int_n_sign_posn;
+} _MonetaryLocale;
+
+
+typedef struct
+{
+	const char *decimal_point;
+	const char *thousands_sep;
+	const char *grouping;
+} _NumericLocale;
+
+
+typedef struct {
+	const char *abday[7];
+	const char *day[7];
+	const char *abmon[12];
+	const char *mon[12];
+	const char *am_pm[2];
+	const char *d_t_fmt;
+	const char *d_fmt;
+	const char *t_fmt;
+	const char *t_fmt_ampm;
+} _TimeLocale;
+
+
+//__BEGIN_HIDDEN_DECLS
+extern const _MessagesLocale *_CurrentMessagesLocale;
+extern const _MessagesLocale  _DefaultMessagesLocale;
+extern const _MonetaryLocale *_CurrentMonetaryLocale;
+extern const _MonetaryLocale  _DefaultMonetaryLocale;
+extern const _NumericLocale *_CurrentNumericLocale;
+extern const _NumericLocale  _DefaultNumericLocale;
+extern const _TimeLocale *_CurrentTimeLocale;
+extern const _TimeLocale  _DefaultTimeLocale;
+//__END_HIDDEN_DECLS
+
+#endif /* !_LOCALEDEF_H_ */
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 8ff5cee..5e1181f 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -28,29 +28,22 @@
 static void unlock(void) { }
 #endif
 
-#ifndef TZ_ABBR_MAX_LEN
-#define TZ_ABBR_MAX_LEN 16
-#endif /* !defined TZ_ABBR_MAX_LEN */
-
 #ifndef TZ_ABBR_CHAR_SET
-#define TZ_ABBR_CHAR_SET \
+# define TZ_ABBR_CHAR_SET \
     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._"
 #endif /* !defined TZ_ABBR_CHAR_SET */
 
 #ifndef TZ_ABBR_ERR_CHAR
-#define TZ_ABBR_ERR_CHAR    '_'
+# define TZ_ABBR_ERR_CHAR    '_'
 #endif /* !defined TZ_ABBR_ERR_CHAR */
 
 /*
-** SunOS 4.1.1 headers lack O_BINARY.
++** Support non-POSIX platforms that distinguish between text and binary files.
 */
 
-#ifdef O_BINARY
-#define OPEN_MODE   (O_RDONLY | O_BINARY)
-#endif /* defined O_BINARY */
 #ifndef O_BINARY
-#define OPEN_MODE   O_RDONLY
-#endif /* !defined O_BINARY */
+# define O_BINARY 0
+#endif
 
 #ifndef WILDABBR
 /*
@@ -72,12 +65,13 @@
 ** manual page of what this "time zone abbreviation" means (doing this so
 ** that tzname[0] has the "normal" length of three characters).
 */
-#define WILDABBR    "   "
+# define WILDABBR    "   "
 #endif /* !defined WILDABBR */
 
 static const char       wildabbr[] = WILDABBR;
 
-static const char gmt[] = "GMT";
+static char const etc_utc[] = "Etc/UTC";
+static char const *utc = etc_utc + sizeof "Etc/" - 1;
 
 /*
 ** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
@@ -86,7 +80,7 @@
 ** for historical reasons, US rules are a common default.
 */
 #ifndef TZDEFRULESTRING
-#define TZDEFRULESTRING ",M3.2.0,M11.1.0"
+# define TZDEFRULESTRING ",M3.2.0,M11.1.0"
 #endif
 
 struct ttinfo {              /* time type information */
@@ -102,9 +96,6 @@
     int_fast32_t ls_corr;    /* correction to apply */
 };
 
-#define SMALLEST(a, b)	(((a) < (b)) ? (a) : (b))
-#define BIGGEST(a, b)   (((a) > (b)) ? (a) : (b))
-
 /* This abbreviation means local time is unspecified.  */
 static char const UNSPEC[] = "-00";
 
@@ -112,14 +103,13 @@
    This needs to be at least 1 for null termination in case the input
    data isn't properly terminated, and it also needs to be big enough
    for ttunspecified to work without crashing.  */
-enum { CHARS_EXTRA = BIGGEST(sizeof UNSPEC, 2) - 1 };
+enum { CHARS_EXTRA = max(sizeof UNSPEC, 2) - 1 };
 
-#ifdef TZNAME_MAX
-#define MY_TZNAME_MAX   TZNAME_MAX
-#endif /* defined TZNAME_MAX */
-#ifndef TZNAME_MAX
-#define MY_TZNAME_MAX   255
-#endif /* !defined TZNAME_MAX */
+/* Limit to time zone abbreviation length in POSIX-style TZ strings.
+   This is distinct from TZ_MAX_CHARS, which limits TZif file contents.  */
+#ifndef TZNAME_MAXIMUM
+# define TZNAME_MAXIMUM 255
+#endif
 
 struct state {
     int           leapcnt;
@@ -131,9 +121,8 @@
     time_t        ats[TZ_MAX_TIMES];
     unsigned char types[TZ_MAX_TIMES];
     struct ttinfo ttis[TZ_MAX_TYPES];
-    char          chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + CHARS_EXTRA,
-                            sizeof gmt),
-                  (2 * (MY_TZNAME_MAX + 1)))];
+    char chars[max(max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof "UTC"),
+		         2 * (TZNAME_MAXIMUM + 1))];
     struct lsinfo lsis[TZ_MAX_LEAPS];
     /* The time type to use for early times or if no transitions.
        It is always zero for recent tzdb releases.
@@ -174,12 +163,12 @@
 #ifndef ALL_STATE
 static struct state lclmem;
 static struct state gmtmem;
-#define lclptr      (&lclmem)
-#define gmtptr      (&gmtmem)
+static struct state *const lclptr = &lclmem;
+static struct state *const gmtptr = &gmtmem;
 #endif /* State Farm */
 
 #ifndef TZ_STRLEN_MAX
-#define TZ_STRLEN_MAX 255
+# define TZ_STRLEN_MAX 255
 #endif /* !defined TZ_STRLEN_MAX */
 
 static char lcl_TZname[TZ_STRLEN_MAX + 1];
@@ -191,9 +180,14 @@
 **  ctime, gmtime, localtime] return values in one of two static
 **  objects: a broken-down time structure and an array of char.
 ** Thanks to Paul Eggert for noting this.
+**
+** This requirement was removed in C99, so support it only if requested,
+** as support is more likely to lead to bugs in badly written programs.
 */
 
+#if SUPPORT_C89
 static struct tm	tm;
+#endif
 
 #if 2 <= HAVE_TZNAME + TZ_TIME_T
 char *			tzname[2] = {
@@ -321,7 +315,7 @@
 	int stddst_mask = 0;
 
 #if HAVE_TZNAME
-	tzname[0] = tzname[1] = (char *) (sp ? wildabbr : gmt);
+	tzname[0] = tzname[1] = (char *) (sp ? wildabbr : utc);
 	stddst_mask = 3;
 #endif
 #if USG_COMPAT
@@ -346,27 +340,28 @@
 #endif
 }
 
-static void
+/* Replace bogus characters in time zone abbreviations.
+   Return 0 on success, an errno value if a time zone abbreviation is
+   too long.  */
+static int
 scrub_abbrs(struct state *sp)
 {
 	int i;
-	/*
-	** First, replace bogus characters.
-	*/
+
+	/* Reject overlong abbreviations.  */
+	for (i = 0; i < sp->charcnt - (TZNAME_MAXIMUM + 1); ) {
+	  int len = strlen(&sp->chars[i]);
+	  if (TZNAME_MAXIMUM < len)
+	    return EOVERFLOW;
+	  i += len + 1;
+	}
+
+	/* Replace bogus characters.  */
 	for (i = 0; i < sp->charcnt; ++i)
 		if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
 			sp->chars[i] = TZ_ABBR_ERR_CHAR;
-	/*
-	** Second, truncate long abbreviations.
-	*/
-	for (i = 0; i < sp->typecnt; ++i) {
-		register const struct ttinfo * const	ttisp = &sp->ttis[i];
-		char *cp = &sp->chars[ttisp->tt_desigidx];
 
-		if (strlen(cp) > TZ_ABBR_MAX_LEN &&
-			strcmp(cp, GRANDPARENTED) != 0)
-				*(cp + TZ_ABBR_MAX_LEN) = '\0';
-	}
+	return 0;
 }
 
 /* Input buffer for data read from a compiled tz file.  */
@@ -399,8 +394,7 @@
   // Android-removed: There is no directory with file-per-time zone on Android.
   #ifndef __BIONIC__
   /* The file name to be opened.  */
-  char fullname[BIGGEST(sizeof(struct file_analysis),
-      sizeof tzdirslash + 1024)];
+  char fullname[max(sizeof(struct file_analysis), sizeof tzdirslash + 1024)];
   #endif
 };
 
@@ -446,8 +440,7 @@
 #endif
 	if (!doaccess) {
 		char const *dot;
-		size_t namelen = strlen(name);
-		if (sizeof lsp->fullname - sizeof tzdirslash <= namelen)
+		if (sizeof lsp->fullname - sizeof tzdirslash <= strlen(name))
 		  return ENAMETOOLONG;
 
 		/* Create a string "TZDIR/NAME".  Using sprintf here
@@ -470,7 +463,7 @@
 	}
 	if (doaccess && access(name, R_OK) != 0)
 	  return errno;
-	fid = open(name, OPEN_MODE);
+  fid = open(name, O_RDONLY | O_BINARY);
 #endif
 	if (fid < 0)
 	  return errno;
@@ -828,12 +821,14 @@
 		b < 0 || b >= sp->typecnt)
 			result = false;
 	else {
+		/* Compare the relevant members of *AP and *BP.
+		   Ignore tt_ttisstd and tt_ttisut, as they are
+		   irrelevant now and counting them could cause
+		   sp->goahead to mistakenly remain false.  */
 		register const struct ttinfo *	ap = &sp->ttis[a];
 		register const struct ttinfo *	bp = &sp->ttis[b];
 		result = (ap->tt_utoff == bp->tt_utoff
 			  && ap->tt_isdst == bp->tt_isdst
-			  && ap->tt_ttisstd == bp->tt_ttisstd
-			  && ap->tt_ttisut == bp->tt_ttisut
 			  && (strcmp(&sp->chars[ap->tt_desigidx],
 				     &sp->chars[bp->tt_desigidx])
 			      == 0));
@@ -863,7 +858,7 @@
 ** Return a pointer to that character.
 */
 
-static ATTRIBUTE_PURE const char *
+ATTRIBUTE_REPRODUCIBLE static const char *
 getzname(register const char *strp)
 {
 	register char	c;
@@ -884,7 +879,7 @@
 ** We don't do any checking here; checking is done later in common-case code.
 */
 
-static ATTRIBUTE_PURE const char *
+ATTRIBUTE_REPRODUCIBLE static const char *
 getqzname(register const char *strp, const int delim)
 {
 	register int	c;
@@ -1122,7 +1117,7 @@
             value += mon_lengths[leapyear][i] * SECSPERDAY;
         break;
 
-        default: UNREACHABLE();
+        default: unreachable();
     }
 
     /*
@@ -1144,13 +1139,11 @@
 {
 	const char *			stdname;
 	const char *			dstname;
-	size_t				stdlen;
-	size_t				dstlen;
-	size_t				charcnt;
 	int_fast32_t			stdoffset;
 	int_fast32_t			dstoffset;
 	register char *			cp;
 	register bool			load_ok;
+	ptrdiff_t stdlen, dstlen, charcnt;
 	time_t atlo = TIME_T_MIN, leaplo = TIME_T_MIN;
 
 	stdname = name;
@@ -1166,14 +1159,12 @@
 	  name = getzname(name);
 	  stdlen = name - stdname;
 	}
-	if (!stdlen)
+	if (! (0 < stdlen && stdlen <= TZNAME_MAXIMUM))
 	  return false;
 	name = getoffset(name, &stdoffset);
 	if (name == NULL)
 	  return false;
 	charcnt = stdlen + 1;
-	if (sizeof sp->chars < charcnt)
-	  return false;
 	if (basep) {
 	  if (0 < basep->timecnt)
 	    atlo = basep->ats[basep->timecnt - 1];
@@ -1200,11 +1191,9 @@
 			name = getzname(name);
 			dstlen = name - dstname; /* length of DST abbr. */
 		}
-		if (!dstlen)
+		if (! (0 < dstlen && dstlen <= TZNAME_MAXIMUM))
 		  return false;
 		charcnt += dstlen + 1;
-		if (sizeof sp->chars < charcnt)
-		  return false;
 		if (*name != '\0' && *name != ',' && *name != ';') {
 			name = getoffset(name, &dstoffset);
 			if (name == NULL)
@@ -1420,8 +1409,8 @@
 static void
 gmtload(struct state *const sp)
 {
-	if (tzload(gmt, sp, true) != 0)
-	  tzparse("GMT0", sp, NULL);
+	if (tzload(etc_utc, sp, true) != 0)
+	  tzparse("UTC0", sp, NULL);
 }
 
 /* Initialize *SP to a value appropriate for the TZ setting NAME.
@@ -1439,7 +1428,7 @@
     sp->charcnt = 0;
     sp->goback = sp->goahead = false;
     init_ttinfo(&sp->ttis[0], 0, false, 0);
-    strcpy(sp->chars, gmt);
+    strcpy(sp->chars, utc);
     sp->defaulttype = 0;
     return 0;
   } else {
@@ -1447,7 +1436,7 @@
     if (err != 0 && name && name[0] != ':' && tzparse(name, sp, NULL))
       err = 0;
     if (err == 0)
-      scrub_abbrs(sp);
+      err = scrub_abbrs(sp);
     return err;
   }
 }
@@ -1557,7 +1546,7 @@
 ** set the applicable parts of tzname, timezone and altzone;
 ** however, it's OK to omit this step if the timezone is POSIX-compatible,
 ** since in that case tzset should have already done this step correctly.
-** SETNAME's type is intfast32_t for compatibility with gmtsub,
+** SETNAME's type is int_fast32_t for compatibility with gmtsub,
 ** but it is actually a boolean and its value should be 0 or 1.
 */
 
@@ -1601,6 +1590,14 @@
 					return NULL;	/* "cannot happen" */
 			result = localsub(sp, &newt, setname, tmp);
 			if (result) {
+#if defined ckd_add && defined ckd_sub
+				if (t < sp->ats[0]
+				    ? ckd_sub(&result->tm_year,
+					      result->tm_year, years)
+				    : ckd_add(&result->tm_year,
+					      result->tm_year, years))
+				  return NULL;
+#else
 				register int_fast64_t newy;
 
 				newy = result->tm_year;
@@ -1610,6 +1607,7 @@
 				if (! (INT_MIN <= newy && newy <= INT_MAX))
 					return NULL;
 				result->tm_year = newy;
+#endif
 			}
 			return result;
 	}
@@ -1650,7 +1648,8 @@
 #if NETBSD_INSPIRED
 
 struct tm *
-localtime_rz(struct state *sp, time_t const *timep, struct tm *tmp)
+localtime_rz(struct state *restrict sp, time_t const *restrict timep,
+	     struct tm *restrict tmp)
 {
   return localsub(sp, timep, 0, tmp);
 }
@@ -1681,11 +1680,14 @@
 struct tm *
 localtime(const time_t *timep)
 {
+#if !SUPPORT_C89
+  static struct tm tm;
+#endif
   return localtime_tzset(timep, &tm);
 }
 
 struct tm *
-localtime_r(const time_t *timep, struct tm *tmp)
+localtime_r(const time_t *restrict timep, struct tm *restrict tmp)
 {
   return localtime_tzset(timep, tmp);
 }
@@ -1695,8 +1697,8 @@
 */
 
 static struct tm *
-gmtsub(struct state const *sp, time_t const *timep, int_fast32_t offset,
-       struct tm *tmp)
+gmtsub(ATTRIBUTE_MAYBE_UNUSED struct state const *sp, time_t const *timep,
+       int_fast32_t offset, struct tm *tmp)
 {
 	register struct tm *	result;
 
@@ -1708,7 +1710,7 @@
 	** but this is no time for a treasure hunt.
 	*/
 	tmp->TM_ZONE = ((char *)
-			(offset ? wildabbr : gmtptr ? gmtptr->chars : gmt));
+			(offset ? wildabbr : gmtptr ? gmtptr->chars : utc));
 #endif /* defined TM_ZONE */
 	return result;
 }
@@ -1718,7 +1720,7 @@
 */
 
 struct tm *
-gmtime_r(const time_t *timep, struct tm *tmp)
+gmtime_r(time_t const *restrict timep, struct tm *restrict tmp)
 {
   gmtcheck();
   return gmtsub(gmtptr, timep, 0, tmp);
@@ -1727,19 +1729,26 @@
 struct tm *
 gmtime(const time_t *timep)
 {
+#if !SUPPORT_C89
+  static struct tm tm;
+#endif
   return gmtime_r(timep, &tm);
 }
 
-#ifdef STD_INSPIRED
+#if STD_INSPIRED
 
 struct tm *
 offtime(const time_t *timep, long offset)
 {
   gmtcheck();
+
+#if !SUPPORT_C89
+  static struct tm tm;
+#endif
   return gmtsub(gmtptr, timep, offset, &tm);
 }
 
-#endif /* defined STD_INSPIRED */
+#endif
 
 /*
 ** Return the number of leap years through the end of the given year
@@ -1825,6 +1834,12 @@
 		y = newy;
 	}
 
+#ifdef ckd_add
+	if (ckd_add(&tmp->tm_year, y, -TM_YEAR_BASE)) {
+	  errno = EOVERFLOW;
+	  return NULL;
+	}
+#else
 	if (!TYPE_SIGNED(time_t) && y < TM_YEAR_BASE) {
 	  int signed_y = y;
 	  tmp->tm_year = signed_y - TM_YEAR_BASE;
@@ -1835,6 +1850,7 @@
 	  errno = EOVERFLOW;
 	  return NULL;
 	}
+#endif
 	tmp->tm_yday = idays;
 	/*
 	** The "extra" mods below avoid overflow problems.
@@ -1868,27 +1884,6 @@
 	return tmp;
 }
 
-char *
-ctime(const time_t *timep)
-{
-/*
-** Section 4.12.3.2 of X3.159-1989 requires that
-**	The ctime function converts the calendar time pointed to by timer
-**	to local time in the form of a string. It is equivalent to
-**		asctime(localtime(timer))
-*/
-  struct tm *tmp = localtime(timep);
-  return tmp ? asctime(tmp) : NULL;
-}
-
-char *
-ctime_r(const time_t *timep, char *buf)
-{
-  struct tm mytm;
-  struct tm *tmp = localtime_r(timep, &mytm);
-  return tmp ? asctime_r(tmp, buf) : NULL;
-}
-
 /*
 ** Adapted from code provided by Robert Elz, who writes:
 **	The "best" way to do mktime I think is based on an idea of Bob
@@ -1899,7 +1894,7 @@
 */
 
 #ifndef WRONG
-#define WRONG	(-1)
+# define WRONG (-1)
 #endif /* !defined WRONG */
 
 /*
@@ -1909,6 +1904,9 @@
 static bool
 increment_overflow(int *ip, int j)
 {
+#ifdef ckd_add
+	return ckd_add(ip, *ip, j);
+#else
 	register int const	i = *ip;
 
 	/*
@@ -1921,22 +1919,30 @@
 		return true;
 	*ip += j;
 	return false;
+#endif
 }
 
 static bool
 increment_overflow32(int_fast32_t *const lp, int const m)
 {
+#ifdef ckd_add
+	return ckd_add(lp, *lp, m);
+#else
 	register int_fast32_t const	l = *lp;
 
 	if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l))
 		return true;
 	*lp += m;
 	return false;
+#endif
 }
 
 static bool
 increment_overflow_time(time_t *tp, int_fast32_t j)
 {
+#ifdef ckd_add
+	return ckd_add(tp, *tp, j);
+#else
 	/*
 	** This is like
 	** 'if (! (TIME_T_MIN <= *tp + j && *tp + j <= TIME_T_MAX)) ...',
@@ -1948,6 +1954,7 @@
 		return true;
 	*tp += j;
 	return false;
+#endif
 }
 
 static bool
@@ -1990,6 +1997,23 @@
 	return result;
 }
 
+/* Copy to *DEST from *SRC.  Copy only the members needed for mktime,
+   as other members might not be initialized.  */
+static void
+mktmcpy(struct tm *dest, struct tm const *src)
+{
+  dest->tm_sec = src->tm_sec;
+  dest->tm_min = src->tm_min;
+  dest->tm_hour = src->tm_hour;
+  dest->tm_mday = src->tm_mday;
+  dest->tm_mon = src->tm_mon;
+  dest->tm_year = src->tm_year;
+  dest->tm_isdst = src->tm_isdst;
+#if defined TM_GMTOFF && ! UNINIT_TRAP
+  dest->TM_GMTOFF = src->TM_GMTOFF;
+#endif
+}
+
 static time_t
 time2sub(struct tm *const tmp,
 	 struct tm *(*funcp)(struct state const *, time_t const *,
@@ -2011,7 +2035,8 @@
 	struct tm			yourtm, mytm;
 
 	*okayp = false;
-	yourtm = *tmp;
+	mktmcpy(&yourtm, tmp);
+
 	if (do_norm_secs) {
 		if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
 			SECSPERMIN))
@@ -2053,14 +2078,19 @@
 				return WRONG;
 		}
 	}
+#ifdef ckd_add
+	if (ckd_add(&yourtm.tm_year, y, -TM_YEAR_BASE))
+	  return WRONG;
+#else
 	if (increment_overflow32(&y, -TM_YEAR_BASE))
 		return WRONG;
 	if (! (INT_MIN <= y && y <= INT_MAX))
 		return WRONG;
 	yourtm.tm_year = y;
+#endif
 	if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
 		saved_seconds = 0;
-	else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
+	else if (yourtm.tm_year < EPOCH_YEAR - TM_YEAR_BASE) {
 		/*
 		** We can't set tm_sec to 0, because that might push the
 		** time below the minimum representable time.
@@ -2120,10 +2150,10 @@
 		    && (yourtm.TM_GMTOFF < 0
 			? (-SECSPERDAY <= yourtm.TM_GMTOFF
 			   && (mytm.TM_GMTOFF <=
-			       (SMALLEST(INT_FAST32_MAX, LONG_MAX)
+			       (min(INT_FAST32_MAX, LONG_MAX)
 				+ yourtm.TM_GMTOFF)))
 			: (yourtm.TM_GMTOFF <= SECSPERDAY
-			   && ((BIGGEST(INT_FAST32_MIN, LONG_MIN)
+			   && ((max(INT_FAST32_MIN, LONG_MIN)
 				+ yourtm.TM_GMTOFF)
 			       <= mytm.TM_GMTOFF)))) {
 		  /* MYTM matches YOURTM except with the wrong UT offset.
@@ -2294,7 +2324,7 @@
 #if NETBSD_INSPIRED
 
 time_t
-mktime_z(struct state *sp, struct tm *tmp)
+mktime_z(struct state *restrict sp, struct tm *restrict tmp)
 {
   return mktime_tzname(sp, tmp, false);
 }
@@ -2324,8 +2354,7 @@
   return t;
 }
 
-#ifdef STD_INSPIRED
-
+#if STD_INSPIRED
 time_t
 timelocal(struct tm *tmp)
 {
@@ -2333,13 +2362,9 @@
 		tmp->tm_isdst = -1;	/* in case it wasn't initialized */
 	return mktime(tmp);
 }
-
-time_t
-timegm(struct tm *tmp)
-{
-  return timeoff(tmp, 0);
-}
-
+#else
+static
+#endif
 time_t
 timeoff(struct tm *tmp, long offset)
 {
@@ -2349,7 +2374,18 @@
   return time1(tmp, gmtsub, gmtptr, offset);
 }
 
-#endif /* defined STD_INSPIRED */
+time_t
+timegm(struct tm *tmp)
+{
+  time_t t;
+  struct tm tmcpy;
+  mktmcpy(&tmcpy, tmp);
+  tmcpy.tm_wday = -1;
+  t = timeoff(&tmcpy, 0);
+  if (0 <= tmcpy.tm_wday)
+    *tmp = tmcpy;
+  return t;
+}
 
 static int_fast32_t
 leapcorr(struct state const *sp, time_t t)
@@ -2370,7 +2406,7 @@
 ** XXX--is the below the right way to conditionalize??
 */
 
-#ifdef STD_INSPIRED
+#if STD_INSPIRED
 
 /* NETBSD_INSPIRED_EXTERN functions are exported to callers if
    NETBSD_INSPIRED is defined, and are private otherwise.  */
@@ -2455,7 +2491,7 @@
   return t;
 }
 
-#endif /* defined STD_INSPIRED */
+#endif /* STD_INSPIRED */
 
 #if TZ_TIME_T
 
diff --git a/libc/tzcode/private.h b/libc/tzcode/private.h
index 4c03324..838ab2b 100644
--- a/libc/tzcode/private.h
+++ b/libc/tzcode/private.h
@@ -17,6 +17,36 @@
 ** Thank you!
 */
 
+/* PORT_TO_C89 means the code should work even if the underlying
+   compiler and library support only C89.  SUPPORT_C89 means the
+   tzcode library should support C89 callers in addition to the usual
+   support for C99-and-later callers.  These macros are obsolescent,
+   and the plan is to remove them along with any code needed only when
+   they are nonzero.  */
+#ifndef PORT_TO_C89
+# define PORT_TO_C89 0
+#endif
+#ifndef SUPPORT_C89
+# define SUPPORT_C89 0
+#endif
+
+#ifndef __STDC_VERSION__
+# define __STDC_VERSION__ 0
+#endif
+
+/* Define true, false and bool if they don't work out of the box.  */
+#if PORT_TO_C89 && __STDC_VERSION__ < 199901
+# define true 1
+# define false 0
+# define bool int
+#elif __STDC_VERSION__ < 202311
+# include <stdbool.h>
+#endif
+
+#if __STDC_VERSION__ < 202311
+# define static_assert(cond) extern int static_assert_check[(cond) ? 1 : -1]
+#endif
+
 /*
 ** zdump has been made independent of the rest of the time
 ** conversion package to increase confidence in the verification it provides.
@@ -36,79 +66,86 @@
 */
 
 #ifndef HAVE_DECL_ASCTIME_R
-#define HAVE_DECL_ASCTIME_R 1
+# define HAVE_DECL_ASCTIME_R 1
 #endif
 
-#if !defined HAVE_GENERIC && defined __has_extension
+#if !defined HAVE__GENERIC && defined __has_extension
 # if __has_extension(c_generic_selections)
-#  define HAVE_GENERIC 1
+#  define HAVE__GENERIC 1
 # else
-#  define HAVE_GENERIC 0
+#  define HAVE__GENERIC 0
 # endif
 #endif
 /* _Generic is buggy in pre-4.9 GCC.  */
-#if !defined HAVE_GENERIC && defined __GNUC__
-# define HAVE_GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__))
+#if !defined HAVE__GENERIC && defined __GNUC__ && !defined __STRICT_ANSI__
+# define HAVE__GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__))
 #endif
-#ifndef HAVE_GENERIC
-# define HAVE_GENERIC (201112 <= __STDC_VERSION__)
+#ifndef HAVE__GENERIC
+# define HAVE__GENERIC (201112 <= __STDC_VERSION__)
 #endif
 
+#if !defined HAVE_GETTEXT && defined __has_include
+# if __has_include(<libintl.h>)
+#  define HAVE_GETTEXT true
+# endif
+#endif
 #ifndef HAVE_GETTEXT
-#define HAVE_GETTEXT		0
-#endif /* !defined HAVE_GETTEXT */
+# define HAVE_GETTEXT false
+#endif
 
 #ifndef HAVE_INCOMPATIBLE_CTIME_R
-#define HAVE_INCOMPATIBLE_CTIME_R	0
+# define HAVE_INCOMPATIBLE_CTIME_R 0
 #endif
 
 #ifndef HAVE_LINK
-#define HAVE_LINK		1
+# define HAVE_LINK 1
 #endif /* !defined HAVE_LINK */
 
 #ifndef HAVE_MALLOC_ERRNO
-#define HAVE_MALLOC_ERRNO 1
+# define HAVE_MALLOC_ERRNO 1
 #endif
 
 #ifndef HAVE_POSIX_DECLS
-#define HAVE_POSIX_DECLS 1
+# define HAVE_POSIX_DECLS 1
 #endif
 
-#ifndef HAVE_STDBOOL_H
-#define HAVE_STDBOOL_H (199901 <= __STDC_VERSION__)
+#ifndef HAVE_SETENV
+# define HAVE_SETENV 1
 #endif
 
 #ifndef HAVE_STRDUP
-#define HAVE_STRDUP 1
-#endif
-
-#ifndef HAVE_STRTOLL
-#define HAVE_STRTOLL 1
+# define HAVE_STRDUP 1
 #endif
 
 #ifndef HAVE_SYMLINK
-#define HAVE_SYMLINK		1
+# define HAVE_SYMLINK 1
 #endif /* !defined HAVE_SYMLINK */
 
+#if !defined HAVE_SYS_STAT_H && defined __has_include
+# if !__has_include(<sys/stat.h>)
+#  define HAVE_SYS_STAT_H false
+# endif
+#endif
 #ifndef HAVE_SYS_STAT_H
-#define HAVE_SYS_STAT_H		1
-#endif /* !defined HAVE_SYS_STAT_H */
+# define HAVE_SYS_STAT_H true
+#endif
 
+#if !defined HAVE_UNISTD_H && defined __has_include
+# if !__has_include(<unistd.h>)
+#  define HAVE_UNISTD_H false
+# endif
+#endif
 #ifndef HAVE_UNISTD_H
-#define HAVE_UNISTD_H		1
-#endif /* !defined HAVE_UNISTD_H */
-
-#ifndef HAVE_UTMPX_H
-#define HAVE_UTMPX_H		1
-#endif /* !defined HAVE_UTMPX_H */
+# define HAVE_UNISTD_H true
+#endif
 
 #ifndef NETBSD_INSPIRED
 # define NETBSD_INSPIRED 1
 #endif
 
 #if HAVE_INCOMPATIBLE_CTIME_R
-#define asctime_r _incompatible_asctime_r
-#define ctime_r _incompatible_ctime_r
+# define asctime_r _incompatible_asctime_r
+# define ctime_r _incompatible_ctime_r
 #endif /* HAVE_INCOMPATIBLE_CTIME_R */
 
 /* Enable tm_gmtoff, tm_zone, and environ on GNUish systems.  */
@@ -118,15 +155,17 @@
 /* Enable strtoimax on pre-C99 Solaris 11.  */
 #define __EXTENSIONS__ 1
 
-/* To avoid having 'stat' fail unnecessarily with errno == EOVERFLOW,
-   enable large files on GNUish systems ...  */
+/* On GNUish systems where time_t might be 32 or 64 bits, use 64.
+   On these platforms _FILE_OFFSET_BITS must also be 64; otherwise
+   setting _TIME_BITS to 64 does not work.  The code does not
+   otherwise rely on _FILE_OFFSET_BITS being 64, since it does not
+   use off_t or functions like 'stat' that depend on off_t.  */
 #ifndef _FILE_OFFSET_BITS
 # define _FILE_OFFSET_BITS 64
 #endif
-/* ... and on AIX ...  */
-#define _LARGE_FILES 1
-/* ... and enable large inode numbers on Mac OS X 10.5 and later.  */
-#define _DARWIN_USE_64_BIT_INODE 1
+#if !defined _TIME_BITS && _FILE_OFFSET_BITS == 64
+# define _TIME_BITS 64
+#endif
 
 /*
 ** Nested includes
@@ -157,8 +196,11 @@
 #undef tzalloc
 #undef tzfree
 
-#include <sys/types.h>	/* for time_t */
+#include <stddef.h>
 #include <string.h>
+#if !PORT_TO_C89
+# include <inttypes.h>
+#endif
 #include <limits.h>	/* for CHAR_BIT et al. */
 #include <stdlib.h>
 
@@ -168,6 +210,9 @@
 # define EINVAL ERANGE
 #endif
 
+#ifndef ELOOP
+# define ELOOP EINVAL
+#endif
 #ifndef ENAMETOOLONG
 # define ENAMETOOLONG EINVAL
 #endif
@@ -182,11 +227,11 @@
 #endif
 
 #if HAVE_GETTEXT
-#include <libintl.h>
+# include <libintl.h>
 #endif /* HAVE_GETTEXT */
 
 #if HAVE_UNISTD_H
-#include <unistd.h>	/* for R_OK, and other POSIX goodness */
+# include <unistd.h> /* for R_OK, and other POSIX goodness */
 #endif /* HAVE_UNISTD_H */
 
 #ifndef HAVE_STRFTIME_L
@@ -222,24 +267,29 @@
 #endif
 
 #ifndef R_OK
-#define R_OK	4
+# define R_OK 4
 #endif /* !defined R_OK */
 
+#if PORT_TO_C89
+
 /*
 ** Define HAVE_STDINT_H's default value here, rather than at the
 ** start, since __GLIBC__ and INTMAX_MAX's values depend on
-** previously-included files.  glibc 2.1 and Solaris 10 and later have
+** previously included files.  glibc 2.1 and Solaris 10 and later have
 ** stdint.h, even with pre-C99 compilers.
 */
+#if !defined HAVE_STDINT_H && defined __has_include
+# define HAVE_STDINT_H true /* C23 __has_include implies C99 stdint.h.  */
+#endif
 #ifndef HAVE_STDINT_H
-#define HAVE_STDINT_H \
+# define HAVE_STDINT_H \
    (199901 <= __STDC_VERSION__ \
-    || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__)	\
+    || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
     || __CYGWIN__ || INTMAX_MAX)
 #endif /* !defined HAVE_STDINT_H */
 
 #if HAVE_STDINT_H
-#include <stdint.h>
+# include <stdint.h>
 #endif /* !HAVE_STDINT_H */
 
 #ifndef HAVE_INTTYPES_H
@@ -250,36 +300,36 @@
 #endif
 
 /* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
-#ifdef __LONG_LONG_MAX__
+#if defined __LONG_LONG_MAX__ && !defined __STRICT_ANSI__
 # ifndef LLONG_MAX
 #  define LLONG_MAX __LONG_LONG_MAX__
 # endif
 # ifndef LLONG_MIN
 #  define LLONG_MIN (-1 - LLONG_MAX)
 # endif
+# ifndef ULLONG_MAX
+#  define ULLONG_MAX (LLONG_MAX * 2ull + 1)
+# endif
 #endif
 
 #ifndef INT_FAST64_MAX
-# ifdef LLONG_MAX
-typedef long long	int_fast64_t;
-#  define INT_FAST64_MIN LLONG_MIN
-#  define INT_FAST64_MAX LLONG_MAX
-# else
-#  if LONG_MAX >> 31 < 0xffffffff
-Please use a compiler that supports a 64-bit integer type (or wider);
-you may need to compile with "-DHAVE_STDINT_H".
-#  endif
-typedef long		int_fast64_t;
+# if 1 <= LONG_MAX >> 31 >> 31
+typedef long int_fast64_t;
 #  define INT_FAST64_MIN LONG_MIN
 #  define INT_FAST64_MAX LONG_MAX
+# else
+/* If this fails, compile with -DHAVE_STDINT_H or with a better compiler.  */
+typedef long long int_fast64_t;
+#  define INT_FAST64_MIN LLONG_MIN
+#  define INT_FAST64_MAX LLONG_MAX
 # endif
 #endif
 
 #ifndef PRIdFAST64
-# if INT_FAST64_MAX == LLONG_MAX
-#  define PRIdFAST64 "lld"
-# else
+# if INT_FAST64_MAX == LONG_MAX
 #  define PRIdFAST64 "ld"
+# else
+#  define PRIdFAST64 "lld"
 # endif
 #endif
 
@@ -302,6 +352,9 @@
 #ifndef INTMAX_MAX
 # ifdef LLONG_MAX
 typedef long long intmax_t;
+#  ifndef HAVE_STRTOLL
+#   define HAVE_STRTOLL true
+#  endif
 #  if HAVE_STRTOLL
 #   define strtoimax strtoll
 #  endif
@@ -325,70 +378,183 @@
 # endif
 #endif
 
+#ifndef PTRDIFF_MAX
+# define PTRDIFF_MAX MAXVAL(ptrdiff_t, TYPE_BIT(ptrdiff_t))
+#endif
+
 #ifndef UINT_FAST32_MAX
 typedef unsigned long uint_fast32_t;
 #endif
 
 #ifndef UINT_FAST64_MAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
-typedef unsigned long long uint_fast64_t;
+# if 3 <= ULONG_MAX >> 31 >> 31
+typedef unsigned long uint_fast64_t;
+#  define UINT_FAST64_MAX ULONG_MAX
 # else
-#  if ULONG_MAX >> 31 >> 1 < 0xffffffff
-Please use a compiler that supports a 64-bit integer type (or wider);
-you may need to compile with "-DHAVE_STDINT_H".
-#  endif
-typedef unsigned long	uint_fast64_t;
+/* If this fails, compile with -DHAVE_STDINT_H or with a better compiler.  */
+typedef unsigned long long uint_fast64_t;
+#  define UINT_FAST64_MAX ULLONG_MAX
 # endif
 #endif
 
 #ifndef UINTMAX_MAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
+# ifdef ULLONG_MAX
 typedef unsigned long long uintmax_t;
+#  define UINTMAX_MAX ULLONG_MAX
 # else
 typedef unsigned long uintmax_t;
+#  define UINTMAX_MAX ULONG_MAX
 # endif
 #endif
 
 #ifndef PRIuMAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
+# ifdef ULLONG_MAX
 #  define PRIuMAX "llu"
 # else
 #  define PRIuMAX "lu"
 # endif
 #endif
 
-#ifndef INT32_MAX
-#define INT32_MAX 0x7fffffff
-#endif /* !defined INT32_MAX */
-#ifndef INT32_MIN
-#define INT32_MIN (-1 - INT32_MAX)
-#endif /* !defined INT32_MIN */
-
 #ifndef SIZE_MAX
-#define SIZE_MAX ((size_t) -1)
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#endif /* PORT_TO_C89 */
+
+/* The maximum size of any created object, as a signed integer.
+   Although the C standard does not outright prohibit larger objects,
+   behavior is undefined if the result of pointer subtraction does not
+   fit into ptrdiff_t, and the code assumes in several places that
+   pointer subtraction works.  As a practical matter it's OK to not
+   support objects larger than this.  */
+#define INDEX_MAX ((ptrdiff_t) min(PTRDIFF_MAX, SIZE_MAX))
+
+/* Support ckd_add, ckd_sub, ckd_mul on C23 or recent-enough GCC-like
+   hosts, unless compiled with -DHAVE_STDCKDINT_H=0 or with pre-C23 EDG.  */
+#if !defined HAVE_STDCKDINT_H && defined __has_include
+# if __has_include(<stdckdint.h>)
+#  define HAVE_STDCKDINT_H true
+# endif
+#endif
+#ifdef HAVE_STDCKDINT_H
+# if HAVE_STDCKDINT_H
+#  include <stdckdint.h>
+# endif
+#elif defined __EDG__
+/* Do nothing, to work around EDG bug <https://bugs.gnu.org/53256>.  */
+#elif defined __has_builtin
+# if __has_builtin(__builtin_add_overflow)
+#  define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
+# endif
+# if __has_builtin(__builtin_sub_overflow)
+#  define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
+# endif
+# if __has_builtin(__builtin_mul_overflow)
+#  define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
+# endif
+#elif 7 <= __GNUC__
+# define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
+# define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
+# define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
 #endif
 
 #if 3 <= __GNUC__
-# define ATTRIBUTE_CONST __attribute__((const))
-# define ATTRIBUTE_MALLOC __attribute__((__malloc__))
-# define ATTRIBUTE_PURE __attribute__((__pure__))
-# define ATTRIBUTE_FORMAT(spec) __attribute__((__format__ spec))
+# define ATTRIBUTE_MALLOC __attribute__((malloc))
+# define ATTRIBUTE_FORMAT(spec) __attribute__((format spec))
 #else
-# define ATTRIBUTE_CONST /* empty */
 # define ATTRIBUTE_MALLOC /* empty */
-# define ATTRIBUTE_PURE /* empty */
 # define ATTRIBUTE_FORMAT(spec) /* empty */
 #endif
 
-#if !defined _Noreturn && __STDC_VERSION__ < 201112
-# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
-#  define _Noreturn __attribute__((__noreturn__))
+#if (defined __has_c_attribute \
+     && (202311 <= __STDC_VERSION__ || !defined __STRICT_ANSI__))
+# define HAVE___HAS_C_ATTRIBUTE true
+#else
+# define HAVE___HAS_C_ATTRIBUTE false
+#endif
+
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(deprecated)
+#  define ATTRIBUTE_DEPRECATED [[deprecated]]
+# endif
+#endif
+#ifndef ATTRIBUTE_DEPRECATED
+# if 3 < __GNUC__ + (2 <= __GNUC_MINOR__)
+#  define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
 # else
-#  define _Noreturn
+#  define ATTRIBUTE_DEPRECATED /* empty */
 # endif
 #endif
 
-#if __STDC_VERSION__ < 199901 && !defined restrict
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(fallthrough)
+#  define ATTRIBUTE_FALLTHROUGH [[fallthrough]]
+# endif
+#endif
+#ifndef ATTRIBUTE_FALLTHROUGH
+# if 7 <= __GNUC__
+#  define ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
+# else
+#  define ATTRIBUTE_FALLTHROUGH ((void) 0)
+# endif
+#endif
+
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(maybe_unused)
+#  define ATTRIBUTE_MAYBE_UNUSED [[maybe_unused]]
+# endif
+#endif
+#ifndef ATTRIBUTE_MAYBE_UNUSED
+# if 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+#  define ATTRIBUTE_MAYBE_UNUSED __attribute__((unused))
+# else
+#  define ATTRIBUTE_MAYBE_UNUSED /* empty */
+# endif
+#endif
+
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(noreturn)
+#  define ATTRIBUTE_NORETURN [[noreturn]]
+# endif
+#endif
+#ifndef ATTRIBUTE_NORETURN
+# if 201112 <= __STDC_VERSION__
+#  define ATTRIBUTE_NORETURN _Noreturn
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
+#  define ATTRIBUTE_NORETURN __attribute__((noreturn))
+# else
+#  define ATTRIBUTE_NORETURN /* empty */
+# endif
+#endif
+
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(reproducible)
+#  define ATTRIBUTE_REPRODUCIBLE [[reproducible]]
+# endif
+#endif
+#ifndef ATTRIBUTE_REPRODUCIBLE
+# if 3 <= __GNUC__
+#  define ATTRIBUTE_REPRODUCIBLE __attribute__((pure))
+# else
+#  define ATTRIBUTE_REPRODUCIBLE /* empty */
+# endif
+#endif
+
+#if HAVE___HAS_C_ATTRIBUTE
+# if __has_c_attribute(unsequenced)
+#  define ATTRIBUTE_UNSEQUENCED [[unsequenced]]
+# endif
+#endif
+#ifndef ATTRIBUTE_UNSEQUENCED
+# if 3 <= __GNUC__
+#  define ATTRIBUTE_UNSEQUENCED __attribute__((const))
+# else
+#  define ATTRIBUTE_UNSEQUENCED /* empty */
+# endif
+#endif
+
+#if (__STDC_VERSION__ < 199901 && !defined restrict \
+     && (PORT_TO_C89 || defined _MSC_VER))
 # define restrict /* empty */
 #endif
 
@@ -505,11 +671,16 @@
 #  define altzone tz_altzone
 # endif
 
-char *asctime(struct tm const *);
+# if __STDC_VERSION__ < 202311
+#  define DEPRECATED_IN_C23 /* empty */
+# else
+#  define DEPRECATED_IN_C23 ATTRIBUTE_DEPRECATED
+# endif
+DEPRECATED_IN_C23 char *asctime(struct tm const *);
 char *asctime_r(struct tm const *restrict, char *restrict);
-char *ctime(time_t const *);
+DEPRECATED_IN_C23 char *ctime(time_t const *);
 char *ctime_r(time_t const *, char *);
-double difftime(time_t, time_t) ATTRIBUTE_CONST;
+ATTRIBUTE_UNSEQUENCED double difftime(time_t, time_t);
 size_t strftime(char *restrict, size_t, char const *restrict,
 		struct tm const *restrict);
 # if HAVE_STRFTIME_L
@@ -522,9 +693,24 @@
 struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
 time_t mktime(struct tm *);
 time_t time(time_t *);
+time_t timegm(struct tm *);
 void tzset(void);
 #endif
 
+#ifndef HAVE_DECL_TIMEGM
+# if (202311 <= __STDC_VERSION__ \
+      || defined __GLIBC__ || defined __tm_zone /* musl */ \
+      || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
+      || (defined __APPLE__ && defined __MACH__))
+#  define HAVE_DECL_TIMEGM true
+# else
+#  define HAVE_DECL_TIMEGM false
+# endif
+#endif
+#if !HAVE_DECL_TIMEGM && !defined timegm
+time_t timegm(struct tm *);
+#endif
+
 #if !HAVE_DECL_ASCTIME_R && !defined asctime_r
 extern char *asctime_r(struct tm const *restrict, char *restrict);
 #endif
@@ -557,13 +743,13 @@
 ** declarations if time_tz is defined.
 */
 
-#ifdef STD_INSPIRED
+#ifndef STD_INSPIRED
+# define STD_INSPIRED 0
+#endif
+#if STD_INSPIRED
 # if TZ_TIME_T || !defined offtime
 struct tm *offtime(time_t const *, long);
 # endif
-# if TZ_TIME_T || !defined timegm
-time_t timegm(struct tm *);
-# endif
 # if TZ_TIME_T || !defined timelocal
 time_t timelocal(struct tm *);
 # endif
@@ -581,6 +767,7 @@
 /* Infer TM_ZONE on systems where this information is known, but suppress
    guessing if NO_TM_ZONE is defined.  Similarly for TM_GMTOFF.  */
 #if (defined __GLIBC__ \
+     || defined __tm_zone /* musl */ \
      || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
      || (defined __APPLE__ && defined __MACH__))
 # if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
@@ -606,12 +793,12 @@
 time_t mktime_z(timezone_t restrict, struct tm *restrict);
 timezone_t tzalloc(char const *);
 void tzfree(timezone_t);
-# ifdef STD_INSPIRED
+# if STD_INSPIRED
 #  if TZ_TIME_T || !defined posix2time_z
-time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE;
+ATTRIBUTE_REPRODUCIBLE time_t posix2time_z(timezone_t, time_t);
 #  endif
 #  if TZ_TIME_T || !defined time2posix_z
-time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE;
+ATTRIBUTE_REPRODUCIBLE time_t time2posix_z(timezone_t, time_t);
 #  endif
 # endif
 #endif
@@ -620,18 +807,15 @@
 ** Finally, some convenience items.
 */
 
-#if HAVE_STDBOOL_H
-# include <stdbool.h>
-#else
-# define true 1
-# define false 0
-# define bool int
-#endif
-
-#define TYPE_BIT(type)	(sizeof(type) * CHAR_BIT)
+#define TYPE_BIT(type) (CHAR_BIT * (ptrdiff_t) sizeof(type))
 #define TYPE_SIGNED(type) (((type) -1) < 0)
 #define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
 
+/* Minimum and maximum of two values.  Use lower case to avoid
+   naming clashes with standard include files.  */
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
 /* Max and min values of the integer type T, of which only the bottom
    B bits are used, and where the highest-order used bit is considered
    to be a sign bit if T is signed.  */
@@ -651,7 +835,7 @@
    This implementation assumes no padding if time_t is signed and
    either the compiler lacks support for _Generic or time_t is not one
    of the standard signed integer types.  */
-#if HAVE_GENERIC
+#if HAVE__GENERIC
 # define TIME_T_MIN \
     _Generic((time_t) 0, \
 	     signed char: SCHAR_MIN, short: SHRT_MIN, \
@@ -664,10 +848,23 @@
 		int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
 		default: TIME_T_MAX_NO_PADDING)			    \
      : (time_t) -1)
+enum { SIGNED_PADDING_CHECK_NEEDED
+         = _Generic((time_t) 0,
+		    signed char: false, short: false,
+		    int: false, long: false, long long: false,
+		    default: true) };
 #else
 # define TIME_T_MIN TIME_T_MIN_NO_PADDING
 # define TIME_T_MAX TIME_T_MAX_NO_PADDING
+enum { SIGNED_PADDING_CHECK_NEEDED = true };
 #endif
+/* Try to check the padding assumptions.  Although TIME_T_MAX and the
+   following check can both have undefined behavior on oddball
+   platforms due to shifts exceeding widths of signed integers, these
+   platforms' compilers are likely to diagnose these issues in integer
+   constant expressions, so it shouldn't hurt to check statically.  */
+static_assert(! TYPE_SIGNED(time_t) || ! SIGNED_PADDING_CHECK_NEEDED
+	      || TIME_T_MAX >> (TYPE_BIT(time_t) - 2) == 1);
 
 /*
 ** 302 / 1000 is log10(2.0) rounded up.
@@ -689,21 +886,30 @@
 # define INITIALIZE(x)
 #endif
 
+/* Whether memory access must strictly follow the C standard.
+   If 0, it's OK to read uninitialized storage so long as the value is
+   not relied upon.  Defining it to 0 lets mktime access parts of
+   struct tm that might be uninitialized, as a heuristic when the
+   standard doesn't say what to return and when tm_gmtoff can help
+   mktime likely infer a better value.  */
 #ifndef UNINIT_TRAP
 # define UNINIT_TRAP 0
 #endif
 
 #ifdef DEBUG
-# define UNREACHABLE() abort()
-#elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
-# define UNREACHABLE() __builtin_unreachable()
-#elif defined __has_builtin
-# if __has_builtin(__builtin_unreachable)
-#  define UNREACHABLE() __builtin_unreachable()
+# undef unreachable
+# define unreachable() abort()
+#elif !defined unreachable
+# ifdef __has_builtin
+#  if __has_builtin(__builtin_unreachable)
+#   define unreachable() __builtin_unreachable()
+#  endif
+# elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
+#  define unreachable() __builtin_unreachable()
 # endif
-#endif
-#ifndef UNREACHABLE
-# define UNREACHABLE() ((void) 0)
+# ifndef unreachable
+#  define unreachable() ((void) 0)
+# endif
 #endif
 
 /*
@@ -725,53 +931,61 @@
 #if HAVE_INCOMPATIBLE_CTIME_R
 #undef asctime_r
 #undef ctime_r
-char *asctime_r(struct tm const *, char *);
+char *asctime_r(struct tm const *restrict, char *restrict);
 char *ctime_r(time_t const *, char *);
 #endif /* HAVE_INCOMPATIBLE_CTIME_R */
 
 /* Handy macros that are independent of tzfile implementation.  */
 
-#define SECSPERMIN	60
-#define MINSPERHOUR	60
-#define HOURSPERDAY	24
-#define DAYSPERWEEK	7
-#define DAYSPERNYEAR	365
-#define DAYSPERLYEAR	366
-#define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
-#define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
-#define MONSPERYEAR	12
+enum {
+  SECSPERMIN = 60,
+  MINSPERHOUR = 60,
+  SECSPERHOUR = SECSPERMIN * MINSPERHOUR,
+  HOURSPERDAY = 24,
+  DAYSPERWEEK = 7,
+  DAYSPERNYEAR = 365,
+  DAYSPERLYEAR = DAYSPERNYEAR + 1,
+  MONSPERYEAR = 12,
+  YEARSPERREPEAT = 400	/* years before a Gregorian repeat */
+};
 
-#define YEARSPERREPEAT		400	/* years before a Gregorian repeat */
+#define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
+
 #define DAYSPERREPEAT		((int_fast32_t) 400 * 365 + 100 - 4 + 1)
 #define SECSPERREPEAT		((int_fast64_t) DAYSPERREPEAT * SECSPERDAY)
 #define AVGSECSPERYEAR		(SECSPERREPEAT / YEARSPERREPEAT)
 
-#define TM_SUNDAY	0
-#define TM_MONDAY	1
-#define TM_TUESDAY	2
-#define TM_WEDNESDAY	3
-#define TM_THURSDAY	4
-#define TM_FRIDAY	5
-#define TM_SATURDAY	6
+enum {
+  TM_SUNDAY,
+  TM_MONDAY,
+  TM_TUESDAY,
+  TM_WEDNESDAY,
+  TM_THURSDAY,
+  TM_FRIDAY,
+  TM_SATURDAY
+};
 
-#define TM_JANUARY	0
-#define TM_FEBRUARY	1
-#define TM_MARCH	2
-#define TM_APRIL	3
-#define TM_MAY		4
-#define TM_JUNE		5
-#define TM_JULY		6
-#define TM_AUGUST	7
-#define TM_SEPTEMBER	8
-#define TM_OCTOBER	9
-#define TM_NOVEMBER	10
-#define TM_DECEMBER	11
+enum {
+  TM_JANUARY,
+  TM_FEBRUARY,
+  TM_MARCH,
+  TM_APRIL,
+  TM_MAY,
+  TM_JUNE,
+  TM_JULY,
+  TM_AUGUST,
+  TM_SEPTEMBER,
+  TM_OCTOBER,
+  TM_NOVEMBER,
+  TM_DECEMBER
+};
 
-#define TM_YEAR_BASE	1900
-#define TM_WDAY_BASE	TM_MONDAY
-
-#define EPOCH_YEAR	1970
-#define EPOCH_WDAY	TM_THURSDAY
+enum {
+  TM_YEAR_BASE = 1900,
+  TM_WDAY_BASE = TM_MONDAY,
+  EPOCH_YEAR = 1970,
+  EPOCH_WDAY = TM_THURSDAY
+};
 
 #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
 
diff --git a/libc/tzcode/strftime.c b/libc/tzcode/strftime.c
index d04c5ba..4cde556 100644
--- a/libc/tzcode/strftime.c
+++ b/libc/tzcode/strftime.c
@@ -71,8 +71,6 @@
     const char *    date_fmt;
 };
 
-#define Locale  (&C_time_locale)
-
 static const struct lc_time_T   C_time_locale = {
     {
         "Jan", "Feb", "Mar", "Apr", "May", "Jun",
@@ -128,13 +126,14 @@
 static char *   _yconv(int, int, bool, bool, char *, const char *, int);
 
 #ifndef YEAR_2000_NAME
-#define YEAR_2000_NAME  "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
+# define YEAR_2000_NAME  "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
 #endif /* !defined YEAR_2000_NAME */
 
 #if HAVE_STRFTIME_L
 size_t
-strftime_l(char *s, size_t maxsize, char const *format, struct tm const *t,
-	   locale_t locale)
+strftime_l(char *restrict s, size_t maxsize, char const *restrict format,
+	   struct tm const *restrict t,
+	   ATTRIBUTE_MAYBE_UNUSED locale_t locale)
 {
   /* Just call strftime, as only the C locale is supported.  */
   return strftime(s, maxsize, format, t);
@@ -144,7 +143,8 @@
 #define FORCE_LOWER_CASE 0x100 /* Android extension. */
 
 size_t
-strftime(char *s, size_t maxsize, const char *format, const struct tm *t)
+strftime(char *restrict s, size_t maxsize, char const *restrict format,
+	 struct tm const *restrict t)
 {
     char *  p;
     int saved_errno = errno;
@@ -217,6 +217,8 @@
 _fmt(const char *format, const struct tm *t, char *pt,
         const char *ptlim, enum warn *warnp)
 {
+	struct lc_time_T const *Locale = &C_time_locale;
+
     for ( ; *format; ++format) {
         if (*format == '%') {
             int modifier = 0;
@@ -378,12 +380,21 @@
                     char buf[INT_STRLEN_MAXIMUM(time64_t) + 1] __attribute__((__uninitialized__));
                     time64_t    mkt;
 
-                    tm = *t;
+          					tm.tm_sec = t->tm_sec;
+					          tm.tm_min = t->tm_min;
+          					tm.tm_hour = t->tm_hour;
+					          tm.tm_mday = t->tm_mday;
+          					tm.tm_mon = t->tm_mon;
+					          tm.tm_year = t->tm_year;
+          					tm.tm_isdst = t->tm_isdst;
+#if defined TM_GMTOFF && ! UNINIT_TRAP
+					          tm.TM_GMTOFF = t->TM_GMTOFF;
+#endif
                     mkt = mktime64(&tm);
-					/* There is no portable, definitive
-					   test for whether whether mktime
-					   succeeded, so treat (time_t) -1 as
-					   the success that it might be.  */
+					/* If mktime fails, %s expands to the
+              value of (time_t) -1 as a failure
+              marker; this is better in practice
+              than strftime failing.  */
                     if (TYPE_SIGNED(time64_t)) {
                       intmax_t n = mkt;
                       sprintf(buf, "%"PRIdMAX, n);
@@ -607,19 +618,19 @@
 # endif
                 negative = diff < 0;
                 if (diff == 0) {
-#ifdef TM_ZONE
+# ifdef TM_ZONE
                   // Android-changed: do not use TM_ZONE as it is as it may be null.
                   {
                     const char* zone = _safe_tm_zone(t);
                     negative = zone[0] == '-';
                   }
-#else
+# else
                     negative = t->tm_isdst < 0;
-# if HAVE_TZNAME
+#  if HAVE_TZNAME
                     if (tzname[t->tm_isdst != 0][0] == '-')
                         negative = true;
+#  endif
 # endif
-#endif
                 }
                 if (negative) {
                     sign = "-";
@@ -748,7 +759,7 @@
     register int    lead;
     register int    trail;
 
-#define DIVISOR 100
+    int DIVISOR = 100;
     trail = a % DIVISOR + b % DIVISOR;
     lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
     trail %= DIVISOR;
diff --git a/libc/tzcode/strptime.c b/libc/tzcode/strptime.c
index 7e8e234..d31a501 100644
--- a/libc/tzcode/strptime.c
+++ b/libc/tzcode/strptime.c
@@ -1,8 +1,7 @@
-/*  $OpenBSD: strptime.c,v 1.11 2005/08/08 08:05:38 espie Exp $ */
-/*  $NetBSD: strptime.c,v 1.12 1998/01/20 21:39:40 mycroft Exp $    */
-
+/*	$OpenBSD: strptime.c,v 1.31 2023/03/02 16:21:51 millert Exp $ */
+/*	$NetBSD: strptime.c,v 1.12 1998/01/20 21:39:40 mycroft Exp $	*/
 /*-
- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code was contributed to The NetBSD Foundation by Klaus Klein.
@@ -15,13 +14,6 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -36,65 +28,44 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-//#include <sys/localedef.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+
+#include "localedef.h"
+#include "private.h"
 #include "tzfile.h"
 
-static const struct {
-    const char *abday[7];
-    const char *day[7];
-    const char *abmon[12];
-    const char *mon[12];
-    const char *am_pm[2];
-    const char *d_t_fmt;
-    const char *d_fmt;
-    const char *t_fmt;
-    const char *t_fmt_ampm;
-} _DefaultTimeLocale = {
-    {
-        "Sun","Mon","Tue","Wed","Thu","Fri","Sat",
-    },
-    {
-        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
-        "Friday", "Saturday"
-    },
-    {
-        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-    },
-    {
-        "January", "February", "March", "April", "May", "June", "July",
-        "August", "September", "October", "November", "December"
-    },
-    {
-        "AM", "PM"
-    },
-    "%a %b %d %H:%M:%S %Y",
-    "%m/%d/%y",
-    "%H:%M:%S",
-    "%I:%M:%S %p"
-};
+// Android: ignore OpenBSD's DEF_WEAK() stuff.
+#define DEF_WEAK(sym) /* */
+// Android: this code is not pointer-sign clean.
+#pragma clang diagnostic ignored "-Wpointer-sign"
+#pragma clang diagnostic ignored "-Wunused-function"
+// Android: clang thinks people don't know && has higher precedence than ||.
+#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
 
-#define _ctloc(x) (_DefaultTimeLocale.x)
+#define	_ctloc(x)		(_CurrentTimeLocale->x)
 
 /*
  * We do not implement alternate representations. However, we always
  * check whether a given modifier is allowed for a certain conversion.
  */
-#define _ALT_E          0x01
-#define _ALT_O          0x02
-#define _LEGAL_ALT(x)       { if (alt_format & ~(x)) return (0); }
+#define _ALT_E			0x01
+#define _ALT_O			0x02
+#define	_LEGAL_ALT(x)		{ if (alt_format & ~(x)) return (0); }
 
-
-struct century_relyear {
-    int century;
-    int relyear;
-};
+/*
+ * We keep track of some of the fields we set in order to compute missing ones.
+ */
+#define FIELD_TM_MON	(1 << 0)
+#define FIELD_TM_MDAY	(1 << 1)
+#define FIELD_TM_WDAY	(1 << 2)
+#define FIELD_TM_YDAY	(1 << 3)
+#define FIELD_TM_YEAR	(1 << 4)
 
 static char gmt[] = { "GMT" };
 static char utc[] = { "UTC" };
@@ -106,9 +77,15 @@
        "EDT",    "CDT",    "MDT",    "PDT",    "\0\0\0"
 };
 
-static  int _conv_num(const unsigned char **, int *, int, int);
-static  unsigned char *_strptime(const unsigned char *, const char *, struct tm *,
-        struct century_relyear *);
+static const int mon_lengths[2][MONSPERYEAR] = {
+        { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+        { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+static	int _conv_num(const unsigned char **, int *, int, int);
+static	int epoch_to_tm(const unsigned char **, struct tm *);
+static	int leaps_thru_end_of(const int y);
+static	char *_strptime(const char *, const char *, struct tm *, int);
 static	const u_char *_find_string(const u_char *, int *, const char * const *,
 	    const char * const *, int);
 
@@ -116,335 +93,336 @@
 char *
 strptime(const char *buf, const char *fmt, struct tm *tm)
 {
-    struct century_relyear cr;
-    cr.century = TM_YEAR_BASE;
-    cr.relyear = -1;
-    return (char*)(_strptime((const unsigned char*)buf, fmt, tm, &cr));
+	return(_strptime(buf, fmt, tm, 1));
 }
+DEF_WEAK(strptime);
 
-static unsigned char *
-_strptime(const unsigned char *buf, const char *fmt, struct tm *tm, struct century_relyear *cr)
+static char *
+_strptime(const char *buf, const char *fmt, struct tm *tm, int initialize)
 {
-    unsigned char c;
-    const unsigned char *bp, *ep;
-    size_t len = 0;
-    int alt_format, i, offs;
-    int neg = 0;
+	unsigned char c;
+	const unsigned char *bp, *ep;
+	size_t len;
+	int alt_format, i, offs;
+	int neg = 0;
+	static int century, relyear, fields;
 
-    bp = (unsigned char *)buf;
-    while ((c = *fmt) != '\0') {
-        /* Clear `alternate' modifier prior to new conversion. */
-        alt_format = 0;
+	if (initialize) {
+		century = TM_YEAR_BASE;
+		relyear = -1;
+		fields = 0;
+	}
 
-        /* Eat up white-space. */
-        if (isspace(c)) {
-            while (isspace(*bp))
-                bp++;
+	bp = (const unsigned char *)buf;
+	while ((c = *fmt) != '\0') {
+		/* Clear `alternate' modifier prior to new conversion. */
+		alt_format = 0;
 
-            fmt++;
-            continue;
-        }
+		/* Eat up white-space. */
+		if (isspace(c)) {
+			while (isspace(*bp))
+				bp++;
 
-        if ((c = *fmt++) != '%')
-            goto literal;
+			fmt++;
+			continue;
+		}
+
+		if ((c = *fmt++) != '%')
+			goto literal;
 
 
-again:      switch (c = *fmt++) {
-        case '%':   /* "%%" is converted to "%". */
+again:		switch (c = *fmt++) {
+		case '%':	/* "%%" is converted to "%". */
 literal:
-        if (c != *bp++)
-            return (NULL);
+		if (c != *bp++)
+			return (NULL);
 
-        break;
+		break;
 
-        /*
-         * "Alternative" modifiers. Just set the appropriate flag
-         * and start over again.
-         */
-        case 'E':   /* "%E?" alternative conversion modifier. */
-            _LEGAL_ALT(0);
-            alt_format |= _ALT_E;
-            goto again;
+		/*
+		 * "Alternative" modifiers. Just set the appropriate flag
+		 * and start over again.
+		 */
+		case 'E':	/* "%E?" alternative conversion modifier. */
+			_LEGAL_ALT(0);
+			alt_format |= _ALT_E;
+			goto again;
 
-        case 'O':   /* "%O?" alternative conversion modifier. */
-            _LEGAL_ALT(0);
-            alt_format |= _ALT_O;
-            goto again;
+		case 'O':	/* "%O?" alternative conversion modifier. */
+			_LEGAL_ALT(0);
+			alt_format |= _ALT_O;
+			goto again;
 
-        /*
-         * "Complex" conversion rules, implemented through recursion.
-         */
-        case 'c':   /* Date and time, using the locale's format. */
-            _LEGAL_ALT(_ALT_E);
-            if (!(bp = _strptime(bp, _ctloc(d_t_fmt), tm, cr)))
-                return (NULL);
-            break;
+		/*
+		 * "Complex" conversion rules, implemented through recursion.
+		 */
+		case 'c':	/* Date and time, using the locale's format. */
+			_LEGAL_ALT(_ALT_E);
+			if (!(bp = _strptime(bp, _ctloc(d_t_fmt), tm, 0)))
+				return (NULL);
+			break;
 
-        case 'D':   /* The date as "%m/%d/%y". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%m/%d/%y", tm, cr)))
-                return (NULL);
-            break;
+		case 'D':	/* The date as "%m/%d/%y". */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%m/%d/%y", tm, 0)))
+				return (NULL);
+			break;
 
-        case 'F':  /* The date as "%Y-%m-%d". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%Y-%m-%d", tm, cr)))
-                return (NULL);
-            continue;
+		case 'F':	/* The date as "%Y-%m-%d". */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%Y-%m-%d", tm, 0)))
+				return (NULL);
+			continue;
 
-        case 'R':   /* The time as "%H:%M". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%H:%M", tm, cr)))
-                return (NULL);
-            break;
+		case 'R':	/* The time as "%H:%M". */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%H:%M", tm, 0)))
+				return (NULL);
+			break;
 
-        case 'r':   /* The time as "%I:%M:%S %p". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%I:%M:%S %p", tm, cr)))
-                return (NULL);
-            break;
+		case 'r':	/* The time as "%I:%M:%S %p". */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%I:%M:%S %p", tm, 0)))
+				return (NULL);
+			break;
 
-        case 'T':   /* The time as "%H:%M:%S". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%H:%M:%S", tm, cr)))
-                return (NULL);
-            break;
+		case 'T':	/* The time as "%H:%M:%S". */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%H:%M:%S", tm, 0)))
+				return (NULL);
+			break;
 
-        case 'v':  /* The date as "%e-%b-%Y". */
-            _LEGAL_ALT(0);
-            if (!(bp = _strptime(bp, "%e-%b-%Y", tm, cr)))
-                return (NULL);
-            break;
+		case 'v':	/* Android: the date as "%e-%b-%Y" for strftime() compat; glibc does this too. */
+			_LEGAL_ALT(0);
+			if (!(bp = _strptime(bp, "%e-%b-%Y", tm, 0)))
+				return (NULL);
+			break;
 
-        case 'X':   /* The time, using the locale's format. */
-            _LEGAL_ALT(_ALT_E);
-            if (!(bp = _strptime(bp, _ctloc(t_fmt), tm, cr)))
-                return (NULL);
-            break;
+		case 'X':	/* The time, using the locale's format. */
+			_LEGAL_ALT(_ALT_E);
+			if (!(bp = _strptime(bp, _ctloc(t_fmt), tm, 0)))
+				return (NULL);
+			break;
 
-        case 'x':   /* The date, using the locale's format. */
-            _LEGAL_ALT(_ALT_E);
-            if (!(bp = _strptime(bp, _ctloc(d_fmt), tm, cr)))
-                return (NULL);
-            break;
+		case 'x':	/* The date, using the locale's format. */
+			_LEGAL_ALT(_ALT_E);
+			if (!(bp = _strptime(bp, _ctloc(d_fmt), tm, 0)))
+				return (NULL);
+			break;
 
-        /*
-         * "Elementary" conversion rules.
-         */
-        case 'A':   /* The day of week, using the locale's form. */
-        case 'a':
-            _LEGAL_ALT(0);
-            for (i = 0; i < 7; i++) {
-                /* Full name. */
-                len = strlen(_ctloc(day[i]));
-                if (strncasecmp(_ctloc(day[i]), (const char*)bp, len) == 0)
-                    break;
+		/*
+		 * "Elementary" conversion rules.
+		 */
+		case 'A':	/* The day of week, using the locale's form. */
+		case 'a':
+			_LEGAL_ALT(0);
+			for (i = 0; i < 7; i++) {
+				/* Full name. */
+				len = strlen(_ctloc(day[i]));
+				if (strncasecmp(_ctloc(day[i]), bp, len) == 0)
+					break;
 
-                /* Abbreviated name. */
-                len = strlen(_ctloc(abday[i]));
-                if (strncasecmp(_ctloc(abday[i]), (const char*)bp, len) == 0)
-                    break;
-            }
+				/* Abbreviated name. */
+				len = strlen(_ctloc(abday[i]));
+				if (strncasecmp(_ctloc(abday[i]), bp, len) == 0)
+					break;
+			}
 
-            /* Nothing matched. */
-            if (i == 7)
-                return (NULL);
+			/* Nothing matched. */
+			if (i == 7)
+				return (NULL);
 
-            tm->tm_wday = i;
-            bp += len;
-            break;
+			tm->tm_wday = i;
+			bp += len;
+			fields |= FIELD_TM_WDAY;
+			break;
 
-        case 'B':   /* The month, using the locale's form. */
-        case 'b':
-        case 'h':
-            _LEGAL_ALT(0);
-            for (i = 0; i < 12; i++) {
-                /* Full name. */
-                len = strlen(_ctloc(mon[i]));
-                if (strncasecmp(_ctloc(mon[i]), (const char*)bp, len) == 0)
-                    break;
+		case 'B':	/* The month, using the locale's form. */
+		case 'b':
+		case 'h':
+			_LEGAL_ALT(0);
+			for (i = 0; i < 12; i++) {
+				/* Full name. */
+				len = strlen(_ctloc(mon[i]));
+				if (strncasecmp(_ctloc(mon[i]), bp, len) == 0)
+					break;
 
-                /* Abbreviated name. */
-                len = strlen(_ctloc(abmon[i]));
-                if (strncasecmp(_ctloc(abmon[i]), (const char*)bp, len) == 0)
-                    break;
-            }
+				/* Abbreviated name. */
+				len = strlen(_ctloc(abmon[i]));
+				if (strncasecmp(_ctloc(abmon[i]), bp, len) == 0)
+					break;
+			}
 
-            /* Nothing matched. */
-            if (i == 12)
-                return (NULL);
+			/* Nothing matched. */
+			if (i == 12)
+				return (NULL);
 
-            tm->tm_mon = i;
-            bp += len;
-            break;
+			tm->tm_mon = i;
+			bp += len;
+			fields |= FIELD_TM_MON;
+			break;
 
-        case 'C':   /* The century number. */
-            _LEGAL_ALT(_ALT_E);
-            if (!(_conv_num(&bp, &i, 0, 99)))
-                return (NULL);
+		case 'C':	/* The century number. */
+			_LEGAL_ALT(_ALT_E);
+			if (!(_conv_num(&bp, &i, 0, 99)))
+				return (NULL);
 
-            cr->century = i * 100;
-            break;
+			century = i * 100;
+			break;
 
-        case 'd':   /* The day of month. */
-        case 'e':
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_mday, 1, 31)))
-                return (NULL);
-            break;
+		case 'e':	/* The day of month. */
+			if (isspace(*bp))
+				bp++;
+			/* FALLTHROUGH */
+		case 'd':
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_mday, 1, 31)))
+				return (NULL);
+			fields |= FIELD_TM_MDAY;
+			break;
 
-        case 'k':   /* The hour (24-hour clock representation). */
-            _LEGAL_ALT(0);
-            /* FALLTHROUGH */
-        case 'H':
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_hour, 0, 23)))
-                return (NULL);
-            break;
+		case 'k':	/* The hour (24-hour clock representation). */
+			_LEGAL_ALT(0);
+			/* FALLTHROUGH */
+		case 'H':
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_hour, 0, 23)))
+				return (NULL);
+			break;
 
-        case 'l':   /* The hour (12-hour clock representation). */
-            _LEGAL_ALT(0);
-            /* FALLTHROUGH */
-        case 'I':
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_hour, 1, 12)))
-                return (NULL);
-            break;
+		case 'l':	/* The hour (12-hour clock representation). */
+			_LEGAL_ALT(0);
+			/* FALLTHROUGH */
+		case 'I':
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_hour, 1, 12)))
+				return (NULL);
+			break;
 
-        case 'j':   /* The day of year. */
-            _LEGAL_ALT(0);
-            if (!(_conv_num(&bp, &tm->tm_yday, 1, 366)))
-                return (NULL);
-            tm->tm_yday--;
-            break;
+		case 'j':	/* The day of year. */
+			_LEGAL_ALT(0);
+			if (!(_conv_num(&bp, &tm->tm_yday, 1, 366)))
+				return (NULL);
+			tm->tm_yday--;
+			fields |= FIELD_TM_YDAY;
+			break;
 
-        case 'M':   /* The minute. */
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_min, 0, 59)))
-                return (NULL);
-            break;
+		case 'M':	/* The minute. */
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_min, 0, 59)))
+				return (NULL);
+			break;
 
-        case 'm':   /* The month. */
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_mon, 1, 12)))
-                return (NULL);
-            tm->tm_mon--;
-            break;
+		case 'm':	/* The month. */
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_mon, 1, 12)))
+				return (NULL);
+			tm->tm_mon--;
+			fields |= FIELD_TM_MON;
+			break;
 
-        case 'P':
-        case 'p':   /* The locale's equivalent of AM/PM. */
-            _LEGAL_ALT(0);
-            /* AM? */
-            len = strlen(_ctloc(am_pm[0]));
-            if (strncasecmp(_ctloc(am_pm[0]), (const char*)bp, len) == 0) {
-                if (tm->tm_hour > 12)   /* i.e., 13:00 AM ?! */
-                    return (NULL);
-                else if (tm->tm_hour == 12)
-                    tm->tm_hour = 0;
+		case 'P':	/* Android addition for strftime() compat; glibc does this too. */
+		case 'p':	/* The locale's equivalent of AM/PM. */
+			_LEGAL_ALT(0);
+			/* AM? */
+			len = strlen(_ctloc(am_pm[0]));
+			if (strncasecmp(_ctloc(am_pm[0]), bp, len) == 0) {
+				if (tm->tm_hour > 12)	/* i.e., 13:00 AM ?! */
+					return (NULL);
+				else if (tm->tm_hour == 12)
+					tm->tm_hour = 0;
 
-                bp += len;
-                break;
-            }
-            /* PM? */
-            len = strlen(_ctloc(am_pm[1]));
-            if (strncasecmp(_ctloc(am_pm[1]), (const char*)bp, len) == 0) {
-                if (tm->tm_hour > 12)   /* i.e., 13:00 PM ?! */
-                    return (NULL);
-                else if (tm->tm_hour < 12)
-                    tm->tm_hour += 12;
+				bp += len;
+				break;
+			}
+			/* PM? */
+			len = strlen(_ctloc(am_pm[1]));
+			if (strncasecmp(_ctloc(am_pm[1]), bp, len) == 0) {
+				if (tm->tm_hour > 12)	/* i.e., 13:00 PM ?! */
+					return (NULL);
+				else if (tm->tm_hour < 12)
+					tm->tm_hour += 12;
 
-                bp += len;
-                break;
-            }
+				bp += len;
+				break;
+			}
 
-            /* Nothing matched. */
-            return (NULL);
+			/* Nothing matched. */
+			return (NULL);
 
-        case 'S':   /* The seconds. */
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_sec, 0, 61)))
-                return (NULL);
-            break;
+		case 'S':	/* The seconds. */
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_sec, 0, 60)))
+				return (NULL);
+			break;
+		case 's':	/* Seconds since epoch. */
+			if (!(epoch_to_tm(&bp, tm)))
+				return (NULL);
+			fields = 0xffff;	 /* everything */
+			break;
+		case 'U':	/* The week of year, beginning on sunday. */
+		case 'W':	/* The week of year, beginning on monday. */
+			_LEGAL_ALT(_ALT_O);
+			/*
+			 * XXX This is bogus, as we can not assume any valid
+			 * information present in the tm structure at this
+			 * point to calculate a real value, so just check the
+			 * range for now.
+			 */
+			 if (!(_conv_num(&bp, &i, 0, 53)))
+				return (NULL);
+			 break;
 
-        case 's':
-            {
-                // Android addition, based on FreeBSD's implementation.
-                int saved_errno = errno;
-                errno = 0;
-                const unsigned char* old_bp = bp;
-                long n = strtol((const char*) bp, (char**) &bp, 10);
-                time_t t = n;
-                if (bp == old_bp || errno == ERANGE || ((long) t) != n) {
-                    errno = saved_errno;
-                    return NULL;
-                }
-                errno = saved_errno;
+		case 'w':	/* The day of week, beginning on sunday. */
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &tm->tm_wday, 0, 6)))
+				return (NULL);
+			fields |= FIELD_TM_WDAY;
+			break;
 
-                if (localtime_r(&t, tm) == NULL) return NULL;
-            }
-            break;
+		case 'u':	/* The day of week, monday = 1. */
+			_LEGAL_ALT(_ALT_O);
+			if (!(_conv_num(&bp, &i, 1, 7)))
+				return (NULL);
+			tm->tm_wday = i % 7;
+			fields |= FIELD_TM_WDAY;
+			continue;
 
+		case 'g':	/* The year corresponding to the ISO week
+				 * number but without the century.
+				 */
+			if (!(_conv_num(&bp, &i, 0, 99)))
+				return (NULL);
+			continue;
 
-        case 'U':   /* The week of year, beginning on sunday. */
-        case 'W':   /* The week of year, beginning on monday. */
-            _LEGAL_ALT(_ALT_O);
-            /*
-             * XXX This is bogus, as we can not assume any valid
-             * information present in the tm structure at this
-             * point to calculate a real value, so just check the
-             * range for now.
-             */
-             if (!(_conv_num(&bp, &i, 0, 53)))
-                return (NULL);
-             break;
+		case 'G':	/* The year corresponding to the ISO week
+				 * number with century.
+				 */
+			do
+				bp++;
+			while (isdigit(*bp));
+			continue;
 
-        case 'w':   /* The day of week, beginning on sunday. */
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &tm->tm_wday, 0, 6)))
-                return (NULL);
-            break;
+		case 'V':	/* The ISO 8601:1988 week number as decimal */
+			if (!(_conv_num(&bp, &i, 0, 53)))
+				return (NULL);
+			continue;
 
-        case 'u':  /* The day of week, monday = 1. */
-            _LEGAL_ALT(_ALT_O);
-            if (!(_conv_num(&bp, &i, 1, 7)))
-                return (NULL);
-            tm->tm_wday = i % 7;
-            continue;
+		case 'Y':	/* The year. */
+			_LEGAL_ALT(_ALT_E);
+			if (!(_conv_num(&bp, &i, 0, 9999)))
+				return (NULL);
 
-        case 'g':  /* The year corresponding to the ISO week
-                    * number but without the century.
-                    */
-            if (!(_conv_num(&bp, &i, 0, 99)))
-                return (NULL);
-            continue;
+			relyear = -1;
+			tm->tm_year = i - TM_YEAR_BASE;
+			fields |= FIELD_TM_YEAR;
+			break;
 
-        case 'G':  /* The year corresponding to the ISO week
-                    * number with century.
-                    */
-            do
-                bp++;
-            while (isdigit(*bp));
-            continue;
-
-        case 'V':  /* The ISO 8601:1988 week number as decimal */
-            if (!(_conv_num(&bp, &i, 0, 53)))
-                return (NULL);
-            continue;
-
-        case 'Y':   /* The year. */
-            _LEGAL_ALT(_ALT_E);
-            if (!(_conv_num(&bp, &i, 0, 9999)))
-                return (NULL);
-
-            cr->relyear = -1;
-            tm->tm_year = i - TM_YEAR_BASE;
-            break;
-
-        case 'y':   /* The year within the century (2 digits). */
-            _LEGAL_ALT(_ALT_E | _ALT_O);
-            if (!(_conv_num(&bp, &cr->relyear, 0, 99)))
-                return (NULL);
-            break;
+		case 'y':	/* The year within the century (2 digits). */
+			_LEGAL_ALT(_ALT_E | _ALT_O);
+			if (!(_conv_num(&bp, &relyear, 0, 99)))
+				return (NULL);
+			break;
 
 		case 'Z':
 			tzset();
@@ -548,42 +526,78 @@
 			tm->tm_zone = NULL;	/* XXX */
 			continue;
 
-        /*
-         * Miscellaneous conversions.
-         */
-        case 'n':   /* Any kind of white-space. */
-        case 't':
-            _LEGAL_ALT(0);
-            while (isspace(*bp))
-                bp++;
-            break;
+		/*
+		 * Miscellaneous conversions.
+		 */
+		case 'n':	/* Any kind of white-space. */
+		case 't':
+			_LEGAL_ALT(0);
+			while (isspace(*bp))
+				bp++;
+			break;
 
 
-        default:    /* Unknown/unsupported conversion. */
-            return (NULL);
-        }
+		default:	/* Unknown/unsupported conversion. */
+			return (NULL);
+		}
 
 
-    }
+	}
 
-    /*
-     * We need to evaluate the two digit year spec (%y)
-     * last as we can get a century spec (%C) at any time.
-     */
-    if (cr->relyear != -1) {
-        if (cr->century == TM_YEAR_BASE) {
-            if (cr->relyear <= 68)
-                tm->tm_year = cr->relyear + 2000 - TM_YEAR_BASE;
-            else
-                tm->tm_year = cr->relyear + 1900 - TM_YEAR_BASE;
-        } else {
-            tm->tm_year = cr->relyear + cr->century - TM_YEAR_BASE;
-        }
-    }
+	/*
+	 * We need to evaluate the two digit year spec (%y)
+	 * last as we can get a century spec (%C) at any time.
+	 */
+	if (relyear != -1) {
+		if (century == TM_YEAR_BASE) {
+			if (relyear <= 68)
+				tm->tm_year = relyear + 2000 - TM_YEAR_BASE;
+			else
+				tm->tm_year = relyear + 1900 - TM_YEAR_BASE;
+		} else {
+			tm->tm_year = relyear + century - TM_YEAR_BASE;
+		}
+		fields |= FIELD_TM_YEAR;
+	}
 
-    return (unsigned char*)bp;
+	/* Compute some missing values when possible. */
+	if (fields & FIELD_TM_YEAR) {
+		const int year = tm->tm_year + TM_YEAR_BASE;
+		const int *mon_lens = mon_lengths[isleap(year)];
+		if (!(fields & FIELD_TM_YDAY) &&
+		    (fields & FIELD_TM_MON) && (fields & FIELD_TM_MDAY)) {
+			tm->tm_yday = tm->tm_mday - 1;
+			for (i = 0; i < tm->tm_mon; i++)
+				tm->tm_yday += mon_lens[i];
+			fields |= FIELD_TM_YDAY;
+		}
+		if (fields & FIELD_TM_YDAY) {
+			int days = tm->tm_yday;
+			if (!(fields & FIELD_TM_WDAY)) {
+				tm->tm_wday = EPOCH_WDAY +
+				    ((year - EPOCH_YEAR) % DAYSPERWEEK) *
+				    (DAYSPERNYEAR % DAYSPERWEEK) +
+				    leaps_thru_end_of(year - 1) -
+				    leaps_thru_end_of(EPOCH_YEAR - 1) +
+				    tm->tm_yday;
+				tm->tm_wday %= DAYSPERWEEK;
+				if (tm->tm_wday < 0)
+					tm->tm_wday += DAYSPERWEEK;
+			}
+			if (!(fields & FIELD_TM_MON)) {
+				tm->tm_mon = 0;
+				while (tm->tm_mon < MONSPERYEAR && days >= mon_lens[tm->tm_mon])
+					days -= mon_lens[tm->tm_mon++];
+			}
+			if (!(fields & FIELD_TM_MDAY))
+				tm->tm_mday = days + 1;
+		}
+	}
+
+	return ((char *)bp);
 }
 
+
 static int
 _conv_num(const unsigned char **buf, int *dest, int llim, int ulim)
 {
@@ -607,6 +621,30 @@
 	return (1);
 }
 
+static int
+epoch_to_tm(const unsigned char **buf, struct tm *tm)
+{
+	int saved_errno = errno;
+	int ret = 0;
+	time_t secs;
+	char *ep;
+
+	errno = 0;
+	secs = strtoll(*buf, &ep, 10);
+	if (*buf == (unsigned char *)ep)
+		goto done;
+	if (secs < 0 ||
+	    secs == LLONG_MAX && errno == ERANGE)
+		goto done;
+	if (localtime_r(&secs, tm) == NULL)
+		goto done;
+	ret = 1;
+done:
+	*buf = ep;
+	errno = saved_errno;
+	return (ret);
+}
+
 static const u_char *
 _find_string(const u_char *bp, int *tgt, const char * const *n1,
 		const char * const *n2, int c)
@@ -629,6 +667,9 @@
 	return NULL;
 }
 
-char* strptime_l(const char* buf, const char* fmt, struct tm* tm, locale_t l) {
-  return strptime(buf, fmt, tm);
+static int
+leaps_thru_end_of(const int y)
+{
+	return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
+		-(leaps_thru_end_of(-(y + 1)) + 1);
 }
diff --git a/libc/tzcode/tzfile.h b/libc/tzcode/tzfile.h
index c5f9967..7ac8b51 100644
--- a/libc/tzcode/tzfile.h
+++ b/libc/tzcode/tzfile.h
@@ -22,15 +22,15 @@
 */
 
 #ifndef TZDIR
-#define TZDIR	"/usr/share/zoneinfo" /* Time zone object file directory */
+# define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */
 #endif /* !defined TZDIR */
 
 #ifndef TZDEFAULT
-#define TZDEFAULT	"/etc/localtime"
+# define TZDEFAULT "/etc/localtime"
 #endif /* !defined TZDEFAULT */
 
 #ifndef TZDEFRULES
-#define TZDEFRULES	"posixrules"
+# define TZDEFRULES "posixrules"
 #endif /* !defined TZDEFRULES */
 
 
@@ -103,21 +103,25 @@
 */
 
 #ifndef TZ_MAX_TIMES
-#define TZ_MAX_TIMES	2000
+/* This must be at least 242 for Europe/London with 'zic -b fat'.  */
+# define TZ_MAX_TIMES 2000
 #endif /* !defined TZ_MAX_TIMES */
 
 #ifndef TZ_MAX_TYPES
-/* This must be at least 17 for Europe/Samara and Europe/Vilnius.  */
-#define TZ_MAX_TYPES	256 /* Limited by what (unsigned char)'s can hold */
+/* This must be at least 18 for Europe/Vilnius with 'zic -b fat'.  */
+# define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
 #endif /* !defined TZ_MAX_TYPES */
 
 #ifndef TZ_MAX_CHARS
-#define TZ_MAX_CHARS	50	/* Maximum number of abbreviation characters */
+/* This must be at least 40 for America/Anchorage.  */
+# define TZ_MAX_CHARS 50	/* Maximum number of abbreviation characters */
 				/* (limited by what unsigned chars can hold) */
 #endif /* !defined TZ_MAX_CHARS */
 
 #ifndef TZ_MAX_LEAPS
-#define TZ_MAX_LEAPS	50	/* Maximum number of leap second corrections */
+/* This must be at least 27 for leap seconds from 1972 through mid-2023.
+   There's a plan to discontinue leap seconds by 2035.  */
+# define TZ_MAX_LEAPS 50	/* Maximum number of leap second corrections */
 #endif /* !defined TZ_MAX_LEAPS */
 
 #define SECSPERMIN	60
diff --git a/libc/upstream-freebsd/lib/libc/string/bcopy.c b/libc/upstream-freebsd/lib/libc/string/bcopy.c
new file mode 100644
index 0000000..84715d0
--- /dev/null
+++ b/libc/upstream-freebsd/lib/libc/string/bcopy.c
@@ -0,0 +1,137 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)bcopy.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+
+typedef	intptr_t word;		/* "word" used for optimal copy speed */
+
+#define	wsize	sizeof(word)
+#define	wmask	(wsize - 1)
+
+/*
+ * Copy a block of memory, handling overlap.
+ * This is the routine that actually implements
+ * (the portable versions of) bcopy, memcpy, and memmove.
+ */
+#if defined(MEMCOPY) || defined(MEMMOVE)
+#include <string.h>
+
+void *
+#ifdef MEMCOPY
+memcpy
+#else
+memmove
+#endif
+(void *dst0, const void *src0, size_t length)
+#else
+#include <strings.h>
+
+void
+bcopy(const void *src0, void *dst0, size_t length)
+#endif
+{
+	char *dst = dst0;
+	const char *src = src0;
+	size_t t;
+
+	if (length == 0 || dst == src)		/* nothing to do */
+		goto done;
+
+	/*
+	 * Macros: loop-t-times; and loop-t-times, t>0
+	 */
+#define	TLOOP(s) if (t) TLOOP1(s)
+#define	TLOOP1(s) do { s; } while (--t)
+
+	if ((unsigned long)dst < (unsigned long)src) {
+		/*
+		 * Copy forward.
+		 */
+		t = (uintptr_t)src;	/* only need low bits */
+		if ((t | (uintptr_t)dst) & wmask) {
+			/*
+			 * Try to align operands.  This cannot be done
+			 * unless the low bits match.
+			 */
+			if ((t ^ (uintptr_t)dst) & wmask || length < wsize)
+				t = length;
+			else
+				t = wsize - (t & wmask);
+			length -= t;
+			TLOOP1(*dst++ = *src++);
+		}
+		/*
+		 * Copy whole words, then mop up any trailing bytes.
+		 */
+		t = length / wsize;
+		TLOOP(*(word *)(void *)dst = *(const word *)(const void *)src;
+		    src += wsize; dst += wsize);
+		t = length & wmask;
+		TLOOP(*dst++ = *src++);
+	} else {
+		/*
+		 * Copy backwards.  Otherwise essentially the same.
+		 * Alignment works as before, except that it takes
+		 * (t&wmask) bytes to align, not wsize-(t&wmask).
+		 */
+		src += length;
+		dst += length;
+		t = (uintptr_t)src;
+		if ((t | (uintptr_t)dst) & wmask) {
+			if ((t ^ (uintptr_t)dst) & wmask || length <= wsize)
+				t = length;
+			else
+				t &= wmask;
+			length -= t;
+			TLOOP1(*--dst = *--src);
+		}
+		t = length / wsize;
+		TLOOP(src -= wsize; dst -= wsize;
+		    *(word *)(void *)dst = *(const word *)(const void *)src);
+		t = length & wmask;
+		TLOOP(*--dst = *--src);
+	}
+done:
+#if defined(MEMCOPY) || defined(MEMMOVE)
+	return (dst0);
+#else
+	return;
+#endif
+}
diff --git a/libc/upstream-freebsd/lib/libc/string/memcmp.c b/libc/upstream-freebsd/lib/libc/string/memcmp.c
new file mode 100644
index 0000000..c8d5d92
--- /dev/null
+++ b/libc/upstream-freebsd/lib/libc/string/memcmp.c
@@ -0,0 +1,58 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)memcmp.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <string.h>
+
+/*
+ * Compare memory regions.
+ */
+int
+memcmp(const void *s1, const void *s2, size_t n)
+{
+	if (n != 0) {
+		const unsigned char *p1 = s1, *p2 = s2;
+
+		do {
+			if (*p1++ != *p2++)
+				return (*--p1 - *--p2);
+		} while (--n != 0);
+	}
+	return (0);
+}
diff --git a/libc/upstream-freebsd/lib/libc/string/memcpy.c b/libc/upstream-freebsd/lib/libc/string/memcpy.c
new file mode 100644
index 0000000..ed03856
--- /dev/null
+++ b/libc/upstream-freebsd/lib/libc/string/memcpy.c
@@ -0,0 +1,5 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define	MEMCOPY
+#include "bcopy.c"
diff --git a/libc/upstream-freebsd/lib/libc/string/memmove.c b/libc/upstream-freebsd/lib/libc/string/memmove.c
new file mode 100644
index 0000000..05cf75a
--- /dev/null
+++ b/libc/upstream-freebsd/lib/libc/string/memmove.c
@@ -0,0 +1,5 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define	MEMMOVE
+#include "bcopy.c"
diff --git a/libc/upstream-freebsd/lib/libc/string/memset.c b/libc/upstream-freebsd/lib/libc/string/memset.c
new file mode 100644
index 0000000..e2d4027
--- /dev/null
+++ b/libc/upstream-freebsd/lib/libc/string/memset.c
@@ -0,0 +1,133 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Hibler and Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)memset.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+
+#include <limits.h>
+
+#define	wsize	sizeof(u_long)
+#define	wmask	(wsize - 1)
+
+#ifdef BZERO
+#include <strings.h>
+
+#define	RETURN	return
+#define	VAL	0
+#define	WIDEVAL	0
+
+void
+bzero(void *dst0, size_t length)
+#else
+#include <string.h>
+
+#define	RETURN	return (dst0)
+#define	VAL	c0
+#define	WIDEVAL	c
+
+void *
+memset(void *dst0, int c0, size_t length)
+#endif
+{
+	size_t t;
+#ifndef BZERO
+	u_long c;
+#endif
+	u_char *dst;
+
+	dst = dst0;
+	/*
+	 * If not enough words, just fill bytes.  A length >= 2 words
+	 * guarantees that at least one of them is `complete' after
+	 * any necessary alignment.  For instance:
+	 *
+	 *	|-----------|-----------|-----------|
+	 *	|00|01|02|03|04|05|06|07|08|09|0A|00|
+	 *	          ^---------------------^
+	 *		 dst		 dst+length-1
+	 *
+	 * but we use a minimum of 3 here since the overhead of the code
+	 * to do word writes is substantial.
+	 *
+	 * TODO: This threshold might not be sensible for 64-bit u_long.
+	 * We should benchmark and revisit this decision.
+	 */
+	if (length < 3 * wsize) {
+		while (length != 0) {
+			*dst++ = VAL;
+			--length;
+		}
+		RETURN;
+	}
+
+#ifndef BZERO
+	if ((c = (u_char)c0) != 0) {	/* Fill the word. */
+		c = (c << 8) | c;	/* u_long is 16 bits. */
+#if ULONG_MAX > 0xffff
+		c = (c << 16) | c;	/* u_long is 32 bits. */
+#endif
+#if ULONG_MAX > 0xffffffff
+		c = (c << 32) | c;	/* u_long is 64 bits. */
+#endif
+	}
+#endif
+	/* Align destination by filling in bytes. */
+	if ((t = (long)dst & wmask) != 0) {
+		t = wsize - t;
+		length -= t;
+		do {
+			*dst++ = VAL;
+		} while (--t != 0);
+	}
+
+	/* Fill words.  Length was >= 2*words so we know t >= 1 here. */
+	t = length / wsize;
+	do {
+		*(u_long *)(void *)dst = WIDEVAL;
+		dst += wsize;
+	} while (--t != 0);
+
+	/* Mop up trailing bytes, if any. */
+	t = length & wmask;
+	if (t != 0)
+		do {
+			*dst++ = VAL;
+		} while (--t != 0);
+	RETURN;
+}
diff --git a/libc/upstream-netbsd/android/include/netbsd-compat.h b/libc/upstream-netbsd/android/include/netbsd-compat.h
index 5dd086e..a625f06 100644
--- a/libc/upstream-netbsd/android/include/netbsd-compat.h
+++ b/libc/upstream-netbsd/android/include/netbsd-compat.h
@@ -43,6 +43,8 @@
 #include <stddef.h>
 int reallocarr(void*, size_t, size_t);
 
+#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
+
 /* Use appropriate shell depending on process's executable. */
 __LIBC_HIDDEN__ extern const char* __bionic_get_shell_path();
 #define _PATH_BSHELL __bionic_get_shell_path()
diff --git a/libc/upstream-netbsd/lib/libc/include/isc/list.h b/libc/upstream-netbsd/lib/libc/include/isc/list.h
index 46f2e79..76dc097 100644
--- a/libc/upstream-netbsd/lib/libc/include/isc/list.h
+++ b/libc/upstream-netbsd/lib/libc/include/isc/list.h
@@ -1,4 +1,4 @@
-/*	$NetBSD: list.h,v 1.5 2009/04/12 17:07:16 christos Exp $	*/
+/*	$NetBSD: list.h,v 1.6 2022/04/19 20:32:15 rillig Exp $	*/
 
 /*
  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
@@ -23,14 +23,14 @@
 
 #define LIST(type) struct { type *head, *tail; }
 #define INIT_LIST(list) \
-	do { (list).head = NULL; (list).tail = NULL; } while (/*CONSTCOND*/0)
+	do { (list).head = NULL; (list).tail = NULL; } while (0)
 
 #define LINK(type) struct { type *prev, *next; }
 #define INIT_LINK_TYPE(elt, link, type) \
 	do { \
 		(elt)->link.prev = (type *)(-1); \
 		(elt)->link.next = (type *)(-1); \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 #define INIT_LINK(elt, link) \
 	INIT_LINK_TYPE(elt, link, void)
 #define LINKED(elt, link) ((void *)((elt)->link.prev) != (void *)(-1) && \
@@ -50,7 +50,7 @@
 		(elt)->link.prev = NULL; \
 		(elt)->link.next = (list).head; \
 		(list).head = (elt); \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 
 #define APPEND(list, elt, link) \
 	do { \
@@ -62,7 +62,7 @@
 		(elt)->link.prev = (list).tail; \
 		(elt)->link.next = NULL; \
 		(list).tail = (elt); \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 
 #define UNLINK_TYPE(list, elt, link, type) \
 	do { \
@@ -80,7 +80,7 @@
 			(list).head = (elt)->link.next; \
 		} \
 		INIT_LINK_TYPE(elt, link, type); \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 #define UNLINK(list, elt, link) \
 	UNLINK_TYPE(list, elt, link, void)
 
@@ -98,7 +98,7 @@
 			(elt)->link.prev->link.next = (elt); \
 			(elt)->link.next = (before); \
 		} \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 
 #define INSERT_AFTER(list, after, elt, link) \
 	do { \
@@ -111,7 +111,7 @@
 			(elt)->link.next->link.prev = (elt); \
 			(elt)->link.prev = (after); \
 		} \
-	} while (/*CONSTCOND*/0)
+	} while (0)
 
 #define ENQUEUE(list, elt, link) APPEND(list, elt, link)
 #define DEQUEUE(list, elt, link) UNLINK(list, elt, link)
diff --git a/libc/upstream-netbsd/lib/libc/regex/cclass.h b/libc/upstream-netbsd/lib/libc/regex/cclass.h
deleted file mode 100644
index 3ab2ccb..0000000
--- a/libc/upstream-netbsd/lib/libc/regex/cclass.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*	$NetBSD: cclass.h,v 1.7 2003/08/07 16:43:19 agc Exp $	*/
-
-/*-
- * Copyright (c) 1992, 1993, 1994
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)cclass.h	8.3 (Berkeley) 3/20/94
- */
-
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)cclass.h	8.3 (Berkeley) 3/20/94
- */
-
-/* character-class table */
-static const struct cclass {
-	const char *name;
-	const char *chars;
-	const char *multis;
-} cclasses[] = {
-	{ "alnum",	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
-0123456789",				"" },
-	{ "alpha",	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
-					"" },
-	{ "blank",	" \t",		"" },
-	{ "cntrl",	"\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
-\25\26\27\30\31\32\33\34\35\36\37\177",	"" },
-	{ "digit",	"0123456789",	"" },
-	{ "graph",	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
-0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-					"" },
-	{ "lower",	"abcdefghijklmnopqrstuvwxyz",
-					"" },
-	{ "print",	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
-0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
-					"" },
-	{ "punct",	"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-					"" },
-	{ "space",	"\t\n\v\f\r ",	"" },
-	{ "upper",	"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
-					"" },
-	{ "xdigit",	"0123456789ABCDEFabcdef",
-					"" },
-	{ NULL,		0,		"" }
-};
diff --git a/libc/upstream-netbsd/lib/libc/regex/cname.h b/libc/upstream-netbsd/lib/libc/regex/cname.h
index 4b9ef39..47e57ac 100644
--- a/libc/upstream-netbsd/lib/libc/regex/cname.h
+++ b/libc/upstream-netbsd/lib/libc/regex/cname.h
@@ -1,6 +1,9 @@
-/*	$NetBSD: cname.h,v 1.7 2003/08/07 16:43:19 agc Exp $	*/
+/*	$NetBSD: cname.h,v 1.8 2021/02/23 22:14:59 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -32,144 +35,108 @@
  * SUCH DAMAGE.
  *
  *	@(#)cname.h	8.3 (Berkeley) 3/20/94
- */
-
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)cname.h	8.3 (Berkeley) 3/20/94
+ * $FreeBSD: head/lib/libc/regex/cname.h 326025 2017-11-20 19:49:47Z pfg $
  */
 
 /* character-name table */
-static const struct cname {
+static struct cname {
 	const char *name;
 	char code;
 } cnames[] = {
-	{ "NUL",			'\0' },
-	{ "SOH",			'\001' },
-	{ "STX",			'\002' },
-	{ "ETX",			'\003' },
-	{ "EOT",			'\004' },
-	{ "ENQ",			'\005' },
-	{ "ACK",			'\006' },
-	{ "BEL",			'\007' },
-	{ "alert",			'\007' },
-	{ "BS",				'\010' },
-	{ "backspace",			'\b' },
-	{ "HT",				'\011' },
-	{ "tab",			'\t' },
-	{ "LF",				'\012' },
-	{ "newline",			'\n' },
-	{ "VT",				'\013' },
-	{ "vertical-tab",		'\v' },
-	{ "FF",				'\014' },
-	{ "form-feed",			'\f' },
-	{ "CR",				'\015' },
-	{ "carriage-return",		'\r' },
-	{ "SO",				'\016' },
-	{ "SI",				'\017' },
-	{ "DLE",			'\020' },
-	{ "DC1",			'\021' },
-	{ "DC2",			'\022' },
-	{ "DC3",			'\023' },
-	{ "DC4",			'\024' },
-	{ "NAK",			'\025' },
-	{ "SYN",			'\026' },
-	{ "ETB",			'\027' },
-	{ "CAN",			'\030' },
-	{ "EM",				'\031' },
-	{ "SUB",			'\032' },
-	{ "ESC",			'\033' },
-	{ "IS4",			'\034' },
-	{ "FS",				'\034' },
-	{ "IS3",			'\035' },
-	{ "GS",				'\035' },
-	{ "IS2",			'\036' },
-	{ "RS",				'\036' },
-	{ "IS1",			'\037' },
-	{ "US",				'\037' },
-	{ "space",			' ' },
-	{ "exclamation-mark",		'!' },
-	{ "quotation-mark",		'"' },
-	{ "number-sign",		'#' },
-	{ "dollar-sign",		'$' },
-	{ "percent-sign",		'%' },
-	{ "ampersand",			'&' },
-	{ "apostrophe",			'\'' },
-	{ "left-parenthesis",		'(' },
-	{ "right-parenthesis",		')' },
-	{ "asterisk",			'*' },
-	{ "plus-sign",			'+' },
-	{ "comma",			',' },
-	{ "hyphen",			'-' },
-	{ "hyphen-minus",		'-' },
-	{ "period",			'.' },
-	{ "full-stop",			'.' },
-	{ "slash",			'/' },
-	{ "solidus",			'/' },
-	{ "zero",			'0' },
-	{ "one",			'1' },
-	{ "two",			'2' },
-	{ "three",			'3' },
-	{ "four",			'4' },
-	{ "five",			'5' },
-	{ "six",			'6' },
-	{ "seven",			'7' },
-	{ "eight",			'8' },
-	{ "nine",			'9' },
-	{ "colon",			':' },
-	{ "semicolon",			';' },
-	{ "less-than-sign",		'<' },
-	{ "equals-sign",		'=' },
-	{ "greater-than-sign",		'>' },
-	{ "question-mark",		'?' },
-	{ "commercial-at",		'@' },
-	{ "left-square-bracket",	'[' },
-	{ "backslash",			'\\' },
-	{ "reverse-solidus",		'\\' },
-	{ "right-square-bracket",	']' },
-	{ "circumflex",			'^' },
-	{ "circumflex-accent",		'^' },
-	{ "underscore",			'_' },
-	{ "low-line",			'_' },
-	{ "grave-accent",		'`' },
-	{ "left-brace",			'{' },
-	{ "left-curly-bracket",		'{' },
-	{ "vertical-line",		'|' },
-	{ "right-brace",		'}' },
-	{ "right-curly-bracket",	'}' },
-	{ "tilde",			'~' },
-	{ "DEL",			'\177' },
-	{ NULL,				0 },
+	{"NUL",			'\0'},
+	{"SOH",			'\001'},
+	{"STX",			'\002'},
+	{"ETX",			'\003'},
+	{"EOT",			'\004'},
+	{"ENQ",			'\005'},
+	{"ACK",			'\006'},
+	{"BEL",			'\007'},
+	{"alert",		'\007'},
+	{"BS",			'\010'},
+	{"backspace",		'\b'},
+	{"HT",			'\011'},
+	{"tab",			'\t'},
+	{"LF",			'\012'},
+	{"newline",		'\n'},
+	{"VT",			'\013'},
+	{"vertical-tab",	'\v'},
+	{"FF",			'\014'},
+	{"form-feed",		'\f'},
+	{"CR",			'\015'},
+	{"carriage-return",	'\r'},
+	{"SO",			'\016'},
+	{"SI",			'\017'},
+	{"DLE",			'\020'},
+	{"DC1",			'\021'},
+	{"DC2",			'\022'},
+	{"DC3",			'\023'},
+	{"DC4",			'\024'},
+	{"NAK",			'\025'},
+	{"SYN",			'\026'},
+	{"ETB",			'\027'},
+	{"CAN",			'\030'},
+	{"EM",			'\031'},
+	{"SUB",			'\032'},
+	{"ESC",			'\033'},
+	{"IS4",			'\034'},
+	{"FS",			'\034'},
+	{"IS3",			'\035'},
+	{"GS",			'\035'},
+	{"IS2",			'\036'},
+	{"RS",			'\036'},
+	{"IS1",			'\037'},
+	{"US",			'\037'},
+	{"space",		' '},
+	{"exclamation-mark",	'!'},
+	{"quotation-mark",	'"'},
+	{"number-sign",		'#'},
+	{"dollar-sign",		'$'},
+	{"percent-sign",	'%'},
+	{"ampersand",		'&'},
+	{"apostrophe",		'\''},
+	{"left-parenthesis",	'('},
+	{"right-parenthesis",	')'},
+	{"asterisk",		'*'},
+	{"plus-sign",		'+'},
+	{"comma",		','},
+	{"hyphen",		'-'},
+	{"hyphen-minus",	'-'},
+	{"period",		'.'},
+	{"full-stop",		'.'},
+	{"slash",		'/'},
+	{"solidus",		'/'},
+	{"zero",		'0'},
+	{"one",			'1'},
+	{"two",			'2'},
+	{"three",		'3'},
+	{"four",		'4'},
+	{"five",		'5'},
+	{"six",			'6'},
+	{"seven",      		'7'},
+	{"eight",		'8'},
+	{"nine",		'9'},
+	{"colon",		':'},
+	{"semicolon",		';'},
+	{"less-than-sign",	'<'},
+	{"equals-sign",		'='},
+	{"greater-than-sign",	'>'},
+	{"question-mark",	'?'},
+	{"commercial-at",	'@'},
+	{"left-square-bracket",	'['},
+	{"backslash",		'\\'},
+	{"reverse-solidus",	'\\'},
+	{"right-square-bracket",']'},
+	{"circumflex",		'^'},
+	{"circumflex-accent",	'^'},
+	{"underscore",		'_'},
+	{"low-line",		'_'},
+	{"grave-accent",	'`'},
+	{"left-brace",		'{'},
+	{"left-curly-bracket",	'{'},
+	{"vertical-line",	'|'},
+	{"right-brace",		'}'},
+	{"right-curly-bracket",	'}'},
+	{"tilde",		'~'},
+	{"DEL",	'\177'},
+	{NULL,	0}
 };
diff --git a/libc/upstream-netbsd/lib/libc/regex/engine.c b/libc/upstream-netbsd/lib/libc/regex/engine.c
index 2a800d4..ca8b24d 100644
--- a/libc/upstream-netbsd/lib/libc/regex/engine.c
+++ b/libc/upstream-netbsd/lib/libc/regex/engine.c
@@ -1,6 +1,9 @@
-/*	$NetBSD: engine.c,v 1.24 2012/03/13 21:13:42 christos Exp $	*/
+/* $NetBSD: engine.c,v 1.29 2021/02/25 21:47:46 christos Exp $ */
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -34,42 +37,13 @@
  *	@(#)engine.c	8.5 (Berkeley) 3/20/94
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)engine.c	8.5 (Berkeley) 3/20/94
- */
+#include <sys/cdefs.h>
+#ifdef __FBSDID
+__FBSDID("$FreeBSD: head/lib/libc/regex/engine.c 368358 2020-12-05 03:16:05Z kevans $");
+#endif
+__RCSID("$NetBSD: engine.c,v 1.29 2021/02/25 21:47:46 christos Exp $");
+
+#include <stdbool.h>
 
 /*
  * The matching engine and friends.  This file is #included by regexec.c
@@ -79,28 +53,37 @@
  */
 
 #ifdef SNAMES
+#define	stepback sstepback
 #define	matcher	smatcher
-#define	fast	sfast
-#define	slow	sslow
+#define	walk	swalk
 #define	dissect	sdissect
 #define	backref	sbackref
 #define	step	sstep
 #define	print	sprint
 #define	at	sat
 #define	match	smat
-#define	nope	snope
 #endif
 #ifdef LNAMES
+#define	stepback lstepback
 #define	matcher	lmatcher
-#define	fast	lfast
-#define	slow	lslow
+#define	walk	lwalk
 #define	dissect	ldissect
 #define	backref	lbackref
 #define	step	lstep
 #define	print	lprint
 #define	at	lat
 #define	match	lmat
-#define	nope	lnope
+#endif
+#ifdef MNAMES
+#define	stepback mstepback
+#define	matcher	mmatcher
+#define	walk	mwalk
+#define	dissect	mdissect
+#define	backref	mbackref
+#define	step	mstep
+#define	print	mprint
+#define	at	mat
+#define	match	mmat
 #endif
 
 /* another structure passed up and down to avoid zillions of parameters */
@@ -118,6 +101,7 @@
 	states fresh;		/* states for a fresh start */
 	states tmp;		/* temporary */
 	states empty;		/* empty set of states */
+	mbstate_t mbs;		/* multibyte conversion state */
 };
 
 /* ========= begin header generated by ./mkh ========= */
@@ -128,27 +112,31 @@
 /* === engine.c === */
 static int matcher(struct re_guts *g, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
 static const char *dissect(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
-static const char *backref(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst, sopno lev);
-static const char *fast(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
-static const char *slow(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
-static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft);
-#define	BOL	(OUT+1)
-#define	EOL	(BOL+1)
-#define	BOLEOL	(BOL+2)
-#define	NOTHING	(BOL+3)
-#define	BOW	(BOL+4)
-#define	EOW	(BOL+5)
-#define	CODEMAX	(BOL+5)		/* highest code used */
-#define	NONCHAR(c)	((c) > CHAR_MAX)
-#define	NNONCHAR	(CODEMAX-CHAR_MAX)
+static const char *backref(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst, sopno lev, int);
+static const char *walk(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst, bool fast);
+static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_t ch, states aft, int sflags);
+#define MAX_RECURSION	100
+#define	BOL	(OUT-1)
+#define	EOL	(BOL-1)
+#define	BOLEOL	(BOL-2)
+#define	NOTHING	(BOL-3)
+#define	BOW	(BOL-4)
+#define	EOW	(BOL-5)
+#define	BADCHAR	(BOL-6)
+#define	NWBND	(BOL-7)
+#define	NONCHAR(c)	((c) <= OUT)
+/* sflags */
+#define	SBOS	0x0001
+#define	SEOS	0x0002
+
 #ifdef REDEBUG
-static void print(struct match *m, char *caption, states st, int ch, FILE *d);
+static void print(struct match *m, const char *caption, states st, int ch, FILE *d);
 #endif
 #ifdef REDEBUG
-static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst);
+static void at(struct match *m, const char *title, const char *start, const char *stop, sopno startst, sopno stopst);
 #endif
 #ifdef REDEBUG
-static char *pchar(int ch);
+static const char *pchar(int ch);
 #endif
 
 #ifdef __cplusplus
@@ -160,7 +148,6 @@
 #define	SP(t, s, c)	print(m, t, s, c, stdout)
 #define	AT(t, p1, p2, s1, s2)	at(m, t, p1, p2, s1, s2)
 #define	NOTE(str)	{ if (m->eflags&REG_TRACE) printf("=%s\n", (str)); }
-static int nope = 0;
 #else
 #define	SP(t, s, c)	/* nothing */
 #define	AT(t, p1, p2, s1, s2)	/* nothing */
@@ -168,27 +155,70 @@
 #endif
 
 /*
+ * Given a multibyte string pointed to by start, step back nchar characters
+ * from current position pointed to by cur.
+ */
+static const char *
+stepback(const char *start, const char *cur, int nchar)
+{
+#ifdef NLS
+	const char *ret;
+	size_t wc, mbc;
+	mbstate_t mbs;
+	size_t clen;
+
+	if (MB_CUR_MAX == 1)
+		goto out;
+
+	ret = cur;
+	for (wc = nchar; wc > 0; wc--) {
+		for (mbc = 1; mbc <= MB_CUR_MAX; mbc++) {
+			if ((ret - mbc) < start)
+				return (NULL);
+			memset(&mbs, 0, sizeof(mbs));
+			clen = mbrtowc(NULL, ret - mbc, mbc, &mbs);
+			if (clen != (size_t)-1 && clen != (size_t)-2)
+				break;
+		}
+		if (mbc > MB_CUR_MAX)
+			return (NULL);
+		ret -= mbc;
+	}
+
+	return (ret);
+out:
+#endif
+	return (cur - nchar) > start ? cur - nchar : NULL;
+}
+
+/*
  - matcher - the actual matching engine
- == static int matcher(struct re_guts *g, char *string, \
+ == static int matcher(struct re_guts *g, const char *string, \
  ==	size_t nmatch, regmatch_t pmatch[], int eflags);
  */
 static int			/* 0 success, REG_NOMATCH failure */
-matcher(
-    struct re_guts *g,
-    const char *string,
-    size_t nmatch,
-    regmatch_t pmatch[],
-    int eflags)
+matcher(struct re_guts *g,
+	const char *string,
+	size_t nmatch,
+	regmatch_t pmatch[],
+	int eflags)
 {
 	const char *endp;
 	size_t i;
 	struct match mv;
 	struct match *m = &mv;
-	const char *dp;
+	const char *dp = NULL;
 	const sopno gf = g->firststate+1;	/* +1 for OEND */
 	const sopno gl = g->laststate;
 	const char *start;
 	const char *stop;
+	/* Boyer-Moore algorithms variables */
+	const char *pp;
+	size_t cj, mj;
+	const char *mustfirst;
+	const char *mustlast;
+	size_t *matchjump;
+	size_t *charjump;
 	int error = 0;
 
 	_DIAGASSERT(g != NULL);
@@ -211,12 +241,46 @@
 
 	/* prescreening; this does wonders for this rather slow code */
 	if (g->must != NULL) {
-		for (dp = start; dp < stop; dp++)
-			if (*dp == g->must[0] && (size_t)(stop - dp) >= g->mlen &&
-				memcmp(dp, g->must, g->mlen) == 0)
-				break;
-		if (dp == stop)		/* we didn't find g->must */
-			return(REG_NOMATCH);
+		if (g->charjump != NULL && g->matchjump != NULL) {
+			mustfirst = g->must;
+			mustlast = g->must + g->mlen - 1;
+			charjump = g->charjump;
+			matchjump = g->matchjump;
+			pp = mustlast;
+			for (dp = start+g->mlen-1; dp < stop;) {
+				/* Fast skip non-matches */
+				while (dp < stop && charjump[(int)*dp])
+					dp += charjump[(int)*dp];
+
+				if (dp >= stop)
+					break;
+
+				/* Greedy matcher */
+				/* We depend on not being used for
+				 * for strings of length 1
+				 */
+				while (*--dp == *--pp && pp != mustfirst);
+
+				if (*dp == *pp)
+					break;
+
+				/* Jump to next possible match */
+				mj = matchjump[pp - mustfirst];
+				cj = charjump[(int)*dp];
+				dp += (cj < mj ? mj : cj);
+				pp = mustlast;
+			}
+			if (pp != mustfirst)
+				return(REG_NOMATCH);
+		} else {
+			for (dp = start; dp < stop; dp++)
+				if (*dp == g->must[0] &&
+				    (size_t)(stop - dp) >= g->mlen &&
+				    memcmp(dp, g->must, (size_t)g->mlen) == 0)
+					break;
+			if (dp == stop)		/* we didn't find g->must */
+				return(REG_NOMATCH);
+		}
 	}
 
 	/* match struct setup */
@@ -233,10 +297,22 @@
 	SETUP(m->tmp);
 	SETUP(m->empty);
 	CLEAR(m->empty);
+	ZAPSTATE(&m->mbs);
+
+	/* Adjust start according to moffset, to speed things up */
+	if (dp != NULL && g->moffset > -1) {
+		const char *nstart;
+
+		nstart = stepback(start, dp, g->moffset);
+		if (nstart != NULL)
+			start = nstart;
+	}
+
+	SP("mloop", m->st, *start);
 
 	/* this loop does only one repetition except for backrefs */
 	for (;;) {
-		endp = fast(m, start, stop, gf, gl);
+		endp = walk(m, start, stop, gf, gl, true);
 		if (endp == NULL) {		/* a miss */
 			error = REG_NOMATCH;
 			goto done;
@@ -248,11 +324,12 @@
 		assert(m->coldp != NULL);
 		for (;;) {
 			NOTE("finding start");
-			endp = slow(m, m->coldp, stop, gf, gl);
+			endp = walk(m, m->coldp, stop, gf, gl, false);
 			if (endp != NULL)
 				break;
 			assert(m->coldp < m->endp);
-			m->coldp++;
+			m->coldp += XMBRTOWC(NULL, m->coldp,
+			    (size_t)(m->endp - m->coldp), &m->mbs, 0);
 		}
 		if (nmatch == 1 && !g->backrefs)
 			break;		/* no further info needed */
@@ -266,20 +343,20 @@
 			goto done;
 		}
 		for (i = 1; i <= m->g->nsub; i++)
-			m->pmatch[i].rm_so = m->pmatch[i].rm_eo = (regoff_t)-1;
+			m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
 		if (!g->backrefs && !(m->eflags&REG_BACKR)) {
 			NOTE("dissecting");
 			dp = dissect(m, m->coldp, endp, gf, gl);
 		} else {
 			if (g->nplus > 0 && m->lastpos == NULL)
 				m->lastpos = malloc((g->nplus+1) *
-							sizeof(const char *));
+						sizeof(const char *));
 			if (g->nplus > 0 && m->lastpos == NULL) {
 				error = REG_ESPACE;
 				goto done;
 			}
 			NOTE("backref dissect");
-			dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+			dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
 		}
 		if (dp != NULL)
 			break;
@@ -291,7 +368,7 @@
 			if (dp != NULL || endp <= m->coldp)
 				break;		/* defeat */
 			NOTE("backoff");
-			endp = slow(m, m->coldp, endp-1, gf, gl);
+			endp = walk(m, m->coldp, endp-1, gf, gl, false);
 			if (endp == NULL)
 				break;		/* defeat */
 			/* try it on a shorter possibility */
@@ -302,7 +379,7 @@
 			}
 #endif
 			NOTE("backoff dissect");
-			dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+			dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
 		}
 		assert(dp == NULL || dp == endp);
 		if (dp != NULL)		/* found a shorter one */
@@ -310,7 +387,9 @@
 
 		/* despite initial appearances, there is no match here */
 		NOTE("false alarm");
-		start = m->coldp + 1;	/* recycle starting later */
+		/* recycle starting later */
+		start = m->coldp + XMBRTOWC(NULL, m->coldp,
+		    (size_t)(stop - m->coldp), &m->mbs, 0);
 		assert(start <= stop);
 	}
 
@@ -337,7 +416,7 @@
 		m->pmatch = NULL;
 	}
 	if (m->lastpos != NULL) {
-		free(m->lastpos);
+		free(__UNCONST(m->lastpos));
 		m->lastpos = NULL;
 	}
 	STATETEARDOWN(m);
@@ -349,29 +428,27 @@
  == static const char *dissect(struct match *m, const char *start, \
  ==	const char *stop, sopno startst, sopno stopst);
  */
-static const char *			/* == stop (success) always */
+static const char *		/* == stop (success) always */
 dissect(
-    struct match *m,
-    const char *start,
-    const char *stop,
-    sopno startst,
-    sopno stopst)
+	struct match *m,
+	const char *start,
+	const char *stop,
+	sopno startst,
+	sopno stopst)
 {
 	int i;
-	sopno ss;	/* start sop of current subRE */
-	sopno es;	/* end sop of current subRE */
-	const char *sp;	/* start of string matched by it */
-	const char *stp; /* string matched by it cannot pass here */
-	const char *rest; /* start of rest of string */
-	const char *tail; /* string unmatched by rest of RE */
-	sopno ssub;	/* start sop of subsubRE */
-	sopno esub;	/* end sop of subsubRE */
-	const char *ssp; /* start of string matched by subsubRE */
-	const char *sep; /* end of string matched by subsubRE */
-	const char *oldssp; /* previous ssp */
-#ifndef NDEBUG
-	const char *dp;
-#endif
+	sopno ss;		/* start sop of current subRE */
+	sopno es;		/* end sop of current subRE */
+	const char *sp;		/* start of string matched by it */
+	const char *stp;	/* string matched by it cannot pass here */
+	const char *rest;	/* start of rest of string */
+	const char *tail;	/* string unmatched by rest of RE */
+	sopno ssub;		/* start sop of subsubRE */
+	sopno esub;		/* end sop of subsubRE */
+	const char *ssp;	/* start of string matched by subsubRE */
+	const char *sep;	/* end of string matched by subsubRE */
+	const char *oldssp;	/* previous ssp */
+	const char *dp __unused;
 
 	_DIAGASSERT(m != NULL);
 	_DIAGASSERT(start != NULL);
@@ -400,16 +477,22 @@
 			assert(nope);
 			break;
 		case OCHAR:
-			sp++;
+			sp += XMBRTOWC(NULL, sp, (size_t)(stop - start),
+			    &m->mbs, 0);
 			break;
 		case OBOL:
 		case OEOL:
 		case OBOW:
 		case OEOW:
+		case OBOS:
+		case OEOS:
+		case OWBND:
+		case ONWBND:
 			break;
 		case OANY:
 		case OANYOF:
-			sp++;
+			sp += XMBRTOWC(NULL, sp, (size_t)(stop - start),
+			    &m->mbs, 0);
 			break;
 		case OBACK_:
 		case O_BACK:
@@ -420,10 +503,10 @@
 			stp = stop;
 			for (;;) {
 				/* how long could this one be? */
-				rest = slow(m, sp, stp, ss, es);
+				rest = walk(m, sp, stp, ss, es, false);
 				assert(rest != NULL);	/* it did match */
 				/* could the rest match the rest? */
-				tail = slow(m, rest, stop, es, stopst);
+				tail = walk(m, rest, stop, es, stopst, false);
 				if (tail == stop)
 					break;		/* yes! */
 				/* no -- try a shorter match for this one */
@@ -433,13 +516,8 @@
 			ssub = ss + 1;
 			esub = es - 1;
 			/* did innards match? */
-			if (slow(m, sp, rest, ssub, esub) != NULL) {
-#ifdef NDEBUG
-				(void)
-#else
-				dp = 
-#endif
-				    dissect(m, sp, rest, ssub, esub);
+			if (walk(m, sp, rest, ssub, esub, false) != NULL) {
+				dp = dissect(m, sp, rest, ssub, esub);
 				assert(dp == rest);
 			} else		/* no */
 				assert(sp == rest);
@@ -449,10 +527,10 @@
 			stp = stop;
 			for (;;) {
 				/* how long could this one be? */
-				rest = slow(m, sp, stp, ss, es);
+				rest = walk(m, sp, stp, ss, es, false);
 				assert(rest != NULL);	/* it did match */
 				/* could the rest match the rest? */
-				tail = slow(m, rest, stop, es, stopst);
+				tail = walk(m, rest, stop, es, stopst, false);
 				if (tail == stop)
 					break;		/* yes! */
 				/* no -- try a shorter match for this one */
@@ -464,7 +542,7 @@
 			ssp = sp;
 			oldssp = ssp;
 			for (;;) {	/* find last match of innards */
-				sep = slow(m, ssp, rest, ssub, esub);
+				sep = walk(m, ssp, rest, ssub, esub, false);
 				if (sep == NULL || sep == ssp)
 					break;	/* failed or matched null */
 				oldssp = ssp;	/* on to next try */
@@ -476,13 +554,8 @@
 				ssp = oldssp;
 			}
 			assert(sep == rest);	/* must exhaust substring */
-			assert(slow(m, ssp, sep, ssub, esub) == rest);
-#ifdef NDEBUG
-			(void)
-#else
-			dp =
-#endif
-			    dissect(m, ssp, sep, ssub, esub);
+			assert(walk(m, ssp, sep, ssub, esub, false) == rest);
+			dp = dissect(m, ssp, sep, ssub, esub);
 			assert(dp == sep);
 			sp = rest;
 			break;
@@ -490,10 +563,10 @@
 			stp = stop;
 			for (;;) {
 				/* how long could this one be? */
-				rest = slow(m, sp, stp, ss, es);
+				rest = walk(m, sp, stp, ss, es, false);
 				assert(rest != NULL);	/* it did match */
 				/* could the rest match the rest? */
-				tail = slow(m, rest, stop, es, stopst);
+				tail = walk(m, rest, stop, es, stopst, false);
 				if (tail == stop)
 					break;		/* yes! */
 				/* no -- try a shorter match for this one */
@@ -504,7 +577,7 @@
 			esub = ss + OPND(m->g->strip[ss]) - 1;
 			assert(OP(m->g->strip[esub]) == OOR1);
 			for (;;) {	/* find first matching branch */
-				if (slow(m, sp, rest, ssub, esub) == rest)
+				if (walk(m, sp, rest, ssub, esub, false) == rest)
 					break;	/* it matched all of it */
 				/* that one missed, try next one */
 				assert(OP(m->g->strip[esub]) == OOR1);
@@ -517,12 +590,7 @@
 				else
 					assert(OP(m->g->strip[esub]) == O_CH);
 			}
-#ifdef NDEBUG
-			(void)
-#else
-			dp =
-#endif
-			    dissect(m, sp, rest, ssub, esub);
+			dp = dissect(m, sp, rest, ssub, esub);
 			assert(dp == rest);
 			sp = rest;
 			break;
@@ -553,6 +621,17 @@
 	return(sp);
 }
 
+#define	ISBOW(m, sp)					\
+    (sp < m->endp && ISWORD(*sp) &&			\
+    ((sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||	\
+    (sp > m->offp && !ISWORD(*(sp-1)))))
+#define	ISEOW(m, sp)					\
+    (((sp == m->endp && !(m->eflags&REG_NOTEOL)) ||	\
+    (sp < m->endp && *sp == '\n' &&			\
+    (m->g->cflags&REG_NEWLINE)) ||			\
+    (sp < m->endp && !ISWORD(*sp)) ) &&			\
+    (sp > m->beginp && ISWORD(*(sp-1))))		\
+
 /*
  - backref - figure out what matched what, figuring in back references
  == static const char *backref(struct match *m, const char *start, \
@@ -560,25 +639,27 @@
  */
 static const char *		/* == stop (success) or NULL (failure) */
 backref(
-    struct match *m,
-    const char *start,
-    const char *stop,
-    sopno startst,
-    sopno stopst,
-    sopno lev)			/* PLUS nesting level */
+	struct match *m,
+	const char *start,
+	const char *stop,
+	sopno startst,
+	sopno stopst,
+	sopno lev,		/* PLUS nesting level */
+	int rec)
 {
 	int i;
-	sopno ss;	/* start sop of current subRE */
-	const char *sp;	/* start of string matched by it */
-	sopno ssub;	/* start sop of subsubRE */
-	sopno esub;	/* end sop of subsubRE */
-	const char *ssp; /* start of string matched by subsubRE */
+	sopno ss;		/* start sop of current subRE */
+	const char *sp;		/* start of string matched by it */
+	sopno ssub;		/* start sop of subsubRE */
+	sopno esub;		/* end sop of subsubRE */
+	const char *ssp;	/* start of string matched by subsubRE */
 	const char *dp;
 	size_t len;
 	int hard;
 	sop s;
 	regoff_t offsave;
 	cset *cs;
+	wint_t wc;
 
 	_DIAGASSERT(m != NULL);
 	_DIAGASSERT(start != NULL);
@@ -592,23 +673,46 @@
 	for (ss = startst; !hard && ss < stopst; ss++)
 		switch (OP(s = m->g->strip[ss])) {
 		case OCHAR:
-			if (sp == stop || *sp++ != (char)OPND(s))
+			if (sp == stop)
+				return(NULL);
+			sp += XMBRTOWC(&wc, sp, (size_t)(stop - sp),
+			    &m->mbs, BADCHAR);
+			if (wc != (wint_t)OPND(s))
 				return(NULL);
 			break;
 		case OANY:
 			if (sp == stop)
 				return(NULL);
-			sp++;
+			sp += XMBRTOWC(&wc, sp, (size_t)(stop - sp),
+			    &m->mbs, BADCHAR);
+			if (wc == BADCHAR)
+				return (NULL);
 			break;
 		case OANYOF:
+			if (sp == stop)
+				return (NULL);
 			cs = &m->g->sets[OPND(s)];
-			if (sp == stop || !CHIN(cs, *sp++))
+			sp += XMBRTOWC(&wc, sp, (size_t)(stop - sp),
+			    &m->mbs, BADCHAR);
+			if (wc == BADCHAR || !CHIN(cs, wc))
+				return(NULL);
+			break;
+		case OBOS:
+			if (sp == m->beginp && (m->eflags & REG_NOTBOL) == 0)
+				{ /* yes */ }
+			else
+				return(NULL);
+			break;
+		case OEOS:
+			if (sp == m->endp && (m->eflags & REG_NOTEOL) == 0)
+				{ /* yes */ }
+			else
 				return(NULL);
 			break;
 		case OBOL:
-			if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) )
+			if ((sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+			    (sp > m->offp && sp < m->endp &&
+			    *(sp-1) == '\n' && (m->g->cflags&REG_NEWLINE)))
 				{ /* yes */ }
 			else
 				return(NULL);
@@ -621,23 +725,29 @@
 			else
 				return(NULL);
 			break;
+		case OWBND:
+			if (ISBOW(m, sp) || ISEOW(m, sp))
+				{ /* yes */ }
+			else
+				return(NULL);
+			break;
+		case ONWBND:
+			if (((sp == m->beginp) && !ISWORD(*sp)) ||
+			    (sp == m->endp && !ISWORD(*(sp - 1))))
+				{ /* yes, beginning/end of subject */ }
+			else if (ISWORD(*(sp - 1)) == ISWORD(*sp))
+				{ /* yes, beginning/end of subject */ }
+			else
+				return(NULL);
+			break;
 		case OBOW:
-			if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) ||
-					(sp > m->beginp &&
-							!ISWORD(*(sp-1))) ) &&
-					(sp < m->endp && ISWORD(*sp)) )
+			if (ISBOW(m, sp))
 				{ /* yes */ }
 			else
 				return(NULL);
 			break;
 		case OEOW:
-			if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
-					(sp < m->endp && *sp == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) ||
-					(sp < m->endp && !ISWORD(*sp)) ) &&
-					(sp > m->beginp && ISWORD(*(sp-1))) )
+			if (ISEOW(m, sp))
 				{ /* yes */ }
 			else
 				return(NULL);
@@ -671,50 +781,47 @@
 	case OBACK_:		/* the vilest depths */
 		i = OPND(s);
 		assert(0 < i && i <= m->g->nsub);
-		if (m->pmatch[i].rm_eo == (regoff_t)-1)
+		if (m->pmatch[i].rm_eo == -1)
 			return(NULL);
-		assert(m->pmatch[i].rm_so != (regoff_t)-1);
-		len = (size_t)(m->pmatch[i].rm_eo - m->pmatch[i].rm_so);
-		if (len == 0)
+		assert(m->pmatch[i].rm_so != -1);
+		len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
+		if (len == 0 && rec++ > MAX_RECURSION)
 			return(NULL);
 		assert(stop - m->beginp >= len);
 		if (sp > stop - len)
 			return(NULL);	/* not enough left to match */
-		ssp = m->offp + (size_t)m->pmatch[i].rm_so;
+		ssp = m->offp + m->pmatch[i].rm_so;
 		if (memcmp(sp, ssp, len) != 0)
 			return(NULL);
 		while (m->g->strip[ss] != SOP(O_BACK, i))
 			ss++;
-		return(backref(m, sp+len, stop, ss+1, stopst, lev));
-
+		return(backref(m, sp+len, stop, ss+1, stopst, lev, rec));
 	case OQUEST_:		/* to null or not */
-		dp = backref(m, sp, stop, ss+1, stopst, lev);
+		dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
 		if (dp != NULL)
 			return(dp);	/* not */
-		return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));
-
+		return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev, rec));
 	case OPLUS_:
 		assert(m->lastpos != NULL);
 		assert(lev+1 <= m->g->nplus);
 		m->lastpos[lev+1] = sp;
-		return(backref(m, sp, stop, ss+1, stopst, lev+1));
-
+		return(backref(m, sp, stop, ss+1, stopst, lev+1, rec));
 	case O_PLUS:
 		if (sp == m->lastpos[lev])	/* last pass matched null */
-			return(backref(m, sp, stop, ss+1, stopst, lev-1));
+			return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
 		/* try another pass */
 		m->lastpos[lev] = sp;
-		dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);
+		dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev, rec);
 		if (dp == NULL)
-			dp = backref(m, sp, stop, ss+1, stopst, lev-1);
-		return(dp);
-
+			return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
+		else
+			return(dp);
 	case OCH_:		/* find the right one, if any */
 		ssub = ss + 1;
 		esub = ss + OPND(s) - 1;
 		assert(OP(m->g->strip[esub]) == OOR1);
 		for (;;) {	/* find first matching branch */
-			dp = backref(m, sp, stop, ssub, esub, lev);
+			dp = backref(m, sp, stop, ssub, esub, lev, rec);
 			if (dp != NULL)
 				return(dp);
 			/* that one missed, try next one */
@@ -729,29 +836,28 @@
 			else
 				assert(OP(m->g->strip[esub]) == O_CH);
 		}
-
+		/* NOTREACHED */
+		break;
 	case OLPAREN:		/* must undo assignment if rest fails */
 		i = OPND(s);
 		assert(0 < i && i <= m->g->nsub);
 		offsave = m->pmatch[i].rm_so;
 		m->pmatch[i].rm_so = sp - m->offp;
-		dp = backref(m, sp, stop, ss+1, stopst, lev);
+		dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
 		if (dp != NULL)
 			return(dp);
 		m->pmatch[i].rm_so = offsave;
 		return(NULL);
-
 	case ORPAREN:		/* must undo assignment if rest fails */
 		i = OPND(s);
 		assert(0 < i && i <= m->g->nsub);
 		offsave = m->pmatch[i].rm_eo;
 		m->pmatch[i].rm_eo = sp - m->offp;
-		dp = backref(m, sp, stop, ss+1, stopst, lev);
+		dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
 		if (dp != NULL)
 			return(dp);
 		m->pmatch[i].rm_eo = offsave;
 		return(NULL);
-
 	default:		/* uh oh */
 		assert(nope);
 		break;
@@ -760,141 +866,66 @@
 	/* "can't happen" */
 	assert(nope);
 	/* NOTREACHED */
-	return NULL;
+	return "shut up gcc";
 }
 
 /*
- - fast - step through the string at top speed
- == static const char *fast(struct match *m, const char *start, \
- ==	const char *stop, sopno startst, sopno stopst);
+ - walk - step through the string either quickly or slowly
+ == static const char *walk(struct match *m, const char *start, \
+ ==	const char *stop, sopno startst, sopno stopst, bool fast);
  */
-static const char *		/* where tentative match ended, or NULL */
-fast(
-    struct match *m,
-    const char *start,
-    const char *stop,
-    sopno startst,
-    sopno stopst)
+static const char * /* where it ended, or NULL */
+walk(struct match *m, const char *start, const char *stop, sopno startst,
+	sopno stopst, bool fast)
 {
 	states st = m->st;
 	states fresh = m->fresh;
-	states tmp = m->tmp;
-	const char *p = start;
-	int c = (start == m->beginp) ? OUT : *(start-1);
-	int lastc;	/* previous c */
-	int flagch;
-	size_t i;
-	const char *coldp; /* last p after which no match was underway */
-
-	_DIAGASSERT(m != NULL);
-	_DIAGASSERT(start != NULL);
-	_DIAGASSERT(stop != NULL);
-
-	CLEAR(st);
-	SET1(st, startst);
-	st = step(m->g, startst, stopst, st, NOTHING, st);
-	ASSIGN(fresh, st);
-	SP("start", st, *p);
-	coldp = NULL;
-	for (;;) {
-		/* next character */
-		lastc = c;
-		c = (p == m->endp) ? OUT : *p;
-		if (EQ(st, fresh))
-			coldp = p;
-
-		/* is there an EOL and/or BOL between lastc and c? */
-		flagch = '\0';
-		i = 0;
-		if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
-			flagch = BOL;
-			i = m->g->nbol;
-		}
-		if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(c == OUT && !(m->eflags&REG_NOTEOL)) ) {
-			flagch = (flagch == BOL) ? BOLEOL : EOL;
-			i += m->g->neol;
-		}
-		if (i != 0) {
-			for (; i > 0; i--)
-				st = step(m->g, startst, stopst, st, flagch, st);
-			SP("boleol", st, c);
-		}
-
-		/* how about a word boundary? */
-		if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
-					(c != OUT && ISWORD(c)) ) {
-			flagch = BOW;
-		}
-		if ( (lastc != OUT && ISWORD(lastc)) &&
-				(flagch == EOL || (c != OUT && !ISWORD(c))) ) {
-			flagch = EOW;
-		}
-		if (flagch == BOW || flagch == EOW) {
-			st = step(m->g, startst, stopst, st, flagch, st);
-			SP("boweow", st, c);
-		}
-
-		/* are we done? */
-		if (ISSET(st, stopst) || p == stop)
-			break;		/* NOTE BREAK OUT */
-
-		/* no, we must deal with this character */
-		ASSIGN(tmp, st);
-		ASSIGN(st, fresh);
-		assert(c != OUT);
-		st = step(m->g, startst, stopst, tmp, c, st);
-		SP("aft", st, c);
-		assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
-		p++;
-	}
-
-	assert(coldp != NULL);
-	m->coldp = coldp;
-	if (ISSET(st, stopst))
-		return(p+1);
-	else
-		return(NULL);
-}
-
-/*
- - slow - step through the string more deliberately
- == static const char *slow(struct match *m, const char *start, \
- ==	const char *stop, sopno startst, sopno stopst);
- */
-static const char *			/* where it ended */
-slow(
-    struct match *m,
-    const char *start,
-    const char *stop,
-    sopno startst,
-    sopno stopst)
-{
-	states st = m->st;
 	states empty = m->empty;
 	states tmp = m->tmp;
 	const char *p = start;
-	int c = (start == m->beginp) ? OUT : *(start-1);
-	int lastc;	/* previous c */
-	int flagch;
-	size_t i;
+	wint_t c;
+	wint_t lastc;		/* previous c */
+	wint_t flagch;
+	int sflags;
 	const char *matchp;	/* last p at which a match ended */
+	size_t i, clen;
 
 	_DIAGASSERT(m != NULL);
 	_DIAGASSERT(start != NULL);
 	_DIAGASSERT(stop != NULL);
 
-	AT("slow", start, stop, startst, stopst);
+	sflags = 0;
+	AT("walk", start, stop, startst, stopst);
 	CLEAR(st);
 	SET1(st, startst);
 	SP("sstart", st, *p);
-	st = step(m->g, startst, stopst, st, NOTHING, st);
+	st = step(m->g, startst, stopst, st, NOTHING, st, sflags);
+	if (fast)
+		ASSIGN(fresh, st);
 	matchp = NULL;
+	if (start == m->offp || (start == m->beginp && !(m->eflags&REG_NOTBOL)))
+		c = OUT;
+	else {
+		/*
+		 * XXX Wrong if the previous character was multi-byte.
+		 * Newline never is (in encodings supported by FreeBSD),
+		 * so this only breaks the ISWORD tests below.
+		 */
+		c = (uch)*(start - 1);
+	}
 	for (;;) {
 		/* next character */
 		lastc = c;
-		c = (p == m->endp) ? OUT : *p;
+		sflags = 0;
+		if (p == m->endp) {
+			c = OUT;
+			clen = 0;
+		} else
+			clen = XMBRTOWC(&c, p, (size_t)(m->endp - p),
+			    &m->mbs, BADCHAR);
+
+		if (fast && EQ(st, fresh))
+			matchp = p;
 
 		/* is there an EOL and/or BOL between lastc and c? */
 		flagch = '\0';
@@ -909,9 +940,20 @@
 			flagch = (flagch == BOL) ? BOLEOL : EOL;
 			i += m->g->neol;
 		}
+		if (lastc == OUT && (m->eflags & REG_NOTBOL) == 0) {
+			sflags |= SBOS;
+			/* Step one more for BOS. */
+			i++;
+		}
+		if (c == OUT && (m->eflags & REG_NOTEOL) == 0) {
+			sflags |= SEOS;
+			/* Step one more for EOS. */
+			i++;
+		}
 		if (i != 0) {
 			for (; i > 0; i--)
-				st = step(m->g, startst, stopst, st, flagch, st);
+				st = step(m->g, startst, stopst, st, flagch, st,
+				    sflags);
 			SP("sboleol", st, c);
 		}
 
@@ -925,52 +967,78 @@
 			flagch = EOW;
 		}
 		if (flagch == BOW || flagch == EOW) {
-			st = step(m->g, startst, stopst, st, flagch, st);
+			st = step(m->g, startst, stopst, st, flagch, st, sflags);
 			SP("sboweow", st, c);
 		}
+		if (lastc != OUT && c != OUT &&
+		    ISWORD(lastc) == ISWORD(c)) {
+			flagch = NWBND;
+		} else if ((lastc == OUT && !ISWORD(c)) ||
+		    (c == OUT && !ISWORD(lastc))) {
+			flagch = NWBND;
+		}
+		if (flagch == NWBND) {
+			st = step(m->g, startst, stopst, st, flagch, st, sflags);
+			SP("snwbnd", st, c);
+		}
 
 		/* are we done? */
-		if (ISSET(st, stopst))
-			matchp = p;
-		if (EQ(st, empty) || p == stop)
+		if (ISSET(st, stopst)) {
+			if (fast)
+				break;
+			else
+				matchp = p;
+		}
+		if (EQ(st, empty) || p == stop || clen > (size_t)(stop - p))
 			break;		/* NOTE BREAK OUT */
 
 		/* no, we must deal with this character */
 		ASSIGN(tmp, st);
-		ASSIGN(st, empty);
+		if (fast)
+			ASSIGN(st, fresh);
+		else
+			ASSIGN(st, empty);
 		assert(c != OUT);
-		st = step(m->g, startst, stopst, tmp, c, st);
+		st = step(m->g, startst, stopst, tmp, c, st, sflags);
 		SP("saft", st, c);
-		assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
-		p++;
+		assert(EQ(step(m->g, startst, stopst, st, NOTHING, st, sflags),
+		    st));
+		p += clen;
 	}
 
-	return(matchp);
+	if (fast) {
+		assert(matchp != NULL);
+		m->coldp = matchp;
+		if (ISSET(st, stopst))
+			return (p + XMBRTOWC(NULL, p, (size_t)(stop - p),
+			    &m->mbs, 0));
+		else
+			return (NULL);
+	} else
+		return (matchp);
 }
 
-
 /*
  - step - map set of states reachable before char to set reachable after
  == static states step(struct re_guts *g, sopno start, sopno stop, \
  ==	states bef, int ch, states aft);
- == #define	BOL	(OUT+1)
- == #define	EOL	(BOL+1)
- == #define	BOLEOL	(BOL+2)
- == #define	NOTHING	(BOL+3)
- == #define	BOW	(BOL+4)
- == #define	EOW	(BOL+5)
- == #define	CODEMAX	(BOL+5)		// highest code used
- == #define	NONCHAR(c)	((c) > CHAR_MAX)
- == #define	NNONCHAR	(CODEMAX-CHAR_MAX)
+ == #define	BOL	(OUT-1)
+ == #define	EOL	(BOL-1)
+ == #define	BOLEOL	(BOL-2)
+ == #define	NOTHING	(BOL-3)
+ == #define	BOW	(BOL-4)
+ == #define	EOW	(BOL-5)
+ == #define	BADCHAR	(BOL-6)
+ == #define	NONCHAR(c)	((c) <= OUT)
  */
 static states
-step(
-    struct re_guts *g,
-    sopno start,		/* start state within strip */
-    sopno stop,			/* state after stop state within strip */
-    states bef,			/* states reachable before */
-    int ch,			/* character or NONCHAR code */
-    states aft)			/* states already known reachable after */
+step(struct re_guts *g,
+	sopno start,		/* start state within strip */
+	sopno stop,		/* state after stop state within strip */
+	states bef,		/* states reachable before */
+	wint_t ch,		/* character or NONCHAR code */
+	states aft,		/* states already known reachable after */
+	int sflags)		/* state flags */
 {
 	cset *cs;
 	sop s;
@@ -989,8 +1057,16 @@
 			break;
 		case OCHAR:
 			/* only characters can match */
-			assert(!NONCHAR(ch) || ch != (char)OPND(s));
-			if (ch == (char)OPND(s))
+			assert(!NONCHAR(ch) || ch != OPND(s));
+			if (ch == (wint_t)OPND(s))
+				FWD(aft, bef, 1);
+			break;
+		case OBOS:
+			if ((ch == BOL || ch == BOLEOL) && (sflags & SBOS) != 0)
+				FWD(aft, bef, 1);
+			break;
+		case OEOS:
+			if ((ch == EOL || ch == BOLEOL) && (sflags & SEOS) != 0)
 				FWD(aft, bef, 1);
 			break;
 		case OBOL:
@@ -1009,6 +1085,14 @@
 			if (ch == EOW)
 				FWD(aft, bef, 1);
 			break;
+		case OWBND:
+			if (ch == BOW || ch == EOW)
+				FWD(aft, bef, 1);
+			break;
+		case ONWBND:
+			if (ch == NWBND)
+				FWD(aft, aft, 1);
+			break;
 		case OANY:
 			if (!NONCHAR(ch))
 				FWD(aft, bef, 1);
@@ -1054,10 +1138,10 @@
 		case OOR1:		/* done a branch, find the O_CH */
 			if (ISSTATEIN(aft, here)) {
 				for (look = 1;
-						OP(s = g->strip[pc+look]) != O_CH;
-						look += OPND(s))
+				    OP(s = g->strip[pc+look]) != O_CH;
+				    look += OPND(s))
 					assert(OP(s) == OOR2);
-				FWD(aft, aft, look);
+				FWD(aft, aft, look + 1);
 			}
 			break;
 		case OOR2:		/* propagate OCH_'s marking */
@@ -1083,20 +1167,19 @@
 /*
  - print - print a set of states
  == #ifdef REDEBUG
- == static void print(struct match *m, char *caption, states st, \
+ == static void print(struct match *m, const char *caption, states st, \
  ==	int ch, FILE *d);
  == #endif
  */
 static void
-print(
-    struct match *m,
-    char *caption,
-    states st,
-    int ch,
-    FILE *d)
+print(struct match *m,
+	const char *caption,
+	states st,
+	int ch,
+	FILE *d)
 {
 	struct re_guts *g = m->g;
-	int i;
+	sopno i;
 	int first = 1;
 
 	_DIAGASSERT(m != NULL);
@@ -1112,27 +1195,26 @@
 		fprintf(d, " %s", pchar(ch));
 	for (i = 0; i < g->nstates; i++)
 		if (ISSET(st, i)) {
-			fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
+			fprintf(d, "%s%lu", (first) ? "\t" : ", ", i);
 			first = 0;
 		}
 	fprintf(d, "\n");
 }
 
-/* 
+/*
  - at - print current situation
  == #ifdef REDEBUG
- == static void at(struct match *m, char *title, char *start, char *stop, \
- ==						sopno startst, sopno stopst);
+ == static void at(struct match *m, const char *title, const char *start, \
+ ==			 const char *stop, sopno startst, sopno stopst);
  == #endif
  */
 static void
-at(
-    struct match *m,
-    char *title,
-    char *start,
-    char *stop,
-    sopno startst,
-    sopno stopst)
+at(	struct match *m,
+	const char *title,
+	const char *start,
+	const char *stop,
+	sopno startst,
+	sopno stopst)
 {
 
 	_DIAGASSERT(m != NULL);
@@ -1153,7 +1235,7 @@
 /*
  - pchar - make a character printable
  == #ifdef REDEBUG
- == static char *pchar(int ch);
+ == static const char *pchar(int ch);
  == #endif
  *
  * Is this identical to regchar() over in debug.c?  Well, yes.  But a
@@ -1161,28 +1243,26 @@
  * a matching debug.o, and this is convenient.  It all disappears in
  * the non-debug compilation anyway, so it doesn't matter much.
  */
-static char *			/* -> representation */
-pchar(
-    int ch)
+static const char *		/* -> representation */
+pchar(int ch)
 {
 	static char pbuf[10];
 
-	if (isprint(ch) || ch == ' ')
-		(void)snprintf(pbuf, sizeof pbuf, "%c", ch);
+	if (isprint((uch)ch) || ch == ' ')
+		snprintf(pbuf, sizeof(pbuf), "%c", ch);
 	else
-		(void)snprintf(pbuf, sizeof pbuf, "\\%o", ch);
+		snprintf(pbuf, sizeof(pbuf), "\\%o", ch);
 	return(pbuf);
 }
 #endif
 #endif
 
+#undef	stepback
 #undef	matcher
-#undef	fast
-#undef	slow
+#undef	walk
 #undef	dissect
 #undef	backref
 #undef	step
 #undef	print
 #undef	at
 #undef	match
-#undef	nope
diff --git a/libc/upstream-netbsd/lib/libc/regex/regcomp.c b/libc/upstream-netbsd/lib/libc/regex/regcomp.c
index 4a0d99a..957f8ac 100644
--- a/libc/upstream-netbsd/lib/libc/regex/regcomp.c
+++ b/libc/upstream-netbsd/lib/libc/regex/regcomp.c
@@ -1,9 +1,17 @@
-/*	$NetBSD: regcomp.c,v 1.38 2019/02/07 22:22:31 christos Exp $	*/
+/*	$NetBSD: regcomp.c,v 1.46 2021/03/11 15:00:29 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
  * This code is derived from software contributed to Berkeley by
  * Henry Spencer.
  *
@@ -34,74 +42,65 @@
  *	@(#)regcomp.c	8.5 (Berkeley) 3/20/94
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)regcomp.c	8.5 (Berkeley) 3/20/94
- */
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
 
 #include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
 #if 0
 static char sccsid[] = "@(#)regcomp.c	8.5 (Berkeley) 3/20/94";
-#else
-__RCSID("$NetBSD: regcomp.c,v 1.38 2019/02/07 22:22:31 christos Exp $");
+__FBSDID("$FreeBSD: head/lib/libc/regex/regcomp.c 368359 2020-12-05 03:18:48Z kevans $");
 #endif
-#endif /* LIBC_SCCS and not lint */
+__RCSID("$NetBSD: regcomp.c,v 1.46 2021/03/11 15:00:29 christos Exp $");
+
+#define _OPENBSD_SOURCE
+
+#ifndef LIBHACK
+#define REGEX_GNU_EXTENSIONS
 
 #include "namespace.h"
+#endif
 #include <sys/types.h>
-
-#include <assert.h>
+#include <stdio.h>
+#include <string.h>
 #include <ctype.h>
 #include <limits.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <regex.h>
+#include <stdbool.h>
 
-#ifdef __weak_alias
+#if defined(__weak_alias) && !defined(LIBHACK)
 __weak_alias(regcomp,_regcomp)
 #endif
 
+#ifdef REGEX_LIBC_COLLATE
+#include "collate.h"
+#endif
+
 #include "utils.h"
 #include "regex2.h"
 
-#include "cclass.h"
 #include "cname.h"
 
 /*
+ * Branching context, used to keep track of branch state for all of the branch-
+ * aware functions. In addition to keeping track of branch positions for the
+ * p_branch_* functions, we use this to simplify some clumsiness in BREs for
+ * detection of whether ^ is acting as an anchor or being used erroneously and
+ * also for whether we're in a sub-expression or not.
+ */
+struct branchc {
+	sopno start;
+	sopno back;
+	sopno fwd;
+
+	int nbranch;
+	int nchain;
+	bool outer;
+	bool terminate;
+};
+
+/*
  * parse structure, passed up and down to avoid global variables and
  * other clumsinesses
  */
@@ -109,6 +108,7 @@
 	const char *next;	/* next character in RE */
 	const char *end;	/* end of string (-> NUL normally) */
 	int error;		/* has an error been seen? */
+	int gnuext;
 	sop *strip;		/* malloced strip */
 	sopno ssize;		/* malloced strip size (allocated) */
 	sopno slen;		/* malloced strip length (used) */
@@ -117,56 +117,70 @@
 #	define	NPAREN	10	/* we need to remember () 1-9 for back refs */
 	sopno pbegin[NPAREN];	/* -> ( ([0] unused) */
 	sopno pend[NPAREN];	/* -> ) ([0] unused) */
+	bool allowbranch;	/* can this expression branch? */
+	bool bre;		/* convenience; is this a BRE? */
+	int pflags;		/* other parsing flags -- legacy escapes? */
+	bool (*parse_expr)(struct parse *, struct branchc *);
+	void (*pre_parse)(struct parse *, struct branchc *);
+	void (*post_parse)(struct parse *, struct branchc *);
 };
 
+#define PFLAG_LEGACY_ESC	0x00000001
+
 /* ========= begin header generated by ./mkh ========= */
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* === regcomp.c === */
-static void p_ere(struct parse *p, int stop, size_t reclimit);
-static void p_ere_exp(struct parse *p, size_t reclimit);
+static bool p_ere_exp(struct parse *p, struct branchc *bc);
 static void p_str(struct parse *p);
-static void p_bre(struct parse *p, int end1, int end2, size_t reclimit);
-static int p_simp_re(struct parse *p, int starordinary, size_t reclimit);
+static int p_branch_eat_delim(struct parse *p, struct branchc *bc);
+static void p_branch_ins_offset(struct parse *p, struct branchc *bc);
+static void p_branch_fix_tail(struct parse *p, struct branchc *bc);
+static bool p_branch_empty(struct parse *p, struct branchc *bc);
+static bool p_branch_do(struct parse *p, struct branchc *bc);
+static void p_bre_pre_parse(struct parse *p, struct branchc *bc);
+static void p_bre_post_parse(struct parse *p, struct branchc *bc);
+static void p_re(struct parse *p, int end1, int end2);
+static bool p_simp_re(struct parse *p, struct branchc *bc);
 static int p_count(struct parse *p);
 static void p_bracket(struct parse *p);
+static int p_range_cmp(wchar_t c1, wchar_t c2);
 static void p_b_term(struct parse *p, cset *cs);
+#ifdef REGEX_GNU_EXTENSIONS
+static int p_b_pseudoclass(struct parse *p, char c);
+#endif
 static void p_b_cclass(struct parse *p, cset *cs);
+static void p_b_cclass_named(struct parse *p, cset *cs, const char[]);
 static void p_b_eclass(struct parse *p, cset *cs);
-static char p_b_symbol(struct parse *p);
-static char p_b_coll_elem(struct parse *p, int endc);
-static int othercase(int ch);
-static void bothcases(struct parse *p, int ch);
-static void ordinary(struct parse *p, int ch);
+static wint_t p_b_symbol(struct parse *p);
+static wint_t p_b_coll_elem(struct parse *p, wint_t endc);
+static bool may_escape(struct parse *p, const wint_t ch);
+static wint_t othercase(wint_t ch);
+static void bothcases(struct parse *p, wint_t ch);
+static void ordinary(struct parse *p, wint_t ch);
 static void nonnewline(struct parse *p);
-static void repeat(struct parse *p, sopno start, int from, int to, size_t reclimit);
+static void repeat(struct parse *p, sopno start, int from, int to);
 static int seterr(struct parse *p, int e);
 static cset *allocset(struct parse *p);
 static void freeset(struct parse *p, cset *cs);
-static sopno freezeset(struct parse *p, cset *cs);
-static int firstch(struct parse *p, cset *cs);
-static int nch(struct parse *p, cset *cs);
-static void mcadd(struct parse *p, cset *cs, const char *cp);
-#if 0
-static void mcsub(cset *cs, char *cp);
-static int mcin(cset *cs, char *cp);
-static char *mcfind(cset *cs, char *cp);
-#endif
-static void mcinvert(struct parse *p, cset *cs);
-static void mccase(struct parse *p, cset *cs);
-static int isinsets(struct re_guts *g, int c);
-static int samesets(struct re_guts *g, int c1, int c2);
-static void categorize(struct parse *p, struct re_guts *g);
+static void CHadd(struct parse *p, cset *cs, wint_t ch);
+static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max);
+static void CHaddtype(struct parse *p, cset *cs, wctype_t wct);
+static wint_t singleton(cset *cs);
 static sopno dupl(struct parse *p, sopno start, sopno finish);
-static void doemit(struct parse *p, sop op, sopno opnd);
-static void doinsert(struct parse *p, sop op, sopno opnd, sopno pos);
-static void dofwd(struct parse *p, sopno pos, sopno value);
+static void doemit(struct parse *p, sop op, size_t opnd);
+static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos);
+static void dofwd(struct parse *p, sopno pos, sop value);
 static int enlarge(struct parse *p, sopno size);
 static void stripsnug(struct parse *p, struct re_guts *g);
 static void findmust(struct parse *p, struct re_guts *g);
+static int altoffset(sop *scan, int offset);
+static void computejumps(struct parse *p, struct re_guts *g);
+static void computematchjumps(struct parse *p, struct re_guts *g);
 static sopno pluscount(struct parse *p, struct re_guts *g);
+static wint_t wgetnext(struct parse *p);
 
 #ifdef __cplusplus
 }
@@ -185,19 +199,22 @@
 #define	MORE2()	(p->next+1 < p->end)
 #define	SEE(c)	(MORE() && PEEK() == (c))
 #define	SEETWO(a, b)	(MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
+#define	SEESPEC(a)	(p->bre ? SEETWO('\\', a) : SEE(a))
 #define	EAT(c)	((SEE(c)) ? (NEXT(), 1) : 0)
 #define	EATTWO(a, b)	((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
+#define	EATSPEC(a)	(p->bre ? EATTWO('\\', a) : EAT(a))
 #define	NEXT()	(p->next++)
 #define	NEXT2()	(p->next += 2)
 #define	NEXTn(n)	(p->next += (n))
 #define	GETNEXT()	(*p->next++)
+#define	WGETNEXT()	wgetnext(p)
 #define	SETERROR(e)	seterr(p, (e))
-#define	REQUIRE(co, e)	(void) ((co) || SETERROR(e))
+#define	REQUIRE(co, e)	((co) || SETERROR(e))
 #define	MUSTSEE(c, e)	(REQUIRE(MORE() && PEEK() == (c), e))
-#define	MUSTEAT(c, e)	(void) (REQUIRE(MORE() && GETNEXT() == (c), e))
+#define	MUSTEAT(c, e)	(REQUIRE(MORE() && GETNEXT() == (c), e))
 #define	MUSTNOTSEE(c, e)	(REQUIRE(!MORE() || PEEK() != (c), e))
-#define	EMIT(op, sopnd)	doemit(p, (sop)(op), sopnd)
-#define	INSERT(op, pos)	doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
+#define	EMIT(op, sopnd)	doemit(p, (op), (sopnd))
+#define	INSERT(op, pos)	doinsert(p, (op), HERE()-(pos)+1, pos)
 #define	AHEAD(pos)		dofwd(p, pos, HERE()-(pos))
 #define	ASTERN(sop, pos)	EMIT(sop, HERE()-pos)
 #define	HERE()		(p->slen)
@@ -205,42 +222,62 @@
 #define	THERETHERE()	(p->slen - 2)
 #define	DROP(n)	(p->slen -= (n))
 
-#ifndef NDEBUG
-static int never = 0;		/* for use in asserts; shuts lint up */
-#else
-#define	never	0		/* some <assert.h>s have bugs too */
+/* Macro used by computejump()/computematchjump() */
+#ifndef MIN
+#define MIN(a,b)	((a)<(b)?(a):(b))
 #endif
 
-#define	MEMLIMIT	0x8000000
-#define MEMSIZE(p) \
-	((p)->ncsalloc / CHAR_BIT * (p)->g->csetsize + \
-	(p)->ncsalloc * sizeof(cset) + \
-	(p)->ssize * sizeof(sop))
-#define	RECLIMIT	256
+#ifndef NLS
+static const struct {
+	const char *name;
+	int (*func)(int);
+} wctypes[] = {
+#define ADD(x) { .name = # x, .func = is ## x }
+	ADD(alnum),
+	ADD(alpha),
+	ADD(blank),
+	ADD(cntrl),
+	ADD(digit),
+	ADD(graph),
+	ADD(lower),
+	ADD(print),
+	ADD(punct),
+	ADD(space),
+	ADD(upper),
+	ADD(xdigit),
+#undef ADD
+};
 
-/*
- - regcomp - interface for parser and compilation
- = extern int regcomp(regex_t *, const char *, int);
- = #define	REG_BASIC	0000
- = #define	REG_EXTENDED	0001
- = #define	REG_ICASE	0002
- = #define	REG_NOSUB	0004
- = #define	REG_NEWLINE	0010
- = #define	REG_NOSPEC	0020
- = #define	REG_PEND	0040
- = #define	REG_DUMP	0200
- */
-int				/* 0 success, otherwise REG_something */
-regcomp(
-    regex_t *preg,
-    const char *pattern,
-    int cflags)
+wctype_t
+__regex_wctype(const char *str)
+{
+	for (size_t i = 0; i < __arraycount(wctypes); i++) {
+		if (strcmp(wctypes[i].name, str) == 0)
+			return (wctype_t)(i + 1);
+	}
+	return (wctype_t)0;
+}
+
+int
+__regex_iswctype(wint_t c, wctype_t ct)
+{
+	if (ct == 0)
+		return 0;
+	return (*wctypes[ct - 1].func)(c);
+}
+#endif
+
+static int				/* 0 success, otherwise REG_something */
+regcomp_internal(regex_t * __restrict preg,
+	const char * __restrict pattern,
+	int cflags, int pflags)
 {
 	struct parse pa;
 	struct re_guts *g;
 	struct parse *p = &pa;
 	int i;
 	size_t len;
+	size_t maxlen;
 #ifdef REDEBUG
 #	define	GOODFLAGS(f)	(f)
 #else
@@ -262,11 +299,27 @@
 		len = strlen(pattern);
 
 	/* do the mallocs early so failure handling is easy */
-	g = malloc(sizeof(struct re_guts) + (NC - 1) * sizeof(cat_t));
+	g = malloc(sizeof(*g));
 	if (g == NULL)
 		return(REG_ESPACE);
-	p->ssize = len/(size_t)2*(size_t)3 + (size_t)1;	/* ugh */
-	p->strip = calloc(p->ssize, sizeof(sop));
+	/*
+	 * Limit the pattern space to avoid a 32-bit overflow on buffer
+	 * extension.  Also avoid any signed overflow in case of conversion
+	 * so make the real limit based on a 31-bit overflow.
+	 *
+	 * Likely not applicable on 64-bit systems but handle the case
+	 * generically (who are we to stop people from using ~715MB+
+	 * patterns?).
+	 */
+	maxlen = ((size_t)-1 >> 1) / sizeof(*p->strip) * 2 / 3;
+	if (len >= maxlen) {
+		free(g);
+		return(REG_ESPACE);
+	}
+	p->ssize = (sopno)(len / 2 * 3 + 1);	/* ugh */
+	assert(p->ssize >= len);
+
+	p->strip = calloc(p->ssize, sizeof(*p->strip));
 	p->slen = 0;
 	if (p->strip == NULL) {
 		free(g);
@@ -275,46 +328,74 @@
 
 	/* set things up */
 	p->g = g;
-	p->next = pattern;
+	p->next = pattern;	/* convenience; we do not modify it */
 	p->end = p->next + len;
 	p->error = 0;
 	p->ncsalloc = 0;
+	p->pflags = pflags;
 	for (i = 0; i < NPAREN; i++) {
 		p->pbegin[i] = 0;
 		p->pend[i] = 0;
 	}
-	g->csetsize = NC;
+#ifdef REGEX_GNU_EXTENSIONS
+	if ((cflags & REG_GNU) == 0) {
+		p->gnuext = false;
+		p->allowbranch = (cflags & REG_EXTENDED) != 0;
+	} else
+		p->gnuext = p->allowbranch = true;
+#else
+	p->gnuext = false;
+	p->allowbranch = (cflags & REG_EXTENDED) != 0;
+#endif
+	if (cflags & REG_EXTENDED) {
+		p->bre = false;
+		p->parse_expr = p_ere_exp;
+		p->pre_parse = NULL;
+		p->post_parse = NULL;
+	} else {
+		p->bre = true;
+		p->parse_expr = p_simp_re;
+		p->pre_parse = p_bre_pre_parse;
+		p->post_parse = p_bre_post_parse;
+	}
 	g->sets = NULL;
-	g->setbits = NULL;
 	g->ncsets = 0;
 	g->cflags = cflags;
 	g->iflags = 0;
 	g->nbol = 0;
 	g->neol = 0;
 	g->must = NULL;
+	g->moffset = -1;
+	g->charjump = NULL;
+	g->matchjump = NULL;
 	g->mlen = 0;
 	g->nsub = 0;
-	g->ncategories = 1;	/* category 0 is "everything else" */
-	g->categories = &g->catspace[-(CHAR_MIN)];
-	(void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
 	g->backrefs = 0;
 
 	/* do it */
 	EMIT(OEND, 0);
 	g->firststate = THERE();
-	if (cflags&REG_EXTENDED)
-		p_ere(p, OUT, 0);
-	else if (cflags&REG_NOSPEC)
+	if (cflags & REG_NOSPEC)
 		p_str(p);
 	else
-		p_bre(p, OUT, OUT, 0);
+		p_re(p, OUT, OUT);
 	EMIT(OEND, 0);
 	g->laststate = THERE();
 
 	/* tidy up loose ends and fill things in */
-	categorize(p, g);
 	stripsnug(p, g);
 	findmust(p, g);
+	/* only use Boyer-Moore algorithm if the pattern is bigger
+	 * than three characters
+	 */
+	if(g->mlen > 3) {
+		computejumps(p, g);
+		computematchjumps(p, g);
+		if(g->matchjump == NULL && g->charjump != NULL) {
+			free(g->charjump);
+			g->charjump = NULL;
+		}
+	}
 	g->nplus = pluscount(p, g);
 	g->magic = MAGIC2;
 	preg->re_nsub = g->nsub;
@@ -333,97 +414,72 @@
 }
 
 /*
- - p_ere - ERE parser top level, concatenation and alternation
- == static void p_ere(struct parse *p, int stop, size_t reclimit);
+ - regcomp - interface for parser and compilation
+ = extern int regcomp(regex_t *, const char *, int);
+ = #define	REG_BASIC	0000
+ = #define	REG_EXTENDED	0001
+ = #define	REG_ICASE	0002
+ = #define	REG_NOSUB	0004
+ = #define	REG_NEWLINE	0010
+ = #define	REG_NOSPEC	0020
+ = #define	REG_PEND	0040
+ = #define	REG_DUMP	0200
  */
-static void
-p_ere(
-    struct parse *p,
-    int stop,			/* character this ERE should end at */
-    size_t reclimit)
+int				/* 0 success, otherwise REG_something */
+regcomp(regex_t * __restrict preg,
+	const char * __restrict pattern,
+	int cflags)
 {
-	char c;
-	sopno prevback = 0;	/* pacify gcc */
-	sopno prevfwd = 0; 	/* pacify gcc */
-	sopno conc;
-	int first = 1;		/* is this the first alternative? */
 
-	_DIAGASSERT(p != NULL);
-
-	if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) {
-		p->error = REG_ESPACE;
-		return;
-	}
-
-	for (;;) {
-		/* do a bunch of concatenated expressions */
-		conc = HERE();
-		while (MORE() && (c = PEEK()) != '|' && c != stop)
-			p_ere_exp(p, reclimit);
-		REQUIRE(HERE() != conc, REG_EMPTY);	/* require nonempty */
-
-		if (!EAT('|'))
-			break;		/* NOTE BREAK OUT */
-
-		if (first) {
-			INSERT(OCH_, conc);	/* offset is wrong */
-			prevfwd = conc;
-			prevback = conc;
-			first = 0;
-		}
-		ASTERN(OOR1, prevback);
-		prevback = THERE();
-		AHEAD(prevfwd);			/* fix previous offset */
-		prevfwd = HERE();
-		EMIT(OOR2, 0);			/* offset is very wrong */
-	}
-
-	if (!first) {		/* tail-end fixups */
-		AHEAD(prevfwd);
-		ASTERN(O_CH, prevback);
-	}
-
-	assert(!MORE() || SEE(stop));
+	return (regcomp_internal(preg, pattern, cflags, 0));
 }
 
 /*
- - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
- == static void p_ere_exp(struct parse *p, size_t reclimit);
+ - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op,
+ - return whether we should terminate or not
+ == static bool p_ere_exp(struct parse *p);
  */
-static void
-p_ere_exp(
-    struct parse *p,
-    size_t reclimit)
+static bool
+p_ere_exp(struct parse *p, struct branchc *bc)
 {
 	char c;
+	wint_t wc;
 	sopno pos;
 	int count;
 	int count2;
+#ifdef REGEX_GNU_EXTENSIONS
+	size_t i;
+	int handled;
+#endif
 	sopno subno;
 	int wascaret = 0;
 
 	_DIAGASSERT(p != NULL);
 
+	(void)bc;
 	assert(MORE());		/* caller should have ensured this */
 	c = GETNEXT();
 
+#ifdef REGEX_GNU_EXTENSIONS
+	handled = 0;
+#endif
 	pos = HERE();
 	switch (c) {
 	case '(':
-		REQUIRE(MORE(), REG_EPAREN);
+		(void)REQUIRE(MORE(), REG_EPAREN);
 		p->g->nsub++;
-		subno = p->g->nsub;
+		subno = (sopno)p->g->nsub;
 		if (subno < NPAREN)
 			p->pbegin[subno] = HERE();
 		EMIT(OLPAREN, subno);
 		if (!SEE(')'))
-			p_ere(p, ')', reclimit);
+			p_re(p, ')', IGN);
 		if (subno < NPAREN) {
 			p->pend[subno] = HERE();
 			assert(p->pend[subno] != 0);
 		}
 		EMIT(ORPAREN, subno);
-		MUSTEAT(')', REG_EPAREN);
+		(void)MUSTEAT(')', REG_EPAREN);
 		break;
 #ifndef POSIX_MISTAKE
 	case ')':		/* happens only if no current unmatched ( */
@@ -454,6 +510,7 @@
 	case '*':
 	case '+':
 	case '?':
+	case '{':
 		SETERROR(REG_BADRPT);
 		break;
 	case '.':
@@ -466,30 +523,118 @@
 		p_bracket(p);
 		break;
 	case '\\':
-		REQUIRE(MORE(), REG_EESCAPE);
-		c = GETNEXT();
-		ordinary(p, c);
+		(void)REQUIRE(MORE(), REG_EESCAPE);
+		wc = WGETNEXT();
+#ifdef REGEX_GNU_EXTENSIONS
+		if (p->gnuext) {
+			handled = 1;
+			switch (wc) {
+			case '`':
+				EMIT(OBOS, 0);
+				break;
+			case '\'':
+				EMIT(OEOS, 0);
+				break;
+			case 'B':
+				EMIT(ONWBND, 0);
+				break;
+			case 'b':
+				EMIT(OWBND, 0);
+				break;
+			case 'W':
+			case 'w':
+			case 'S':
+			case 's':
+				p_b_pseudoclass(p, wc);
+				break;
+			case 'a':
+				ordinary(p, '\a');
+				break;
+			case 'e':
+				ordinary(p, '\e');
+				break;
+			case 'f':
+				ordinary(p, '\f');
+				break;
+			case 'n':
+				ordinary(p, '\n');
+				break;
+			case 'r':
+				ordinary(p, '\r');
+				break;
+			case 't':
+				ordinary(p, '\t');
+				break;
+			case 'v':
+				ordinary(p, '\v');
+				break;
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				i = wc - '0';
+				assert(i < NPAREN);
+				if (p->pend[i] != 0) {
+					assert(i <= p->g->nsub);
+					EMIT(OBACK_, i);
+					assert(p->pbegin[i] != 0);
+					assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
+					assert(OP(p->strip[p->pend[i]]) == ORPAREN);
+					(void) dupl(p, p->pbegin[i]+1, p->pend[i]);
+					EMIT(O_BACK, i);
+				} else
+					SETERROR(REG_ESUBREG);
+				p->g->backrefs = 1;
+				break;
+			default:
+				handled = 0;
+			}
+			/* Don't proceed to the POSIX bits if we've already handled it */
+			if (handled)
+				break;
+		}
+#endif
+		switch (wc) {
+		case '<':
+			EMIT(OBOW, 0);
+			break;
+		case '>':
+			EMIT(OEOW, 0);
+			break;
+		default:
+			if (may_escape(p, wc))
+				ordinary(p, wc);
+			else
+				SETERROR(REG_EESCAPE);
+			break;
+		}
 		break;
-	case '{':		/* okay as ordinary except if digit follows */
-		REQUIRE(!MORE() || !isdigit((unsigned char)PEEK()), REG_BADRPT);
-		/* FALLTHROUGH */
 	default:
 		if (p->error != 0)
-			return;
-		ordinary(p, c);
+			return (false);
+		p->next--;
+		wc = WGETNEXT();
+		ordinary(p, wc);
 		break;
 	}
 
 	if (!MORE())
-		return;
+		return (false);
 	c = PEEK();
 	/* we call { a repetition if followed by a digit */
-	if (!( c == '*' || c == '+' || c == '?' ||
-	    (c == '{' && MORE2() && isdigit((unsigned char)PEEK2())) ))
-		return;		/* no repetition, we're done */
+	if (!( c == '*' || c == '+' || c == '?' || c == '{'))
+		return (false);		/* no repetition, we're done */
+	else if (c == '{')
+		(void)REQUIRE(MORE2() && \
+		    (isdigit((uch)PEEK2()) || PEEK2() == ','), REG_BADRPT);
 	NEXT();
 
-	REQUIRE(!wascaret, REG_BADRPT);
+	(void)REQUIRE(!wascaret, REG_BADRPT);
 	switch (c) {
 	case '*':	/* implemented as +? */
 		/* this case does not require the (y|) trick, noKLUDGE */
@@ -514,30 +659,31 @@
 	case '{':
 		count = p_count(p);
 		if (EAT(',')) {
-			if (isdigit((unsigned char)PEEK())) {
+			if (isdigit((uch)PEEK())) {
 				count2 = p_count(p);
-				REQUIRE(count <= count2, REG_BADBR);
+				(void)REQUIRE(count <= count2, REG_BADBR);
 			} else		/* single number with comma */
 				count2 = INFINITY;
 		} else		/* just a single number */
 			count2 = count;
-		repeat(p, pos, count, count2, 0);
+		repeat(p, pos, count, count2);
 		if (!EAT('}')) {	/* error heuristics */
 			while (MORE() && PEEK() != '}')
 				NEXT();
-			REQUIRE(MORE(), REG_EBRACE);
+			(void)REQUIRE(MORE(), REG_EBRACE);
 			SETERROR(REG_BADBR);
 		}
 		break;
 	}
 
 	if (!MORE())
-		return;
+		return (false);
 	c = PEEK();
 	if (!( c == '*' || c == '+' || c == '?' ||
-	    (c == '{' && MORE2() && isdigit((unsigned char)PEEK2())) ) )
-		return;
+				(c == '{' && MORE2() && isdigit((uch)PEEK2())) ) )
+		return (false);
 	SETERROR(REG_BADRPT);
+	return (false);
 }
 
 /*
@@ -545,159 +691,350 @@
  == static void p_str(struct parse *p);
  */
 static void
-p_str(
-    struct parse *p)
+p_str(struct parse *p)
 {
-
-	_DIAGASSERT(p != NULL);
-
-	REQUIRE(MORE(), REG_EMPTY);
+	(void)REQUIRE(MORE(), REG_EMPTY);
 	while (MORE())
-		ordinary(p, GETNEXT());
+		ordinary(p, WGETNEXT());
 }
 
 /*
- - p_bre - BRE parser top level, anchoring and concatenation
- == static void p_bre(struct parse *p, int end1, \
- ==	int end2, size_t reclimit);
- * Giving end1 as OUT essentially eliminates the end1/end2 check.
- *
- * This implementation is a bit of a kludge, in that a trailing $ is first
- * taken as an ordinary character and then revised to be an anchor.  The
- * only undesirable side effect is that '$' gets included as a character
- * category in such cases.  This is fairly harmless; not worth fixing.
- * The amount of lookahead needed to avoid this kludge is excessive.
+ * Eat consecutive branch delimiters for the kind of expression that we are
+ * parsing, return the number of delimiters that we ate.
+ */
+static int
+p_branch_eat_delim(struct parse *p, struct branchc *bc)
+{
+	int nskip;
+
+	(void)bc;
+	nskip = 0;
+	while (EATSPEC('|'))
+		++nskip;
+	return (nskip);
+}
+
+/*
+ * Insert necessary branch book-keeping operations. This emits a
+ * bogus 'next' offset, since we still have more to parse
  */
 static void
-p_bre(
-    struct parse *p,
-    int end1,		/* first terminating character */
-    int end2,		/* second terminating character */
-    size_t reclimit)
+p_branch_ins_offset(struct parse *p, struct branchc *bc)
 {
-	sopno start;
-	int first = 1;			/* first subexpression? */
-	int wasdollar = 0;
 
-	_DIAGASSERT(p != NULL);
-
-	if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) {
-		p->error = REG_ESPACE;
-		return;
+	if (bc->nbranch == 0) {
+		INSERT(OCH_, bc->start);	/* offset is wrong */
+		bc->fwd = bc->start;
+		bc->back = bc->start;
 	}
 
-	start = HERE();
+	ASTERN(OOR1, bc->back);
+	bc->back = THERE();
+	AHEAD(bc->fwd);			/* fix previous offset */
+	bc->fwd = HERE();
+	EMIT(OOR2, 0);			/* offset is very wrong */
+	++bc->nbranch;
+}
 
+/*
+ * Fix the offset of the tail branch, if we actually had any branches.
+ * This is to correct the bogus placeholder offset that we use.
+ */
+static void
+p_branch_fix_tail(struct parse *p, struct branchc *bc)
+{
+
+	/* Fix bogus offset at the tail if we actually have branches */
+	if (bc->nbranch > 0) {
+		AHEAD(bc->fwd);
+		ASTERN(O_CH, bc->back);
+	}
+}
+
+/*
+ * Signal to the parser that an empty branch has been encountered; this will,
+ * in the future, be used to allow for more permissive behavior with empty
+ * branches. The return value should indicate whether parsing may continue
+ * or not.
+ */
+static bool
+p_branch_empty(struct parse *p, struct branchc *bc)
+{
+
+	(void)bc;
+	SETERROR(REG_EMPTY);
+	return (false);
+}
+
+/*
+ * Take care of any branching requirements. This includes inserting the
+ * appropriate branching instructions as well as eating all of the branch
+ * delimiters until we either run out of pattern or need to parse more pattern.
+ */
+static bool
+p_branch_do(struct parse *p, struct branchc *bc)
+{
+	int ate = 0;
+
+	ate = p_branch_eat_delim(p, bc);
+	if (ate == 0)
+		return (false);
+	else if ((ate > 1 || (bc->outer && !MORE())) && !p_branch_empty(p, bc))
+		/*
+		 * Halt parsing only if we have an empty branch and p_branch_empty
+		 * indicates that we must not continue. In the future, this will not
+		 * necessarily be an error.
+		 */
+		return (false);
+	p_branch_ins_offset(p, bc);
+
+	return (true);
+}
+
+static void
+p_bre_pre_parse(struct parse *p, struct branchc *bc)
+{
+
+	(void)bc;
+	/*
+	 * Does not move cleanly into expression parser because of
+	 * ordinary interpration of * at the beginning position of
+	 * an expression.
+	 */
 	if (EAT('^')) {
 		EMIT(OBOL, 0);
 		p->g->iflags |= USEBOL;
 		p->g->nbol++;
 	}
-	while (MORE() && !SEETWO(end1, end2)) {
-		wasdollar = p_simp_re(p, first, reclimit);
-		first = 0;
-	}
-	if (wasdollar) {	/* oops, that was a trailing anchor */
+}
+
+static void
+p_bre_post_parse(struct parse *p, struct branchc *bc)
+{
+
+	/* Expression is terminating due to EOL token */
+	if (bc->terminate) {
 		DROP(1);
 		EMIT(OEOL, 0);
 		p->g->iflags |= USEEOL;
 		p->g->neol++;
 	}
+}
 
-	REQUIRE(HERE() != start, REG_EMPTY);	/* require nonempty */
+/*
+ - p_re - Top level parser, concatenation and BRE anchoring
+ == static void p_re(struct parse *p, int end1, int end2);
+ * Giving end1 as OUT essentially eliminates the end1/end2 check.
+ *
+ * This implementation is a bit of a kludge, in that a trailing $ is first
+ * taken as an ordinary character and then revised to be an anchor.
+ * The amount of lookahead needed to avoid this kludge is excessive.
+ */
+static void
+p_re(struct parse *p,
+	int end1,	/* first terminating character */
+	int end2)	/* second terminating character; ignored for EREs */
+{
+	struct branchc bc;
+
+	bc.nbranch = 0;
+	if (end1 == OUT && end2 == OUT)
+		bc.outer = true;
+	else
+		bc.outer = false;
+#define	SEEEND()	(!p->bre ? SEE(end1) : SEETWO(end1, end2))
+	for (;;) {
+		bc.start = HERE();
+		bc.nchain = 0;
+		bc.terminate = false;
+		if (p->pre_parse != NULL)
+			p->pre_parse(p, &bc);
+		while (MORE() && (!p->allowbranch || !SEESPEC('|')) && !SEEEND()) {
+			bc.terminate = p->parse_expr(p, &bc);
+			++bc.nchain;
+		}
+		if (p->post_parse != NULL)
+			p->post_parse(p, &bc);
+		(void) REQUIRE(p->gnuext || HERE() != bc.start, REG_EMPTY);
+#ifdef REGEX_GNU_EXTENSIONS
+		if (p->gnuext && HERE() == bc.start && !p_branch_empty(p, &bc))
+			break;
+#endif
+		if (!p->allowbranch)
+			break;
+		/*
+		 * p_branch_do's return value indicates whether we should
+		 * continue parsing or not. This is both for correctness and
+		 * a slight optimization, because it will check if we've
+		 * encountered an empty branch or the end of the string
+		 * immediately following a branch delimiter.
+		 */
+		if (!p_branch_do(p, &bc))
+			break;
+	}
+#undef SEE_END
+	if (p->allowbranch)
+		p_branch_fix_tail(p, &bc);
+	assert(!MORE() || SEE(end1));
 }
 
 /*
  - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
- == static int p_simp_re(struct parse *p, int starordinary, size_t reclimit);
+ == static bool p_simp_re(struct parse *p, struct branchc *bc);
  */
-static int			/* was the simple RE an unbackslashed $? */
-p_simp_re(
-    struct parse *p,
-    int starordinary,		/* is a leading * an ordinary character? */
-    size_t reclimit)
+static bool			/* was the simple RE an unbackslashed $? */
+p_simp_re(struct parse *p, struct branchc *bc)
 {
 	int c;
+	int cc;			/* convenient/control character */
 	int count;
 	int count2;
-	sopno pos, i;
+	sopno pos;
+	bool handled;
+	size_t i;
+	wint_t wc;
 	sopno subno;
 #	define	BACKSL	(1<<CHAR_BIT)
 
-	_DIAGASSERT(p != NULL);
-
-	pos = HERE();		/* repetion op, if any, covers from here */
+	pos = HERE();		/* repetition op, if any, covers from here */
+	handled = false;
 
 	assert(MORE());		/* caller should have ensured this */
 	c = GETNEXT();
 	if (c == '\\') {
-		REQUIRE(MORE(), REG_EESCAPE);
-		c = BACKSL | (unsigned char)GETNEXT();
-	}
-	switch (c) {
-	case '.':
-		if (p->g->cflags&REG_NEWLINE)
-			nonnewline(p);
-		else
-			EMIT(OANY, 0);
-		break;
-	case '[':
-		p_bracket(p);
-		break;
-	case BACKSL|'{':
-		SETERROR(REG_BADRPT);
-		break;
-	case BACKSL|'(':
-		p->g->nsub++;
-		subno = p->g->nsub;
-		if (subno < NPAREN)
-			p->pbegin[subno] = HERE();
-		EMIT(OLPAREN, subno);
-		/* the MORE here is an error heuristic */
-		if (MORE() && !SEETWO('\\', ')'))
-			p_bre(p, '\\', ')', reclimit);
-		if (subno < NPAREN) {
-			p->pend[subno] = HERE();
-			assert(p->pend[subno] != 0);
+		(void)REQUIRE(MORE(), REG_EESCAPE);
+		cc = GETNEXT();
+		c = BACKSL | cc;
+#ifdef REGEX_GNU_EXTENSIONS
+		if (p->gnuext) {
+			handled = true;
+			switch (c) {
+			case BACKSL|'`':
+				EMIT(OBOS, 0);
+				break;
+			case BACKSL|'\'':
+				EMIT(OEOS, 0);
+				break;
+			case BACKSL|'B':
+				EMIT(ONWBND, 0);
+				break;
+			case BACKSL|'b':
+				EMIT(OWBND, 0);
+				break;
+			case BACKSL|'W':
+			case BACKSL|'w':
+			case BACKSL|'S':
+			case BACKSL|'s':
+				p_b_pseudoclass(p, cc);
+				break;
+			case BACKSL|'a':
+				ordinary(p, '\a');
+				break;
+			case BACKSL|'e':
+				ordinary(p, '\e');
+				break;
+			case BACKSL|'f':
+				ordinary(p, '\f');
+				break;
+			case BACKSL|'n':
+				ordinary(p, '\n');
+				break;
+			case BACKSL|'r':
+				ordinary(p, '\r');
+				break;
+			case BACKSL|'t':
+				ordinary(p, '\t');
+				break;
+			case BACKSL|'v':
+				ordinary(p, '\v');
+				break;
+			default:
+				handled = false;
+			}
 		}
-		EMIT(ORPAREN, subno);
-		REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
-		break;
-	case BACKSL|')':	/* should not get here -- must be user */
-	case BACKSL|'}':
-		SETERROR(REG_EPAREN);
-		break;
-	case BACKSL|'1':
-	case BACKSL|'2':
-	case BACKSL|'3':
-	case BACKSL|'4':
-	case BACKSL|'5':
-	case BACKSL|'6':
-	case BACKSL|'7':
-	case BACKSL|'8':
-	case BACKSL|'9':
-		i = (c&~BACKSL) - '0';
-		assert(i < NPAREN);
-		if (p->pend[i] != 0) {
-			assert(i <= p->g->nsub);
-			EMIT(OBACK_, i);
-			assert(p->pbegin[i] != 0);
-			assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
-			assert(OP(p->strip[p->pend[i]]) == ORPAREN);
-			(void) dupl(p, p->pbegin[i]+1, p->pend[i]);
-			EMIT(O_BACK, i);
-		} else
-			SETERROR(REG_ESUBREG);
-		p->g->backrefs = 1;
-		break;
-	case '*':
-		REQUIRE(starordinary, REG_BADRPT);
-		/* FALLTHROUGH */
-	default:
-		if (p->error != 0)
-			return(0);
-		ordinary(p, c &~ BACKSL);
-		break;
+#endif
+	}
+	if (!handled) {
+		switch (c) {
+		case '.':
+			if (p->g->cflags&REG_NEWLINE)
+				nonnewline(p);
+			else
+				EMIT(OANY, 0);
+			break;
+		case '[':
+			p_bracket(p);
+			break;
+		case BACKSL|'<':
+			EMIT(OBOW, 0);
+			break;
+		case BACKSL|'>':
+			EMIT(OEOW, 0);
+			break;
+		case BACKSL|'{':
+			SETERROR(REG_BADRPT);
+			break;
+		case BACKSL|'(':
+			p->g->nsub++;
+			subno = (sopno)p->g->nsub;
+			if (subno < NPAREN)
+				p->pbegin[subno] = HERE();
+			EMIT(OLPAREN, subno);
+			/* the MORE here is an error heuristic */
+			if (MORE() && !SEETWO('\\', ')'))
+				p_re(p, '\\', ')');
+			if (subno < NPAREN) {
+				p->pend[subno] = HERE();
+				assert(p->pend[subno] != 0);
+			}
+			EMIT(ORPAREN, subno);
+			(void)REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
+			break;
+		case BACKSL|')':	/* should not get here -- must be user */
+			SETERROR(REG_EPAREN);
+			break;
+		case BACKSL|'1':
+		case BACKSL|'2':
+		case BACKSL|'3':
+		case BACKSL|'4':
+		case BACKSL|'5':
+		case BACKSL|'6':
+		case BACKSL|'7':
+		case BACKSL|'8':
+		case BACKSL|'9':
+			i = (c&~BACKSL) - '0';
+			assert(i < NPAREN);
+			if (p->pend[i] != 0) {
+				assert(i <= p->g->nsub);
+				EMIT(OBACK_, i);
+				assert(p->pbegin[i] != 0);
+				assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
+				assert(OP(p->strip[p->pend[i]]) == ORPAREN);
+				(void) dupl(p, p->pbegin[i]+1, p->pend[i]);
+				EMIT(O_BACK, i);
+			} else
+				SETERROR(REG_ESUBREG);
+			p->g->backrefs = 1;
+			break;
+		case '*':
+			/*
+			 * Ordinary if used as the first character beyond BOL anchor of
+			 * a (sub-)expression, counts as a bad repetition operator if it
+			 * appears otherwise.
+			 */
+			(void)REQUIRE(bc->nchain == 0, REG_BADRPT);
+			/* FALLTHROUGH */
+		default:
+			if (p->error != 0)
+				return (false);	/* Definitely not $... */
+			p->next--;
+			wc = WGETNEXT();
+			if ((c & BACKSL) == 0 || may_escape(p, wc))
+				ordinary(p, wc);
+			else
+				SETERROR(REG_EESCAPE);
+			break;
+		}
 	}
 
 	if (EAT('*')) {		/* implemented as +? */
@@ -706,27 +1043,35 @@
 		ASTERN(O_PLUS, pos);
 		INSERT(OQUEST_, pos);
 		ASTERN(O_QUEST, pos);
+#ifdef REGEX_GNU_EXTENSIONS
+	} else if (p->gnuext && EATTWO('\\', '?')) {
+		INSERT(OQUEST_, pos);
+		ASTERN(O_QUEST, pos);
+	} else if (p->gnuext && EATTWO('\\', '+')) {
+		INSERT(OPLUS_, pos);
+		ASTERN(O_PLUS, pos);
+#endif
 	} else if (EATTWO('\\', '{')) {
 		count = p_count(p);
 		if (EAT(',')) {
-			if (MORE() && isdigit((unsigned char)PEEK())) {
+			if (MORE() && isdigit((uch)PEEK())) {
 				count2 = p_count(p);
-				REQUIRE(count <= count2, REG_BADBR);
+				(void)REQUIRE(count <= count2, REG_BADBR);
 			} else		/* single number with comma */
 				count2 = INFINITY;
 		} else		/* just a single number */
 			count2 = count;
-		repeat(p, pos, count, count2, 0);
+		repeat(p, pos, count, count2);
 		if (!EATTWO('\\', '}')) {	/* error heuristics */
 			while (MORE() && !SEETWO('\\', '}'))
 				NEXT();
-			REQUIRE(MORE(), REG_EBRACE);
+			(void)REQUIRE(MORE(), REG_EBRACE);
 			SETERROR(REG_BADBR);
 		}
-	} else if (c == (unsigned char)'$')	/* $ (but not \$) ends it */
-		return(1);
+	} else if (c == '$')     /* $ (but not \$) ends it */
+		return (true);
 
-	return(0);
+	return (false);
 }
 
 /*
@@ -734,105 +1079,95 @@
  == static int p_count(struct parse *p);
  */
 static int			/* the value */
-p_count(
-    struct parse *p)
+p_count(struct parse *p)
 {
 	int count = 0;
 	int ndigits = 0;
 
-	_DIAGASSERT(p != NULL);
-
-	while (MORE() && isdigit((unsigned char)PEEK()) && count <= DUPMAX) {
+	while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) {
 		count = count*10 + (GETNEXT() - '0');
 		ndigits++;
 	}
 
-	REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
+	(void)REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
 	return(count);
 }
 
 /*
  - p_bracket - parse a bracketed character list
  == static void p_bracket(struct parse *p);
- *
- * Note a significant property of this code:  if the allocset() did SETERROR,
- * no set operations are done.
  */
 static void
-p_bracket(
-    struct parse *p)
+p_bracket(struct parse *p)
 {
 	cset *cs;
-	int invert = 0;
-	_DIAGASSERT(p != NULL);
-
-	cs = allocset(p);
-	if (cs == NULL)
-		return;
+	wint_t ch;
 
 	/* Dept of Truly Sickening Special-Case Kludges */
-	if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]",
-					    (size_t)6) == 0) {
+	if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) {
 		EMIT(OBOW, 0);
 		NEXTn(6);
 		return;
 	}
-	if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]",
-					    (size_t)6) == 0) {
+	if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) {
 		EMIT(OEOW, 0);
 		NEXTn(6);
 		return;
 	}
 
+	if ((cs = allocset(p)) == NULL)
+		return;
+
+	if (p->g->cflags&REG_ICASE)
+		cs->icase = 1;
 	if (EAT('^'))
-		invert++;	/* make note to invert set at end */
+		cs->invert = 1;
 	if (EAT(']'))
-		CHadd(cs, ']');
+		CHadd(p, cs, ']');
 	else if (EAT('-'))
-		CHadd(cs, '-');
+		CHadd(p, cs, '-');
 	while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
 		p_b_term(p, cs);
 	if (EAT('-'))
-		CHadd(cs, '-');
-	MUSTEAT(']', REG_EBRACK);
+		CHadd(p, cs, '-');
+	(void)MUSTEAT(']', REG_EBRACK);
 
 	if (p->error != 0)	/* don't mess things up further */
 		return;
 
-	if (p->g->cflags&REG_ICASE) {
-		ssize_t i;
-		int ci;
+	if (cs->invert && p->g->cflags&REG_NEWLINE)
+		cs->bmp['\n' >> 3] |= 1 << ('\n' & 7);
 
-		for (i = p->g->csetsize - 1; i >= 0; i--)
-			if (CHIN(cs, i) && isalpha(i)) {
-				ci = othercase((int)i);
-				if (ci != i)
-					CHadd(cs, ci);
-			}
-		if (cs->multis != NULL)
-			mccase(p, cs);
-	}
-	if (invert) {
-		ssize_t i;
-
-		for (i = p->g->csetsize - 1; i >= 0; i--)
-			if (CHIN(cs, i))
-				CHsub(cs, (int)i);
-			else
-				CHadd(cs, (int)i);
-		if (p->g->cflags&REG_NEWLINE)
-			CHsub(cs, '\n');
-		if (cs->multis != NULL)
-			mcinvert(p, cs);
-	}
-
-	assert(cs->multis == NULL);		/* xxx */
-
-	if (nch(p, cs) == 1) {		/* optimize singleton sets */
-		ordinary(p, firstch(p, cs));
+	if ((ch = singleton(cs)) != OUT) {	/* optimize singleton sets */
+		ordinary(p, ch);
 		freeset(p, cs);
 	} else
-		EMIT(OANYOF, freezeset(p, cs));
+		EMIT(OANYOF, (size_t)(cs - p->g->sets));
+}
+
+static int
+p_range_cmp(wchar_t c1, wchar_t c2)
+{
+#ifdef REGEX_LIBC_COLLATE
+	return __wcollate_range_cmp(c1, c2);
+#elif defined(NLS)
+	/* Copied from libc/collate __wcollate_range_cmp */
+	wchar_t s1[2], s2[2];
+
+	s1[0] = c1;
+	s1[1] = L'\0';
+	s2[0] = c2;
+	s2[1] = L'\0';
+	return wcscoll(s1, s2);
+#else
+	char s1[2], s2[2];
+
+	s1[0] = (char)c1;
+	s1[1] = '\0';
+	s2[0] = (char)c2;
+	s2[1] = '\0';
+	return strcoll(s1, s2);
+#endif
 }
 
 /*
@@ -840,13 +1175,15 @@
  == static void p_b_term(struct parse *p, cset *cs);
  */
 static void
-p_b_term(
-    struct parse *p,
-    cset *cs)
+p_b_term(struct parse *p, cset *cs)
 {
 	char c;
-	char start, finish;
-	int i;
+	wint_t start, finish;
+	wint_t i;
+#ifdef REGEX_LIBC_COLLATE
+	struct xlocale_collate *table =
+		(struct xlocale_collate*)__get_locale()->components[XLC_COLLATE];
+#endif
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(cs != NULL);
@@ -856,11 +1193,9 @@
 	case '[':
 		c = (MORE2()) ? PEEK2() : '\0';
 		break;
-
 	case '-':
 		SETERROR(REG_ERANGE);
 		return;			/* NOTE RETURN */
-
 	default:
 		c = '\0';
 		break;
@@ -869,24 +1204,23 @@
 	switch (c) {
 	case ':':		/* character class */
 		NEXT2();
-		REQUIRE(MORE(), REG_EBRACK);
+		(void)REQUIRE(MORE(), REG_EBRACK);
 		c = PEEK();
-		REQUIRE(c != '-' && c != ']', REG_ECTYPE);
+		(void)REQUIRE(c != '-' && c != ']', REG_ECTYPE);
 		p_b_cclass(p, cs);
-		REQUIRE(MORE(), REG_EBRACK);
-		REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
+		(void)REQUIRE(MORE(), REG_EBRACK);
+		(void)REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
 		break;
 	case '=':		/* equivalence class */
 		NEXT2();
-		REQUIRE(MORE(), REG_EBRACK);
+		(void)REQUIRE(MORE(), REG_EBRACK);
 		c = PEEK();
-		REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
+		(void)REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
 		p_b_eclass(p, cs);
-		REQUIRE(MORE(), REG_EBRACK);
-		REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
+		(void)REQUIRE(MORE(), REG_EBRACK);
+		(void)REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
 		break;
 	default:		/* symbol, ordinary character, or range */
-/* xxx revision needed for multichar stuff */
 		start = p_b_symbol(p);
 		if (SEE('-') && MORE2() && PEEK2() != ']') {
 			/* range */
@@ -897,51 +1231,103 @@
 				finish = p_b_symbol(p);
 		} else
 			finish = start;
-/* xxx what about signed chars here... */
-		REQUIRE(start <= finish, REG_ERANGE);
-		for (i = start; i <= finish; i++)
-			CHadd(cs, i);
+		if (start == finish)
+			CHadd(p, cs, start);
+		else {
+#ifdef REGEX_LIBC_COLLATE
+			if (table->__collate_load_error || MB_CUR_MAX > 1) {
+#else
+			if (MB_CUR_MAX > 1) {
+#endif
+				(void)REQUIRE(start <= finish, REG_ERANGE);
+				CHaddrange(p, cs, start, finish);
+			} else {
+				(void)REQUIRE(p_range_cmp(start, finish) <= 0, REG_ERANGE);
+				for (i = 0; i <= UCHAR_MAX; i++) {
+					if (p_range_cmp(start, i) <= 0 &&
+					    p_range_cmp(i, finish) <= 0 )
+						CHadd(p, cs, i);
+				}
+			}
+		}
 		break;
 	}
 }
 
+#ifdef REGEX_GNU_EXTENSIONS
+/*
+ - p_b_pseudoclass - parse a pseudo-class (\w, \W, \s, \S)
+ == static int p_b_pseudoclass(struct parse *p, char c)
+ */
+static int
+p_b_pseudoclass(struct parse *p, char c) {
+	cset *cs;
+
+	if ((cs = allocset(p)) == NULL)
+		return(0);
+
+	if (p->g->cflags&REG_ICASE)
+		cs->icase = 1;
+
+	switch (c) {
+	case 'W':
+		cs->invert = 1;
+		/* FALLTHROUGH */
+	case 'w':
+		p_b_cclass_named(p, cs, "alnum");
+		break;
+	case 'S':
+		cs->invert = 1;
+		/* FALLTHROUGH */
+	case 's':
+		p_b_cclass_named(p, cs, "space");
+		break;
+	default:
+		return(0);
+	}
+
+	EMIT(OANYOF, (size_t)(cs - p->g->sets));
+	return(1);
+}
+#endif
+
 /*
  - p_b_cclass - parse a character-class name and deal with it
  == static void p_b_cclass(struct parse *p, cset *cs);
  */
 static void
-p_b_cclass(
-    struct parse *p,
-    cset *cs)
+p_b_cclass(struct parse *p, cset *cs)
 {
-	const char *sp;
-	const struct cclass *cp;
+	const char *sp = p->next;
 	size_t len;
-	const char *u;
-	char c;
+	char clname[16];
 
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	sp = p->next;
-
-	while (MORE() && isalpha((unsigned char)PEEK()))
+	while (MORE() && isalpha((uch)PEEK()))
 		NEXT();
 	len = p->next - sp;
-	for (cp = cclasses; cp->name != NULL; cp++)
-		if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
-			break;
-	if (cp->name == NULL) {
-		/* oops, didn't find it */
+	if (len >= sizeof(clname) - 1) {
 		SETERROR(REG_ECTYPE);
 		return;
 	}
+	memcpy(clname, sp, len);
+	clname[len] = '\0';
 
-	u = cp->chars;
-	while ((c = *u++) != '\0')
-		CHadd(cs, c);
-	for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
-		MCadd(p, cs, u);
+	p_b_cclass_named(p, cs, clname);
+}
+
+/*
+ - p_b_cclass_named - deal with a named character class
+ == static void p_b_cclass_named(struct parse *p, cset *cs, const char []);
+ */
+static void
+p_b_cclass_named(struct parse *p, cset *cs, const char clname[]) {
+	wctype_t wct;
+
+	if ((wct = wctype(clname)) == 0) {
+		SETERROR(REG_ECTYPE);
+		return;
+	}
+	CHaddtype(p, cs, wct);
 }
 
 /*
@@ -951,58 +1337,52 @@
  * This implementation is incomplete. xxx
  */
 static void
-p_b_eclass(
-    struct parse *p,
-    cset *cs)
+p_b_eclass(struct parse *p, cset *cs)
 {
-	char c;
+	wint_t c;
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(cs != NULL);
 
 	c = p_b_coll_elem(p, '=');
-	CHadd(cs, c);
+	CHadd(p, cs, c);
 }
 
 /*
  - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
- == static char p_b_symbol(struct parse *p);
+ == static wint_t p_b_symbol(struct parse *p);
  */
-static char			/* value of symbol */
-p_b_symbol(
-    struct parse *p)
+static wint_t			/* value of symbol */
+p_b_symbol(struct parse *p)
 {
-	char value;
+	wint_t value;
 
 	_DIAGASSERT(p != NULL);
 
-	REQUIRE(MORE(), REG_EBRACK);
+	(void)REQUIRE(MORE(), REG_EBRACK);
 	if (!EATTWO('[', '.'))
-		return(GETNEXT());
+		return(WGETNEXT());
 
 	/* collating symbol */
 	value = p_b_coll_elem(p, '.');
-	REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
+	(void)REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
 	return(value);
 }
 
 /*
  - p_b_coll_elem - parse a collating-element name and look it up
- == static char p_b_coll_elem(struct parse *p, int endc);
+ == static wint_t p_b_coll_elem(struct parse *p, wint_t endc);
  */
-static char			/* value of collating element */
-p_b_coll_elem(
-    struct parse *p,
-    int endc)			/* name ended by endc,']' */
+static wint_t			/* value of collating element */
+p_b_coll_elem(struct parse *p,
+	wint_t endc)		/* name ended by endc,']' */
 {
-	const char *sp;
-	const struct cname *cp;
+	const char *sp = p->next;
+	struct cname *cp;
 	size_t len;
 
 	_DIAGASSERT(p != NULL);
 
-	sp = p->next;
-
 	while (MORE() && !SEETWO(endc, ']'))
 		NEXT();
 	if (!MORE()) {
@@ -1013,85 +1393,152 @@
 	for (cp = cnames; cp->name != NULL; cp++)
 		if (strncmp(cp->name, sp, len) == 0 && strlen(cp->name) == len)
 			return(cp->code);	/* known name */
-	if (len == 1)
-		return(*sp);	/* single character */
-	SETERROR(REG_ECOLLATE);			/* neither */
+#ifdef NLS
+	mbstate_t mbs;
+	wchar_t wc;
+	size_t clen;
+
+	memset(&mbs, 0, sizeof(mbs));
+	if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len)
+		return (wc);			/* single character */
+	else if (clen == (size_t)-1 || clen == (size_t)-2)
+		SETERROR(REG_ILLSEQ);
+	else
+		SETERROR(REG_ECOLLATE);		/* neither */
 	return(0);
+#else
+	if (len == 1)
+		return *sp;    /* single character */
+	SETERROR(REG_ECOLLATE);                 /* neither */
+	return 0;
+#endif
+}
+
+/*
+ - may_escape - determine whether 'ch' is escape-able in the current context
+ == static int may_escape(struct parse *p, const wint_t ch)
+ */
+static bool
+may_escape(struct parse *p, const wint_t ch)
+{
+
+	if ((p->pflags & PFLAG_LEGACY_ESC) != 0)
+		return (true);
+	if (isalpha(ch) || ch == '\'' || ch == '`')
+		return (false);
+	return (true);
+#ifdef NOTYET
+	/*
+	 * Build a whitelist of characters that may be escaped to produce an
+	 * ordinary in the current context. This assumes that these have not
+	 * been otherwise interpreted as a special character. Escaping an
+	 * ordinary character yields undefined results according to
+	 * IEEE 1003.1-2008. Some extensions (notably, some GNU extensions) take
+	 * advantage of this and use escaped ordinary characters to provide
+	 * special meaning, e.g. \b, \B, \w, \W, \s, \S.
+	 */
+	switch(ch) {
+	case '|':
+	case '+':
+	case '?':
+		/* The above characters may not be escaped in BREs */
+		if (!(p->g->cflags&REG_EXTENDED))
+			return (false);
+		/* Fallthrough */
+	case '(':
+	case ')':
+	case '{':
+	case '}':
+	case '.':
+	case '[':
+	case ']':
+	case '\\':
+	case '*':
+	case '^':
+	case '$':
+		return (true);
+	default:
+		return (false);
+	}
+#endif
 }
 
 /*
  - othercase - return the case counterpart of an alphabetic
- == static int othercase(int ch);
+ == static wint_t othercase(wint_t ch);
  */
-static int			/* if no counterpart, return ch */
-othercase(
-    int ch)
+static wint_t			/* if no counterpart, return ch */
+othercase(wint_t ch)
 {
-	assert(isalpha(ch));
-	if (isupper(ch))
-		return(tolower(ch));
-	else if (islower(ch))
-		return(toupper(ch));
+	assert(iswalpha(ch));
+	if (iswupper(ch))
+		return(towlower(ch));
+	else if (iswlower(ch))
+		return(towupper(ch));
 	else			/* peculiar, but could happen */
 		return(ch);
 }
 
 /*
  - bothcases - emit a dualcase version of a two-case character
- == static void bothcases(struct parse *p, int ch);
+ == static void bothcases(struct parse *p, wint_t ch);
  *
  * Boy, is this implementation ever a kludge...
  */
 static void
-bothcases(
-    struct parse *p,
-    int ch)
+bothcases(struct parse *p, wint_t ch)
 {
-	const char *oldnext;
-	const char *oldend;
-	char bracket[3];
+	const char *oldnext = p->next;
+	const char *oldend = p->end;
+	char bracket[3 + MB_LEN_MAX];
+	size_t n;
 
 	_DIAGASSERT(p != NULL);
 
-	oldnext = p->next;
-	oldend = p->end;
-
 	assert(othercase(ch) != ch);	/* p_bracket() would recurse */
 	p->next = bracket;
-	p->end = bracket+2;
-	bracket[0] = ch;
-	bracket[1] = ']';
-	bracket[2] = '\0';
+#ifdef NLS
+	mbstate_t mbs;
+	memset(&mbs, 0, sizeof(mbs));
+	n = wcrtomb(bracket, ch, &mbs);
+	assert(n != (size_t)-1);
+#else
+	n = 0;
+	bracket[n++] = ch;
+#endif
+	bracket[n] = ']';
+	bracket[n + 1] = '\0';
+	p->end = bracket+n+1;
 	p_bracket(p);
-	assert(p->next == bracket+2);
+	assert(p->next == p->end);
 	p->next = oldnext;
 	p->end = oldend;
 }
 
 /*
  - ordinary - emit an ordinary character
- == static void ordinary(struct parse *p, int ch);
+ == static void ordinary(struct parse *p, wint_t ch);
  */
 static void
-ordinary(
-    struct parse *p,
-    int ch)
+ordinary(struct parse *p, wint_t ch)
 {
-	cat_t *cap;
-	unsigned char uc = (unsigned char)ch;
+	cset *cs;
 
 	_DIAGASSERT(p != NULL);
 
-	cap = p->g->categories;
-	if ((p->g->cflags & REG_ICASE) && isalpha(uc) && othercase(uc) != uc)
-		bothcases(p, uc);
+	if ((p->g->cflags&REG_ICASE) && iswalpha(ch) && othercase(ch) != ch)
+		bothcases(p, ch);
+	else if ((wint_t)(ch & OPDMASK) == ch)
+		EMIT(OCHAR, (size_t)ch);
 	else {
-		EMIT(OCHAR, (sopno)uc);
-		if (cap[uc] == 0) {
-			_DIAGASSERT(__type_fit(unsigned char,
-			    p->g->ncategories + 1));
-			cap[uc] = (unsigned char)p->g->ncategories++;
-		}
+		/*
+		 * Kludge: character is too big to fit into an OCHAR operand.
+		 * Emit a singleton set.
+		 */
+		if ((cs = allocset(p)) == NULL)
+			return;
+		CHadd(p, cs, ch);
+		EMIT(OANYOF, (size_t)(cs - p->g->sets));
 	}
 }
 
@@ -1102,18 +1549,14 @@
  * Boy, is this implementation ever a kludge...
  */
 static void
-nonnewline(
-    struct parse *p)
+nonnewline(struct parse *p)
 {
-	const char *oldnext;
-	const char *oldend;
+	const char *oldnext = p->next;
+	const char *oldend = p->end;
 	char bracket[4];
 
 	_DIAGASSERT(p != NULL);
 
-	oldnext = p->next;
-	oldend = p->end;
-
 	p->next = bracket;
 	p->end = bracket+3;
 	bracket[0] = '^';
@@ -1128,18 +1571,15 @@
 
 /*
  - repeat - generate code for a bounded repetition, recursively if needed
- == static void repeat(struct parse *p, sopno start, int from, int to,
- == size_t reclimit);
+ == static void repeat(struct parse *p, sopno start, int from, int to);
  */
 static void
-repeat(
-    struct parse *p,
-    sopno start,		/* operand from here to end of strip */
-    int from,			/* repeated from this number */
-    int to,			/* to this number of times (maybe INFINITY) */
-    size_t reclimit)
+repeat(struct parse *p,
+	sopno start,		/* operand from here to end of strip */
+	int from,		/* repeated from this number */
+	int to)			/* to this number of times (maybe INFINITY) */
 {
-	sopno finish;
+	sopno finish = HERE();
 #	define	N	2
 #	define	INF	3
 #	define	REP(f, t)	((f)*8 + (t))
@@ -1148,13 +1588,9 @@
 
 	_DIAGASSERT(p != NULL);
 
-	if (reclimit++ > RECLIMIT) 
-		p->error = REG_ESPACE;
-	if (p->error)
+	if (p->error != 0)	/* head off possible runaway recursion */
 		return;
 
-	finish = HERE();
-
 	assert(from <= to);
 
 	switch (REP(MAP(from), MAP(to))) {
@@ -1166,7 +1602,7 @@
 	case REP(0, INF):		/* as x{1,}? */
 		/* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
 		INSERT(OCH_, start);		/* offset is wrong... */
-		repeat(p, start+1, 1, to, reclimit);
+		repeat(p, start+1, 1, to);
 		ASTERN(OOR1, start);
 		AHEAD(start);			/* ... fix it */
 		EMIT(OOR2, 0);
@@ -1186,7 +1622,7 @@
 		ASTERN(O_CH, THERETHERE());
 		copy = dupl(p, start+1, finish+1);
 		assert(copy == finish+4);
-		repeat(p, copy, 1, to-1, reclimit);
+		repeat(p, copy, 1, to-1);
 		break;
 	case REP(1, INF):		/* as x+ */
 		INSERT(OPLUS_, start);
@@ -1194,11 +1630,11 @@
 		break;
 	case REP(N, N):			/* as xx{m-1,n-1} */
 		copy = dupl(p, start, finish);
-		repeat(p, copy, from-1, to-1, reclimit);
+		repeat(p, copy, from-1, to-1);
 		break;
 	case REP(N, INF):		/* as xx{n-1,INF} */
 		copy = dupl(p, start, finish);
-		repeat(p, copy, from-1, to, reclimit);
+		repeat(p, copy, from-1, to);
 		break;
 	default:			/* "can't happen" */
 		SETERROR(REG_ASSERT);	/* just in case */
@@ -1207,13 +1643,39 @@
 }
 
 /*
+ - wgetnext - helper function for WGETNEXT() macro. Gets the next wide
+ - character from the parse struct, signals a REG_ILLSEQ error if the
+ - character can't be converted. Returns the number of bytes consumed.
+ */
+static wint_t
+wgetnext(struct parse *p)
+{
+#ifdef NLS
+	mbstate_t mbs;
+	wchar_t wc;
+	size_t n;
+
+	memset(&mbs, 0, sizeof(mbs));
+	n = mbrtowc(&wc, p->next, (size_t)(p->end - p->next), &mbs);
+	if (n == (size_t)-1 || n == (size_t)-2) {
+		SETERROR(REG_ILLSEQ);
+		return (0);
+	}
+	if (n == 0)
+		n = 1;
+	p->next += n;
+	return wc;
+#else
+	return *p->next++;
+#endif
+}
+
+/*
  - seterr - set an error condition
  == static int seterr(struct parse *p, int e);
  */
 static int			/* useless but makes type checking happy */
-seterr(
-    struct parse *p,
-    int e)
+seterr(struct parse *p, int e)
 {
 
 	_DIAGASSERT(p != NULL);
@@ -1230,55 +1692,22 @@
  == static cset *allocset(struct parse *p);
  */
 static cset *
-allocset(
-    struct parse *p)
+allocset(struct parse *p)
 {
-	size_t no;
-	size_t nc;
-	size_t nbytes;
-	cset *cs;
-	size_t css;
-	size_t i;
-	void *old_ptr;
+	cset *cs, *ncs;
 
 	_DIAGASSERT(p != NULL);
 
-	no = p->g->ncsets++;
-	css = (size_t)p->g->csetsize;
-	if (no >= p->ncsalloc) {	/* need another column of space */
-		p->ncsalloc += CHAR_BIT;
-		nc = p->ncsalloc;
-		assert(nc % CHAR_BIT == 0);
-		nbytes = nc / CHAR_BIT * css;
-		if (MEMSIZE(p) > MEMLIMIT)
-			goto oomem;
-		if (reallocarr(&p->g->sets, nc, sizeof(cset)))
-			goto oomem;
-		old_ptr = p->g->setbits;
-		if (reallocarr(&p->g->setbits, nc / CHAR_BIT, css)) {
-			free(old_ptr);
-			goto oomem;
-		}
-		if (old_ptr != p->g->setbits) {
-			for (i = 0; i < no; i++)
-				p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
-		}
-		(void) memset((char *)p->g->setbits + (nbytes - css), 0, css);
+	ncs = reallocarray(p->g->sets, p->g->ncsets + 1, sizeof(*ncs));
+	if (ncs == NULL) {
+		SETERROR(REG_ESPACE);
+		return (NULL);
 	}
-
-	cs = &p->g->sets[no];
-	cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
-	cs->mask = 1 << (unsigned int)((no) % CHAR_BIT);
-	cs->hash = 0;
-	cs->smultis = 0;
-	cs->multis = NULL;
+	p->g->sets = ncs;
+	cs = &p->g->sets[p->g->ncsets++];
+	memset(cs, 0, sizeof(*cs));
 
 	return(cs);
-
-oomem:
-	SETERROR(REG_ESPACE);
-	/* caller's responsibility not to do set ops */
-	return NULL;
 }
 
 /*
@@ -1286,353 +1715,128 @@
  == static void freeset(struct parse *p, cset *cs);
  */
 static void
-freeset(
-    struct parse *p,
-    cset *cs)
+freeset(struct parse *p, cset *cs)
 {
-	size_t i;
 	cset *top;
-	size_t css;
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(cs != NULL);
 
 	top = &p->g->sets[p->g->ncsets];
-	css = (size_t)p->g->csetsize;
 
-	for (i = 0; i < css; i++)
-		CHsub(cs, (int)i);
+	free(cs->wides);
+	free(cs->ranges);
+	free(cs->types);
+	memset(cs, 0, sizeof(*cs));
 	if (cs == top-1)	/* recover only the easy case */
 		p->g->ncsets--;
 }
 
 /*
- - freezeset - final processing on a set of characters
- == static int freezeset(struct parse *p, cset *cs);
- *
- * The main task here is merging identical sets.  This is usually a waste
- * of time (although the hash code minimizes the overhead), but can win
- * big if REG_ICASE is being used.  REG_ICASE, by the way, is why the hash
- * is done using addition rather than xor -- all ASCII [aA] sets xor to
- * the same value!
+ - singleton - Determine whether a set contains only one character,
+ - returning it if so, otherwise returning OUT.
  */
-static sopno			/* set number */
-freezeset(
-    struct parse *p,
-    cset *cs)
+static wint_t
+singleton(cset *cs)
 {
-	uch h;
-	size_t i;
-	cset *top;
-	cset *cs2;
-	size_t css;
+	wint_t i, s, n;
 
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	h = cs->hash;
-	top = &p->g->sets[p->g->ncsets];
-	css = (size_t)p->g->csetsize;
-
-	/* look for an earlier one which is the same */
-	for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
-		if (cs2->hash == h && cs2 != cs) {
-			/* maybe */
-			for (i = 0; i < css; i++)
-				if (!!CHIN(cs2, i) != !!CHIN(cs, i))
-					break;		/* no */
-			if (i == css)
-				break;			/* yes */
-		}
-
-	if (cs2 < top) {	/* found one */
-		freeset(p, cs);
-		cs = cs2;
-	}
-
-	return (sopno)(cs - p->g->sets);
-}
-
-/*
- - firstch - return first character in a set (which must have at least one)
- == static int firstch(struct parse *p, cset *cs);
- */
-static int			/* character; there is no "none" value */
-firstch(
-    struct parse *p,
-    cset *cs)
-{
-	size_t i;
-	size_t css;
-
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	css = (size_t)p->g->csetsize;
-
-	for (i = 0; i < css; i++)
-		if (CHIN(cs, i))
-			return((char)i);
-	assert(never);
-	return(0);		/* arbitrary */
-}
-
-/*
- - nch - number of characters in a set
- == static int nch(struct parse *p, cset *cs);
- */
-static int
-nch(
-    struct parse *p,
-    cset *cs)
-{
-	size_t i;
-	size_t css;
-	int n = 0;
-
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	css = (size_t)p->g->csetsize;
-
-	for (i = 0; i < css; i++)
-		if (CHIN(cs, i))
+	for (i = n = 0; i < NC; i++)
+		if (CHIN(cs, i)) {
 			n++;
-	return(n);
+			s = i;
+		}
+	if (n == 1)
+		return (s);
+	if (cs->nwides == 1 && cs->nranges == 0 && cs->ntypes == 0 &&
+	    cs->icase == 0)
+		return (cs->wides[0]);
+	/* Don't bother handling the other cases. */
+	return (OUT);
 }
 
 /*
- - mcadd - add a collating element to a cset
- == static void mcadd(struct parse *p, cset *cs, \
- ==	char *cp);
+ - CHadd - add character to character set.
  */
 static void
-mcadd(
-    struct parse *p,
-    cset *cs,
-    const char *cp)
+CHadd(struct parse *p, cset *cs, wint_t ch)
 {
-	size_t oldend;
+	wint_t nch, *newwides;
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(cs != NULL);
-	_DIAGASSERT(cp != NULL);
 
-	oldend = cs->smultis;
+	assert(ch >= 0);
+	if (ch < NC)
+		cs->bmp[(unsigned)ch >> 3] |= 1 << (ch & 7);
+	else {
+		newwides = reallocarray(cs->wides, cs->nwides + 1,
+		    sizeof(*cs->wides));
+		if (newwides == NULL) {
+			SETERROR(REG_ESPACE);
+			return;
+		}
+		cs->wides = newwides;
+		cs->wides[cs->nwides++] = ch;
+	}
+	if (cs->icase) {
+		if ((nch = towlower(ch)) < NC)
+			cs->bmp[(unsigned)nch >> 3] |= 1 << (nch & 7);
+		if ((nch = towupper(ch)) < NC)
+			cs->bmp[(unsigned)nch >> 3] |= 1 << (nch & 7);
+	}
+}
 
-	cs->smultis += strlen(cp) + 1;
-	if (cs->multis == NULL)
-		cs->multis = malloc(cs->smultis);
-	else
-		cs->multis = realloc(cs->multis, cs->smultis);
-	if (cs->multis == NULL) {
+/*
+ - CHaddrange - add all characters in the range [min,max] to a character set.
+ */
+static void
+CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max)
+{
+	crange *newranges;
+
+	_DIAGASSERT(p != NULL);
+	_DIAGASSERT(cs != NULL);
+
+	for (; min < NC && min <= max; min++)
+		CHadd(p, cs, min);
+	if (min >= max)
+		return;
+	newranges = reallocarray(cs->ranges, cs->nranges + 1,
+	    sizeof(*cs->ranges));
+	if (newranges == NULL) {
 		SETERROR(REG_ESPACE);
 		return;
 	}
-
-	(void) strcpy(cs->multis + oldend - 1, cp);
-	cs->multis[cs->smultis - 1] = '\0';
+	cs->ranges = newranges;
+	cs->ranges[cs->nranges].min = min;
+	cs->ranges[cs->nranges].max = max;
+	cs->nranges++;
 }
 
-#if 0
 /*
- - mcsub - subtract a collating element from a cset
- == static void mcsub(cset *cs, char *cp);
+ - CHaddtype - add all characters of a certain type to a character set.
  */
 static void
-mcsub(
-    cset *cs,
-    char *cp)
+CHaddtype(struct parse *p, cset *cs, wctype_t wct)
 {
-	char *fp;
-	size_t len;
+	wint_t i;
+	wctype_t *newtypes;
 
+	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(cs != NULL);
-	_DIAGASSERT(cp != NULL);
 
-	fp = mcfind(cs, cp);
-	len = strlen(fp);
-
-	assert(fp != NULL);
-	(void) memmove(fp, fp + len + 1,
-				cs->smultis - (fp + len + 1 - cs->multis));
-	cs->smultis -= len;
-
-	if (cs->smultis == 0) {
-		free(cs->multis);
-		cs->multis = NULL;
+	for (i = 0; i < NC; i++)
+		if (iswctype(i, wct))
+			CHadd(p, cs, i);
+	newtypes = reallocarray(cs->types, cs->ntypes + 1,
+	    sizeof(*cs->types));
+	if (newtypes == NULL) {
+		SETERROR(REG_ESPACE);
 		return;
 	}
-
-	cs->multis = realloc(cs->multis, cs->smultis);
-	assert(cs->multis != NULL);
-}
-
-/*
- - mcin - is a collating element in a cset?
- == static int mcin(cset *cs, char *cp);
- */
-static int
-mcin(
-    cset *cs,
-    char *cp)
-{
-
-	_DIAGASSERT(cs != NULL);
-	_DIAGASSERT(cp != NULL);
-
-	return(mcfind(cs, cp) != NULL);
-}
-
-/*
- - mcfind - find a collating element in a cset
- == static char *mcfind(cset *cs, char *cp);
- */
-static char *
-mcfind(
-    cset *cs,
-    char *cp)
-{
-	char *p;
-
-	_DIAGASSERT(cs != NULL);
-	_DIAGASSERT(cp != NULL);
-
-	if (cs->multis == NULL)
-		return(NULL);
-	for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
-		if (strcmp(cp, p) == 0)
-			return(p);
-	return(NULL);
-}
-#endif
-
-/*
- - mcinvert - invert the list of collating elements in a cset
- == static void mcinvert(struct parse *p, cset *cs);
- *
- * This would have to know the set of possibilities.  Implementation
- * is deferred.
- */
-/* ARGSUSED */
-static void
-mcinvert(
-    struct parse *p,
-    cset *cs)
-{
-
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	assert(cs->multis == NULL);	/* xxx */
-}
-
-/*
- - mccase - add case counterparts of the list of collating elements in a cset
- == static void mccase(struct parse *p, cset *cs);
- *
- * This would have to know the set of possibilities.  Implementation
- * is deferred.
- */
-/* ARGSUSED */
-static void
-mccase(
-    struct parse *p,
-    cset *cs)
-{
-
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(cs != NULL);
-
-	assert(cs->multis == NULL);	/* xxx */
-}
-
-/*
- - isinsets - is this character in any sets?
- == static int isinsets(struct re_guts *g, int c);
- */
-static int			/* predicate */
-isinsets(
-    struct re_guts *g,
-    int c)
-{
-	uch *col;
-	size_t i;
-	size_t ncols;
-	unsigned uc = (unsigned char)c;
-
-	_DIAGASSERT(g != NULL);
-
-	if (g->setbits == NULL)
-		return 0;
-
-	ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
-
-	for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
-		if (col[uc] != 0)
-			return(1);
-	return(0);
-}
-
-/*
- - samesets - are these two characters in exactly the same sets?
- == static int samesets(struct re_guts *g, int c1, int c2);
- */
-static int			/* predicate */
-samesets(
-    struct re_guts *g,
-    int c1,
-    int c2)
-{
-	uch *col;
-	size_t i;
-	size_t ncols;
-	unsigned uc1 = (unsigned char)c1;
-	unsigned uc2 = (unsigned char)c2;
-
-	_DIAGASSERT(g != NULL);
-
-	ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
-
-	for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
-		if (col[uc1] != col[uc2])
-			return(0);
-	return(1);
-}
-
-/*
- - categorize - sort out character categories
- == static void categorize(struct parse *p, struct re_guts *g);
- */
-static void
-categorize(
-    struct parse *p,
-    struct re_guts *g)
-{
-	cat_t *cats;
-	int c;
-	int c2;
-	cat_t cat;
-
-	_DIAGASSERT(p != NULL);
-	_DIAGASSERT(g != NULL);
-
-	cats = g->categories;
-
-	/* avoid making error situations worse */
-	if (p->error != 0)
-		return;
-
-	for (c = CHAR_MIN; c <= CHAR_MAX; c++)
-		if (cats[c] == 0 && isinsets(g, c)) {
-			_DIAGASSERT(__type_fit(unsigned char,
-			    g->ncategories + 1));
-			cat = g->ncategories++;
-			cats[c] = cat;
-			for (c2 = c+1; c2 <= CHAR_MAX; c2++)
-				if (cats[c2] == 0 && samesets(g, c, c2))
-					cats[c2] = cat;
-		}
+	cs->types = newtypes;
+	cs->types[cs->ntypes++] = wct;
 }
 
 /*
@@ -1640,25 +1844,22 @@
  == static sopno dupl(struct parse *p, sopno start, sopno finish);
  */
 static sopno			/* start of duplicate */
-dupl(
-    struct parse *p,
-    sopno start,			/* from here */
-    sopno finish)			/* to this less one */
+dupl(struct parse *p,
+	sopno start,		/* from here */
+	sopno finish)		/* to this less one */
 {
-	sopno ret;
+	sopno ret = HERE();
 	sopno len = finish - start;
 
 	_DIAGASSERT(p != NULL);
 
-	ret = HERE();
-
 	assert(finish >= start);
 	if (len == 0)
 		return(ret);
-	if (!enlarge(p, p->ssize + len))/* this many unexpected additions */
-		return ret;
-	(void)memcpy(p->strip + p->slen, p->strip + start,
-	    (size_t)len * sizeof(sop));
+	if (!enlarge(p, p->ssize + len)) /* this many unexpected additions */
+		return(ret);
+	(void) memcpy(p->strip + p->slen,
+	    p->strip + start, len * sizeof(*p->strip));
 	p->slen += len;
 	return(ret);
 }
@@ -1672,17 +1873,14 @@
  * some changes to the data structures.  Maybe later.
  */
 static void
-doemit(
-    struct parse *p,
-    sop op,
-    sopno opnd)
+doemit(struct parse *p, sop op, size_t opnd)
 {
-	_DIAGASSERT(p != NULL);
-
 	/* avoid making error situations worse */
 	if (p->error != 0)
 		return;
 
+	_DIAGASSERT(p != NULL);
+
 	/* deal with oversize operands ("can't happen", more or less) */
 	assert(opnd < 1<<OPSHIFT);
 
@@ -1692,7 +1890,7 @@
 			return;
 
 	/* finally, it's all reduced to the easy case */
-	p->strip[p->slen++] = (sop)SOP(op, opnd);
+	p->strip[p->slen++] = (sopno)SOP(op, opnd);
 }
 
 /*
@@ -1700,11 +1898,7 @@
  == static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos);
  */
 static void
-doinsert(
-    struct parse *p,
-    sop op,
-    sopno opnd,
-    sopno pos)
+doinsert(struct parse *p, sop op, size_t opnd, sopno pos)
 {
 	sopno sn;
 	sop s;
@@ -1732,7 +1926,8 @@
 		}
 	}
 
-	memmove(&p->strip[pos+1], &p->strip[pos], (HERE()-pos-1)*sizeof(sop));
+	memmove(&p->strip[pos+1], &p->strip[pos],
+	    (HERE()-pos-1)*sizeof(*p->strip));
 	p->strip[pos] = s;
 }
 
@@ -1741,10 +1936,7 @@
  == static void dofwd(struct parse *p, sopno pos, sop value);
  */
 static void
-dofwd(
-    struct parse *p,
-    sopno pos,
-    sopno value)
+dofwd(struct parse *p, sopno pos, sop value)
 {
 
 	_DIAGASSERT(p != NULL);
@@ -1754,25 +1946,29 @@
 		return;
 
 	assert(value < 1<<OPSHIFT);
-	p->strip[pos] = (sop)(OP(p->strip[pos]) | value);
+	p->strip[pos] = OP(p->strip[pos]) | value;
 }
 
 /*
  - enlarge - enlarge the strip
- == static void enlarge(struct parse *p, sopno size);
+ == static int enlarge(struct parse *p, sopno size);
  */
 static int
 enlarge(struct parse *p, sopno size)
 {
+	sop *sp;
+
 	_DIAGASSERT(p != NULL);
 
 	if (p->ssize >= size)
 		return 1;
 
-	if (MEMSIZE(p) > MEMLIMIT || reallocarr(&p->strip, size, sizeof(sop))) {
+	sp = reallocarray(p->strip, size, sizeof(*p->strip));
+	if (sp == NULL) {
 		SETERROR(REG_ESPACE);
 		return 0;
 	}
+	p->strip = sp;
 	p->ssize = size;
 	return 1;
 }
@@ -1782,18 +1978,18 @@
  == static void stripsnug(struct parse *p, struct re_guts *g);
  */
 static void
-stripsnug(
-    struct parse *p,
-    struct re_guts *g)
+stripsnug(struct parse *p, struct re_guts *g)
 {
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(g != NULL);
 
 	g->nstates = p->slen;
-	g->strip = p->strip;
-	reallocarr(&g->strip, p->slen, sizeof(sop));
-	/* Ignore error as tries to free memory only. */
+	g->strip = reallocarray(p->strip, p->slen, sizeof(*p->strip));
+	if (g->strip == NULL) {
+		SETERROR(REG_ESPACE);
+		g->strip = p->strip;
+	}
 }
 
 /*
@@ -1807,9 +2003,7 @@
  * Note that must and mlen got initialized during setup.
  */
 static void
-findmust(
-    struct parse *p,
-    struct re_guts *g)
+findmust(struct parse *p, struct re_guts *g)
 {
 	sop *scan;
 	sop *start = NULL;
@@ -1817,7 +2011,8 @@
 	sopno newlen;
 	sop s;
 	char *cp;
-	sopno i;
+	int offset;
+	mbstate_t mbs;
 
 	_DIAGASSERT(p != NULL);
 	_DIAGASSERT(g != NULL);
@@ -1826,16 +2021,39 @@
 	if (p->error != 0)
 		return;
 
+#ifdef notyet
+	/*
+	 * It's not generally safe to do a ``char'' substring search on
+	 * multibyte character strings, but it's safe for at least
+	 * UTF-8 (see RFC 3629).
+	 */
+	if (MB_CUR_MAX > 1 &&
+	    strcmp(_CurrentRuneLocale->__encoding, "UTF-8") != 0)
+		return;
+#endif
+
 	/* find the longest OCHAR sequence in strip */
 	newlen = 0;
+	offset = 0;
+	g->moffset = 0;
 	scan = g->strip + 1;
 	do {
 		s = *scan++;
 		switch (OP(s)) {
 		case OCHAR:		/* sequence member */
-			if (newlen == 0)		/* new sequence */
+			if (newlen == 0) {		/* new sequence */
+				memset(&mbs, 0, sizeof(mbs));
 				newstart = scan - 1;
+			}
+#ifdef NLS
+			char buf[MB_LEN_MAX];
+			size_t clen = wcrtomb(buf, (int)OPND(s), &mbs);
+			if (clen == (size_t)-1)
+				goto toohard;
+			newlen += (sopno)clen;
+#else
 			newlen++;
+#endif
 			break;
 		case OPLUS_:		/* things that don't break one */
 		case OLPAREN:
@@ -1843,60 +2061,346 @@
 			break;
 		case OQUEST_:		/* things that must be skipped */
 		case OCH_:
+			offset = altoffset(scan, offset);
 			scan--;
 			do {
 				scan += OPND(s);
 				s = *scan;
 				/* assert() interferes w debug printouts */
-				if (OP(s) != O_QUEST && OP(s) != O_CH &&
-							OP(s) != OOR2) {
+				if (OP(s) != O_QUEST &&
+				    OP(s) != O_CH && OP(s) != OOR2) {
 					g->iflags |= BAD;
 					return;
 				}
 			} while (OP(s) != O_QUEST && OP(s) != O_CH);
 			/* FALLTHROUGH */
-		default:		/* things that break a sequence */
-			if (newlen > g->mlen) {		/* ends one */
+		case OBOW:		/* things that break a sequence */
+		case OEOW:
+		case OBOL:
+		case OEOL:
+		case OBOS:
+		case OEOS:
+		case OWBND:
+		case ONWBND:
+		case O_QUEST:
+		case O_CH:
+		case OEND:
+			if (newlen > (sopno)g->mlen) {		/* ends one */
 				start = newstart;
 				g->mlen = newlen;
+				if (offset > -1) {
+					g->moffset += offset;
+					offset = newlen;
+				} else
+					g->moffset = offset;
+			} else {
+				if (offset > -1)
+					offset += newlen;
 			}
 			newlen = 0;
 			break;
+		case OANY:
+			if (newlen > (sopno)g->mlen) {		/* ends one */
+				start = newstart;
+				g->mlen = newlen;
+				if (offset > -1) {
+					g->moffset += offset;
+					offset = newlen;
+				} else
+					g->moffset = offset;
+			} else {
+				if (offset > -1)
+					offset += newlen;
+			}
+			if (offset > -1)
+				offset++;
+			newlen = 0;
+			break;
+		case OANYOF:		/* may or may not invalidate offset */
+			/* First, everything as OANY */
+			if (newlen > (sopno)g->mlen) {		/* ends one */
+				start = newstart;
+				g->mlen = newlen;
+				if (offset > -1) {
+					g->moffset += offset;
+					offset = newlen;
+				} else
+					g->moffset = offset;
+			} else {
+				if (offset > -1)
+					offset += newlen;
+			}
+			if (offset > -1)
+				offset++;
+			newlen = 0;
+			break;
+#ifdef NLS
+		toohard:/*FALLTHROUGH*/
+#endif
+		default:
+			/* Anything here makes it impossible or too hard
+			 * to calculate the offset -- so we give up;
+			 * save the last known good offset, in case the
+			 * must sequence doesn't occur later.
+			 */
+			if (newlen > (sopno)g->mlen) {		/* ends one */
+				start = newstart;
+				g->mlen = newlen;
+				if (offset > -1)
+					g->moffset += offset;
+				else
+					g->moffset = offset;
+			}
+			offset = -1;
+			newlen = 0;
+			break;
 		}
 	} while (OP(s) != OEND);
 
-	if (start == NULL)
-		g->mlen = 0;
-
-	if (g->mlen == 0)	/* there isn't one */
+	if (g->mlen == 0) {		/* there isn't one */
+		g->moffset = -1;
 		return;
+	}
 
 	/* turn it into a character string */
 	g->must = malloc((size_t)g->mlen + 1);
 	if (g->must == NULL) {		/* argh; just forget it */
 		g->mlen = 0;
+		g->moffset = -1;
 		return;
 	}
 	cp = g->must;
 	scan = start;
-	for (i = g->mlen; i > 0; i--) {
+	memset(&mbs, 0, sizeof(mbs));
+	while (cp < g->must + g->mlen) {
 		while (OP(s = *scan++) != OCHAR)
 			continue;
-		assert(cp < g->must + g->mlen);
-		*cp++ = (char)OPND(s);
+#ifdef NLS
+		size_t clen = wcrtomb(cp, (int)OPND(s), &mbs);
+		assert(clen != (size_t)-1);
+		cp += clen;
+#else
+		*cp++ = OPND(s);
+#endif
 	}
 	assert(cp == g->must + g->mlen);
 	*cp++ = '\0';		/* just on general principles */
 }
 
 /*
+ - altoffset - choose biggest offset among multiple choices
+ == static int altoffset(sop *scan, int offset);
+ *
+ * Compute, recursively if necessary, the largest offset among multiple
+ * re paths.
+ */
+static int
+altoffset(sop *scan, int offset)
+{
+	int largest;
+	int try;
+	sop s;
+
+	_DIAGASSERT(scan != NULL);
+
+	/* If we gave up already on offsets, return */
+	if (offset == -1)
+		return -1;
+
+	largest = 0;
+	try = 0;
+	s = *scan++;
+	while (OP(s) != O_QUEST && OP(s) != O_CH) {
+		switch (OP(s)) {
+		case OOR1:
+			if (try > largest)
+				largest = try;
+			try = 0;
+			break;
+		case OQUEST_:
+		case OCH_:
+			try = altoffset(scan, try);
+			if (try == -1)
+				return -1;
+			scan--;
+			do {
+				scan += OPND(s);
+				s = *scan;
+				if (OP(s) != O_QUEST &&
+				    OP(s) != O_CH && OP(s) != OOR2)
+					return -1;
+			} while (OP(s) != O_QUEST && OP(s) != O_CH);
+			/* We must skip to the next position, or we'll
+			 * leave altoffset() too early.
+			 */
+			scan++;
+			break;
+		case OANYOF:
+		case OCHAR:
+		case OANY:
+			try++;
+			/*FALLTHROUGH*/
+		case OBOW:
+		case OEOW:
+		case OWBND:
+		case ONWBND:
+		case OLPAREN:
+		case ORPAREN:
+		case OOR2:
+			break;
+		default:
+			try = -1;
+			break;
+		}
+		if (try == -1)
+			return -1;
+		s = *scan++;
+	}
+
+	if (try > largest)
+		largest = try;
+
+	return largest+offset;
+}
+
+/*
+ - computejumps - compute char jumps for BM scan
+ == static void computejumps(struct parse *p, struct re_guts *g);
+ *
+ * This algorithm assumes g->must exists and is has size greater than
+ * zero. It's based on the algorithm found on Computer Algorithms by
+ * Sara Baase.
+ *
+ * A char jump is the number of characters one needs to jump based on
+ * the value of the character from the text that was mismatched.
+ */
+static void
+computejumps(struct parse *p, struct re_guts *g)
+{
+	int ch;
+	size_t mindex;
+
+	_DIAGASSERT(p != NULL);
+	_DIAGASSERT(g != NULL);
+
+	/* Avoid making errors worse */
+	if (p->error != 0)
+		return;
+
+	g->charjump = calloc((NC_MAX + 1), sizeof(*g->charjump));
+	if (g->charjump == NULL)	/* Not a fatal error */
+		return;
+	/* Adjust for signed chars, if necessary */
+	g->charjump = &g->charjump[-(CHAR_MIN)];
+
+	/* If the character does not exist in the pattern, the jump
+	 * is equal to the number of characters in the pattern.
+	 */
+	for (ch = CHAR_MIN; ch < (CHAR_MAX + 1); ch++)
+		g->charjump[ch] = g->mlen;
+
+	/* If the character does exist, compute the jump that would
+	 * take us to the last character in the pattern equal to it
+	 * (notice that we match right to left, so that last character
+	 * is the first one that would be matched).
+	 */
+	for (mindex = 0; mindex < g->mlen; mindex++)
+		g->charjump[(int)g->must[mindex]] = g->mlen - mindex - 1;
+}
+
+/*
+ - computematchjumps - compute match jumps for BM scan
+ == static void computematchjumps(struct parse *p, struct re_guts *g);
+ *
+ * This algorithm assumes g->must exists and is has size greater than
+ * zero. It's based on the algorithm found on Computer Algorithms by
+ * Sara Baase.
+ *
+ * A match jump is the number of characters one needs to advance based
+ * on the already-matched suffix.
+ * Notice that all values here are minus (g->mlen-1), because of the way
+ * the search algorithm works.
+ */
+static void
+computematchjumps(struct parse *p, struct re_guts *g)
+{
+	size_t mindex;		/* General "must" iterator */
+	size_t suffix;		/* Keeps track of matching suffix */
+	size_t ssuffix;		/* Keeps track of suffixes' suffix */
+	size_t* pmatches;	/* pmatches[k] points to the next i
+				 * such that i+1...mlen is a substring
+				 * of k+1...k+mlen-i-1
+				 */
+
+	_DIAGASSERT(p != NULL);
+	_DIAGASSERT(g != NULL);
+
+	/* Avoid making errors worse */
+	if (p->error != 0)
+		return;
+
+	pmatches = calloc(g->mlen, sizeof(*pmatches));
+	if (pmatches == NULL) {
+		g->matchjump = NULL;
+		return;
+	}
+
+	g->matchjump = calloc(g->mlen, sizeof(*g->matchjump));
+	if (g->matchjump == NULL) {	/* Not a fatal error */
+		free(pmatches);
+		return;
+	}
+
+	/* Set maximum possible jump for each character in the pattern */
+	for (mindex = 0; mindex < g->mlen; mindex++)
+		g->matchjump[mindex] = 2 * g->mlen - mindex - 1;
+
+	/* Compute pmatches[] */
+	for (suffix = mindex = g->mlen; mindex-- > 0; suffix--) {
+		pmatches[mindex] = suffix;
+
+		/* If a mismatch is found, interrupting the substring,
+		 * compute the matchjump for that position. If no
+		 * mismatch is found, then a text substring mismatched
+		 * against the suffix will also mismatch against the
+		 * substring.
+		 */
+		while (suffix < g->mlen
+		    && g->must[mindex] != g->must[suffix]) {
+			g->matchjump[suffix] = MIN(g->matchjump[suffix],
+			    g->mlen - mindex - 1);
+			suffix = pmatches[suffix];
+		}
+	}
+
+	/* Compute the matchjump up to the last substring found to jump
+	 * to the beginning of the largest must pattern prefix matching
+	 * it's own suffix.
+	 */
+	for (mindex = 0; mindex <= suffix; mindex++)
+		g->matchjump[mindex] = MIN(g->matchjump[mindex],
+		    g->mlen + suffix - mindex);
+
+        ssuffix = pmatches[suffix];
+        while (suffix < g->mlen) {
+                while (suffix <= ssuffix && suffix < g->mlen) {
+                        g->matchjump[suffix] = MIN(g->matchjump[suffix],
+			    g->mlen + ssuffix - suffix);
+                        suffix++;
+                }
+		if (suffix < g->mlen)
+                	ssuffix = pmatches[ssuffix];
+        }
+
+	free(pmatches);
+}
+
+/*
  - pluscount - count + nesting
  == static sopno pluscount(struct parse *p, struct re_guts *g);
  */
 static sopno			/* nesting depth */
-pluscount(
-    struct parse *p,
-    struct re_guts *g)
+pluscount(struct parse *p, struct re_guts *g)
 {
 	sop *scan;
 	sop s;
diff --git a/libc/upstream-netbsd/lib/libc/regex/regerror.c b/libc/upstream-netbsd/lib/libc/regex/regerror.c
index e00d7c0..cfd7704 100644
--- a/libc/upstream-netbsd/lib/libc/regex/regerror.c
+++ b/libc/upstream-netbsd/lib/libc/regex/regerror.c
@@ -1,6 +1,9 @@
-/*	$NetBSD: regerror.c,v 1.23 2007/02/09 23:44:18 junyoung Exp $	*/
+/*	$NetBSD: regerror.c,v 1.26 2022/11/05 11:33:55 riastradh Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -34,76 +37,38 @@
  *	@(#)regerror.c	8.4 (Berkeley) 3/20/94
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)regerror.c	8.4 (Berkeley) 3/20/94
- */
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
 
 #include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
 #if 0
 static char sccsid[] = "@(#)regerror.c	8.4 (Berkeley) 3/20/94";
-#else
-__RCSID("$NetBSD: regerror.c,v 1.23 2007/02/09 23:44:18 junyoung Exp $");
+__FBSDID("$FreeBSD: head/lib/libc/regex/regerror.c 326025 2017-11-20 19:49:47Z pfg $");
 #endif
-#endif /* LIBC_SCCS and not lint */
+__RCSID("$NetBSD: regerror.c,v 1.26 2022/11/05 11:33:55 riastradh Exp $");
 
 #include "namespace.h"
 #include <sys/types.h>
-
-#include <assert.h>
-#include <ctype.h>
-#include <limits.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
+#include <limits.h>
+#include <stdlib.h>
 #include <regex.h>
 
+#include "utils.h"
+
 #ifdef __weak_alias
 __weak_alias(regerror,_regerror)
 #endif
 
-#include "utils.h"
-
 /* ========= begin header generated by ./mkh ========= */
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* === regerror.c === */
-static const char *regatoi(const regex_t *preg, char *localbuf, size_t buflen);
+static const char *regatoi(const regex_t *preg, char *localbufm, size_t buflen);
 
 #ifdef __cplusplus
 }
@@ -126,6 +91,8 @@
  = #define	REG_EMPTY	14
  = #define	REG_ASSERT	15
  = #define	REG_INVARG	16
+ = #define	REG_ENOSYS	17
+ = #define	REG_ILLSEQ	18
  = #define	REG_ATOI	255	// convert name to number (!)
  = #define	REG_ITOA	0400	// convert number to name (!)
  */
@@ -134,36 +101,36 @@
 	const char *name;
 	const char *explain;
 } rerrs[] = {
-	{ REG_NOMATCH,	"REG_NOMATCH",	"regexec() failed to match" },
-	{ REG_BADPAT,	"REG_BADPAT",	"invalid regular expression" },
-	{ REG_ECOLLATE,	"REG_ECOLLATE",	"invalid collating element" },
-	{ REG_ECTYPE,	"REG_ECTYPE",	"invalid character class" },
-	{ REG_EESCAPE,	"REG_EESCAPE",	"trailing backslash (\\)" },
-	{ REG_ESUBREG,	"REG_ESUBREG",	"invalid backreference number" },
-	{ REG_EBRACK,	"REG_EBRACK",	"brackets ([ ]) not balanced" },
-	{ REG_EPAREN,	"REG_EPAREN",	"parentheses not balanced" },
-	{ REG_EBRACE,	"REG_EBRACE",	"braces not balanced" },
-	{ REG_BADBR,	"REG_BADBR",	"invalid repetition count(s)" },
-	{ REG_ERANGE,	"REG_ERANGE",	"invalid character range" },
-	{ REG_ESPACE,	"REG_ESPACE",	"out of memory" },
-	{ REG_BADRPT,	"REG_BADRPT",	"repetition-operator operand invalid" },
-	{ REG_EMPTY,	"REG_EMPTY",	"empty (sub)expression" },
-	{ REG_ASSERT,	"REG_ASSERT",	"\"can't happen\" -- you found a bug" },
-	{ REG_INVARG,	"REG_INVARG",	"invalid argument to regex routine" },
-	{ 0,		"",		"*** unknown regexp error code ***" }
+	{REG_NOMATCH,	"REG_NOMATCH",	"regexec() failed to match"},
+	{REG_BADPAT,	"REG_BADPAT",	"invalid regular expression"},
+	{REG_ECOLLATE,	"REG_ECOLLATE",	"invalid collating element"},
+	{REG_ECTYPE,	"REG_ECTYPE",	"invalid character class"},
+	{REG_EESCAPE,	"REG_EESCAPE",	"trailing backslash (\\)"},
+	{REG_ESUBREG,	"REG_ESUBREG",	"invalid backreference number"},
+	{REG_EBRACK,	"REG_EBRACK",	"brackets ([ ]) not balanced"},
+	{REG_EPAREN,	"REG_EPAREN",	"parentheses not balanced"},
+	{REG_EBRACE,	"REG_EBRACE",	"braces not balanced"},
+	{REG_BADBR,	"REG_BADBR",	"invalid repetition count(s)"},
+	{REG_ERANGE,	"REG_ERANGE",	"invalid character range"},
+	{REG_ESPACE,	"REG_ESPACE",	"out of memory"},
+	{REG_BADRPT,	"REG_BADRPT",	"repetition-operator operand invalid"},
+	{REG_EMPTY,	"REG_EMPTY",	"empty (sub)expression"},
+	{REG_ASSERT,	"REG_ASSERT",	"\"can't happen\" -- you found a bug"},
+	{REG_INVARG,	"REG_INVARG",	"invalid argument to regex routine"},
+	{REG_ILLSEQ,	"REG_ILLSEQ",	"illegal byte sequence"},
+	{0,		"",		"*** unknown regexp error code ***"}
 };
 
 /*
- * regerror - the interface to error numbers
- * extern size_t regerror(int, const regex_t *, char *, size_t);
+ - regerror - the interface to error numbers
+ = extern size_t regerror(int, const regex_t *, char *, size_t);
  */
 /* ARGSUSED */
 size_t
-regerror(
-    int errcode,
-    const regex_t *preg,
-    char *errbuf,
-    size_t errbuf_size)
+regerror(int errcode,
+	 const regex_t * __restrict preg,
+	 char * __restrict errbuf,
+	 size_t errbuf_size)
 {
 	const struct rerr *r;
 	size_t len;
@@ -172,21 +139,20 @@
 	char convbuf[50];
 
 	_DIAGASSERT(errcode != REG_ATOI || preg != NULL);
-	_DIAGASSERT(errbuf != NULL);
+	_DIAGASSERT(errbuf_size == 0 || errbuf != NULL);
 
-	if (errcode == REG_ATOI)
+	if (errcode == REG_ATOI) {
 		s = regatoi(preg, convbuf, sizeof convbuf);
-	else {
+	} else {
 		for (r = rerrs; r->code != 0; r++)
 			if (r->code == target)
 				break;
-	
-		if (errcode & REG_ITOA) {
-			if (r->code != 0) {
-				(void)strlcpy(convbuf, r->name, sizeof convbuf);
-			} else
-				(void)snprintf(convbuf, sizeof convbuf,
-				    "REG_0x%x", target);
+
+		if (errcode&REG_ITOA) {
+			if (r->code != 0)
+				(void) strlcpy(convbuf, r->name, sizeof(convbuf));
+			else
+				snprintf(convbuf, sizeof(convbuf), "REG_0x%x", target);
 			s = convbuf;
 		} else
 			s = r->explain;
@@ -194,21 +160,17 @@
 
 	len = strlen(s) + 1;
 	if (errbuf_size > 0)
-		(void)strlcpy(errbuf, s, errbuf_size);
+		(void) strlcpy(errbuf, s, errbuf_size);
 
 	return(len);
 }
 
 /*
- * regatoi - internal routine to implement REG_ATOI
- * static const char *regatoi(const regex_t *preg, char *localbuf,
- * size_t buflen);
+ - regatoi - internal routine to implement REG_ATOI
+ == static char *regatoi(const regex_t *preg, char *localbuf);
  */
 static const char *
-regatoi(
-    const regex_t *preg,
-    char *localbuf,
-    size_t buflen)
+regatoi(const regex_t *preg, char *localbuf, size_t buflen)
 {
 	const struct rerr *r;
 
@@ -218,6 +180,6 @@
 	if (r->code == 0)
 		return "0";
 
-	(void)snprintf(localbuf, buflen, "%d", r->code);
+	snprintf(localbuf, buflen, "%d", r->code);
 	return localbuf;
 }
diff --git a/libc/upstream-netbsd/lib/libc/regex/regex2.h b/libc/upstream-netbsd/lib/libc/regex/regex2.h
index 7c877ee..fbfff0d 100644
--- a/libc/upstream-netbsd/lib/libc/regex/regex2.h
+++ b/libc/upstream-netbsd/lib/libc/regex/regex2.h
@@ -1,6 +1,9 @@
-/*	$NetBSD: regex2.h,v 1.13 2011/10/09 18:23:00 christos Exp $	*/
+/*	$NetBSD: regex2.h,v 1.15 2021/02/24 18:13:21 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -32,43 +35,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)regex2.h	8.4 (Berkeley) 3/20/94
- */
-
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)regex2.h	8.4 (Berkeley) 3/20/94
+ * $FreeBSD: head/lib/libc/regex/regex2.h 368359 2020-12-05 03:18:48Z kevans $
  */
 
 /*
@@ -109,68 +76,100 @@
  * In state representations, an operator's bit is on to signify a state
  * immediately *preceding* "execution" of that operator.
  */
-typedef u_int32_t sop;	/* strip operator */
-typedef size_t sopno;
-#define	OPRMASK	((u_int32_t)0xf8000000UL)
-#define	OPDMASK	((u_int32_t)0x07ffffffUL)
-#define	OPSHIFT	((unsigned)27)
+typedef uint32_t sop;	/* strip operator */
+typedef uint32_t sopno;
+#define	OPRMASK	0xf8000000U
+#define	OPDMASK	0x07ffffffU
+#define	OPSHIFT	(27U)
 #define	OP(n)	((n)&OPRMASK)
-#define	OPND(n)	((int)((n)&OPDMASK))
+#define	OPND(n)	((n)&OPDMASK)
 #define	SOP(op, opnd)	((op)|(opnd))
-
-#define OPC(n)	(((u_int32_t)(n))<<OPSHIFT)
-/* operators		   meaning	operand			*/
-/*					(back, fwd are offsets)	*/
-#define	OEND	OPC(1)	/* endmarker	-			*/
-#define	OCHAR	OPC(2)	/* character	unsigned char		*/
-#define	OBOL	OPC(3)	/* left anchor	-			*/
-#define	OEOL	OPC(4)	/* right anchor	-			*/
-#define	OANY	OPC(5)	/* .		-			*/
-#define	OANYOF	OPC(6)	/* [...]	set number		*/
-#define	OBACK_	OPC(7)	/* begin \d	paren number		*/
-#define	O_BACK	OPC(8)	/* end \d	paren number		*/
-#define	OPLUS_	OPC(9)	/* + prefix	fwd to suffix		*/
-#define	O_PLUS	OPC(10)	/* + suffix	back to prefix		*/
-#define	OQUEST_	OPC(11)	/* ? prefix	fwd to suffix		*/
-#define	O_QUEST	OPC(12)	/* ? suffix	back to prefix		*/
-#define	OLPAREN	OPC(13)	/* (		fwd to )		*/
-#define	ORPAREN	OPC(14)	/* )		back to (		*/
-#define	OCH_	OPC(15)	/* begin choice	fwd to OOR2		*/
-#define	OOR1	OPC(16)	/* | pt. 1	back to OOR1 or OCH_	*/
-#define	OOR2	OPC(17)	/* | pt. 2	fwd to OOR2 or O_CH	*/
-#define	O_CH	OPC(18)	/* end choice	back to OOR1		*/
-#define	OBOW	OPC(19)	/* begin word	-			*/
-#define	OEOW	OPC(20)	/* end word	-			*/
+/* operators			   meaning	operand			*/
+/*						(back, fwd are offsets)	*/
+#define	OEND	(1U<<OPSHIFT)	/* endmarker	-			*/
+#define	OCHAR	(2U<<OPSHIFT)	/* character	wide character		*/
+#define	OBOL	(3U<<OPSHIFT)	/* left anchor	-			*/
+#define	OEOL	(4U<<OPSHIFT)	/* right anchor	-			*/
+#define	OANY	(5U<<OPSHIFT)	/* .		-			*/
+#define	OANYOF	(6U<<OPSHIFT)	/* [...]	set number		*/
+#define	OBACK_	(7U<<OPSHIFT)	/* begin \d	paren number		*/
+#define	O_BACK	(8U<<OPSHIFT)	/* end \d	paren number		*/
+#define	OPLUS_	(9U<<OPSHIFT)	/* + prefix	fwd to suffix		*/
+#define	O_PLUS	(10U<<OPSHIFT)	/* + suffix	back to prefix		*/
+#define	OQUEST_	(11U<<OPSHIFT)	/* ? prefix	fwd to suffix		*/
+#define	O_QUEST	(12U<<OPSHIFT)	/* ? suffix	back to prefix		*/
+#define	OLPAREN	(13U<<OPSHIFT)	/* (		fwd to )		*/
+#define	ORPAREN	(14U<<OPSHIFT)	/* )		back to (		*/
+#define	OCH_	(15U<<OPSHIFT)	/* begin choice	fwd to OOR2		*/
+#define	OOR1	(16U<<OPSHIFT)	/* | pt. 1	back to OOR1 or OCH_	*/
+#define	OOR2	(17U<<OPSHIFT)	/* | pt. 2	fwd to OOR2 or O_CH	*/
+#define	O_CH	(18U<<OPSHIFT)	/* end choice	back to OOR1		*/
+#define	OBOW	(19U<<OPSHIFT)	/* begin word	-			*/
+#define	OEOW	(20U<<OPSHIFT)	/* end word	-			*/
+#define	OBOS	(21U<<OPSHIFT)	/* begin subj.  -			*/
+#define	OEOS	(22U<<OPSHIFT)	/* end subj.	-			*/
+#define	OWBND	(23U<<OPSHIFT)	/* word bound	-			*/
+#define	ONWBND	(24U<<OPSHIFT)	/* not bound	-			*/
 
 /*
- * Structure for [] character-set representation.  Character sets are
- * done as bit vectors, grouped 8 to a byte vector for compactness.
- * The individual set therefore has both a pointer to the byte vector
- * and a mask to pick out the relevant bit of each byte.  A hash code
- * simplifies testing whether two sets could be identical.
- *
- * This will get trickier for multicharacter collating elements.  As
- * preliminary hooks for dealing with such things, we also carry along
- * a string of multi-character elements, and decide the size of the
- * vectors at run time.
+ * Structures for [] character-set representation.
  */
 typedef struct {
-	uch *ptr;		/* -> uch [csetsize] */
-	uch mask;		/* bit within array */
-	uch hash;		/* hash code */
-	size_t smultis;
-	char *multis;		/* -> char[smulti]  ab\0cd\0ef\0\0 */
+	wint_t		min;
+	wint_t		max;
+} crange;
+typedef struct {
+	unsigned char	bmp[NC_MAX / 8];
+	wctype_t	*types;
+	unsigned int	ntypes;
+	wint_t		*wides;
+	unsigned int	nwides;
+	crange		*ranges;
+	unsigned int	nranges;
+	int		invert;
+	int		icase;
 } cset;
-/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
-#define	CHadd(cs, c)	((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
-#define	CHsub(cs, c)	((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
-#define	CHIN(cs, c)	((cs)->ptr[(uch)(c)] & (cs)->mask)
-#define	MCadd(p, cs, cp)	mcadd(p, cs, cp)	/* regcomp() internal fns */
-#define	MCsub(p, cs, cp)	mcsub(p, cs, cp)
-#define	MCin(p, cs, cp)	mcin(p, cs, cp)
 
-/* stuff for character categories */
-typedef unsigned char cat_t;
+static int
+CHIN1(cset *cs, wint_t ch)
+{
+	unsigned int i;
+
+	assert(ch >= 0);
+	if (ch < NC)
+		return (((cs->bmp[(unsigned)ch >> 3] & (1 << (ch & 7))) != 0) ^
+		    cs->invert);
+	for (i = 0; i < cs->nwides; i++) {
+		if (cs->icase) {
+			if (ch == towlower(cs->wides[i]) ||
+			    ch == towupper(cs->wides[i]))
+				return (!cs->invert);
+		} else if (ch == cs->wides[i])
+			return (!cs->invert);
+	}
+	for (i = 0; i < cs->nranges; i++)
+		if (cs->ranges[i].min <= ch && ch <= cs->ranges[i].max)
+			return (!cs->invert);
+	for (i = 0; i < cs->ntypes; i++)
+		if (iswctype(ch, cs->types[i]))
+			return (!cs->invert);
+	return (cs->invert);
+}
+
+static __inline int
+CHIN(cset *cs, wint_t ch)
+{
+
+	assert(ch >= 0);
+	if (ch < NC)
+		return (((cs->bmp[(unsigned)ch >> 3] & (1 << (ch & 7))) != 0) ^
+		    cs->invert);
+	else if (cs->icase)
+		return (CHIN1(cs, ch) || CHIN1(cs, towlower(ch)) ||
+		    CHIN1(cs, towupper(ch)));
+	else
+		return (CHIN1(cs, ch));
+}
 
 /*
  * main compiled-expression structure
@@ -179,10 +178,8 @@
 	int magic;
 #		define	MAGIC2	((('R'^0200)<<8)|'E')
 	sop *strip;		/* malloced area for strip */
-	size_t csetsize;	/* number of bits in a cset vector */
 	size_t ncsets;		/* number of csets in use */
 	cset *sets;		/* -> cset [ncsets] */
-	uch *setbits;		/* -> uch[csetsize][ncsets/CHAR_BIT] */
 	int cflags;		/* copy of regcomp() cflags argument */
 	sopno nstates;		/* = number of sops */
 	sopno firststate;	/* the initial OEND (normally 0) */
@@ -193,17 +190,17 @@
 #		define	BAD	04	/* something wrong */
 	size_t nbol;		/* number of ^ used */
 	size_t neol;		/* number of $ used */
-	size_t ncategories;	/* how many character categories */
-	cat_t *categories;	/* ->catspace[-CHAR_MIN] */
 	char *must;		/* match must contain this string */
+	int moffset;		/* latest point at which must may be located */
+	size_t *charjump;	/* Boyer-Moore char jump table */
+	size_t *matchjump;	/* Boyer-Moore match jump table */
 	size_t mlen;		/* length of must */
 	size_t nsub;		/* copy of re_nsub */
 	int backrefs;		/* does it use back references? */
 	sopno nplus;		/* how deep does it nest +s? */
-	/* catspace must be last */
-	cat_t catspace[1];	/* actually [NC] */
 };
 
 /* misc utilities */
-#define	OUT	(CHAR_MAX+1)	/* a non-character value */
-#define	ISWORD(c)	(isalnum((unsigned char)c) || (c) == '_')
+#define	OUT	(CHAR_MIN - 1)	/* a non-character value */
+#define	IGN	(CHAR_MIN - 2)
+#define ISWORD(c)       (iswalnum((uch)(c)) || (c) == '_')
diff --git a/libc/upstream-netbsd/lib/libc/regex/regexec.c b/libc/upstream-netbsd/lib/libc/regex/regexec.c
index f16e0b6..213a90b 100644
--- a/libc/upstream-netbsd/lib/libc/regex/regexec.c
+++ b/libc/upstream-netbsd/lib/libc/regex/regexec.c
@@ -1,6 +1,9 @@
-/*	$NetBSD: regexec.c,v 1.22 2012/03/13 21:13:43 christos Exp $	*/
+/*	$NetBSD: regexec.c,v 1.26 2021/02/26 19:24:47 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -34,91 +37,96 @@
  *	@(#)regexec.c	8.3 (Berkeley) 3/20/94
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)regexec.c	8.3 (Berkeley) 3/20/94
- */
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
 
 #include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
 #if 0
 static char sccsid[] = "@(#)regexec.c	8.3 (Berkeley) 3/20/94";
-#else
-__RCSID("$NetBSD: regexec.c,v 1.22 2012/03/13 21:13:43 christos Exp $");
+__FBSDID("$FreeBSD: head/lib/libc/regex/regexec.c 326025 2017-11-20 19:49:47Z pfg $");
 #endif
-#endif /* LIBC_SCCS and not lint */
+__RCSID("$NetBSD: regexec.c,v 1.26 2021/02/26 19:24:47 christos Exp $");
 
 /*
  * the outer shell of regexec()
  *
- * This file includes engine.c *twice*, after muchos fiddling with the
+ * This file includes engine.c three times, after muchos fiddling with the
  * macros that code uses.  This lets the same code operate on two different
- * representations for state sets.
+ * representations for state sets and characters.
  */
-#include "namespace.h"
-#include <sys/types.h>
 
-#include <assert.h>
-#include <ctype.h>
-#include <limits.h>
+#ifndef LIBHACK
+#include "namespace.h"
+#endif
+#include <sys/types.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
+#include <ctype.h>
 #include <regex.h>
 
-#ifdef __weak_alias
+#if defined(__weak_alias) && !defined(LIBHACK)
 __weak_alias(regexec,_regexec)
 #endif
 
 #include "utils.h"
 #include "regex2.h"
 
+static __inline size_t
+xmbrtowc(wint_t *wi, const char *s, size_t n, mbstate_t *mbs, wint_t dummy)
+{
+#ifdef NLS
+	size_t nr;
+	wchar_t wc;
+
+	nr = mbrtowc(&wc, s, n, mbs);
+	if (wi != NULL)
+		*wi = wc;
+	if (nr == 0)
+		return (1);
+	else if (nr == (size_t)-1 || nr == (size_t)-2) {
+		memset(mbs, 0, sizeof(*mbs));
+		if (wi != NULL)
+			*wi = dummy;
+		return (1);
+	} else
+                return (nr);
+#else
+	if (wi)
+		*wi = *s;
+	return 1;
+#endif
+}
+
+static __inline size_t
+xmbrtowc_dummy(wint_t *wi,
+		const char *s,
+		size_t n __unused,
+		mbstate_t *mbs __unused,
+		wint_t dummy __unused)
+{
+
+	if (wi != NULL)
+		*wi = (unsigned char)*s;
+	return (1);
+}
+
 /* macros for manipulating states, small version */
-#define	states	unsigned long
-#define	states1	unsigned long	/* for later use in regexec() decision */
+#define	states	long
+#define	states1	states		/* for later use in regexec() decision */
 #define	CLEAR(v)	((v) = 0)
 #define	SET0(v, n)	((v) &= ~((unsigned long)1 << (n)))
 #define	SET1(v, n)	((v) |= (unsigned long)1 << (n))
 #define	ISSET(v, n)	(((v) & ((unsigned long)1 << (n))) != 0)
 #define	ASSIGN(d, s)	((d) = (s))
 #define	EQ(a, b)	((a) == (b))
-#define	STATEVARS	int dummy	/* dummy version */
+#define	STATEVARS	long dummy	/* dummy version */
 #define	STATESETUP(m, n)	/* nothing */
 #define	STATETEARDOWN(m)	/* nothing */
 #define	SETUP(v)	((v) = 0)
-#define	onestate	unsigned long
+#define	onestate	long
 #define	INIT(o, n)	((o) = (unsigned long)1 << (n))
 #define	INC(o)	((o) <<= 1)
 #define	ISSTATEIN(v, o)	(((v) & (o)) != 0)
@@ -127,6 +135,9 @@
 #define	FWD(dst, src, n)	((dst) |= ((unsigned long)(src)&(here)) << (n))
 #define	BACK(dst, src, n)	((dst) |= ((unsigned long)(src)&(here)) >> (n))
 #define	ISSETBACK(v, n)	(((v) & ((unsigned long)here >> (n))) != 0)
+/* no multibyte support */
+#define	XMBRTOWC	xmbrtowc_dummy
+#define	ZAPSTATE(mbs)	((void)(mbs))
 /* function names */
 #define SNAMES			/* engine.c looks after details */
 
@@ -152,26 +163,25 @@
 #undef	BACK
 #undef	ISSETBACK
 #undef	SNAMES
+#undef	XMBRTOWC
+#undef	ZAPSTATE
 
 /* macros for manipulating states, large version */
 #define	states	char *
-#define	CLEAR(v)	memset(v, 0, (size_t)m->g->nstates)
+#define	CLEAR(v)	memset(v, 0, m->g->nstates)
 #define	SET0(v, n)	((v)[n] = 0)
 #define	SET1(v, n)	((v)[n] = 1)
 #define	ISSET(v, n)	((v)[n])
-#define	ASSIGN(d, s)	memcpy(d, s, (size_t)m->g->nstates)
-#define	EQ(a, b)	(memcmp(a, b, (size_t)m->g->nstates) == 0)
-#define	STATEVARS	int vn; char *space
-#define	STATESETUP(m, nv) \
-    if (((m)->space = malloc((size_t)((nv)*(m)->g->nstates))) == NULL) \
-	return(REG_ESPACE); \
-    else \
-	(m)->vn = 0
-
-#define	STATETEARDOWN(m)	{ free((m)->space); m->space = NULL; }
-#define	SETUP(v)	((v) = &m->space[(size_t)(m->vn++ * m->g->nstates)])
-#define	onestate	int
-#define	INIT(o, n)	((o) = (int)(n))
+#define	ASSIGN(d, s)	memcpy(d, s, m->g->nstates)
+#define	EQ(a, b)	(memcmp(a, b, m->g->nstates) == 0)
+#define	STATEVARS	long vn; char *space
+#define	STATESETUP(m, nv)	{ (m)->space = malloc((nv)*(m)->g->nstates); \
+				if ((m)->space == NULL) return(REG_ESPACE); \
+				(m)->vn = 0; }
+#define	STATETEARDOWN(m)	{ free((m)->space); }
+#define	SETUP(v)	((v) = &m->space[m->vn++ * m->g->nstates])
+#define	onestate	long
+#define	INIT(o, n)	((o) = (n))
 #define	INC(o)	((o)++)
 #define	ISSTATEIN(v, o)	((v)[o])
 /* some abbreviations; note that some of these know variable names! */
@@ -179,11 +189,24 @@
 #define	FWD(dst, src, n)	((dst)[here+(n)] |= (src)[here])
 #define	BACK(dst, src, n)	((dst)[here-(n)] |= (src)[here])
 #define	ISSETBACK(v, n)	((v)[here - (n)])
+/* no multibyte support */
+#define	XMBRTOWC	xmbrtowc_dummy
+#define	ZAPSTATE(mbs)	((void)(mbs))
 /* function names */
 #define	LNAMES			/* flag */
 
 #include "engine.c"
 
+/* multibyte character & large states version */
+#undef	LNAMES
+#undef	XMBRTOWC
+#undef	ZAPSTATE
+#define	XMBRTOWC	xmbrtowc
+#define	ZAPSTATE(mbs)	memset((mbs), 0, sizeof(*(mbs)))
+#define	MNAMES
+
+#include "engine.c"
+
 /*
  - regexec - interface for matching
  = extern int regexec(const regex_t *, const char *, size_t, \
@@ -200,21 +223,18 @@
  * have been prototyped.
  */
 int				/* 0 success, REG_NOMATCH failure */
-regexec(
-    const regex_t *preg,
-    const char *string,
-    size_t nmatch,
-    regmatch_t pmatch[],
-    int eflags)
+regexec(const regex_t * __restrict preg,
+	const char * __restrict string,
+	size_t nmatch,
+	regmatch_t pmatch[__restrict],
+	int eflags)
 {
 	struct re_guts *g = preg->re_g;
-	char *s;
 #ifdef REDEBUG
 #	define	GOODFLAGS(f)	(f)
 #else
 #	define	GOODFLAGS(f)	((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
 #endif
-
 	_DIAGASSERT(preg != NULL);
 	_DIAGASSERT(string != NULL);
 
@@ -225,10 +245,10 @@
 		return(REG_BADPAT);
 	eflags = GOODFLAGS(eflags);
 
-	s = __UNCONST(string);
-
-	if (g->nstates <= (sopno)(CHAR_BIT*sizeof(states1)) && !(eflags&REG_LARGE))
-		return(smatcher(g, s, nmatch, pmatch, eflags));
+	if (MB_CUR_MAX > 1)
+		return(mmatcher(g, string, nmatch, pmatch, eflags));
+	else if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
+		return(smatcher(g, string, nmatch, pmatch, eflags));
 	else
-		return(lmatcher(g, s, nmatch, pmatch, eflags));
+		return(lmatcher(g, string, nmatch, pmatch, eflags));
 }
diff --git a/libc/upstream-netbsd/lib/libc/regex/regfree.c b/libc/upstream-netbsd/lib/libc/regex/regfree.c
index ce011ea..7e388b1 100644
--- a/libc/upstream-netbsd/lib/libc/regex/regfree.c
+++ b/libc/upstream-netbsd/lib/libc/regex/regfree.c
@@ -1,6 +1,9 @@
-/*	$NetBSD: regfree.c,v 1.15 2007/02/09 23:44:18 junyoung Exp $	*/
+/*	$NetBSD: regfree.c,v 1.19 2021/02/26 19:24:47 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -34,58 +37,22 @@
  *	@(#)regfree.c	8.3 (Berkeley) 3/20/94
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)regfree.c	8.3 (Berkeley) 3/20/94
- */
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
 
 #include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
 #if 0
 static char sccsid[] = "@(#)regfree.c	8.3 (Berkeley) 3/20/94";
-#else
-__RCSID("$NetBSD: regfree.c,v 1.15 2007/02/09 23:44:18 junyoung Exp $");
+__FBSDID("$FreeBSD: head/lib/libc/regex/regfree.c 326025 2017-11-20 19:49:47Z pfg $");
 #endif
-#endif /* LIBC_SCCS and not lint */
+__RCSID("$NetBSD: regfree.c,v 1.19 2021/02/26 19:24:47 christos Exp $");
 
 #include "namespace.h"
 #include <sys/types.h>
-
-#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <limits.h>
 #include <regex.h>
 
 #ifdef __weak_alias
@@ -100,10 +67,10 @@
  = extern void regfree(regex_t *);
  */
 void
-regfree(
-    regex_t *preg)
+regfree(regex_t *preg)
 {
 	struct re_guts *g;
+	unsigned int i;
 
 	_DIAGASSERT(preg != NULL);
 
@@ -119,11 +86,19 @@
 
 	if (g->strip != NULL)
 		free(g->strip);
-	if (g->sets != NULL)
+	if (g->sets != NULL) {
+		for (i = 0; i < g->ncsets; i++) {
+			free(g->sets[i].ranges);
+			free(g->sets[i].wides);
+			free(g->sets[i].types);
+		}
 		free(g->sets);
-	if (g->setbits != NULL)
-		free(g->setbits);
+	}
 	if (g->must != NULL)
 		free(g->must);
+	if (g->charjump != NULL)
+		free(&g->charjump[CHAR_MIN]);
+	if (g->matchjump != NULL)
+		free(g->matchjump);
 	free(g);
 }
diff --git a/libc/upstream-netbsd/lib/libc/regex/utils.h b/libc/upstream-netbsd/lib/libc/regex/utils.h
index 762caee..972f555 100644
--- a/libc/upstream-netbsd/lib/libc/regex/utils.h
+++ b/libc/upstream-netbsd/lib/libc/regex/utils.h
@@ -1,6 +1,9 @@
-/*	$NetBSD: utils.h,v 1.6 2003/08/07 16:43:21 agc Exp $	*/
+/*	$NetBSD: utils.h,v 1.9 2021/04/22 19:20:24 christos Exp $	*/
 
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -32,49 +35,38 @@
  * SUCH DAMAGE.
  *
  *	@(#)utils.h	8.3 (Berkeley) 3/20/94
+ * $FreeBSD: head/lib/libc/regex/utils.h 341838 2018-12-12 04:23:00Z yuripv $
  */
 
-/*-
- * Copyright (c) 1992, 1993, 1994 Henry Spencer.
- *
- * This code is derived from software contributed to Berkeley by
- * Henry Spencer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)utils.h	8.3 (Berkeley) 3/20/94
- */
+#ifdef NLS
+#include <wchar.h>
+#include <wctype.h>
+#else
+#include <ctype.h>
+#define wint_t regex_wint_t
+#define mbstate_t regex_mbstate_t
+#define wctype_t regex_wctype_t
+typedef short wint_t;
+typedef char mbstate_t;
+typedef short wctype_t;
+#define iswupper(a) isupper(a)
+#define iswlower(a) islower(a)
+#define iswalpha(a) isalpha(a)
+#define iswalnum(a) isalnum(a)
+#define towupper(a) toupper(a)
+#define towlower(a) tolower(a)
+extern wctype_t __regex_wctype(const char *);
+extern int __regex_iswctype(wint_t, wctype_t);
+#define wctype(s) __regex_wctype(s)
+#define iswctype(c, t) __regex_iswctype((c), (t))
+#endif
 
 /* utility definitions */
 #define	DUPMAX		_POSIX2_RE_DUP_MAX	/* xxx is this right? */
 #define	INFINITY	(DUPMAX + 1)
-#define	NC		(CHAR_MAX - CHAR_MIN + 1)
+
+#define	NC_MAX		(CHAR_MAX - CHAR_MIN + 1)
+#define	NC		((MB_CUR_MAX) == 1 ? (NC_MAX) : (128))
 typedef unsigned char uch;
 
 /* switch off assertions (if not already off) if no REDEBUG */
diff --git a/libc/upstream-netbsd/lib/libc/stdlib/bsearch.c b/libc/upstream-netbsd/lib/libc/stdlib/bsearch.c
index 2b0e0d8..e48fe85 100644
--- a/libc/upstream-netbsd/lib/libc/stdlib/bsearch.c
+++ b/libc/upstream-netbsd/lib/libc/stdlib/bsearch.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: bsearch.c,v 1.15 2012/03/04 20:01:45 christos Exp $	*/
+/*	$NetBSD: bsearch.c,v 1.16 2022/05/31 08:43:14 andvar Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)bsearch.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: bsearch.c,v 1.15 2012/03/04 20:01:45 christos Exp $");
+__RCSID("$NetBSD: bsearch.c,v 1.16 2022/05/31 08:43:14 andvar Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -50,7 +50,7 @@
  * is odd, moving left simply involves halving lim: e.g., when lim
  * is 5 we look at item 2, so we change lim to 2 so that we will
  * look at items 0 & 1.  If lim is even, the same applies.  If lim
- * is odd, moving right again involes halving lim, this time moving
+ * is odd, moving right again involves halving lim, this time moving
  * the base up one item past p: e.g., when lim is 5 we change base
  * to item 3 and make lim 2 so that we will look at items 3 and 4.
  * If lim is even, however, we have to shrink it by one before
diff --git a/libc/upstream-openbsd/lib/libc/gdtoa/gdtoaimp.h b/libc/upstream-openbsd/lib/libc/gdtoa/gdtoaimp.h
index 823f2a9..f853045 100644
--- a/libc/upstream-openbsd/lib/libc/gdtoa/gdtoaimp.h
+++ b/libc/upstream-openbsd/lib/libc/gdtoa/gdtoaimp.h
@@ -26,7 +26,7 @@
 
 ****************************************************************/
 
-/* This is a variation on dtoa.c that converts arbitary binary
+/* This is a variation on dtoa.c that converts arbitrary binary
    floating-point formats to and from decimal notation.  It uses
    double-precision arithmetic internally, so there are still
    various #ifdefs that adapt the calculations to the native
diff --git a/libc/upstream-openbsd/lib/libc/locale/_def_time.c b/libc/upstream-openbsd/lib/libc/locale/_def_time.c
new file mode 100644
index 0000000..ba83fb8
--- /dev/null
+++ b/libc/upstream-openbsd/lib/libc/locale/_def_time.c
@@ -0,0 +1,36 @@
+/*	$OpenBSD: _def_time.c,v 1.6 2016/05/23 00:05:15 guenther Exp $ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <locale.h>
+#include "localedef.h"
+
+const _TimeLocale _DefaultTimeLocale =
+{
+	{
+		"Sun","Mon","Tue","Wed","Thu","Fri","Sat",
+	},
+	{
+		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+		"Friday", "Saturday"
+	},
+	{
+		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+	},
+	{
+		"January", "February", "March", "April", "May", "June", "July",
+		"August", "September", "October", "November", "December"
+	},
+	{
+		"AM", "PM"
+	},
+	"%a %b %e %H:%M:%S %Y",
+	"%m/%d/%y",
+	"%H:%M:%S",
+	"%I:%M:%S %p"
+};
+
+const _TimeLocale *_CurrentTimeLocale = &_DefaultTimeLocale;
diff --git a/libc/upstream-openbsd/lib/libc/stdio/setvbuf.c b/libc/upstream-openbsd/lib/libc/stdio/setvbuf.c
index 9a08d13..74a1695 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/setvbuf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/setvbuf.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: setvbuf.c,v 1.14 2016/09/21 04:38:56 guenther Exp $ */
+/*	$OpenBSD: setvbuf.c,v 1.15 2022/09/28 16:44:14 gnezdo Exp $ */
 /*-
  * Copyright (c) 1990, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -31,6 +31,7 @@
  * SUCH DAMAGE.
  */
 
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "local.h"
@@ -52,7 +53,7 @@
 	 * when setting _IONBF.
 	 */
 	if (mode != _IONBF)
-		if ((mode != _IOFBF && mode != _IOLBF) || (int)size < 0)
+		if ((mode != _IOFBF && mode != _IOLBF) || size > INT_MAX)
 			return (EOF);
 
 	/*
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/div.c b/libc/upstream-openbsd/lib/libc/stdlib/div.c
index beaa428..5e6164f 100644
--- a/libc/upstream-openbsd/lib/libc/stdlib/div.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/div.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: div.c,v 1.6 2015/09/13 08:31:47 guenther Exp $ */
+/*	$OpenBSD: div.c,v 1.7 2022/12/27 17:10:06 jmc Exp $ */
 /*
  * Copyright (c) 1990 Regents of the University of California.
  * All rights reserved.
@@ -46,7 +46,7 @@
 	 * words, we should always truncate the quotient towards
 	 * 0, never -infinity.
 	 *
-	 * Machine division and remainer may work either way when
+	 * Machine division and remainder may work either way when
 	 * one or both of n or d is negative.  If only one is
 	 * negative and r.quot has been truncated towards -inf,
 	 * r.rem will have the same sign as denom and the opposite
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/setenv.c b/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
index 15c550b..fc8e5b6 100644
--- a/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: setenv.c,v 1.19 2016/09/21 04:38:56 guenther Exp $ */
+/*	$OpenBSD: setenv.c,v 1.20 2022/08/08 22:40:03 millert Exp $ */
 /*
  * Copyright (c) 1987 Regents of the University of California.
  * All rights reserved.
@@ -48,9 +48,10 @@
 
 	for (cp = str; *cp && *cp != '='; ++cp)
 		;
-	if (*cp != '=') {
+	if (cp == str || *cp != '=') {
+		/* '=' is the first character of string or is missing. */
 		errno = EINVAL;
-		return (-1);			/* missing `=' in string */
+		return (-1);
 	}
 
 	if (__findenv(str, (int)(cp - str), &offset) != NULL) {
diff --git a/libc/versioner-dependencies/riscv64/kernel_uapi_asm-riscv64 b/libc/versioner-dependencies/riscv64/kernel_uapi_asm-riscv64
new file mode 120000
index 0000000..61353cb
--- /dev/null
+++ b/libc/versioner-dependencies/riscv64/kernel_uapi_asm-riscv64
@@ -0,0 +1 @@
+../../kernel/uapi/asm-riscv/
\ No newline at end of file
diff --git a/libdl/Android.bp b/libdl/Android.bp
index 9714af5..fde3dfc 100644
--- a/libdl/Android.bp
+++ b/libdl/Android.bp
@@ -74,6 +74,7 @@
         "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
+        "-Wl,--exclude-libs=libclang_rt.builtins-riscv64-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
     ],
 
@@ -87,6 +88,9 @@
         arm64: {
             version_script: ":libdl.arm64.map",
         },
+        riscv64: {
+            version_script: ":libdl.riscv64.map",
+        },
         x86: {
             pack_relocations: false,
             ldflags: [
@@ -174,6 +178,7 @@
         "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
+        "-Wl,--exclude-libs=libclang_rt.builtins-riscv64-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
     ],
 
@@ -239,7 +244,7 @@
 
 genrule {
     name: "libdl.arm.map",
-    out: ["libdl.arm.map"],
+    out: ["libdl.arm.map.txt"],
     srcs: ["libdl.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm $(in) $(out)",
@@ -247,15 +252,23 @@
 
 genrule {
     name: "libdl.arm64.map",
-    out: ["libdl.arm64.map"],
+    out: ["libdl.arm64.map.txt"],
     srcs: ["libdl.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm64 $(in) $(out)",
 }
 
 genrule {
+    name: "libdl.riscv64.map",
+    out: ["libdl.riscv64.map.txt"],
+    srcs: ["libdl.map.txt"],
+    tools: ["generate-version-script"],
+    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
+}
+
+genrule {
     name: "libdl.x86.map",
-    out: ["libdl.x86.map"],
+    out: ["libdl.x86.map.txt"],
     srcs: ["libdl.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86 $(in) $(out)",
@@ -263,7 +276,7 @@
 
 genrule {
     name: "libdl.x86_64.map",
-    out: ["libdl.x86_64.map"],
+    out: ["libdl.x86_64.map.txt"],
     srcs: ["libdl.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
diff --git a/libdl/libdl.cpp b/libdl/libdl.cpp
index a56a5ab..20f08d9 100644
--- a/libdl/libdl.cpp
+++ b/libdl/libdl.cpp
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
+#include <android/dlext.h>
 #include <dlfcn.h>
 #include <link.h>
+#include <signal.h>
 #include <stdlib.h>
-#include <android/dlext.h>
 
 // These functions are exported by the loader
 // TODO(dimitry): replace these with reference to libc.so
@@ -72,6 +73,9 @@
 __attribute__((__weak__, visibility("default")))
 int __loader_android_get_application_target_sdk_version();
 
+__attribute__((__weak__, visibility("default"))) bool __loader_android_handle_signal(
+    int signal_number, siginfo_t* info, void* context);
+
 // Proxy calls to bionic loader
 __attribute__((__weak__))
 void android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size) {
@@ -138,4 +142,14 @@
   return __loader_android_get_application_target_sdk_version();
 }
 
+// Returns true if this function handled the signal, false if the caller should handle the signal
+// itself. This function returns true if the sigchain handler should immediately return, which
+// happens when the signal came from GWP-ASan, and we've dumped a debuggerd report and patched up
+// the GWP-ASan allocator to recover from the fault, and regular execution of the program can
+// continue.
+__attribute__((__weak__)) bool android_handle_signal(int signal_number, siginfo_t* info,
+                                                     void* context) {
+  return __loader_android_handle_signal(signal_number, info, context);
+}
+
 } // extern "C"
diff --git a/libdl/libdl.map.txt b/libdl/libdl.map.txt
index 473bdf2..043ec53 100644
--- a/libdl/libdl.map.txt
+++ b/libdl/libdl.map.txt
@@ -45,4 +45,5 @@
   global:
     android_get_LD_LIBRARY_PATH;
     __cfi_init;
+    android_handle_signal;
 } LIBC_OMR1;
diff --git a/libfdtrack/fdtrack.cpp b/libfdtrack/fdtrack.cpp
index 2d114f2..b064401 100644
--- a/libfdtrack/fdtrack.cpp
+++ b/libfdtrack/fdtrack.cpp
@@ -71,7 +71,11 @@
 static constexpr size_t kStackDepth = 32;
 
 // Skip any initial frames from libfdtrack.so.
-static std::vector<std::string> kSkipFdtrackLib [[clang::no_destroy]] = {"libfdtrack.so"};
+// Also ignore frames from ART (http://b/236197847) because we'd rather spend
+// our precious few frames on the actual Java calling code rather than the
+// implementation of JNI!
+static std::vector<std::string> kSkipFdtrackLib
+    [[clang::no_destroy]] = {"libfdtrack.so", "libart.so"};
 
 static bool installed = false;
 static std::array<FdEntry, kFdTableSize> stack_traces [[clang::no_destroy]];
diff --git a/libm/Android.bp b/libm/Android.bp
index 641956c..13fbf9a 100644
--- a/libm/Android.bp
+++ b/libm/Android.bp
@@ -29,6 +29,7 @@
 
     whole_static_libs: ["libarm-optimized-routines-math"],
 
+    tidy_disabled_srcs: ["upstream-*/**/*.c"],
     srcs: [
         "upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c",
         "upstream-freebsd/lib/msun/src/catrig.c",
@@ -73,8 +74,6 @@
         "upstream-freebsd/lib/msun/src/e_scalbf.c",
         "upstream-freebsd/lib/msun/src/e_sinh.c",
         "upstream-freebsd/lib/msun/src/e_sinhf.c",
-        "upstream-freebsd/lib/msun/src/e_sqrt.c",
-        "upstream-freebsd/lib/msun/src/e_sqrtf.c",
         "upstream-freebsd/lib/msun/src/k_cos.c",
         "upstream-freebsd/lib/msun/src/k_cosf.c",
         "upstream-freebsd/lib/msun/src/k_exp.c",
@@ -95,8 +94,6 @@
         "upstream-freebsd/lib/msun/src/s_cbrtf.c",
         "upstream-freebsd/lib/msun/src/s_ccosh.c",
         "upstream-freebsd/lib/msun/src/s_ccoshf.c",
-        "upstream-freebsd/lib/msun/src/s_ceil.c",
-        "upstream-freebsd/lib/msun/src/s_ceilf.c",
         "upstream-freebsd/lib/msun/src/s_cexp.c",
         "upstream-freebsd/lib/msun/src/s_cexpf.c",
         "upstream-freebsd/lib/msun/src/s_cimag.c",
@@ -107,8 +104,6 @@
         "upstream-freebsd/lib/msun/src/s_conj.c",
         "upstream-freebsd/lib/msun/src/s_conjf.c",
         "upstream-freebsd/lib/msun/src/s_conjl.c",
-        "upstream-freebsd/lib/msun/src/s_copysign.c",
-        "upstream-freebsd/lib/msun/src/s_copysignf.c",
         "upstream-freebsd/lib/msun/src/s_cos.c",
         "upstream-freebsd/lib/msun/src/s_cospi.c",
         "upstream-freebsd/lib/msun/src/s_cpow.c",
@@ -133,8 +128,6 @@
         "upstream-freebsd/lib/msun/src/s_fdim.c",
         "upstream-freebsd/lib/msun/src/s_finite.c",
         "upstream-freebsd/lib/msun/src/s_finitef.c",
-        "upstream-freebsd/lib/msun/src/s_floor.c",
-        "upstream-freebsd/lib/msun/src/s_floorf.c",
         "upstream-freebsd/lib/msun/src/s_fma.c",
         "upstream-freebsd/lib/msun/src/s_fmaf.c",
         "upstream-freebsd/lib/msun/src/s_fmax.c",
@@ -236,7 +229,6 @@
                 "upstream-freebsd/lib/msun/src/s_cbrtl.c",
                 "upstream-freebsd/lib/msun/src/s_ceill.c",
                 "upstream-freebsd/lib/msun/src/s_clogl.c",
-                "upstream-freebsd/lib/msun/src/s_copysignl.c",
                 "upstream-freebsd/lib/msun/src/e_coshl.c",
                 "upstream-freebsd/lib/msun/src/s_cosl.c",
                 "upstream-freebsd/lib/msun/src/s_csqrtl.c",
@@ -282,24 +274,13 @@
         },
     },
 
-    // arch-specific settings
     arch: {
         arm: {
             srcs: [
                 "arm/fenv.c",
+                "upstream-freebsd/lib/msun/src/s_ceil.c",
+                "upstream-freebsd/lib/msun/src/s_ceilf.c",
             ],
-            neon: {
-                srcs: [
-                    "arm/sqrt.S",
-                    "arm/floor.S",
-                ],
-
-                exclude_srcs: [
-                    "upstream-freebsd/lib/msun/src/e_sqrt.c",
-                    "upstream-freebsd/lib/msun/src/e_sqrtf.c",
-                    "upstream-freebsd/lib/msun/src/s_floor.c",
-                ],
-            },
             instruction_set: "arm",
             pack_relocations: false,
             ldflags: ["-Wl,--hash-style=both"],
@@ -314,16 +295,8 @@
         arm64: {
             srcs: [
                 "arm64/fenv.c",
-                "arm64/lrint.S",
-                "arm64/sqrt.S",
             ],
             exclude_srcs: [
-                "upstream-freebsd/lib/msun/src/e_sqrt.c",
-                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
-                "upstream-freebsd/lib/msun/src/s_ceil.c",
-                "upstream-freebsd/lib/msun/src/s_ceilf.c",
-                "upstream-freebsd/lib/msun/src/s_floor.c",
-                "upstream-freebsd/lib/msun/src/s_floorf.c",
                 "upstream-freebsd/lib/msun/src/s_fma.c",
                 "upstream-freebsd/lib/msun/src/s_fmaf.c",
                 "upstream-freebsd/lib/msun/src/s_fmax.c",
@@ -332,8 +305,12 @@
                 "upstream-freebsd/lib/msun/src/s_fminf.c",
                 "upstream-freebsd/lib/msun/src/s_llrint.c",
                 "upstream-freebsd/lib/msun/src/s_llrintf.c",
+                "upstream-freebsd/lib/msun/src/s_llround.c",
+                "upstream-freebsd/lib/msun/src/s_llroundf.c",
                 "upstream-freebsd/lib/msun/src/s_lrint.c",
                 "upstream-freebsd/lib/msun/src/s_lrintf.c",
+                "upstream-freebsd/lib/msun/src/s_lround.c",
+                "upstream-freebsd/lib/msun/src/s_lroundf.c",
                 "upstream-freebsd/lib/msun/src/s_rint.c",
                 "upstream-freebsd/lib/msun/src/s_rintf.c",
                 "upstream-freebsd/lib/msun/src/s_round.c",
@@ -344,71 +321,55 @@
             version_script: ":libm.arm64.map",
         },
 
+        riscv64: {
+            srcs: [
+                "riscv64/fenv.c",
+            ],
+
+            exclude_srcs: [
+                "upstream-freebsd/lib/msun/src/s_fma.c",
+                "upstream-freebsd/lib/msun/src/s_fmaf.c",
+                "upstream-freebsd/lib/msun/src/s_fmax.c",
+                "upstream-freebsd/lib/msun/src/s_fmaxf.c",
+                "upstream-freebsd/lib/msun/src/s_fmin.c",
+                "upstream-freebsd/lib/msun/src/s_fminf.c",
+                "upstream-freebsd/lib/msun/src/s_llrint.c",
+                "upstream-freebsd/lib/msun/src/s_llrintf.c",
+                "upstream-freebsd/lib/msun/src/s_llround.c",
+                "upstream-freebsd/lib/msun/src/s_llroundf.c",
+                "upstream-freebsd/lib/msun/src/s_lrint.c",
+                "upstream-freebsd/lib/msun/src/s_lrintf.c",
+                "upstream-freebsd/lib/msun/src/s_lround.c",
+                "upstream-freebsd/lib/msun/src/s_lroundf.c",
+                "upstream-freebsd/lib/msun/src/s_rint.c",
+                "upstream-freebsd/lib/msun/src/s_rintf.c",
+                "upstream-freebsd/lib/msun/src/s_round.c",
+                "upstream-freebsd/lib/msun/src/s_roundf.c",
+                "upstream-freebsd/lib/msun/src/s_trunc.c",
+                "upstream-freebsd/lib/msun/src/s_truncf.c",
+            ],
+            version_script: ":libm.riscv64.map",
+        },
+
         x86: {
             srcs: [
                 "i387/fenv.c",
-                "x86/ceil.S",
-                "x86/ceilf.S",
-                "x86/floor.S",
-                "x86/floorf.S",
-                "x86/rint.S",
-                "x86/rintf.S",
-                "x86/sqrt.S",
-                "x86/sqrtf.S",
-                "x86/trunc.S",
-                "x86/truncf.S",
-                "x86/e_acos.S",
-                "x86/e_asin.S",
-                "x86/e_atan2.S",
-                "x86/e_cosh.S",
-                "x86/e_hypot.S",
-                "x86/e_log10.S",
-                "x86/e_sinh.S",
-                "x86/libm_reduce_pi04l.S",
-                "x86/libm_sincos_huge.S",
-                "x86/libm_tancot_huge.S",
                 "x86/lrint.S",
                 "x86/lrintf.S",
-                "x86/s_atan.S",
-                "x86/s_cbrt.S",
-                "x86/s_cos.S",
-                "x86/s_expm1.S",
-                "x86/s_log1p.S",
-                "x86/s_sin.S",
-                "x86/s_tanh.S",
-                "x86/s_tan.S",
             ],
             exclude_srcs: [
-                "upstream-freebsd/lib/msun/src/e_acos.c",
-                "upstream-freebsd/lib/msun/src/e_asin.c",
-                "upstream-freebsd/lib/msun/src/e_atan2.c",
-                "upstream-freebsd/lib/msun/src/e_cosh.c",
-                "upstream-freebsd/lib/msun/src/e_hypot.c",
-                "upstream-freebsd/lib/msun/src/e_log10.c",
-                "upstream-freebsd/lib/msun/src/e_sinh.c",
-                "upstream-freebsd/lib/msun/src/e_sqrt.c",
-                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
-                "upstream-freebsd/lib/msun/src/s_atan.c",
-                "upstream-freebsd/lib/msun/src/s_cbrt.c",
-                "upstream-freebsd/lib/msun/src/s_ceil.c",
-                "upstream-freebsd/lib/msun/src/s_ceilf.c",
-                "upstream-freebsd/lib/msun/src/s_cos.c",
-                "upstream-freebsd/lib/msun/src/s_expm1.c",
-                "upstream-freebsd/lib/msun/src/s_floor.c",
-                "upstream-freebsd/lib/msun/src/s_floorf.c",
-                "upstream-freebsd/lib/msun/src/s_log1p.c",
                 "upstream-freebsd/lib/msun/src/s_lrint.c",
                 "upstream-freebsd/lib/msun/src/s_lrintf.c",
                 "upstream-freebsd/lib/msun/src/s_rint.c",
                 "upstream-freebsd/lib/msun/src/s_rintf.c",
-                "upstream-freebsd/lib/msun/src/s_sin.c",
-                "upstream-freebsd/lib/msun/src/s_tan.c",
-                "upstream-freebsd/lib/msun/src/s_tanh.c",
                 "upstream-freebsd/lib/msun/src/s_trunc.c",
                 "upstream-freebsd/lib/msun/src/s_truncf.c",
             ],
             local_include_dirs: ["i387"],
             pack_relocations: false,
+            // The x86 ABI doesn't include this, which is needed for the
+            // roundss/roundsd instructions that we've used since Android M.
+            cflags: ["-msse4.1"],
             ldflags: ["-Wl,--hash-style=both"],
             version_script: ":libm.x86.map",
         },
@@ -416,62 +377,16 @@
         x86_64: {
             srcs: [
                 "amd64/fenv.c",
-                "x86_64/ceil.S",
-                "x86_64/ceilf.S",
-                "x86_64/floor.S",
-                "x86_64/floorf.S",
-                "x86_64/rint.S",
-                "x86_64/rintf.S",
-                "x86_64/sqrt.S",
-                "x86_64/sqrtf.S",
-                "x86_64/trunc.S",
-                "x86_64/truncf.S",
-                "x86_64/e_acos.S",
-                "x86_64/e_asin.S",
-                "x86_64/e_atan2.S",
-                "x86_64/e_cosh.S",
-                "x86_64/e_hypot.S",
-                "x86_64/e_log10.S",
-                "x86_64/e_sinh.S",
                 "x86_64/lrint.S",
                 "x86_64/lrintf.S",
-                "x86_64/s_atan.S",
-                "x86_64/s_cbrt.S",
-                "x86_64/s_cos.S",
-                "x86_64/s_expm1.S",
-                "x86_64/s_log1p.S",
-                "x86_64/s_sin.S",
-                "x86_64/s_tanh.S",
-                "x86_64/s_tan.S",
             ],
             exclude_srcs: [
-                "upstream-freebsd/lib/msun/src/e_acos.c",
-                "upstream-freebsd/lib/msun/src/e_asin.c",
-                "upstream-freebsd/lib/msun/src/e_atan2.c",
-                "upstream-freebsd/lib/msun/src/e_cosh.c",
-                "upstream-freebsd/lib/msun/src/e_hypot.c",
-                "upstream-freebsd/lib/msun/src/e_log10.c",
-                "upstream-freebsd/lib/msun/src/e_sinh.c",
-                "upstream-freebsd/lib/msun/src/e_sqrt.c",
-                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
-                "upstream-freebsd/lib/msun/src/s_atan.c",
-                "upstream-freebsd/lib/msun/src/s_cbrt.c",
-                "upstream-freebsd/lib/msun/src/s_ceil.c",
-                "upstream-freebsd/lib/msun/src/s_ceilf.c",
-                "upstream-freebsd/lib/msun/src/s_cos.c",
-                "upstream-freebsd/lib/msun/src/s_expm1.c",
-                "upstream-freebsd/lib/msun/src/s_floor.c",
-                "upstream-freebsd/lib/msun/src/s_floorf.c",
-                "upstream-freebsd/lib/msun/src/s_log1p.c",
                 "upstream-freebsd/lib/msun/src/s_llrint.c",
                 "upstream-freebsd/lib/msun/src/s_llrintf.c",
                 "upstream-freebsd/lib/msun/src/s_lrint.c",
                 "upstream-freebsd/lib/msun/src/s_lrintf.c",
                 "upstream-freebsd/lib/msun/src/s_rint.c",
                 "upstream-freebsd/lib/msun/src/s_rintf.c",
-                "upstream-freebsd/lib/msun/src/s_sin.c",
-                "upstream-freebsd/lib/msun/src/s_tan.c",
-                "upstream-freebsd/lib/msun/src/s_tanh.c",
                 "upstream-freebsd/lib/msun/src/s_trunc.c",
                 "upstream-freebsd/lib/msun/src/s_truncf.c",
             ],
@@ -558,7 +473,7 @@
 
 genrule {
     name: "libm.arm.map",
-    out: ["libm.arm.map"],
+    out: ["libm.arm.map.txt"],
     srcs: ["libm.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm $(in) $(out)",
@@ -566,15 +481,23 @@
 
 genrule {
     name: "libm.arm64.map",
-    out: ["libm.arm64.map"],
+    out: ["libm.arm64.map.txt"],
     srcs: ["libm.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) arm64 $(in) $(out)",
 }
 
 genrule {
+    name: "libm.riscv64.map",
+    out: ["libm.riscv64.map.txt"],
+    srcs: ["libm.map.txt"],
+    tools: ["generate-version-script"],
+    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
+}
+
+genrule {
     name: "libm.x86.map",
-    out: ["libm.x86.map"],
+    out: ["libm.x86.map.txt"],
     srcs: ["libm.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86 $(in) $(out)",
@@ -582,7 +505,7 @@
 
 genrule {
     name: "libm.x86_64.map",
-    out: ["libm.x86_64.map"],
+    out: ["libm.x86_64.map.txt"],
     srcs: ["libm.map.txt"],
     tools: ["generate-version-script"],
     cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
diff --git a/libm/NOTICE b/libm/NOTICE
index 64d253a..5e2f8ca 100644
--- a/libm/NOTICE
+++ b/libm/NOTICE
@@ -253,7 +253,7 @@
 
 -------------------------------------------------------------------
 
-Copyright (C) 2018 The Android Open Source Project
+Copyright (C) 2021 The Android Open Source Project
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -281,7 +281,7 @@
 
 -------------------------------------------------------------------
 
-Copyright (C) 2021 The Android Open Source Project
+Copyright (C) 2022 The Android Open Source Project
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -1120,37 +1120,6 @@
 
 -------------------------------------------------------------------
 
-Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
-Johnny Qiu <joqiu@nvidia.com>
-Shu Zhang <chazhang@nvidia.com>
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
 Copyright (c) 2014, Intel Corporation
 All rights reserved.
 
diff --git a/libm/arm/fenv.c b/libm/arm/fenv.c
index 67c6456..a7e2bfd 100644
--- a/libm/arm/fenv.c
+++ b/libm/arm/fenv.c
@@ -1,34 +1,126 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- *  * Redistributions of source code must retain the above copyright
+ * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/msun/arm/fenv.c,v 1.1 2004/06/06 10:03:59 das Exp $
  */
 
 #include <fenv.h>
 
-#define __BIONIC_FENV_INLINE /* Out of line. */
-#include <bits/fenv_inlines_arm.h>
+#define FPSCR_RMODE_SHIFT 22
 
 const fenv_t __fe_dfl_env = 0;
+
+int fegetenv(fenv_t* __envp) {
+  fenv_t _fpscr;
+  __asm__ __volatile__("vmrs %0,fpscr" : "=r"(_fpscr));
+  *__envp = _fpscr;
+  return 0;
+}
+
+int fesetenv(const fenv_t* __envp) {
+  fenv_t _fpscr = *__envp;
+  __asm__ __volatile__("vmsr fpscr,%0" : : "ri"(_fpscr));
+  return 0;
+}
+
+int feclearexcept(int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  __fpscr &= ~__excepts;
+  fesetenv(&__fpscr);
+  return 0;
+}
+
+int fegetexceptflag(fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  *__flagp = __fpscr & __excepts;
+  return 0;
+}
+
+int fesetexceptflag(const fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  __fpscr &= ~__excepts;
+  __fpscr |= *__flagp & __excepts;
+  fesetenv(&__fpscr);
+  return 0;
+}
+
+int feraiseexcept(int __excepts) {
+  fexcept_t __ex = __excepts;
+  fesetexceptflag(&__ex, __excepts);
+  return 0;
+}
+
+int fetestexcept(int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  return (__fpscr & __excepts);
+}
+
+int fegetround(void) {
+  fenv_t _fpscr;
+  fegetenv(&_fpscr);
+  return ((_fpscr >> FPSCR_RMODE_SHIFT) & 0x3);
+}
+
+int fesetround(int __round) {
+  fenv_t _fpscr;
+  fegetenv(&_fpscr);
+  _fpscr &= ~(0x3 << FPSCR_RMODE_SHIFT);
+  _fpscr |= (__round << FPSCR_RMODE_SHIFT);
+  fesetenv(&_fpscr);
+  return 0;
+}
+
+int feholdexcept(fenv_t* __envp) {
+  fenv_t __env;
+  fegetenv(&__env);
+  *__envp = __env;
+  __env &= ~FE_ALL_EXCEPT;
+  fesetenv(&__env);
+  return 0;
+}
+
+int feupdateenv(const fenv_t* __envp) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  fesetenv(__envp);
+  feraiseexcept(__fpscr & FE_ALL_EXCEPT);
+  return 0;
+}
+
+int feenableexcept(int __mask __unused) {
+  return -1;
+}
+
+int fedisableexcept(int __mask __unused) {
+  return 0;
+}
+
+int fegetexcept(void) {
+  return 0;
+}
diff --git a/libm/arm/floor.S b/libm/arm/floor.S
deleted file mode 100644
index 3af8f76..0000000
--- a/libm/arm/floor.S
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
- * Johnny Qiu <joqiu@nvidia.com>
- * Shu Zhang <chazhang@nvidia.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <float.h>
-#include <private/bionic_asm.h>
-
-ENTRY(floor)    /* x in r0, r1 */
-
-        and             r3, r1, #0x80000000     /* sign(x) */
-        bic             r1, r1, #0x80000000     /* x = abs(x) */
-
-        /* extract exp of x */
-        lsr             r2, r1, #20
-        sub             r2, r2, #0x3fc
-        subs            r2, r2, #0x3            /* r2 <- exp */
-
-        /* |x| < 1.0? */
-        blt             .Lx_lt_one
-
-        /* x < 0? */
-        cmp             r3, #0
-        bne             .Lclr_frac_neg
-
-        /* |x| <= 2^20? */
-        cmp             r2, #20
-        ble             .Lclr_frac_r1
-
-        /* |x| < 2^52? */
-        cmp             r2, #52
-        blt             .Lclr_frac_r0
-
-        /* return x */
-        bx              lr
-
-.Lclr_frac_r1:
-        rsb             r2, r2, #20
-        lsr             r1, r1, r2
-        lsl             r1, r1, r2
-        mov             r0, #0
-        bx              lr
-
-.Lclr_frac_r0:
-        rsb             r2, r2, #52
-        lsr             r0, r0, r2
-        lsl             r0, r0, r2
-        bx              lr
-
-.Lclr_frac_neg:
-        /* |x| <= 2^20? */
-        cmp             r2, #20
-        ble             .Lclr_frac_r1_neg
-
-        /* |x| < 2^52? */
-        cmp             r2, #52
-        blt             .Lclr_frac_r0_neg
-
-        /* return x */
-        orr             r1, r1, #0x80000000
-        bx              lr
-
-.Lclr_frac_r1_neg:
-        rsb             r2, r2, #20
-        mov             r3, #1
-        lsl             r3, r3, r2
-        sub             r3, r3, #1
-        and             r3, r1, r3
-        orr             r3, r3, r0
-        lsr             r1, r1, r2
-        lsl             r1, r1, r2
-        mov             r0, #0
-        b               .Lreturn_x_neg
-
-.Lclr_frac_r0_neg:
-        rsb             r2, r2, #52
-        mov             r3, #1
-        lsl             r3, r3, r2
-        sub             r3, r3, #1
-        and             r3, r0, r3
-        lsr             r0, r0, r2
-        lsl             r0, r0, r2
-        b               .Lreturn_x_neg
-
-.Lx_lt_one:
-        /* x == +-0? */
-        cmp             r0, #0
-        cmpeq           r1, #0
-        orreq           r1, r1, r3
-        bxeq            lr
-
-        /* (x > 0) ? 0 : -1 */
-        mov             r1, #0x00100000
-        mov             r0, #0
-        cmp             r3, #0
-        movne           r1, #0xc0000000
-        sub             r1, r1, #0x00100000
-        bx              lr
-
-.Lreturn_x_neg:
-        cmp             r3, #0
-        orr             r1, r1, #0x80000000
-        bxeq            lr
-
-        vmov            d16, r0, r1
-        vmov.f64        d18, #1.0
-        vsub.f64        d16, d16, d18
-        vmov            r0, r1, d16
-        bx              lr
-
-END(floor)
-
-ALIAS_SYMBOL(floorl, floor);
diff --git a/libm/arm/sqrt.S b/libm/arm/sqrt.S
deleted file mode 100644
index f2981f4..0000000
--- a/libm/arm/sqrt.S
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
- * Johnny Qiu <joqiu@nvidia.com>
- * Shu Zhang <chazhang@nvidia.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <float.h>
-#include <private/bionic_asm.h>
-
-ENTRY(sqrt)
-    vmov.f64    d0, r0, r1
-    vsqrt.f64   d0, d0
-    vmov.f64    r0, r1, d0
-    bx          lr
-END(sqrt)
-
-ENTRY(sqrtf)
-    vmov.f32    s0, r0
-    vsqrt.f32   s0, s0
-    vmov.f32    r0, s0
-    bx          lr
-END(sqrtf)
-
-ALIAS_SYMBOL(sqrtl, sqrt);
diff --git a/libm/arm64/fenv.c b/libm/arm64/fenv.c
index a99288b..0f28d0c 100644
--- a/libm/arm64/fenv.c
+++ b/libm/arm64/fenv.c
@@ -59,7 +59,6 @@
 
 int fesetenv(const fenv_t* envp) {
   fpu_control_t fpcr;
-
   __get_fpcr(fpcr);
   if (envp->__control != fpcr) {
     __set_fpcr(envp->__control);
@@ -70,27 +69,22 @@
 
 int feclearexcept(int excepts) {
   fpu_status_t fpsr;
-
-  excepts &= FE_ALL_EXCEPT;
   __get_fpsr(fpsr);
-  fpsr &= ~excepts;
+  fpsr &= ~(excepts & FE_ALL_EXCEPT);
   __set_fpsr(fpsr);
   return 0;
 }
 
 int fegetexceptflag(fexcept_t* flagp, int excepts) {
   fpu_status_t fpsr;
-
-  excepts &= FE_ALL_EXCEPT;
   __get_fpsr(fpsr);
-  *flagp = fpsr & excepts;
+  *flagp = fpsr & (excepts & FE_ALL_EXCEPT);
   return 0;
 }
 
 int fesetexceptflag(const fexcept_t* flagp, int excepts) {
-  fpu_status_t fpsr;
-
   excepts &= FE_ALL_EXCEPT;
+  fpu_status_t fpsr;
   __get_fpsr(fpsr);
   fpsr &= ~excepts;
   fpsr |= *flagp & excepts;
@@ -100,32 +94,27 @@
 
 int feraiseexcept(int excepts) {
   fexcept_t ex = excepts;
-
   fesetexceptflag(&ex, excepts);
   return 0;
 }
 
 int fetestexcept(int excepts) {
   fpu_status_t fpsr;
-
-  excepts &= FE_ALL_EXCEPT;
   __get_fpsr(fpsr);
-  return (fpsr & excepts);
+  return (fpsr & (excepts & FE_ALL_EXCEPT));
 }
 
 int fegetround(void) {
   fpu_control_t fpcr;
-
   __get_fpcr(fpcr);
   return ((fpcr >> FPCR_RMODE_SHIFT) & FE_TOWARDZERO);
 }
 
 int fesetround(int round) {
-  fpu_control_t fpcr, new_fpcr;
-
-  round &= FE_TOWARDZERO;
+  if (round < FE_TONEAREST || round > FE_TOWARDZERO) return -1;
+  fpu_control_t fpcr;
   __get_fpcr(fpcr);
-  new_fpcr = fpcr & ~(FE_TOWARDZERO << FPCR_RMODE_SHIFT);
+  fpu_control_t new_fpcr = fpcr & ~(FE_TOWARDZERO << FPCR_RMODE_SHIFT);
   new_fpcr |= (round << FPCR_RMODE_SHIFT);
   if (new_fpcr != fpcr) {
     __set_fpcr(new_fpcr);
@@ -134,33 +123,15 @@
 }
 
 int feholdexcept(fenv_t* envp) {
-  fpu_status_t fpsr;
-  __get_fpsr(fpsr);
-  fpu_control_t fpcr;
-  __get_fpcr(fpcr);
-  fenv_t env = { .__status = fpsr, .__control = fpcr };
-  *envp = env;
-
-  // Clear all exceptions.
-  fpsr &= ~FE_ALL_EXCEPT;
-  __set_fpsr(fpsr);
+  fegetenv(envp);
+  feclearexcept(FE_ALL_EXCEPT);
   return 0;
 }
 
 int feupdateenv(const fenv_t* envp) {
-  fpu_status_t fpsr;
-  fpu_control_t fpcr;
-
-  // Set FPU Control register.
-  __get_fpcr(fpcr);
-  if (envp->__control != fpcr) {
-    __set_fpcr(envp->__control);
-  }
-
-  // Set FPU Status register to status | currently raised exceptions.
-  __get_fpsr(fpsr);
-  fpsr = envp->__status | (fpsr & FE_ALL_EXCEPT);
-  __set_fpsr(fpsr);
+  int excepts = fetestexcept(FE_ALL_EXCEPT);
+  fesetenv(envp);
+  feraiseexcept(excepts);
   return 0;
 }
 
diff --git a/libm/arm64/lrint.S b/libm/arm64/lrint.S
deleted file mode 100644
index e835d08..0000000
--- a/libm/arm64/lrint.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <private/bionic_asm.h>
-
-ENTRY(lrint)
-  frintX d0, d0
-  fcvtzs x0, d0
-  ret
-END(lrint)
-
-ENTRY(lrintf)
-  frintX s0, s0
-  fcvtzs x0, s0
-  ret
-END(lrintf)
-
-// sizeof(long) and sizeof(long long) are the same for aarch64
-ALIAS_SYMBOL(llrint, lrint);
-
-ALIAS_SYMBOL(llrintf, lrintf);
-
-NOTE_GNU_PROPERTY()
diff --git a/libm/arm64/sqrt.S b/libm/arm64/sqrt.S
deleted file mode 100644
index 0659b13..0000000
--- a/libm/arm64/sqrt.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrt)
-  fsqrt d0, d0
-  ret
-END(sqrt)
-
-ENTRY(sqrtf)
-  fsqrt s0, s0
-  ret
-END(sqrtf)
-
-NOTE_GNU_PROPERTY()
diff --git a/libm/builtins.cpp b/libm/builtins.cpp
index 3b9228c..41e145b 100644
--- a/libm/builtins.cpp
+++ b/libm/builtins.cpp
@@ -18,40 +18,43 @@
 
 #include "fpmath.h"
 
-double fabs(double x) {
-#if __arm__
-  // Both Clang and GCC insist on moving r0/r1 into a double register
-  // and using fabs where bit-twiddling would be a better choice.
-  // They get fabsf right, but we need to be careful in fabsl too.
-  IEEEd2bits u;
-  u.d = x;
-  u.bits.sign = 0;
-  return u.d;
-#else
-  return __builtin_fabs(x);
-#endif
-}
-
-float fabsf(float x) {
-  return __builtin_fabsf(x);
-}
-
-#if defined(__LP64__)
+double fabs(double x) { return __builtin_fabs(x); }
+float fabsf(float x) { return __builtin_fabsf(x); }
 long double fabsl(long double x) { return __builtin_fabsl(x); }
-#else
-long double fabsl(long double x) {
-  // Don't use __builtin_fabs here because of ARM. (See fabs above.)
-  return fabs(x);
-}
-#endif
 
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__)
 float ceilf(float x) { return __builtin_ceilf(x); }
 double ceil(double x) { return __builtin_ceil(x); }
+#if defined(__ILP32__)
+__weak_reference(ceil, ceill);
+#endif
+#endif
 
+double copysign(double x, double y) { return __builtin_copysign(x, y); }
+float copysignf(float x, float y) { return __builtin_copysignf(x, y); }
+long double copysignl(long double x, long double y) { return __builtin_copysignl(x, y); }
+
+#if defined(__arm__) && (__ARM_ARCH < 8)
+// armv8 arm32 has a single-instruction implementation for these, but
+// armv7 arm32 doesn't, so __builtin_ doesn't work for arm32.
+#include "math_private.h"
+namespace s_floor {
+#include "upstream-freebsd/lib/msun/src/s_floor.c"
+}
+namespace s_floorf {
+#include "upstream-freebsd/lib/msun/src/s_floorf.c"
+}
+float floorf(float x) { return s_floorf::floorf(x); }
+double floor(double x) { return s_floor::floor(x); }
+#else
 float floorf(float x) { return __builtin_floorf(x); }
 double floor(double x) { return __builtin_floor(x); }
+#if defined(__ILP32__)
+__weak_reference(floor, floorl);
+#endif
+#endif
 
+#if defined(__aarch64__) || defined(__riscv)
 float fmaf(float x, float y, float z) { return __builtin_fmaf(x, y, z); }
 double fma(double x, double y, double z) { return __builtin_fma(x, y, z); }
 
@@ -60,13 +63,45 @@
 
 float fminf(float x, float y) { return __builtin_fminf(x, y); }
 double fmin(double x, double y) { return __builtin_fmin(x, y); }
+#endif
 
+#if defined(__aarch64__) || defined(__riscv)
+long lrint(double x) { return __builtin_lrint(x); }
+long lrintf(float x) { return __builtin_lrintf(x); }
+long long llrint(double x) { return __builtin_llrint(x); }
+long long llrintf(float x) { return __builtin_llrintf(x); }
+#endif
+
+#if defined(__aarch64__) || defined(__riscv)
+long lround(double x) { return __builtin_lround(x); }
+long lroundf(float x) { return __builtin_lroundf(x); }
+long long llround(double x) { return __builtin_llround(x); }
+long long llroundf(float x) { return __builtin_llroundf(x); }
+#endif
+
+#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__)
 float rintf(float x) { return __builtin_rintf(x); }
 double rint(double x) { return __builtin_rint(x); }
+#if defined(__ILP32__)
+__weak_reference(rint, rintl);
+#endif
+#endif
 
+#if defined(__aarch64__) || defined(__riscv)
 float roundf(float x) { return __builtin_roundf(x); }
 double round(double x) { return __builtin_round(x); }
+#endif
 
+float sqrtf(float x) { return __builtin_sqrtf(x); }
+double sqrt(double x) { return __builtin_sqrt(x); }
+#if defined(__ILP32__)
+__weak_reference(sqrt, sqrtl);
+#endif
+
+#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__)
 float truncf(float x) { return __builtin_truncf(x); }
 double trunc(double x) { return __builtin_trunc(x); }
+#if defined(__ILP32__)
+__weak_reference(trunc, truncl);
+#endif
 #endif
diff --git a/libm/fake_long_double.c b/libm/fake_long_double.c
index 26edfeb..5f9b980 100644
--- a/libm/fake_long_double.c
+++ b/libm/fake_long_double.c
@@ -24,7 +24,6 @@
 // Android works around those cases by replacing the broken functions with our own trivial stubs
 // that call the regular "double" function.
 
-long double copysignl(long double a1, long double a2) { return copysign(a1, a2); }
 long double fmaxl(long double a1, long double a2) { return fmax(a1, a2); }
 long double fmodl(long double a1, long double a2) { return fmod(a1, a2); }
 long double fminl(long double a1, long double a2) { return fmin(a1, a2); }
diff --git a/libm/riscv64/fenv.c b/libm/riscv64/fenv.c
new file mode 100644
index 0000000..f16e5a9
--- /dev/null
+++ b/libm/riscv64/fenv.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <fenv.h>
+#include <stdint.h>
+
+const fenv_t __fe_dfl_env = 0;
+
+int fegetenv(fenv_t* envp) {
+  __asm__ __volatile__("frcsr %0" : "=r"(*envp));
+  return 0;
+}
+
+int fesetenv(const fenv_t* envp) {
+  fenv_t env;
+  fegetenv(&env);
+  if (*envp != env) {
+    __asm__ __volatile__("fscsr %z0" : : "r"(*envp));
+  }
+  return 0;
+}
+
+int feclearexcept(int excepts) {
+  __asm__ __volatile__("csrc fflags, %0" : : "r"(excepts & FE_ALL_EXCEPT));
+  return 0;
+}
+
+int fegetexceptflag(fexcept_t* flagp, int excepts) {
+  *flagp = fetestexcept(excepts & FE_ALL_EXCEPT);
+  return 0;
+}
+
+int fesetexceptflag(const fexcept_t* flagp, int excepts) {
+  feclearexcept((~*flagp) & excepts);
+  feraiseexcept(*flagp & excepts);
+  return 0;
+}
+
+int feraiseexcept(int excepts) {
+  __asm__ __volatile__("csrs fflags, %0" : : "r"(excepts));
+  return 0;
+}
+
+int fetestexcept(int excepts) {
+  int flags;
+  __asm__ __volatile__("frflags %0" : "=r"(flags));
+  return flags & excepts;
+}
+
+int fegetround(void) {
+  int rm;
+  __asm__ __volatile__("frrm %0" : "=r"(rm));
+  return rm;
+}
+
+int fesetround(int round) {
+  if (round < FE_TONEAREST || round > FE_UPWARD) return -1;
+  __asm__ __volatile__("fsrm %z0" : : "r"(round));
+  return 0;
+}
+
+int feholdexcept(fenv_t* envp) {
+  fegetenv(envp);
+  feclearexcept(FE_ALL_EXCEPT);
+  return 0;
+}
+
+int feupdateenv(const fenv_t* envp) {
+  int excepts = fetestexcept(FE_ALL_EXCEPT);
+  fesetenv(envp);
+  feraiseexcept(excepts);
+  return 0;
+}
+
+int feenableexcept(int mask __unused) {
+  return -1;
+}
+
+int fedisableexcept(int mask __unused) {
+  return 0;
+}
+
+int fegetexcept(void) {
+  return 0;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sqrt.c b/libm/upstream-freebsd/lib/msun/src/e_sqrt.c
deleted file mode 100644
index 37351a4..0000000
--- a/libm/upstream-freebsd/lib/msun/src/e_sqrt.c
+++ /dev/null
@@ -1,459 +0,0 @@
-
-/* @(#)e_sqrt.c 1.3 95/01/18 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunSoft, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <float.h>
-
-#include "math.h"
-#include "math_private.h"
-
-#ifdef USE_BUILTIN_SQRT
-double
-__ieee754_sqrt(double x)
-{
-	return (__builtin_sqrt(x));
-}
-#else
-/* __ieee754_sqrt(x)
- * Return correctly rounded sqrt.
- *           ------------------------------------------
- *	     |  Use the hardware sqrt if you have one |
- *           ------------------------------------------
- * Method: 
- *   Bit by bit method using integer arithmetic. (Slow, but portable) 
- *   1. Normalization
- *	Scale x to y in [1,4) with even powers of 2: 
- *	find an integer k such that  1 <= (y=x*2^(2k)) < 4, then
- *		sqrt(x) = 2^k * sqrt(y)
- *   2. Bit by bit computation
- *	Let q  = sqrt(y) truncated to i bit after binary point (q = 1),
- *	     i							 0
- *                                     i+1         2
- *	    s  = 2*q , and	y  =  2   * ( y - q  ).		(1)
- *	     i      i            i                 i
- *                                                        
- *	To compute q    from q , one checks whether 
- *		    i+1       i                       
- *
- *			      -(i+1) 2
- *			(q + 2      ) <= y.			(2)
- *     			  i
- *							      -(i+1)
- *	If (2) is false, then q   = q ; otherwise q   = q  + 2      .
- *		 	       i+1   i             i+1   i
- *
- *	With some algebric manipulation, it is not difficult to see
- *	that (2) is equivalent to 
- *                             -(i+1)
- *			s  +  2       <= y			(3)
- *			 i                i
- *
- *	The advantage of (3) is that s  and y  can be computed by 
- *				      i      i
- *	the following recurrence formula:
- *	    if (3) is false
- *
- *	    s     =  s  ,	y    = y   ;			(4)
- *	     i+1      i		 i+1    i
- *
- *	    otherwise,
- *                         -i                     -(i+1)
- *	    s	  =  s  + 2  ,  y    = y  -  s  - 2  		(5)
- *           i+1      i          i+1    i     i
- *				
- *	One may easily use induction to prove (4) and (5). 
- *	Note. Since the left hand side of (3) contain only i+2 bits,
- *	      it does not necessary to do a full (53-bit) comparison 
- *	      in (3).
- *   3. Final rounding
- *	After generating the 53 bits result, we compute one more bit.
- *	Together with the remainder, we can decide whether the
- *	result is exact, bigger than 1/2ulp, or less than 1/2ulp
- *	(it will never equal to 1/2ulp).
- *	The rounding mode can be detected by checking whether
- *	huge + tiny is equal to huge, and whether huge - tiny is
- *	equal to huge for some floating point number "huge" and "tiny".
- *		
- * Special cases:
- *	sqrt(+-0) = +-0 	... exact
- *	sqrt(inf) = inf
- *	sqrt(-ve) = NaN		... with invalid signal
- *	sqrt(NaN) = NaN		... with invalid signal for signaling NaN
- *
- * Other methods : see the appended file at the end of the program below.
- *---------------
- */
-
-static	const double	one	= 1.0, tiny=1.0e-300;
-
-double
-__ieee754_sqrt(double x)
-{
-	double z;
-	int32_t sign = (int)0x80000000;
-	int32_t ix0,s0,q,m,t,i;
-	u_int32_t r,t1,s1,ix1,q1;
-
-	EXTRACT_WORDS(ix0,ix1,x);
-
-    /* take care of Inf and NaN */
-	if((ix0&0x7ff00000)==0x7ff00000) {			
-	    return x*x+x;		/* sqrt(NaN)=NaN, sqrt(+inf)=+inf
-					   sqrt(-inf)=sNaN */
-	} 
-    /* take care of zero */
-	if(ix0<=0) {
-	    if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
-	    else if(ix0<0)
-		return (x-x)/(x-x);		/* sqrt(-ve) = sNaN */
-	}
-    /* normalize x */
-	m = (ix0>>20);
-	if(m==0) {				/* subnormal x */
-	    while(ix0==0) {
-		m -= 21;
-		ix0 |= (ix1>>11); ix1 <<= 21;
-	    }
-	    for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
-	    m -= i-1;
-	    ix0 |= (ix1>>(32-i));
-	    ix1 <<= i;
-	}
-	m -= 1023;	/* unbias exponent */
-	ix0 = (ix0&0x000fffff)|0x00100000;
-	if(m&1){	/* odd m, double x to make it even */
-	    ix0 += ix0 + ((ix1&sign)>>31);
-	    ix1 += ix1;
-	}
-	m >>= 1;	/* m = [m/2] */
-
-    /* generate sqrt(x) bit by bit */
-	ix0 += ix0 + ((ix1&sign)>>31);
-	ix1 += ix1;
-	q = q1 = s0 = s1 = 0;	/* [q,q1] = sqrt(x) */
-	r = 0x00200000;		/* r = moving bit from right to left */
-
-	while(r!=0) {
-	    t = s0+r; 
-	    if(t<=ix0) { 
-		s0   = t+r; 
-		ix0 -= t; 
-		q   += r; 
-	    } 
-	    ix0 += ix0 + ((ix1&sign)>>31);
-	    ix1 += ix1;
-	    r>>=1;
-	}
-
-	r = sign;
-	while(r!=0) {
-	    t1 = s1+r; 
-	    t  = s0;
-	    if((t<ix0)||((t==ix0)&&(t1<=ix1))) { 
-		s1  = t1+r;
-		if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1;
-		ix0 -= t;
-		if (ix1 < t1) ix0 -= 1;
-		ix1 -= t1;
-		q1  += r;
-	    }
-	    ix0 += ix0 + ((ix1&sign)>>31);
-	    ix1 += ix1;
-	    r>>=1;
-	}
-
-    /* use floating add to find out rounding direction */
-	if((ix0|ix1)!=0) {
-	    z = one-tiny; /* trigger inexact flag */
-	    if (z>=one) {
-	        z = one+tiny;
-	        if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;}
-		else if (z>one) {
-		    if (q1==(u_int32_t)0xfffffffe) q+=1;
-		    q1+=2; 
-		} else
-	            q1 += (q1&1);
-	    }
-	}
-	ix0 = (q>>1)+0x3fe00000;
-	ix1 =  q1>>1;
-	if ((q&1)==1) ix1 |= sign;
-	ix0 += (m <<20);
-	INSERT_WORDS(z,ix0,ix1);
-	return z;
-}
-#endif
-
-#if (LDBL_MANT_DIG == 53)
-__weak_reference(sqrt, sqrtl);
-#endif
-
-/*
-Other methods  (use floating-point arithmetic)
--------------
-(This is a copy of a drafted paper by Prof W. Kahan 
-and K.C. Ng, written in May, 1986)
-
-	Two algorithms are given here to implement sqrt(x) 
-	(IEEE double precision arithmetic) in software.
-	Both supply sqrt(x) correctly rounded. The first algorithm (in
-	Section A) uses newton iterations and involves four divisions.
-	The second one uses reciproot iterations to avoid division, but
-	requires more multiplications. Both algorithms need the ability
-	to chop results of arithmetic operations instead of round them, 
-	and the INEXACT flag to indicate when an arithmetic operation
-	is executed exactly with no roundoff error, all part of the 
-	standard (IEEE 754-1985). The ability to perform shift, add,
-	subtract and logical AND operations upon 32-bit words is needed
-	too, though not part of the standard.
-
-A.  sqrt(x) by Newton Iteration
-
-   (1)	Initial approximation
-
-	Let x0 and x1 be the leading and the trailing 32-bit words of
-	a floating point number x (in IEEE double format) respectively 
-
-	    1    11		     52				  ...widths
-	   ------------------------------------------------------
-	x: |s|	  e     |	      f				|
-	   ------------------------------------------------------
-	      msb    lsb  msb				      lsb ...order
-
- 
-	     ------------------------  	     ------------------------
-	x0:  |s|   e    |    f1     |	 x1: |          f2           |
-	     ------------------------  	     ------------------------
-
-	By performing shifts and subtracts on x0 and x1 (both regarded
-	as integers), we obtain an 8-bit approximation of sqrt(x) as
-	follows.
-
-		k  := (x0>>1) + 0x1ff80000;
-		y0 := k - T1[31&(k>>15)].	... y ~ sqrt(x) to 8 bits
-	Here k is a 32-bit integer and T1[] is an integer array containing
-	correction terms. Now magically the floating value of y (y's
-	leading 32-bit word is y0, the value of its trailing word is 0)
-	approximates sqrt(x) to almost 8-bit.
-
-	Value of T1:
-	static int T1[32]= {
-	0,	1024,	3062,	5746,	9193,	13348,	18162,	23592,
-	29598,	36145,	43202,	50740,	58733,	67158,	75992,	85215,
-	83599,	71378,	60428,	50647,	41945,	34246,	27478,	21581,
-	16499,	12183,	8588,	5674,	3403,	1742,	661,	130,};
-
-    (2)	Iterative refinement
-
-	Apply Heron's rule three times to y, we have y approximates 
-	sqrt(x) to within 1 ulp (Unit in the Last Place):
-
-		y := (y+x/y)/2		... almost 17 sig. bits
-		y := (y+x/y)/2		... almost 35 sig. bits
-		y := y-(y-x/y)/2	... within 1 ulp
-
-
-	Remark 1.
-	    Another way to improve y to within 1 ulp is:
-
-		y := (y+x/y)		... almost 17 sig. bits to 2*sqrt(x)
-		y := y - 0x00100006	... almost 18 sig. bits to sqrt(x)
-
-				2
-			    (x-y )*y
-		y := y + 2* ----------	...within 1 ulp
-			       2
-			     3y  + x
-
-
-	This formula has one division fewer than the one above; however,
-	it requires more multiplications and additions. Also x must be
-	scaled in advance to avoid spurious overflow in evaluating the
-	expression 3y*y+x. Hence it is not recommended uless division
-	is slow. If division is very slow, then one should use the 
-	reciproot algorithm given in section B.
-
-    (3) Final adjustment
-
-	By twiddling y's last bit it is possible to force y to be 
-	correctly rounded according to the prevailing rounding mode
-	as follows. Let r and i be copies of the rounding mode and
-	inexact flag before entering the square root program. Also we
-	use the expression y+-ulp for the next representable floating
-	numbers (up and down) of y. Note that y+-ulp = either fixed
-	point y+-1, or multiply y by nextafter(1,+-inf) in chopped
-	mode.
-
-		I := FALSE;	... reset INEXACT flag I
-		R := RZ;	... set rounding mode to round-toward-zero
-		z := x/y;	... chopped quotient, possibly inexact
-		If(not I) then {	... if the quotient is exact
-		    if(z=y) {
-		        I := i;	 ... restore inexact flag
-		        R := r;  ... restore rounded mode
-		        return sqrt(x):=y.
-		    } else {
-			z := z - ulp;	... special rounding
-		    }
-		}
-		i := TRUE;		... sqrt(x) is inexact
-		If (r=RN) then z=z+ulp	... rounded-to-nearest
-		If (r=RP) then {	... round-toward-+inf
-		    y = y+ulp; z=z+ulp;
-		}
-		y := y+z;		... chopped sum
-		y0:=y0-0x00100000;	... y := y/2 is correctly rounded.
-	        I := i;	 		... restore inexact flag
-	        R := r;  		... restore rounded mode
-	        return sqrt(x):=y.
-		    
-    (4)	Special cases
-
-	Square root of +inf, +-0, or NaN is itself;
-	Square root of a negative number is NaN with invalid signal.
-
-
-B.  sqrt(x) by Reciproot Iteration
-
-   (1)	Initial approximation
-
-	Let x0 and x1 be the leading and the trailing 32-bit words of
-	a floating point number x (in IEEE double format) respectively
-	(see section A). By performing shifs and subtracts on x0 and y0,
-	we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
-
-	    k := 0x5fe80000 - (x0>>1);
-	    y0:= k - T2[63&(k>>14)].	... y ~ 1/sqrt(x) to 7.8 bits
-
-	Here k is a 32-bit integer and T2[] is an integer array 
-	containing correction terms. Now magically the floating
-	value of y (y's leading 32-bit word is y0, the value of
-	its trailing word y1 is set to zero) approximates 1/sqrt(x)
-	to almost 7.8-bit.
-
-	Value of T2:
-	static int T2[64]= {
-	0x1500,	0x2ef8,	0x4d67,	0x6b02,	0x87be,	0xa395,	0xbe7a,	0xd866,
-	0xf14a,	0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
-	0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
-	0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
-	0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
-	0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
-	0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
-	0x1527f,0x1334a,0x11051,0xe951,	0xbe01,	0x8e0d,	0x5924,	0x1edd,};
-
-    (2)	Iterative refinement
-
-	Apply Reciproot iteration three times to y and multiply the
-	result by x to get an approximation z that matches sqrt(x)
-	to about 1 ulp. To be exact, we will have 
-		-1ulp < sqrt(x)-z<1.0625ulp.
-	
-	... set rounding mode to Round-to-nearest
-	   y := y*(1.5-0.5*x*y*y)	... almost 15 sig. bits to 1/sqrt(x)
-	   y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
-	... special arrangement for better accuracy
-	   z := x*y			... 29 bits to sqrt(x), with z*y<1
-	   z := z + 0.5*z*(1-z*y)	... about 1 ulp to sqrt(x)
-
-	Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
-	(a) the term z*y in the final iteration is always less than 1; 
-	(b) the error in the final result is biased upward so that
-		-1 ulp < sqrt(x) - z < 1.0625 ulp
-	    instead of |sqrt(x)-z|<1.03125ulp.
-
-    (3)	Final adjustment
-
-	By twiddling y's last bit it is possible to force y to be 
-	correctly rounded according to the prevailing rounding mode
-	as follows. Let r and i be copies of the rounding mode and
-	inexact flag before entering the square root program. Also we
-	use the expression y+-ulp for the next representable floating
-	numbers (up and down) of y. Note that y+-ulp = either fixed
-	point y+-1, or multiply y by nextafter(1,+-inf) in chopped
-	mode.
-
-	R := RZ;		... set rounding mode to round-toward-zero
-	switch(r) {
-	    case RN:		... round-to-nearest
-	       if(x<= z*(z-ulp)...chopped) z = z - ulp; else
-	       if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
-	       break;
-	    case RZ:case RM:	... round-to-zero or round-to--inf
-	       R:=RP;		... reset rounding mod to round-to-+inf
-	       if(x<z*z ... rounded up) z = z - ulp; else
-	       if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
-	       break;
-	    case RP:		... round-to-+inf
-	       if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
-	       if(x>z*z ...chopped) z = z+ulp;
-	       break;
-	}
-
-	Remark 3. The above comparisons can be done in fixed point. For
-	example, to compare x and w=z*z chopped, it suffices to compare
-	x1 and w1 (the trailing parts of x and w), regarding them as
-	two's complement integers.
-
-	...Is z an exact square root?
-	To determine whether z is an exact square root of x, let z1 be the
-	trailing part of z, and also let x0 and x1 be the leading and
-	trailing parts of x.
-
-	If ((z1&0x03ffffff)!=0)	... not exact if trailing 26 bits of z!=0
-	    I := 1;		... Raise Inexact flag: z is not exact
-	else {
-	    j := 1 - [(x0>>20)&1]	... j = logb(x) mod 2
-	    k := z1 >> 26;		... get z's 25-th and 26-th 
-					    fraction bits
-	    I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
-	}
-	R:= r		... restore rounded mode
-	return sqrt(x):=z.
-
-	If multiplication is cheaper then the foregoing red tape, the 
-	Inexact flag can be evaluated by
-
-	    I := i;
-	    I := (z*z!=x) or I.
-
-	Note that z*z can overwrite I; this value must be sensed if it is 
-	True.
-
-	Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
-	zero.
-
-		    --------------------
-		z1: |        f2        | 
-		    --------------------
-		bit 31		   bit 0
-
-	Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
-	or even of logb(x) have the following relations:
-
-	-------------------------------------------------
-	bit 27,26 of z1		bit 1,0 of x1	logb(x)
-	-------------------------------------------------
-	00			00		odd and even
-	01			01		even
-	10			10		odd
-	10			00		even
-	11			01		even
-	-------------------------------------------------
-
-    (4)	Special cases (see (4) of Section A).	
- 
- */
- 
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c b/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c
deleted file mode 100644
index 06e5d62..0000000
--- a/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* e_sqrtf.c -- float version of e_sqrt.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#ifndef lint
-static char rcsid[] = "$FreeBSD$";
-#endif
-
-#include "math.h"
-#include "math_private.h"
-
-#ifdef USE_BUILTIN_SQRTF
-float
-__ieee754_sqrtf(float x)
-{
-	return (__builtin_sqrtf(x));
-}
-#else
-static	const float	one	= 1.0, tiny=1.0e-30;
-
-float
-__ieee754_sqrtf(float x)
-{
-	float z;
-	int32_t sign = (int)0x80000000;
-	int32_t ix,s,q,m,t,i;
-	u_int32_t r;
-
-	GET_FLOAT_WORD(ix,x);
-
-    /* take care of Inf and NaN */
-	if((ix&0x7f800000)==0x7f800000) {
-	    return x*x+x;		/* sqrt(NaN)=NaN, sqrt(+inf)=+inf
-					   sqrt(-inf)=sNaN */
-	}
-    /* take care of zero */
-	if(ix<=0) {
-	    if((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */
-	    else if(ix<0)
-		return (x-x)/(x-x);		/* sqrt(-ve) = sNaN */
-	}
-    /* normalize x */
-	m = (ix>>23);
-	if(m==0) {				/* subnormal x */
-	    for(i=0;(ix&0x00800000)==0;i++) ix<<=1;
-	    m -= i-1;
-	}
-	m -= 127;	/* unbias exponent */
-	ix = (ix&0x007fffff)|0x00800000;
-	if(m&1)	/* odd m, double x to make it even */
-	    ix += ix;
-	m >>= 1;	/* m = [m/2] */
-
-    /* generate sqrt(x) bit by bit */
-	ix += ix;
-	q = s = 0;		/* q = sqrt(x) */
-	r = 0x01000000;		/* r = moving bit from right to left */
-
-	while(r!=0) {
-	    t = s+r;
-	    if(t<=ix) {
-		s    = t+r;
-		ix  -= t;
-		q   += r;
-	    }
-	    ix += ix;
-	    r>>=1;
-	}
-
-    /* use floating add to find out rounding direction */
-	if(ix!=0) {
-	    z = one-tiny; /* trigger inexact flag */
-	    if (z>=one) {
-	        z = one+tiny;
-		if (z>one)
-		    q += 2;
-		else
-		    q += (q&1);
-	    }
-	}
-	ix = (q>>1)+0x3f000000;
-	ix += (m <<23);
-	SET_FLOAT_WORD(z,ix);
-	return z;
-}
-#endif
diff --git a/libm/x86/ceil.S b/libm/x86/ceil.S
deleted file mode 100644
index 6302037..0000000
--- a/libm/x86/ceil.S
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(ceil)
-	mov    %esp,%eax
-	and    $0xfffffff8,%eax
-	movsd  0x4(%esp),%xmm0
-	roundsd $0x2,%xmm0,%xmm0
-	movlpd %xmm0,-0x8(%eax)
-	fldl   -0x8(%eax)
-	ret
-END(ceil)
-
-ALIAS_SYMBOL(ceill, ceil);
diff --git a/libm/x86/ceilf.S b/libm/x86/ceilf.S
deleted file mode 100644
index 51eb440..0000000
--- a/libm/x86/ceilf.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(ceilf)
-	movss  0x4(%esp),%xmm0
-	roundss $0x2,%xmm0,%xmm0
-	movss  %xmm0,-0x4(%esp)
-	flds   -0x4(%esp)
-	ret
-END(ceilf)
diff --git a/libm/x86/e_acos.S b/libm/x86/e_acos.S
deleted file mode 100644
index 04b1787..0000000
--- a/libm/x86/e_acos.S
+++ /dev/null
@@ -1,1929 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  To compute acos(s), separate schemes are used when s is in different
-//  intervals.
-//
-//  |s| in [2^{-4}, sqrt(3)/2):
-//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
-//       acos(s)=pi/2-asin(t)-asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
-//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
-//       For the first degree term, r is evaluated as
-//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
-//       (sqrt(1-t^2) read from table)
-//  The main source of error is still R (may still be affected by up to 3 ulps
-//  of rounding error). The table size must be sufficiently large, to minimize
-//  this effect.
-//
-//  |s| in [sqrt(3)/2, 255/256):
-//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
-//       acos(|s|)=asin(t)-asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
-//   acos(-|s|)=pi-acos(|s|)
-//       (The -PI constant, or 0, is added to the result. The sign is set at
-//        the end)
-//       asin(r) evaluated as a polynomial (same as above)
-//       The first degree term is evaluated as
-//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
-//
-//  |s|<2^{-4}: acos(s)=pi/2-asin(s)
-//              evaluate asin(s) as 13-degree polynomial
-//
-//  |s| in [255/256,1): acos(|s|)=2*asin(q), where q=sqrt((1-|s|)/2)
-//  asin(q) is evaluated as 13-degree polynomial
-//      q^2=(1-|s|)/2 is obtained in advance
-//         2*q*eps ~ ((1-|s|)/2-q^2)/q used for first term
-//   acos(-|s|)=pi-acos(|s|)
-//       (The -PI constant, or 0, is added to the result. The sign is set at
-//        the end)
-//
-// Special cases:
-//  acos(NaN) = quiet NaN, and raise invalid exception
-//  acos(INF) = QNaN and raise invalid exception
-//  acos(x) = QNaN and raise invalid exception, for |x|>1.0
-//  acos(1) = +0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function	
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret       
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  acos
-ENTRY(acos)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 48(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        movsd     6048(%ebx), %xmm4
-        movsd     6080(%ebx), %xmm3
-        xorpd     %xmm5, %xmm5
-        movsd     6064(%ebx), %xmm2
-        movapd    %xmm0, %xmm1
-        movsd     %xmm0, 8(%esp)
-        psrlq     $44, %xmm0
-        movd      %xmm0, %edx
-        movapd    %xmm1, %xmm7
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movapd    %xmm1, %xmm0
-        movl      $524287, %eax
-        andl      %edx, %eax
-        subl      $260864, %eax
-        cmpl      $955, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-        mulsd     %xmm1, %xmm1
-        andl      $65535, %edx
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andpd     %xmm7, %xmm2
-        andl      $-4, %edx
-        subl      $64256, %edx
-        movsd     3840(%ebx,%edx,2), %xmm1
-        orpd      %xmm5, %xmm2
-        movapd    (%ebx,%edx,4), %xmm4
-        movapd    %xmm7, %xmm6
-        addsd     %xmm2, %xmm7
-        subsd     %xmm2, %xmm0
-        mulsd     %xmm0, %xmm7
-        mulsd     %xmm1, %xmm6
-        mulsd     %xmm2, %xmm3
-        movapd    %xmm6, %xmm1
-        addsd     %xmm3, %xmm6
-        divsd     %xmm6, %xmm7
-        movsd     5976(%ebx), %xmm0
-        movsd     5960(%ebx), %xmm5
-        subsd     %xmm3, %xmm1
-        psrlq     $63, %xmm2
-        movapd    %xmm1, %xmm3
-        psllq     $63, %xmm2
-        mulsd     %xmm1, %xmm1
-        pshufd    $68, %xmm2, %xmm2
-        movsd     5968(%ebx), %xmm6
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm4
-        mulsd     %xmm3, %xmm5
-        subpd     5888(%ebx), %xmm4
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm3, %xmm0
-        subsd     %xmm4, %xmm5
-        pshufd    $238, %xmm4, %xmm4
-        addsd     %xmm5, %xmm0
-        subsd     %xmm7, %xmm0
-        subsd     %xmm4, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        subl      $955, %eax
-        cmpl      $65, %eax
-        jae       .L_2TAG_PACKET_2.0.2
-        psrlq     $38, %xmm7
-        psllq     $38, %xmm7
-        pmovmskb  %xmm0, %eax
-        andnpd    %xmm0, %xmm4
-        subsd     %xmm7, %xmm1
-        movapd    %xmm7, %xmm6
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm6, %xmm0
-        orpd      %xmm4, %xmm5
-        subsd     %xmm7, %xmm3
-        mulsd     %xmm1, %xmm0
-        movapd    %xmm3, %xmm4
-        subsd     %xmm0, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andl      $128, %eax
-        shrl      $7, %eax
-        negl      %eax
-        movapd    %xmm3, %xmm7
-        andpd     %xmm3, %xmm2
-        psllq     $2, %xmm3
-        pextrw    $3, %xmm3, %edx
-        orpd      %xmm5, %xmm2
-        movd      %eax, %xmm3
-        pshufd    $0, %xmm3, %xmm3
-        subl      $65216, %edx
-        addl      %edx, %edx
-        mulsd     3840(%ebx,%edx,4), %xmm7
-        mulsd     %xmm2, %xmm6
-        mulsd     %xmm2, %xmm1
-        mulsd     %xmm2, %xmm2
-        subsd     %xmm7, %xmm6
-        andpd     5904(%ebx), %xmm3
-        addsd     %xmm1, %xmm6
-        subsd     %xmm2, %xmm4
-        addsd     %xmm7, %xmm7
-        movsd     5960(%ebx), %xmm5
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm7
-        movsd     5976(%ebx), %xmm0
-        divsd     %xmm7, %xmm4
-        movsd     5968(%ebx), %xmm2
-        addpd     (%ebx,%edx,8), %xmm3
-        movapd    %xmm6, %xmm1
-        mulsd     %xmm6, %xmm6
-        mulsd     %xmm6, %xmm0
-        mulsd     %xmm6, %xmm1
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm6, %xmm1
-        addsd     %xmm2, %xmm0
-        pxor      %xmm6, %xmm6
-        mulsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm5
-        addsd     %xmm5, %xmm0
-        andl      $32768, %eax
-        pinsrw    $3, %eax, %xmm6
-        movapd    %xmm4, %xmm5
-        pshufd    $238, %xmm3, %xmm3
-        addsd     %xmm3, %xmm4
-        subsd     %xmm4, %xmm3
-        addsd     %xmm3, %xmm5
-        addsd     %xmm5, %xmm0
-        addsd     %xmm4, %xmm0
-        xorpd     %xmm6, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        addl      $15291, %eax
-        cmpl      $14336, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        unpcklpd  %xmm0, %xmm0
-        movapd    5984(%ebx), %xmm6
-        unpcklpd  %xmm0, %xmm1
-        movapd    6000(%ebx), %xmm2
-        movapd    6016(%ebx), %xmm4
-        mulpd     %xmm0, %xmm0
-        movapd    5888(%ebx), %xmm5
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm6
-        mulpd     %xmm0, %xmm0
-        movapd    %xmm1, %xmm3
-        mulsd     %xmm1, %xmm1
-        addpd     %xmm2, %xmm6
-        mulpd     %xmm0, %xmm4
-        mulsd     %xmm3, %xmm1
-        addpd     %xmm4, %xmm6
-        pshufd    $238, %xmm5, %xmm0
-        mulpd     %xmm6, %xmm1
-        pshufd    $238, %xmm5, %xmm6
-        subsd     %xmm7, %xmm0
-        pshufd    $238, %xmm1, %xmm2
-        subsd     %xmm1, %xmm5
-        subsd     %xmm0, %xmm6
-        subsd     %xmm2, %xmm5
-        subsd     %xmm6, %xmm7
-        subsd     %xmm7, %xmm5
-        addsd     %xmm5, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_3.0.2:
-        subl      $15356, %eax
-        cmpl      $4, %eax
-        jae       .L_2TAG_PACKET_4.0.2
-        xorpd     %xmm6, %xmm6
-        andpd     6048(%ebx), %xmm7
-        movsd     6096(%ebx), %xmm4
-        movapd    5984(%ebx), %xmm1
-        mulsd     %xmm4, %xmm7
-        movapd    6000(%ebx), %xmm2
-        subsd     %xmm7, %xmm4
-        movapd    6016(%ebx), %xmm3
-        pshufd    $68, %xmm4, %xmm7
-        sqrtsd    %xmm4, %xmm4
-        mulpd     %xmm7, %xmm1
-        pshufd    $68, %xmm7, %xmm5
-        pextrw    $3, %xmm0, %eax
-        mulpd     %xmm7, %xmm7
-        addpd     %xmm1, %xmm2
-        movsd     5936(%ebx), %xmm1
-        mulpd     %xmm7, %xmm3
-        cmpsd     $1, %xmm6, %xmm0
-        mulsd     %xmm5, %xmm7
-        addpd     %xmm3, %xmm2
-        pshufd    $68, %xmm0, %xmm0
-        mulsd     %xmm7, %xmm2
-        andpd     5904(%ebx), %xmm0
-        mulpd     %xmm5, %xmm2
-        andpd     %xmm4, %xmm1
-        pshufd    $68, %xmm4, %xmm3
-        subsd     %xmm1, %xmm4
-        addsd     %xmm3, %xmm3
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm4, %xmm3
-        subsd     %xmm1, %xmm5
-        mulsd     %xmm3, %xmm4
-        pshufd    $238, %xmm3, %xmm3
-        subsd     %xmm4, %xmm5
-        divsd     %xmm3, %xmm5
-        addpd     %xmm3, %xmm3
-        mulpd     %xmm3, %xmm2
-        pshufd    $238, %xmm2, %xmm4
-        addsd     %xmm0, %xmm2
-        andl      $32768, %eax
-        pinsrw    $3, %eax, %xmm6
-        pshufd    $238, %xmm0, %xmm0
-        addsd     %xmm4, %xmm2
-        addsd     %xmm5, %xmm2
-        addsd     %xmm3, %xmm2
-        addsd     %xmm2, %xmm0
-        xorpd     %xmm6, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_4.0.2:
-        addl      $261884, %eax
-        cmpl      $261888, %eax
-        jb        .L_2TAG_PACKET_5.0.2
-        movd      %xmm7, %ecx
-        psrlq     $32, %xmm7
-        movd      %xmm7, %edx
-        andl      $2147483647, %edx
-        movl      $1072693248, %eax
-        subl      %edx, %eax
-        orl       %ecx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_6.0.2
-        movq      8(%esp), %xmm2
-        movd      %xmm2, %edx
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $2147483647, %ecx
-        subl      $1, %edx
-        sbbl      $2146435072, %ecx
-        cmpl      $0, %ecx
-        jge       .L_2TAG_PACKET_7.0.2
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %edx
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_6.0.2:
-        pextrw    $1, %xmm7, %edx
-        shrl      $15, %edx
-        negl      %edx
-        movd      %edx, %xmm7
-        pshufd    $0, %xmm7, %xmm7
-        movsd     5920(%ebx), %xmm2
-        movsd     5928(%ebx), %xmm0
-        andpd     %xmm7, %xmm2
-        andpd     %xmm7, %xmm0
-        addsd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_5.0.2:
-        movsd     5888(%ebx), %xmm2
-        movsd     5896(%ebx), %xmm0
-        addsd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_7.0.2:
-        xorpd     %xmm6, %xmm6
-        addsd     %xmm6, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-.L_2TAG_PACKET_1.0.2:
-        movl      48(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(acos)
-# -- End  acos
-
-# Start file scope ASM
-ALIAS_SYMBOL(acosl, acos);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	3822952792
-	.long	1021639372
-	.long	182792448
-	.long	1068507836
-	.long	2264213271
-	.long	1019558908
-	.long	649052928
-	.long	1068524253
-	.long	1797139609
-	.long	1022295143
-	.long	1243095296
-	.long	1068540671
-	.long	1415938756
-	.long	1021439537
-	.long	2033294592
-	.long	1068557090
-	.long	2356809978
-	.long	1021777916
-	.long	3088063744
-	.long	1068573510
-	.long	2669055318
-	.long	1022124482
-	.long	180888576
-	.long	1068589932
-	.long	3566445325
-	.long	1021358712
-	.long	1970196992
-	.long	1068606354
-	.long	896980323
-	.long	1021319659
-	.long	4229555456
-	.long	1068622777
-	.long	436049712
-	.long	1021319758
-	.long	2732572160
-	.long	1068639202
-	.long	583123209
-	.long	1020797960
-	.long	1842831872
-	.long	1068655628
-	.long	1370449804
-	.long	1021429270
-	.long	1628994560
-	.long	1068672055
-	.long	2411391464
-	.long	1021057980
-	.long	2159763712
-	.long	1068688483
-	.long	1208692749
-	.long	1021943903
-	.long	3503886336
-	.long	1068704912
-	.long	538793309
-	.long	1019744063
-	.long	1435187200
-	.long	1068721343
-	.long	4085087612
-	.long	1020608419
-	.long	317469952
-	.long	1068737775
-	.long	144386942
-	.long	1021440732
-	.long	219617280
-	.long	1068754208
-	.long	2940088361
-	.long	1019981122
-	.long	1210558208
-	.long	1068770642
-	.long	2176850347
-	.long	1018373705
-	.long	3359268352
-	.long	1068787077
-	.long	2395611454
-	.long	1021889042
-	.long	2439803648
-	.long	1068803514
-	.long	1650705253
-	.long	1020227966
-	.long	2816203520
-	.long	1068819952
-	.long	3702166386
-	.long	1019379914
-	.long	262620672
-	.long	1068836392
-	.long	1855649370
-	.long	1020453124
-	.long	3438159616
-	.long	1068852832
-	.long	923063860
-	.long	1019273834
-	.long	3822105856
-	.long	1068869274
-	.long	4289947947
-	.long	1019434249
-	.long	1483729920
-	.long	1068885718
-	.long	787455814
-	.long	1020738379
-	.long	787321088
-	.long	1068902163
-	.long	3321653337
-	.long	1021842569
-	.long	1802253312
-	.long	1068918609
-	.long	2653633526
-	.long	1021821525
-	.long	302985984
-	.long	1068935057
-	.long	161272028
-	.long	1021655149
-	.long	653966080
-	.long	1068951506
-	.long	2566098667
-	.long	1020066219
-	.long	2924727296
-	.long	1068967956
-	.long	3646493722
-	.long	1014292285
-	.long	2889890304
-	.long	1068984408
-	.long	1081009196
-	.long	1022189620
-	.long	619098112
-	.long	1069000862
-	.long	4011643355
-	.long	1021773297
-	.long	477017600
-	.long	1069017317
-	.long	4030305534
-	.long	1021292252
-	.long	2533403904
-	.long	1069033773
-	.long	2645187591
-	.long	1019527099
-	.long	2563102208
-	.long	1069050231
-	.long	3857293792
-	.long	1022311697
-	.long	635982336
-	.long	1069066691
-	.long	3625936637
-	.long	1017511744
-	.long	1116940800
-	.long	1069083152
-	.long	3653872993
-	.long	1022016631
-	.long	4075964160
-	.long	1069099614
-	.long	2468900271
-	.long	1021769532
-	.long	993165568
-	.long	1069116079
-	.long	1358104224
-	.long	1021199776
-	.long	528586752
-	.long	1069132545
-	.long	2200950332
-	.long	1022024872
-	.long	2752395776
-	.long	1069149012
-	.long	3197072454
-	.long	1017751319
-	.long	3439855616
-	.long	1069165481
-	.long	1651081806
-	.long	1020809338
-	.long	2661257728
-	.long	1069181952
-	.long	539032752
-	.long	1021728805
-	.long	486957312
-	.long	1069198425
-	.long	3136045149
-	.long	1016888671
-	.long	1282340352
-	.long	1069214899
-	.long	2593963259
-	.long	1018956103
-	.long	822921728
-	.long	1069231375
-	.long	2146032737
-	.long	1022306465
-	.long	3474216192
-	.long	1069247852
-	.long	3976811625
-	.long	1021350207
-	.long	716902656
-	.long	1069264332
-	.long	718267222
-	.long	1018624727
-	.long	1211594496
-	.long	1069280813
-	.long	1485641389
-	.long	1018447451
-	.long	734070272
-	.long	1069297296
-	.long	354455128
-	.long	1021341291
-	.long	3650110720
-	.long	1069313780
-	.long	682185947
-	.long	1021651853
-	.long	1440663040
-	.long	1069330267
-	.long	3558574550
-	.long	1021615110
-	.long	2766612224
-	.long	1069346755
-	.long	874607978
-	.long	1017746872
-	.long	3404011008
-	.long	1069363245
-	.long	4154988502
-	.long	1021439906
-	.long	3423949056
-	.long	1069379737
-	.long	2263202309
-	.long	1021479615
-	.long	2897587712
-	.long	1069396231
-	.long	2562065031
-	.long	1022090363
-	.long	1896159232
-	.long	1069412727
-	.long	3836237663
-	.long	1019867288
-	.long	490968576
-	.long	1069429225
-	.long	3322056743
-	.long	1006752762
-	.long	3048360192
-	.long	1069445724
-	.long	1152314833
-	.long	1013122252
-	.long	1049850624
-	.long	1069462226
-	.long	3601590727
-	.long	1022214610
-	.long	3156899584
-	.long	1069478729
-	.long	1855169970
-	.long	1019487271
-	.long	851173376
-	.long	1069495235
-	.long	312649594
-	.long	1020868604
-	.long	2794281728
-	.long	1069511742
-	.long	1093490181
-	.long	1020777577
-	.long	468042496
-	.long	1069528252
-	.long	1152540679
-	.long	1021403732
-	.long	2534219264
-	.long	1069544763
-	.long	2292126035
-	.long	1021872430
-	.long	1376146432
-	.long	1069558527
-	.long	3293753641
-	.long	1020500454
-	.long	4175442432
-	.long	1069575044
-	.long	3626347564
-	.long	1021610969
-	.long	3523113472
-	.long	1069591566
-	.long	339956500
-	.long	1021119039
-	.long	4003350528
-	.long	1069608092
-	.long	3429333082
-	.long	1022813542
-	.long	1611067392
-	.long	1069624623
-	.long	2298017544
-	.long	1021977587
-	.long	931782144
-	.long	1069641158
-	.long	2164684743
-	.long	1021250988
-	.long	2256725504
-	.long	1069657697
-	.long	1138762335
-	.long	1021443776
-	.long	1582853120
-	.long	1069674241
-	.long	1084010382
-	.long	1022994693
-	.long	3497758720
-	.long	1069690789
-	.long	406366244
-	.long	1022713586
-	.long	3999816960
-	.long	1069707342
-	.long	1488723042
-	.long	1023381290
-	.long	3383096064
-	.long	1069723900
-	.long	2541558953
-	.long	1019137887
-	.long	1942403584
-	.long	1069740463
-	.long	1879620343
-	.long	1022653642
-	.long	4268263680
-	.long	1069757030
-	.long	3039077047
-	.long	1022252545
-	.long	2067062272
-	.long	1069773603
-	.long	4190670677
-	.long	1020725863
-	.long	4225828096
-	.long	1069790180
-	.long	1998567321
-	.long	1022014385
-	.long	2452507136
-	.long	1069806763
-	.long	1511628873
-	.long	1021900300
-	.long	1340746240
-	.long	1069823351
-	.long	788367341
-	.long	1022726208
-	.long	1190035456
-	.long	1069839944
-	.long	3856337230
-	.long	1021834118
-	.long	2300688384
-	.long	1069856542
-	.long	3211396579
-	.long	1022621365
-	.long	678886400
-	.long	1069873146
-	.long	4001011887
-	.long	1022042646
-	.long	921594112
-	.long	1069889755
-	.long	557811968
-	.long	1023065533
-	.long	3331668992
-	.long	1069906369
-	.long	1877060679
-	.long	1022419742
-	.long	3917875200
-	.long	1069922989
-	.long	1181055171
-	.long	1022752712
-	.long	2984829696
-	.long	1069939615
-	.long	4294526932
-	.long	1021499988
-	.long	838049024
-	.long	1069956247
-	.long	3658081878
-	.long	1022957952
-	.long	2078928384
-	.long	1069972884
-	.long	820353701
-	.long	1019391107
-	.long	2719854336
-	.long	1069989527
-	.long	1644022489
-	.long	1023378240
-	.long	3069117696
-	.long	1070006176
-	.long	2771393702
-	.long	1019319954
-	.long	3435962368
-	.long	1070022831
-	.long	3876394145
-	.long	1023024433
-	.long	4130595328
-	.long	1070039492
-	.long	1630447748
-	.long	1021465882
-	.long	1169236224
-	.long	1070056160
-	.long	2828355997
-	.long	1020458120
-	.long	3453997312
-	.long	1070072833
-	.long	164091641
-	.long	1020388279
-	.long	2708127744
-	.long	1070089513
-	.long	3036550223
-	.long	1023328684
-	.long	3540797696
-	.long	1070106199
-	.long	3710949463
-	.long	1022568805
-	.long	1972276736
-	.long	1070122892
-	.long	3885277950
-	.long	1019761674
-	.long	2613815552
-	.long	1070139591
-	.long	2764165077
-	.long	1022921023
-	.long	1487791616
-	.long	1070156297
-	.long	1330644769
-	.long	1023162679
-	.long	3207593472
-	.long	1070173009
-	.long	3911007221
-	.long	1022993496
-	.long	3797764608
-	.long	1070189728
-	.long	979712598
-	.long	1022554580
-	.long	3578920448
-	.long	1070206454
-	.long	2825738223
-	.long	1020223708
-	.long	2872795648
-	.long	1070223187
-	.long	392451124
-	.long	1022666279
-	.long	2002258432
-	.long	1070239927
-	.long	3730407632
-	.long	1023148291
-	.long	1291326464
-	.long	1070256674
-	.long	3723802980
-	.long	1022514089
-	.long	1065180928
-	.long	1070273428
-	.long	2635617463
-	.long	1022654470
-	.long	1650181632
-	.long	1070290189
-	.long	2061982883
-	.long	1022853411
-	.long	3373882880
-	.long	1070306957
-	.long	319732785
-	.long	1022017175
-	.long	2270081280
-	.long	1070323733
-	.long	2237757411
-	.long	1023064087
-	.long	2963732736
-	.long	1070340516
-	.long	468839165
-	.long	1023293774
-	.long	1491099904
-	.long	1070357307
-	.long	1502657946
-	.long	1021533479
-	.long	2479636480
-	.long	1070374105
-	.long	482913562
-	.long	1021986286
-	.long	1968133632
-	.long	1070390911
-	.long	3281474337
-	.long	1022646400
-	.long	291639040
-	.long	1070407725
-	.long	2453320259
-	.long	1022812423
-	.long	2081472512
-	.long	1070424546
-	.long	2939989570
-	.long	1023091888
-	.long	3380340480
-	.long	1070441375
-	.long	2850707499
-	.long	1021921109
-	.long	232287488
-	.long	1070458213
-	.long	3674625342
-	.long	1020725130
-	.long	1567614208
-	.long	1070475058
-	.long	9347334
-	.long	1022024009
-	.long	3433091072
-	.long	1070491911
-	.long	282524999
-	.long	1021433523
-	.long	1876877312
-	.long	1070508773
-	.long	3470449440
-	.long	1019309721
-	.long	1538472192
-	.long	1070525643
-	.long	2089486825
-	.long	1019698916
-	.long	2763830784
-	.long	1070542521
-	.long	443498115
-	.long	1020505194
-	.long	1605381632
-	.long	1070559408
-	.long	3018871601
-	.long	1022869913
-	.long	2706946048
-	.long	1070576303
-	.long	3936260892
-	.long	1023175875
-	.long	2123887360
-	.long	1070593207
-	.long	2994220655
-	.long	1022825948
-	.long	104015104
-	.long	1070603108
-	.long	335054493
-	.long	1023441853
-	.long	2904568832
-	.long	1070615800
-	.long	1451215633
-	.long	1023853857
-	.long	3456197120
-	.long	1070632739
-	.long	436334733
-	.long	1024026432
-	.long	252452352
-	.long	1070649697
-	.long	34596167
-	.long	1024031396
-	.long	3328018432
-	.long	1070666672
-	.long	2644547073
-	.long	1024296758
-	.long	1255829248
-	.long	1070683667
-	.long	552832586
-	.long	1023763122
-	.long	4097058560
-	.long	1070700680
-	.long	1955640623
-	.long	1021394654
-	.long	451770112
-	.long	1070717714
-	.long	3428903777
-	.long	1022941142
-	.long	408920832
-	.long	1070734767
-	.long	165503263
-	.long	1023894958
-	.long	1186960640
-	.long	1070751840
-	.long	435826450
-	.long	1024026134
-	.long	19078656
-	.long	1070768934
-	.long	1834169749
-	.long	1022899284
-	.long	2743490304
-	.long	1070786048
-	.long	494581074
-	.long	1018818479
-	.long	2328961024
-	.long	1070803184
-	.long	2987908834
-	.long	1022581110
-	.long	350011392
-	.long	1070820342
-	.long	240771184
-	.long	1024143083
-	.long	2692326912
-	.long	1070837521
-	.long	666056837
-	.long	1022394776
-	.long	2373274368
-	.long	1070854723
-	.long	2484337770
-	.long	1024228156
-	.long	1017131520
-	.long	1070871948
-	.long	3285648279
-	.long	1024025789
-	.long	265558272
-	.long	1070889196
-	.long	392241896
-	.long	1024252809
-	.long	1778008064
-	.long	1070906467
-	.long	1536107943
-	.long	1023949300
-	.long	2937184768
-	.long	1070923762
-	.long	3541062251
-	.long	1019448646
-	.long	1144442880
-	.long	1070941082
-	.long	3691683781
-	.long	1022123948
-	.long	2410165504
-	.long	1070958426
-	.long	1804181960
-	.long	1023945221
-	.long	4174350848
-	.long	1070975795
-	.long	2016094861
-	.long	1021716585
-	.long	3897012480
-	.long	1070993190
-	.long	175294410
-	.long	1023703404
-	.long	3353623040
-	.long	1071010611
-	.long	167973242
-	.long	1023240839
-	.long	45671168
-	.long	1071028059
-	.long	2166856113
-	.long	1021565413
-	.long	86063872
-	.long	1071045533
-	.long	2676254727
-	.long	1023985299
-	.long	1019772672
-	.long	1071063034
-	.long	989043593
-	.long	1021549587
-	.long	414297344
-	.long	1071080563
-	.long	3960972046
-	.long	1024307251
-	.long	155173120
-	.long	1071098120
-	.long	1830919291
-	.long	1021592251
-	.long	2151562240
-	.long	1071115705
-	.long	405408666
-	.long	1023423128
-	.long	4041854720
-	.long	1071133319
-	.long	2043497827
-	.long	1024411503
-	.long	3489224192
-	.long	1071150963
-	.long	3072215864
-	.long	1022698635
-	.long	2477196288
-	.long	1071168637
-	.long	1812195139
-	.long	1022689192
-	.long	3015298816
-	.long	1071186341
-	.long	764841969
-	.long	1021027331
-	.long	2844731136
-	.long	1071204076
-	.long	2878117321
-	.long	1019116513
-	.long	4028950528
-	.long	1071221842
-	.long	698911452
-	.long	1023265602
-	.long	69441536
-	.long	1071239641
-	.long	3253467847
-	.long	1020795075
-	.long	1676209920
-	.long	1071257471
-	.long	4272431167
-	.long	1022873982
-	.long	2408752384
-	.long	1071275334
-	.long	648519100
-	.long	1024385717
-	.long	151623680
-	.long	1071293231
-	.long	345257017
-	.long	1019561408
-	.long	1410154240
-	.long	1071311161
-	.long	197863993
-	.long	1023224207
-	.long	4131351552
-	.long	1071329125
-	.long	2620801789
-	.long	1024411169
-	.long	1999664384
-	.long	1071347125
-	.long	3952692616
-	.long	1024168086
-	.long	1617668864
-	.long	1071365160
-	.long	3019889809
-	.long	1021907692
-	.long	1032074240
-	.long	1071383231
-	.long	59469899
-	.long	1023656194
-	.long	2619492096
-	.long	1071401338
-	.long	1417526820
-	.long	1021457783
-	.long	202429440
-	.long	1071419483
-	.long	2927667935
-	.long	1019175447
-	.long	525044224
-	.long	1071437665
-	.long	38166811
-	.long	1023981879
-	.long	1779258880
-	.long	1071455885
-	.long	481252500
-	.long	1023310234
-	.long	2195673600
-	.long	1071474144
-	.long	3962395981
-	.long	1021339088
-	.long	44573696
-	.long	1071492443
-	.long	3936281395
-	.long	1023014829
-	.long	2226905344
-	.long	1071510781
-	.long	1515320476
-	.long	1024320623
-	.long	2800512512
-	.long	1071529160
-	.long	1225403697
-	.long	1021081846
-	.long	161113600
-	.long	1071547581
-	.long	3064809733
-	.long	1024173917
-	.long	1338410240
-	.long	1071566043
-	.long	2027604973
-	.long	1024362526
-	.long	522433280
-	.long	1071584548
-	.long	2055171723
-	.long	1023858825
-	.long	539595776
-	.long	1071603096
-	.long	3868820135
-	.long	1022936424
-	.long	4264017664
-	.long	1071621687
-	.long	3228065145
-	.long	1023479578
-	.long	1733924096
-	.long	1071640324
-	.long	3511934475
-	.long	1022496355
-	.long	108880384
-	.long	1071651839
-	.long	615880967
-	.long	1023519706
-	.long	3517856512
-	.long	1071661202
-	.long	3113108559
-	.long	1025190289
-	.long	4043153152
-	.long	1071670589
-	.long	1571836218
-	.long	1023106116
-	.long	3251299072
-	.long	1071680000
-	.long	3444076102
-	.long	1022187841
-	.long	2736921600
-	.long	1071689435
-	.long	272771483
-	.long	1025095280
-	.long	3897698560
-	.long	1071703633
-	.long	2075390188
-	.long	1022489022
-	.long	3209485056
-	.long	1071722652
-	.long	1438094065
-	.long	1021844944
-	.long	3781432064
-	.long	1071741774
-	.long	1675017145
-	.long	1024143828
-	.long	2684184064
-	.long	1071761003
-	.long	2259963753
-	.long	1024731393
-	.long	1840489728
-	.long	1071780342
-	.long	3372883597
-	.long	1023431408
-	.long	3764087808
-	.long	1071799794
-	.long	3307523102
-	.long	1024485788
-	.long	3006232320
-	.long	1071819364
-	.long	3088971966
-	.long	1025213251
-	.long	3374881280
-	.long	1071839055
-	.long	834437749
-	.long	1025236452
-	.long	797284864
-	.long	1071858872
-	.long	3122663941
-	.long	1025320473
-	.long	545765120
-	.long	1071878818
-	.long	826539625
-	.long	1022450955
-	.long	107562240
-	.long	1071898898
-	.long	339584600
-	.long	1022481255
-	.long	2123649024
-	.long	1071919116
-	.long	3912959833
-	.long	1024321009
-	.long	1562385664
-	.long	1071939478
-	.long	2846067230
-	.long	1023343981
-	.long	2963085824
-	.long	1071959988
-	.long	954548627
-	.long	1021475211
-	.long	3325550592
-	.long	1071980652
-	.long	3459651155
-	.long	1025305573
-	.long	775752448
-	.long	1072001476
-	.long	3582746667
-	.long	1023859460
-	.long	3238590720
-	.long	1072022464
-	.long	634636162
-	.long	1024472353
-	.long	2758801920
-	.long	1072043624
-	.long	3078216319
-	.long	1025304516
-	.long	1370319104
-	.long	1072064962
-	.long	2570569078
-	.long	1025099442
-	.long	2615805184
-	.long	1072086484
-	.long	3729933412
-	.long	1024605112
-	.long	3077336576
-	.long	1072108198
-	.long	1948916066
-	.long	1024781603
-	.long	1099528192
-	.long	1072130112
-	.long	3139143157
-	.long	1023729360
-	.long	1231903232
-	.long	1072152233
-	.long	1349513477
-	.long	1024737515
-	.long	1507504128
-	.long	1072174570
-	.long	3484516322
-	.long	1024000959
-	.long	2214659840
-	.long	1072197132
-	.long	2563820917
-	.long	1025225535
-	.long	1804739840
-	.long	1072219929
-	.long	760038746
-	.long	1024482855
-	.long	1413746688
-	.long	1072242971
-	.long	3401734714
-	.long	1025129838
-	.long	821409536
-	.long	1072266269
-	.long	3729772551
-	.long	1025484796
-	.long	3031825664
-	.long	1072289834
-	.long	122256749
-	.long	1024752594
-	.long	1710784256
-	.long	1072313680
-	.long	1518205483
-	.long	1024724809
-	.long	3025265152
-	.long	1072337819
-	.long	409951989
-	.long	1022835555
-	.long	287769088
-	.long	1072362267
-	.long	800355594
-	.long	1022484850
-	.long	198179840
-	.long	1072387038
-	.long	3502926213
-	.long	1024209373
-	.long	1909130496
-	.long	1072412149
-	.long	3064694319
-	.long	1025380823
-	.long	1941732096
-	.long	1072437619
-	.long	4112930390
-	.long	1024294679
-	.long	3492010496
-	.long	1072463467
-	.long	2684918107
-	.long	1023220233
-	.long	81959680
-	.long	1072489716
-	.long	220021366
-	.long	1020635131
-	.long	2297837056
-	.long	1072516387
-	.long	4027683826
-	.long	1021041185
-	.long	270404096
-	.long	1072543508
-	.long	2012766065
-	.long	1021780753
-	.long	3667376896
-	.long	1072571105
-	.long	2727981522
-	.long	1023009874
-	.long	330400256
-	.long	1072599212
-	.long	2940017003
-	.long	1025393439
-	.long	1119293952
-	.long	1072627861
-	.long	1608550416
-	.long	1022675612
-	.long	3536155904
-	.long	1072657091
-	.long	349665778
-	.long	1025156751
-	.long	3078046720
-	.long	1072686946
-	.long	2016159996
-	.long	1022193169
-	.long	455228416
-	.long	1072705361
-	.long	1908539328
-	.long	1026126332
-	.long	1871505664
-	.long	1072720988
-	.long	2784700894
-	.long	1025922277
-	.long	1630994432
-	.long	1072737010
-	.long	361107678
-	.long	1022887244
-	.long	2084558336
-	.long	1072753462
-	.long	2642784509
-	.long	1072689083
-	.long	1514442531
-	.long	1072688953
-	.long	333108933
-	.long	1072688821
-	.long	3392112024
-	.long	1072688686
-	.long	2099852862
-	.long	1072688550
-	.long	749609004
-	.long	1072688412
-	.long	3634632596
-	.long	1072688271
-	.long	2163248461
-	.long	1072688129
-	.long	628657846
-	.long	1072687985
-	.long	3324036511
-	.long	1072687838
-	.long	1657632815
-	.long	1072687690
-	.long	4217538760
-	.long	1072687539
-	.long	2411951597
-	.long	1072687387
-	.long	533944872
-	.long	1072687233
-	.long	2876566508
-	.long	1072687076
-	.long	847936891
-	.long	1072686918
-	.long	3036019913
-	.long	1072686757
-	.long	848884575
-	.long	1072686595
-	.long	2874443326
-	.long	1072686430
-	.long	520713666
-	.long	1072686264
-	.long	2375556481
-	.long	1072686095
-	.long	4141904948
-	.long	1072685924
-	.long	1522666382
-	.long	1072685752
-	.long	3105624104
-	.long	1072685577
-	.long	298666327
-	.long	1072685401
-	.long	1689524500
-	.long	1072685222
-	.long	2981002200
-	.long	1072685041
-	.long	4170844284
-	.long	1072684858
-	.long	961802263
-	.long	1072684674
-	.long	1941503454
-	.long	1072684487
-	.long	2812647170
-	.long	1072684298
-	.long	3572873869
-	.long	1072684107
-	.long	4219797823
-	.long	1072683914
-	.long	456039788
-	.long	1072683720
-	.long	869096151
-	.long	1072683523
-	.long	1161535119
-	.long	1072683324
-	.long	1330865866
-	.long	1072683123
-	.long	1374571204
-	.long	1072682920
-	.long	1290107538
-	.long	1072682715
-	.long	1074904836
-	.long	1072682508
-	.long	726366587
-	.long	1072682299
-	.long	241869763
-	.long	1072682088
-	.long	3913732079
-	.long	1072681874
-	.long	3149342765
-	.long	1072681659
-	.long	2240966306
-	.long	1072681442
-	.long	1185873216
-	.long	1072681223
-	.long	4276274591
-	.long	1072681001
-	.long	2919452883
-	.long	1072680778
-	.long	1407565635
-	.long	1072680553
-	.long	4032743551
-	.long	1072680325
-	.long	2202188565
-	.long	1072680096
-	.long	207977577
-	.long	1072679865
-	.long	2342160518
-	.long	1072679631
-	.long	11858423
-	.long	1072679396
-	.long	1804034453
-	.long	1072679158
-	.long	3420722787
-	.long	1072678918
-	.long	563930456
-	.long	1072678677
-	.long	1820539192
-	.long	1072678433
-	.long	2892501606
-	.long	1072678187
-	.long	3776710320
-	.long	1072677939
-	.long	175063337
-	.long	1072677690
-	.long	674333171
-	.long	1072677438
-	.long	976363026
-	.long	1072677184
-	.long	1077935934
-	.long	1072676928
-	.long	1921075490
-	.long	1072676540
-	.long	881493302
-	.long	1072676016
-	.long	3275752439
-	.long	1072675483
-	.long	486855588
-	.long	1072674943
-	.long	1077229111
-	.long	1072674394
-	.long	723950308
-	.long	1072673837
-	.long	3693582199
-	.long	1072673271
-	.long	1367335316
-	.long	1072672698
-	.long	2305837020
-	.long	1072672116
-	.long	2184358641
-	.long	1072671526
-	.long	972682840
-	.long	1072670928
-	.long	2935101762
-	.long	1072670321
-	.long	3745513263
-	.long	1072669706
-	.long	3372320886
-	.long	1072669083
-	.long	1783464620
-	.long	1072668452
-	.long	3241386215
-	.long	1072667812
-	.long	3418125284
-	.long	1072667164
-	.long	2280219148
-	.long	1072666508
-	.long	4088700758
-	.long	1072665843
-	.long	219227400
-	.long	1072665171
-	.long	3521816918
-	.long	1072664489
-	.long	1076205279
-	.long	1072663800
-	.long	1436484616
-	.long	1072663102
-	.long	271362610
-	.long	1072662396
-	.long	1838996688
-	.long	1072661681
-	.long	1807122518
-	.long	1072660958
-	.long	137953542
-	.long	1072660227
-	.long	1088178584
-	.long	1072659487
-	.long	324057537
-	.long	1072658739
-	.long	2101288076
-	.long	1072657982
-	.long	2085133974
-	.long	1072657217
-	.long	235324451
-	.long	1072656444
-	.long	806051592
-	.long	1072655662
-	.long	3756033140
-	.long	1072654871
-	.long	453542543
-	.long	1072654073
-	.long	3741177327
-	.long	1072653265
-	.long	691216109
-	.long	1072652450
-	.long	4145223372
-	.long	1072651625
-	.long	1174439091
-	.long	1072650793
-	.long	324416139
-	.long	1072649952
-	.long	1550246310
-	.long	1072649102
-	.long	511524674
-	.long	1072648244
-	.long	1457248482
-	.long	1072647377
-	.long	45944955
-	.long	1072646502
-	.long	525537397
-	.long	1072645618
-	.long	2848440188
-	.long	1072644725
-	.long	2671555633
-	.long	1072643824
-	.long	4241172637
-	.long	1072642914
-	.long	3213094278
-	.long	1072641996
-	.long	3832503688
-	.long	1072641069
-	.long	1754091534
-	.long	1072640134
-	.long	1221921804
-	.long	1072639190
-	.long	2184526489
-	.long	1072638237
-	.long	294902089
-	.long	1072637276
-	.long	4090375270
-	.long	1072636305
-	.long	632860906
-	.long	1072635327
-	.long	2753498702
-	.long	1072634339
-	.long	1808009252
-	.long	1072633343
-	.long	2036428672
-	.long	1072632338
-	.long	3383235626
-	.long	1072631324
-	.long	1497347484
-	.long	1072630302
-	.long	617018317
-	.long	1072629271
-	.long	684933058
-	.long	1072628231
-	.long	1643170798
-	.long	1072627182
-	.long	3011066360
-	.long	1072625592
-	.long	957158713
-	.long	1072623442
-	.long	1390907941
-	.long	1072621256
-	.long	3819155270
-	.long	1072619034
-	.long	3443571196
-	.long	1072616777
-	.long	4045412458
-	.long	1072614484
-	.long	805503923
-	.long	1072612156
-	.long	1778922015
-	.long	1072609791
-	.long	2125033665
-	.long	1072607390
-	.long	1287203863
-	.long	1072604953
-	.long	2992629568
-	.long	1072602479
-	.long	2367267127
-	.long	1072599969
-	.long	3115526047
-	.long	1072597422
-	.long	340219539
-	.long	1072594839
-	.long	2017215719
-	.long	1072592218
-	.long	3225443424
-	.long	1072589560
-	.long	3326565673
-	.long	1072586865
-	.long	1669811211
-	.long	1072584133
-	.long	1886735022
-	.long	1072581363
-	.long	3301071171
-	.long	1072578555
-	.long	928514283
-	.long	1072575710
-	.long	2656364059
-	.long	1072572826
-	.long	3473490507
-	.long	1072569904
-	.long	2649965606
-	.long	1072566944
-	.long	3736819052
-	.long	1072563945
-	.long	1680885175
-	.long	1072560908
-	.long	4413771
-	.long	1072557832
-	.long	2214869753
-	.long	1072554716
-	.long	3214725184
-	.long	1072551561
-	.long	2186079903
-	.long	1072548367
-	.long	2590372131
-	.long	1072545133
-	.long	3578146079
-	.long	1072541859
-	.long	4283712755
-	.long	1072538545
-	.long	3824834510
-	.long	1072535191
-	.long	1302400298
-	.long	1072531797
-	.long	95058636
-	.long	1072528362
-	.long	3563906063
-	.long	1072524885
-	.long	2167230730
-	.long	1072521368
-	.long	3524918334
-	.long	1072517809
-	.long	2353304918
-	.long	1072514209
-	.long	1939625839
-	.long	1072510567
-	.long	1256714581
-	.long	1072506883
-	.long	3552525848
-	.long	1072503156
-	.long	3464809522
-	.long	1072499387
-	.long	4200542593
-	.long	1072495575
-	.long	355609124
-	.long	1072491721
-	.long	3684139099
-	.long	1072487822
-	.long	148355918
-	.long	1072483881
-	.long	1457689242
-	.long	1072479895
-	.long	2118591596
-	.long	1072475865
-	.long	908848089
-	.long	1072471791
-	.long	877032689
-	.long	1072467672
-	.long	752012304
-	.long	1072463508
-	.long	3532301749
-	.long	1072459298
-	.long	3600563221
-	.long	1072455043
-	.long	3902857084
-	.long	1072450742
-	.long	3063101036
-	.long	1072446395
-	.long	3972344374
-	.long	1072442001
-	.long	903183549
-	.long	1072437561
-	.long	983892938
-	.long	1072433073
-	.long	2722858568
-	.long	1072428537
-	.long	302790515
-	.long	1072423954
-	.long	759811057
-	.long	1072419322
-	.long	2507809922
-	.long	1072414641
-	.long	2388408813
-	.long	1072407528
-	.long	2084492942
-	.long	1072397870
-	.long	2435703301
-	.long	1072388010
-	.long	1935433360
-	.long	1072377945
-	.long	2742047290
-	.long	1072367671
-	.long	2053284205
-	.long	1072357185
-	.long	657783367
-	.long	1072346483
-	.long	2893664841
-	.long	1072335560
-	.long	3718906405
-	.long	1072324413
-	.long	1547896303
-	.long	1072313038
-	.long	2494058440
-	.long	1072301429
-	.long	3133238742
-	.long	1072289582
-	.long	3327000086
-	.long	1072277492
-	.long	1860667274
-	.long	1072265154
-	.long	665340747
-	.long	1072252562
-	.long	443347841
-	.long	1072239710
-	.long	581282618
-	.long	1072226592
-	.long	3349780465
-	.long	1072213201
-	.long	914217606
-	.long	1072199532
-	.long	989797661
-	.long	1072185576
-	.long	945436416
-	.long	1072171326
-	.long	549291300
-	.long	1072156774
-	.long	1814636389
-	.long	1072141911
-	.long	239092858
-	.long	1072126729
-	.long	1794680724
-	.long	1072111217
-	.long	1241534678
-	.long	1072095366
-	.long	3366566214
-	.long	1072079164
-	.long	1244090828
-	.long	1072062601
-	.long	1708448120
-	.long	1072045663
-	.long	3544260650
-	.long	1072028337
-	.long	1402741403
-	.long	1072010610
-	.long	2551936888
-	.long	1071992465
-	.long	617669739
-	.long	1071973887
-	.long	794002186
-	.long	1071954857
-	.long	2021237693
-	.long	1071935356
-	.long	540450384
-	.long	1071915364
-	.long	1920555537
-	.long	1071894857
-	.long	2879585206
-	.long	1071873811
-	.long	3000237455
-	.long	1071852199
-	.long	3352974346
-	.long	1071829991
-	.long	569629937
-	.long	1071807155
-	.long	2077237208
-	.long	1071783653
-	.long	2284891805
-	.long	1071759446
-	.long	1226651784
-	.long	1071734489
-	.long	1102047405
-	.long	1071708731
-	.long	2009896384
-	.long	1071682115
-	.long	927419082
-	.long	1071654577
-	.long	85010366
-	.long	1071607413
-	.long	696431025
-	.long	1071548180
-	.long	2611410541
-	.long	1071486585
-	.long	2612593658
-	.long	1071422396
-	.long	3548155306
-	.long	1071355336
-	.long	3887997484
-	.long	1071285073
-	.long	244854763
-	.long	1071211202
-	.long	4214445648
-	.long	1071133216
-	.long	2303966727
-	.long	1071050478
-	.long	3991040013
-	.long	1070962152
-	.long	3126952278
-	.long	1070867118
-	.long	1817448378
-	.long	1070763804
-	.long	1793814864
-	.long	1070649884
-	.long	3507224072
-	.long	1070447193
-	.long	4027609105
-	.long	1070148772
-	.long	577507993
-	.long	1069779414
-	.long	2310232419
-	.long	1068931829
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	3164710438
-	.long	1413754136
-	.long	3221823995
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	1074340347
-	.long	4160749568
-	.long	4294967295
-	.long	4160749568
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	1431655765
-	.long	3217380693
-	.long	858993459
-	.long	3216192307
-	.long	3067833783
-	.long	3215383405
-	.long	780903145
-	.long	1066854586
-	.long	858993459
-	.long	1068708659
-	.long	3340530119
-	.long	1067392113
-	.long	1431655765
-	.long	1069897045
-	.long	1321528399
-	.long	1066517740
-	.long	3067833783
-	.long	1067899757
-	.long	2021159460
-	.long	1065855096
-	.long	2576980378
-	.long	1066178969
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	0
-	.long	0
-	.long	4294950912
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	0
-	.type	static_const_table,@object
-	.size	static_const_table,6112
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_asin.S b/libm/x86/e_asin.S
deleted file mode 100644
index 6a3ff8e..0000000
--- a/libm/x86/e_asin.S
+++ /dev/null
@@ -1,2003 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  To compute asin(s), separate schemes are used when s is in different
-//  intervals.
-//
-//  |s| in [2^{-4}, sqrt(3)/2):
-//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
-//       asin(s)=asin(t)+asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
-//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
-//       For the first degree term, r is evaluated as
-//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
-//       (sqrt(1-t^2) read from table)
-//  The main source of error is still R (may still be affected by up to 3 ulps
-//  of rounding error). The table size must be sufficiently large, to minimize
-//  this effect.
-//
-//  |s| in [sqrt(3)/2, 255/256):
-//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
-//       asin(|s|)=pi/2-asin(t)+asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
-//       asin(r) evaluated as polynomial (same as above)
-//       The first degree term is evaluated as
-//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
-//
-//  |s|<2^{-4}: evaluate as 13-degree polynomial
-//
-//  |s| in [255/256,1): asin(|s|)=pi/2-asin(sqrt(1-s^2))
-//         use 17-degree polynomial, get error term
-//         Q*eps ~ (1-s^2-Q^2)/(2*Q) for first term
-//                 ( Q(1+eps)=sqrt(1-s^2) )
-//
-// Special cases:
-//  asin(NaN) = quiet NaN, and raise invalid exception
-//  asin(INF) = QNaN and raise invalid exception
-//  asin(x) = QNaN and raise invalid exception, for |x|>1.0
-//  asin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  asin
-ENTRY(asin)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 64(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     128(%esp), %xmm0
-        stmxcsr   16(%esp)
-        movl      16(%esp), %edx
-        andl      $-24577, %edx
-        cmpl      %edx, 16(%esp)
-        jne       .L_2TAG_PACKET_0.0.2
-.L_2TAG_PACKET_1.0.2:
-        movsd     5984(%ebx), %xmm4
-        movsd     6016(%ebx), %xmm3
-        xorpd     %xmm5, %xmm5
-        movsd     6000(%ebx), %xmm2
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movapd    %xmm0, %xmm1
-        movsd     %xmm0, 8(%esp)
-        psrlq     $44, %xmm0
-        movd      %xmm0, %edx
-        movapd    %xmm1, %xmm7
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movapd    %xmm1, %xmm0
-        movl      $524287, %eax
-        andl      %edx, %eax
-        subl      $260864, %eax
-        cmpl      $955, %eax
-        jae       .L_2TAG_PACKET_2.0.2
-        mulsd     %xmm1, %xmm1
-        andl      $65535, %edx
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andpd     %xmm7, %xmm2
-        andl      $-4, %edx
-        subl      $64256, %edx
-        movsd     3936(%ebx,%edx,2), %xmm1
-        orpd      %xmm5, %xmm2
-        movapd    96(%ebx,%edx,4), %xmm4
-        movapd    %xmm7, %xmm6
-        addsd     %xmm2, %xmm7
-        subsd     %xmm2, %xmm0
-        mulsd     %xmm7, %xmm0
-        mulsd     %xmm1, %xmm6
-        mulsd     %xmm2, %xmm3
-        movapd    %xmm6, %xmm1
-        addsd     %xmm3, %xmm6
-        divsd     %xmm6, %xmm0
-        movsd     80(%ebx), %xmm7
-        movsd     64(%ebx), %xmm5
-        subsd     %xmm3, %xmm1
-        andpd     6064(%ebx), %xmm2
-        movapd    %xmm1, %xmm3
-        mulsd     %xmm1, %xmm1
-        movsd     72(%ebx), %xmm6
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm1, %xmm7
-        mulsd     %xmm3, %xmm5
-        xorpd     %xmm2, %xmm4
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm7, %xmm6
-        mulsd     %xmm3, %xmm6
-        addsd     %xmm4, %xmm5
-        pshufd    $238, %xmm4, %xmm4
-        addsd     %xmm5, %xmm6
-        orpd      %xmm2, %xmm4
-        addsd     %xmm6, %xmm0
-        movl      16(%esp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%esp), %eax
-        je        .L_2TAG_PACKET_3.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %eax
-        andl      $24576, %eax
-        orl       %eax, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_3.0.2:
-        addsd     %xmm4, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_2.0.2:
-        subl      $955, %eax
-        cmpl      $67, %eax
-        jae       .L_2TAG_PACKET_5.0.2
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        movl      %edx, %eax
-        andpd     5984(%ebx), %xmm0
-        andpd     6048(%ebx), %xmm7
-        movapd    %xmm0, %xmm1
-        movsd     6016(%ebx), %xmm4
-        movapd    %xmm7, %xmm6
-        subsd     %xmm7, %xmm1
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm6, %xmm0
-        subsd     %xmm7, %xmm4
-        mulsd     %xmm1, %xmm0
-        movapd    %xmm3, %xmm7
-        andpd     %xmm3, %xmm2
-        psllq     $2, %xmm3
-        pextrw    $3, %xmm3, %edx
-        orpd      %xmm5, %xmm2
-        subl      $65216, %edx
-        addl      %edx, %edx
-        mulsd     3936(%ebx,%edx,4), %xmm7
-        mulsd     %xmm2, %xmm6
-        movapd    6080(%ebx), %xmm3
-        mulsd     %xmm2, %xmm1
-        mulsd     %xmm2, %xmm2
-        subsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm6
-        subsd     %xmm2, %xmm4
-        addsd     %xmm7, %xmm7
-        movsd     64(%ebx), %xmm5
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm7
-        movsd     80(%ebx), %xmm0
-        divsd     %xmm7, %xmm4
-        movsd     72(%ebx), %xmm2
-        subpd     96(%ebx,%edx,8), %xmm3
-        movapd    %xmm6, %xmm1
-        mulsd     %xmm6, %xmm6
-        andl      $524288, %eax
-        shrl      $4, %eax
-        mulsd     %xmm6, %xmm0
-        mulsd     %xmm6, %xmm1
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm6, %xmm1
-        addsd     %xmm2, %xmm0
-        pxor      %xmm6, %xmm6
-        mulsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm5
-        pinsrw    $3, %eax, %xmm6
-        addsd     %xmm5, %xmm0
-        movapd    %xmm4, %xmm5
-        pshufd    $238, %xmm3, %xmm3
-        subsd     %xmm3, %xmm4
-        addsd     %xmm4, %xmm3
-        subsd     %xmm3, %xmm5
-        subsd     %xmm5, %xmm0
-        movl      16(%esp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%esp), %eax
-        je        .L_2TAG_PACKET_6.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %eax
-        andl      $24576, %eax
-        orl       %eax, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm6, %xmm0
-        xorpd     %xmm6, %xmm4
-        subsd     %xmm4, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_5.0.2:
-        addl      $15291, %eax
-        cmpl      $14336, %eax
-        jae       .L_2TAG_PACKET_7.0.2
-        unpcklpd  %xmm7, %xmm7
-        movapd    (%ebx), %xmm1
-        movapd    %xmm7, %xmm6
-        movapd    16(%ebx), %xmm2
-        movapd    32(%ebx), %xmm4
-        mulpd     %xmm7, %xmm7
-        mulpd     %xmm7, %xmm6
-        mulpd     %xmm7, %xmm1
-        mulpd     %xmm7, %xmm7
-        movapd    %xmm6, %xmm3
-        mulsd     %xmm6, %xmm6
-        addpd     %xmm2, %xmm1
-        mulpd     %xmm7, %xmm4
-        mulsd     %xmm3, %xmm6
-        addpd     %xmm4, %xmm1
-        mulpd     %xmm6, %xmm1
-        pshufd    $238, %xmm1, %xmm2
-        addsd     %xmm2, %xmm1
-        movl      16(%esp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%esp), %eax
-        je        .L_2TAG_PACKET_8.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %eax
-        andl      $24576, %eax
-        orl       %eax, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_8.0.2:
-        addsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_7.0.2:
-        subl      $15358, %eax
-        cmpl      $2, %eax
-        jae       .L_2TAG_PACKET_9.0.2
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        movl      %edx, %eax
-        andpd     6032(%ebx), %xmm7
-        pshufd    $68, %xmm3, %xmm5
-        andpd     6032(%ebx), %xmm3
-        movapd    %xmm7, %xmm1
-        movsd     6016(%ebx), %xmm4
-        movapd    %xmm7, %xmm6
-        subsd     %xmm7, %xmm0
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm1, %xmm1
-        mulsd     %xmm0, %xmm1
-        subsd     %xmm7, %xmm4
-        movapd    %xmm3, %xmm6
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm0, %xmm0
-        subsd     %xmm1, %xmm4
-        subsd     %xmm5, %xmm6
-        addsd     %xmm5, %xmm5
-        subsd     %xmm3, %xmm4
-        movapd    (%ebx), %xmm2
-        pshufd    $238, %xmm5, %xmm3
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm5
-        pshufd    $238, %xmm3, %xmm7
-        addsd     %xmm3, %xmm3
-        mulsd     %xmm6, %xmm5
-        addsd     %xmm5, %xmm4
-        pshufd    $238, %xmm7, %xmm6
-        divsd     %xmm3, %xmm4
-        movapd    48(%ebx), %xmm1
-        movapd    16(%ebx), %xmm5
-        movapd    32(%ebx), %xmm0
-        mulpd     %xmm7, %xmm7
-        movapd    %xmm6, %xmm3
-        mulpd     %xmm7, %xmm2
-        mulpd     %xmm7, %xmm6
-        shrl      $4, %eax
-        andl      $32768, %eax
-        mulsd     %xmm7, %xmm1
-        mulpd     %xmm7, %xmm7
-        addpd     %xmm2, %xmm5
-        movapd    %xmm6, %xmm2
-        mulsd     %xmm6, %xmm6
-        mulpd     %xmm0, %xmm7
-        movapd    6080(%ebx), %xmm0
-        mulsd     %xmm6, %xmm2
-        addpd     %xmm5, %xmm7
-        pshufd    $238, %xmm1, %xmm5
-        mulsd     %xmm2, %xmm6
-        mulpd     %xmm2, %xmm7
-        addsd     %xmm5, %xmm1
-        xorpd     %xmm5, %xmm5
-        pshufd    $238, %xmm7, %xmm2
-        mulsd     %xmm6, %xmm1
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm2, %xmm7
-        movapd    %xmm3, %xmm2
-        pinsrw    $3, %eax, %xmm5
-        subsd     %xmm6, %xmm3
-        addsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm6
-        addsd     %xmm4, %xmm7
-        subsd     %xmm6, %xmm2
-        subsd     %xmm7, %xmm0
-        subsd     %xmm2, %xmm0
-        movl      16(%esp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%esp), %eax
-        je        .L_2TAG_PACKET_10.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %eax
-        andl      $24576, %eax
-        orl       %eax, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_10.0.2:
-        xorpd     %xmm5, %xmm0
-        xorpd     %xmm5, %xmm3
-        subsd     %xmm3, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_9.0.2:
-        addl      $261886, %eax
-        cmpl      $261888, %eax
-        jb        .L_2TAG_PACKET_11.0.2
-        movd      %xmm0, %ecx
-        psrlq     $32, %xmm0
-        movd      %xmm0, %edx
-        andl      $2147483647, %edx
-        movl      $1072693248, %eax
-        subl      %edx, %eax
-        orl       %ecx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_12.0.2
-        movq      8(%esp), %xmm2
-        movd      %xmm2, %edx
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $2147483647, %ecx
-        subl      $1, %edx
-        sbbl      $2146435072, %ecx
-        cmpl      $0, %ecx
-        jge       .L_2TAG_PACKET_11.0.2
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %edx
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_13.0.2
-.L_2TAG_PACKET_12.0.2:
-        movsd     5984(%ebx), %xmm1
-        movsd     6080(%ebx), %xmm2
-        movsd     6088(%ebx), %xmm0
-        movl      16(%esp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%esp), %eax
-        je        .L_2TAG_PACKET_14.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %eax
-        andl      $24576, %eax
-        orl       %eax, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_14.0.2:
-        andnpd    %xmm7, %xmm1
-        orpd      %xmm1, %xmm0
-        orpd      %xmm1, %xmm2
-        addsd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_0.0.2:
-        movl      16(%esp), %edx
-        andl      $-24577, %edx
-        movl      %edx, 24(%esp)
-        ldmxcsr   24(%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_11.0.2:
-        movsd     8(%esp), %xmm0
-        xorpd     %xmm6, %xmm6
-        movapd    %xmm0, %xmm7
-        pextrw    $3, %xmm0, %edx
-        andl      $32752, %edx
-        subl      $16, %edx
-        cmpl      $32736, %edx
-        jb        .L_2TAG_PACKET_15.0.2
-        addsd     %xmm0, %xmm6
-        orpd      %xmm6, %xmm0
-        mulsd     %xmm0, %xmm7
-.L_2TAG_PACKET_15.0.2:
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-.L_2TAG_PACKET_13.0.2:
-        movl      16(%esp), %edx
-        andl      $-24577, %edx
-        cmpl      16(%esp), %edx
-        je        .L_2TAG_PACKET_4.0.2
-        stmxcsr   24(%esp)
-        movl      16(%esp), %edx
-        andl      $24576, %edx
-        orl       %edx, 24(%esp)
-        ldmxcsr   24(%esp)
-.L_2TAG_PACKET_4.0.2:
-        movl      64(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(asin)
-# -- End  asin
-
-# Start file scope ASM
-ALIAS_SYMBOL(asinl, asin);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	780903145
-	.long	1066854586
-	.long	858993459
-	.long	1068708659
-	.long	3340530119
-	.long	1067392113
-	.long	1431655765
-	.long	1069897045
-	.long	1321528399
-	.long	1066517740
-	.long	3067833783
-	.long	1067899757
-	.long	2021159460
-	.long	1065855096
-	.long	2576980378
-	.long	1066178969
-	.long	1431655765
-	.long	1069897045
-	.long	858993459
-	.long	1068708659
-	.long	3067833783
-	.long	1067899757
-	.long	0
-	.long	0
-	.long	3822952792
-	.long	1021639372
-	.long	182792448
-	.long	1068507836
-	.long	2264213271
-	.long	1019558908
-	.long	649052928
-	.long	1068524253
-	.long	1797139609
-	.long	1022295143
-	.long	1243095296
-	.long	1068540671
-	.long	1415938756
-	.long	1021439537
-	.long	2033294592
-	.long	1068557090
-	.long	2356809978
-	.long	1021777916
-	.long	3088063744
-	.long	1068573510
-	.long	2669055318
-	.long	1022124482
-	.long	180888576
-	.long	1068589932
-	.long	3566445325
-	.long	1021358712
-	.long	1970196992
-	.long	1068606354
-	.long	896980323
-	.long	1021319659
-	.long	4229555456
-	.long	1068622777
-	.long	436049712
-	.long	1021319758
-	.long	2732572160
-	.long	1068639202
-	.long	583123209
-	.long	1020797960
-	.long	1842831872
-	.long	1068655628
-	.long	1370449804
-	.long	1021429270
-	.long	1628994560
-	.long	1068672055
-	.long	2411391464
-	.long	1021057980
-	.long	2159763712
-	.long	1068688483
-	.long	1208692749
-	.long	1021943903
-	.long	3503886336
-	.long	1068704912
-	.long	538793309
-	.long	1019744063
-	.long	1435187200
-	.long	1068721343
-	.long	4085087612
-	.long	1020608419
-	.long	317469952
-	.long	1068737775
-	.long	144386942
-	.long	1021440732
-	.long	219617280
-	.long	1068754208
-	.long	2940088361
-	.long	1019981122
-	.long	1210558208
-	.long	1068770642
-	.long	2176850347
-	.long	1018373705
-	.long	3359268352
-	.long	1068787077
-	.long	2395611454
-	.long	1021889042
-	.long	2439803648
-	.long	1068803514
-	.long	1650705253
-	.long	1020227966
-	.long	2816203520
-	.long	1068819952
-	.long	3702166386
-	.long	1019379914
-	.long	262620672
-	.long	1068836392
-	.long	1855649370
-	.long	1020453124
-	.long	3438159616
-	.long	1068852832
-	.long	923063860
-	.long	1019273834
-	.long	3822105856
-	.long	1068869274
-	.long	4289947947
-	.long	1019434249
-	.long	1483729920
-	.long	1068885718
-	.long	787455814
-	.long	1020738379
-	.long	787321088
-	.long	1068902163
-	.long	3321653337
-	.long	1021842569
-	.long	1802253312
-	.long	1068918609
-	.long	2653633526
-	.long	1021821525
-	.long	302985984
-	.long	1068935057
-	.long	161272028
-	.long	1021655149
-	.long	653966080
-	.long	1068951506
-	.long	2566098667
-	.long	1020066219
-	.long	2924727296
-	.long	1068967956
-	.long	3646493722
-	.long	1014292285
-	.long	2889890304
-	.long	1068984408
-	.long	1081009196
-	.long	1022189620
-	.long	619098112
-	.long	1069000862
-	.long	4011643355
-	.long	1021773297
-	.long	477017600
-	.long	1069017317
-	.long	4030305534
-	.long	1021292252
-	.long	2533403904
-	.long	1069033773
-	.long	2645187591
-	.long	1019527099
-	.long	2563102208
-	.long	1069050231
-	.long	3857293792
-	.long	1022311697
-	.long	635982336
-	.long	1069066691
-	.long	3625936637
-	.long	1017511744
-	.long	1116940800
-	.long	1069083152
-	.long	3653872993
-	.long	1022016631
-	.long	4075964160
-	.long	1069099614
-	.long	2468900271
-	.long	1021769532
-	.long	993165568
-	.long	1069116079
-	.long	1358104224
-	.long	1021199776
-	.long	528586752
-	.long	1069132545
-	.long	2200950332
-	.long	1022024872
-	.long	2752395776
-	.long	1069149012
-	.long	3197072454
-	.long	1017751319
-	.long	3439855616
-	.long	1069165481
-	.long	1651081806
-	.long	1020809338
-	.long	2661257728
-	.long	1069181952
-	.long	539032752
-	.long	1021728805
-	.long	486957312
-	.long	1069198425
-	.long	3136045149
-	.long	1016888671
-	.long	1282340352
-	.long	1069214899
-	.long	2593963259
-	.long	1018956103
-	.long	822921728
-	.long	1069231375
-	.long	2146032737
-	.long	1022306465
-	.long	3474216192
-	.long	1069247852
-	.long	3976811625
-	.long	1021350207
-	.long	716902656
-	.long	1069264332
-	.long	718267222
-	.long	1018624727
-	.long	1211594496
-	.long	1069280813
-	.long	1485641389
-	.long	1018447451
-	.long	734070272
-	.long	1069297296
-	.long	354455128
-	.long	1021341291
-	.long	3650110720
-	.long	1069313780
-	.long	682185947
-	.long	1021651853
-	.long	1440663040
-	.long	1069330267
-	.long	3558574550
-	.long	1021615110
-	.long	2766612224
-	.long	1069346755
-	.long	874607978
-	.long	1017746872
-	.long	3404011008
-	.long	1069363245
-	.long	4154988502
-	.long	1021439906
-	.long	3423949056
-	.long	1069379737
-	.long	2263202309
-	.long	1021479615
-	.long	2897587712
-	.long	1069396231
-	.long	2562065031
-	.long	1022090363
-	.long	1896159232
-	.long	1069412727
-	.long	3836237663
-	.long	1019867288
-	.long	490968576
-	.long	1069429225
-	.long	3322056743
-	.long	1006752762
-	.long	3048360192
-	.long	1069445724
-	.long	1152314833
-	.long	1013122252
-	.long	1049850624
-	.long	1069462226
-	.long	3601590727
-	.long	1022214610
-	.long	3156899584
-	.long	1069478729
-	.long	1855169970
-	.long	1019487271
-	.long	851173376
-	.long	1069495235
-	.long	312649594
-	.long	1020868604
-	.long	2794281728
-	.long	1069511742
-	.long	1093490181
-	.long	1020777577
-	.long	468042496
-	.long	1069528252
-	.long	1152540679
-	.long	1021403732
-	.long	2534219264
-	.long	1069544763
-	.long	2292126035
-	.long	1021872430
-	.long	1376146432
-	.long	1069558527
-	.long	3293753641
-	.long	1020500454
-	.long	4175442432
-	.long	1069575044
-	.long	3626347564
-	.long	1021610969
-	.long	3523113472
-	.long	1069591566
-	.long	339956500
-	.long	1021119039
-	.long	4003350528
-	.long	1069608092
-	.long	3429333082
-	.long	1022813542
-	.long	1611067392
-	.long	1069624623
-	.long	2298017544
-	.long	1021977587
-	.long	931782144
-	.long	1069641158
-	.long	2164684743
-	.long	1021250988
-	.long	2256725504
-	.long	1069657697
-	.long	1138762335
-	.long	1021443776
-	.long	1582853120
-	.long	1069674241
-	.long	1084010382
-	.long	1022994693
-	.long	3497758720
-	.long	1069690789
-	.long	406366244
-	.long	1022713586
-	.long	3999816960
-	.long	1069707342
-	.long	1488723042
-	.long	1023381290
-	.long	3383096064
-	.long	1069723900
-	.long	2541558953
-	.long	1019137887
-	.long	1942403584
-	.long	1069740463
-	.long	1879620343
-	.long	1022653642
-	.long	4268263680
-	.long	1069757030
-	.long	3039077047
-	.long	1022252545
-	.long	2067062272
-	.long	1069773603
-	.long	4190670677
-	.long	1020725863
-	.long	4225828096
-	.long	1069790180
-	.long	1998567321
-	.long	1022014385
-	.long	2452507136
-	.long	1069806763
-	.long	1511628873
-	.long	1021900300
-	.long	1340746240
-	.long	1069823351
-	.long	788367341
-	.long	1022726208
-	.long	1190035456
-	.long	1069839944
-	.long	3856337230
-	.long	1021834118
-	.long	2300688384
-	.long	1069856542
-	.long	3211396579
-	.long	1022621365
-	.long	678886400
-	.long	1069873146
-	.long	4001011887
-	.long	1022042646
-	.long	921594112
-	.long	1069889755
-	.long	557811968
-	.long	1023065533
-	.long	3331668992
-	.long	1069906369
-	.long	1877060679
-	.long	1022419742
-	.long	3917875200
-	.long	1069922989
-	.long	1181055171
-	.long	1022752712
-	.long	2984829696
-	.long	1069939615
-	.long	4294526932
-	.long	1021499988
-	.long	838049024
-	.long	1069956247
-	.long	3658081878
-	.long	1022957952
-	.long	2078928384
-	.long	1069972884
-	.long	820353701
-	.long	1019391107
-	.long	2719854336
-	.long	1069989527
-	.long	1644022489
-	.long	1023378240
-	.long	3069117696
-	.long	1070006176
-	.long	2771393702
-	.long	1019319954
-	.long	3435962368
-	.long	1070022831
-	.long	3876394145
-	.long	1023024433
-	.long	4130595328
-	.long	1070039492
-	.long	1630447748
-	.long	1021465882
-	.long	1169236224
-	.long	1070056160
-	.long	2828355997
-	.long	1020458120
-	.long	3453997312
-	.long	1070072833
-	.long	164091641
-	.long	1020388279
-	.long	2708127744
-	.long	1070089513
-	.long	3036550223
-	.long	1023328684
-	.long	3540797696
-	.long	1070106199
-	.long	3710949463
-	.long	1022568805
-	.long	1972276736
-	.long	1070122892
-	.long	3885277950
-	.long	1019761674
-	.long	2613815552
-	.long	1070139591
-	.long	2764165077
-	.long	1022921023
-	.long	1487791616
-	.long	1070156297
-	.long	1330644769
-	.long	1023162679
-	.long	3207593472
-	.long	1070173009
-	.long	3911007221
-	.long	1022993496
-	.long	3797764608
-	.long	1070189728
-	.long	979712598
-	.long	1022554580
-	.long	3578920448
-	.long	1070206454
-	.long	2825738223
-	.long	1020223708
-	.long	2872795648
-	.long	1070223187
-	.long	392451124
-	.long	1022666279
-	.long	2002258432
-	.long	1070239927
-	.long	3730407632
-	.long	1023148291
-	.long	1291326464
-	.long	1070256674
-	.long	3723802980
-	.long	1022514089
-	.long	1065180928
-	.long	1070273428
-	.long	2635617463
-	.long	1022654470
-	.long	1650181632
-	.long	1070290189
-	.long	2061982883
-	.long	1022853411
-	.long	3373882880
-	.long	1070306957
-	.long	319732785
-	.long	1022017175
-	.long	2270081280
-	.long	1070323733
-	.long	2237757411
-	.long	1023064087
-	.long	2963732736
-	.long	1070340516
-	.long	468839165
-	.long	1023293774
-	.long	1491099904
-	.long	1070357307
-	.long	1502657946
-	.long	1021533479
-	.long	2479636480
-	.long	1070374105
-	.long	482913562
-	.long	1021986286
-	.long	1968133632
-	.long	1070390911
-	.long	3281474337
-	.long	1022646400
-	.long	291639040
-	.long	1070407725
-	.long	2453320259
-	.long	1022812423
-	.long	2081472512
-	.long	1070424546
-	.long	2939989570
-	.long	1023091888
-	.long	3380340480
-	.long	1070441375
-	.long	2850707499
-	.long	1021921109
-	.long	232287488
-	.long	1070458213
-	.long	3674625342
-	.long	1020725130
-	.long	1567614208
-	.long	1070475058
-	.long	9347334
-	.long	1022024009
-	.long	3433091072
-	.long	1070491911
-	.long	282524999
-	.long	1021433523
-	.long	1876877312
-	.long	1070508773
-	.long	3470449440
-	.long	1019309721
-	.long	1538472192
-	.long	1070525643
-	.long	2089486825
-	.long	1019698916
-	.long	2763830784
-	.long	1070542521
-	.long	443498115
-	.long	1020505194
-	.long	1605381632
-	.long	1070559408
-	.long	3018871601
-	.long	1022869913
-	.long	2706946048
-	.long	1070576303
-	.long	3936260892
-	.long	1023175875
-	.long	2123887360
-	.long	1070593207
-	.long	2994220655
-	.long	1022825948
-	.long	104015104
-	.long	1070603108
-	.long	335054493
-	.long	1023441853
-	.long	2904568832
-	.long	1070615800
-	.long	1451215633
-	.long	1023853857
-	.long	3456197120
-	.long	1070632739
-	.long	436334733
-	.long	1024026432
-	.long	252452352
-	.long	1070649697
-	.long	34596167
-	.long	1024031396
-	.long	3328018432
-	.long	1070666672
-	.long	2644547073
-	.long	1024296758
-	.long	1255829248
-	.long	1070683667
-	.long	552832586
-	.long	1023763122
-	.long	4097058560
-	.long	1070700680
-	.long	1955640623
-	.long	1021394654
-	.long	451770112
-	.long	1070717714
-	.long	3428903777
-	.long	1022941142
-	.long	408920832
-	.long	1070734767
-	.long	165503263
-	.long	1023894958
-	.long	1186960640
-	.long	1070751840
-	.long	435826450
-	.long	1024026134
-	.long	19078656
-	.long	1070768934
-	.long	1834169749
-	.long	1022899284
-	.long	2743490304
-	.long	1070786048
-	.long	494581074
-	.long	1018818479
-	.long	2328961024
-	.long	1070803184
-	.long	2987908834
-	.long	1022581110
-	.long	350011392
-	.long	1070820342
-	.long	240771184
-	.long	1024143083
-	.long	2692326912
-	.long	1070837521
-	.long	666056837
-	.long	1022394776
-	.long	2373274368
-	.long	1070854723
-	.long	2484337770
-	.long	1024228156
-	.long	1017131520
-	.long	1070871948
-	.long	3285648279
-	.long	1024025789
-	.long	265558272
-	.long	1070889196
-	.long	392241896
-	.long	1024252809
-	.long	1778008064
-	.long	1070906467
-	.long	1536107943
-	.long	1023949300
-	.long	2937184768
-	.long	1070923762
-	.long	3541062251
-	.long	1019448646
-	.long	1144442880
-	.long	1070941082
-	.long	3691683781
-	.long	1022123948
-	.long	2410165504
-	.long	1070958426
-	.long	1804181960
-	.long	1023945221
-	.long	4174350848
-	.long	1070975795
-	.long	2016094861
-	.long	1021716585
-	.long	3897012480
-	.long	1070993190
-	.long	175294410
-	.long	1023703404
-	.long	3353623040
-	.long	1071010611
-	.long	167973242
-	.long	1023240839
-	.long	45671168
-	.long	1071028059
-	.long	2166856113
-	.long	1021565413
-	.long	86063872
-	.long	1071045533
-	.long	2676254727
-	.long	1023985299
-	.long	1019772672
-	.long	1071063034
-	.long	989043593
-	.long	1021549587
-	.long	414297344
-	.long	1071080563
-	.long	3960972046
-	.long	1024307251
-	.long	155173120
-	.long	1071098120
-	.long	1830919291
-	.long	1021592251
-	.long	2151562240
-	.long	1071115705
-	.long	405408666
-	.long	1023423128
-	.long	4041854720
-	.long	1071133319
-	.long	2043497827
-	.long	1024411503
-	.long	3489224192
-	.long	1071150963
-	.long	3072215864
-	.long	1022698635
-	.long	2477196288
-	.long	1071168637
-	.long	1812195139
-	.long	1022689192
-	.long	3015298816
-	.long	1071186341
-	.long	764841969
-	.long	1021027331
-	.long	2844731136
-	.long	1071204076
-	.long	2878117321
-	.long	1019116513
-	.long	4028950528
-	.long	1071221842
-	.long	698911452
-	.long	1023265602
-	.long	69441536
-	.long	1071239641
-	.long	3253467847
-	.long	1020795075
-	.long	1676209920
-	.long	1071257471
-	.long	4272431167
-	.long	1022873982
-	.long	2408752384
-	.long	1071275334
-	.long	648519100
-	.long	1024385717
-	.long	151623680
-	.long	1071293231
-	.long	345257017
-	.long	1019561408
-	.long	1410154240
-	.long	1071311161
-	.long	197863993
-	.long	1023224207
-	.long	4131351552
-	.long	1071329125
-	.long	2620801789
-	.long	1024411169
-	.long	1999664384
-	.long	1071347125
-	.long	3952692616
-	.long	1024168086
-	.long	1617668864
-	.long	1071365160
-	.long	3019889809
-	.long	1021907692
-	.long	1032074240
-	.long	1071383231
-	.long	59469899
-	.long	1023656194
-	.long	2619492096
-	.long	1071401338
-	.long	1417526820
-	.long	1021457783
-	.long	202429440
-	.long	1071419483
-	.long	2927667935
-	.long	1019175447
-	.long	525044224
-	.long	1071437665
-	.long	38166811
-	.long	1023981879
-	.long	1779258880
-	.long	1071455885
-	.long	481252500
-	.long	1023310234
-	.long	2195673600
-	.long	1071474144
-	.long	3962395981
-	.long	1021339088
-	.long	44573696
-	.long	1071492443
-	.long	3936281395
-	.long	1023014829
-	.long	2226905344
-	.long	1071510781
-	.long	1515320476
-	.long	1024320623
-	.long	2800512512
-	.long	1071529160
-	.long	1225403697
-	.long	1021081846
-	.long	161113600
-	.long	1071547581
-	.long	3064809733
-	.long	1024173917
-	.long	1338410240
-	.long	1071566043
-	.long	2027604973
-	.long	1024362526
-	.long	522433280
-	.long	1071584548
-	.long	2055171723
-	.long	1023858825
-	.long	539595776
-	.long	1071603096
-	.long	3868820135
-	.long	1022936424
-	.long	4264017664
-	.long	1071621687
-	.long	3228065145
-	.long	1023479578
-	.long	1733924096
-	.long	1071640324
-	.long	3511934475
-	.long	1022496355
-	.long	108880384
-	.long	1071651839
-	.long	615880967
-	.long	1023519706
-	.long	3517856512
-	.long	1071661202
-	.long	3113108559
-	.long	1025190289
-	.long	4043153152
-	.long	1071670589
-	.long	1571836218
-	.long	1023106116
-	.long	3251299072
-	.long	1071680000
-	.long	3444076102
-	.long	1022187841
-	.long	2736921600
-	.long	1071689435
-	.long	272771483
-	.long	1025095280
-	.long	3897698560
-	.long	1071703633
-	.long	2075390188
-	.long	1022489022
-	.long	3209485056
-	.long	1071722652
-	.long	1438094065
-	.long	1021844944
-	.long	3781432064
-	.long	1071741774
-	.long	1675017145
-	.long	1024143828
-	.long	2684184064
-	.long	1071761003
-	.long	2259963753
-	.long	1024731393
-	.long	1840489728
-	.long	1071780342
-	.long	3372883597
-	.long	1023431408
-	.long	3764087808
-	.long	1071799794
-	.long	3307523102
-	.long	1024485788
-	.long	3006232320
-	.long	1071819364
-	.long	3088971966
-	.long	1025213251
-	.long	3374881280
-	.long	1071839055
-	.long	834437749
-	.long	1025236452
-	.long	797284864
-	.long	1071858872
-	.long	3122663941
-	.long	1025320473
-	.long	545765120
-	.long	1071878818
-	.long	826539625
-	.long	1022450955
-	.long	107562240
-	.long	1071898898
-	.long	339584600
-	.long	1022481255
-	.long	2123649024
-	.long	1071919116
-	.long	3912959833
-	.long	1024321009
-	.long	1562385664
-	.long	1071939478
-	.long	2846067230
-	.long	1023343981
-	.long	2963085824
-	.long	1071959988
-	.long	954548627
-	.long	1021475211
-	.long	3325550592
-	.long	1071980652
-	.long	3459651155
-	.long	1025305573
-	.long	775752448
-	.long	1072001476
-	.long	3582746667
-	.long	1023859460
-	.long	3238590720
-	.long	1072022464
-	.long	634636162
-	.long	1024472353
-	.long	2758801920
-	.long	1072043624
-	.long	3078216319
-	.long	1025304516
-	.long	1370319104
-	.long	1072064962
-	.long	2570569078
-	.long	1025099442
-	.long	2615805184
-	.long	1072086484
-	.long	3729933412
-	.long	1024605112
-	.long	3077336576
-	.long	1072108198
-	.long	1948916066
-	.long	1024781603
-	.long	1099528192
-	.long	1072130112
-	.long	3139143157
-	.long	1023729360
-	.long	1231903232
-	.long	1072152233
-	.long	1349513477
-	.long	1024737515
-	.long	1507504128
-	.long	1072174570
-	.long	3484516322
-	.long	1024000959
-	.long	2214659840
-	.long	1072197132
-	.long	2563820917
-	.long	1025225535
-	.long	1804739840
-	.long	1072219929
-	.long	760038746
-	.long	1024482855
-	.long	1413746688
-	.long	1072242971
-	.long	3401734714
-	.long	1025129838
-	.long	821409536
-	.long	1072266269
-	.long	3729772551
-	.long	1025484796
-	.long	3031825664
-	.long	1072289834
-	.long	122256749
-	.long	1024752594
-	.long	1710784256
-	.long	1072313680
-	.long	1518205483
-	.long	1024724809
-	.long	3025265152
-	.long	1072337819
-	.long	409951989
-	.long	1022835555
-	.long	287769088
-	.long	1072362267
-	.long	800355594
-	.long	1022484850
-	.long	198179840
-	.long	1072387038
-	.long	3502926213
-	.long	1024209373
-	.long	1909130496
-	.long	1072412149
-	.long	3064694319
-	.long	1025380823
-	.long	1941732096
-	.long	1072437619
-	.long	4112930390
-	.long	1024294679
-	.long	3492010496
-	.long	1072463467
-	.long	2684918107
-	.long	1023220233
-	.long	81959680
-	.long	1072489716
-	.long	220021366
-	.long	1020635131
-	.long	2297837056
-	.long	1072516387
-	.long	4027683826
-	.long	1021041185
-	.long	270404096
-	.long	1072543508
-	.long	2012766065
-	.long	1021780753
-	.long	3667376896
-	.long	1072571105
-	.long	2727981522
-	.long	1023009874
-	.long	330400256
-	.long	1072599212
-	.long	2940017003
-	.long	1025393439
-	.long	1119293952
-	.long	1072627861
-	.long	1608550416
-	.long	1022675612
-	.long	3536155904
-	.long	1072657091
-	.long	349665778
-	.long	1025156751
-	.long	3078046720
-	.long	1072686946
-	.long	2016159996
-	.long	1022193169
-	.long	455228416
-	.long	1072705361
-	.long	1908539328
-	.long	1026126332
-	.long	1871505664
-	.long	1072720988
-	.long	2784700894
-	.long	1025922277
-	.long	1630994432
-	.long	1072737010
-	.long	361107678
-	.long	1022887244
-	.long	2084558336
-	.long	1072753462
-	.long	2642784509
-	.long	1072689083
-	.long	1514442531
-	.long	1072688953
-	.long	333108933
-	.long	1072688821
-	.long	3392112024
-	.long	1072688686
-	.long	2099852862
-	.long	1072688550
-	.long	749609004
-	.long	1072688412
-	.long	3634632596
-	.long	1072688271
-	.long	2163248461
-	.long	1072688129
-	.long	628657846
-	.long	1072687985
-	.long	3324036511
-	.long	1072687838
-	.long	1657632815
-	.long	1072687690
-	.long	4217538760
-	.long	1072687539
-	.long	2411951597
-	.long	1072687387
-	.long	533944872
-	.long	1072687233
-	.long	2876566508
-	.long	1072687076
-	.long	847936891
-	.long	1072686918
-	.long	3036019913
-	.long	1072686757
-	.long	848884575
-	.long	1072686595
-	.long	2874443326
-	.long	1072686430
-	.long	520713666
-	.long	1072686264
-	.long	2375556481
-	.long	1072686095
-	.long	4141904948
-	.long	1072685924
-	.long	1522666382
-	.long	1072685752
-	.long	3105624104
-	.long	1072685577
-	.long	298666327
-	.long	1072685401
-	.long	1689524500
-	.long	1072685222
-	.long	2981002200
-	.long	1072685041
-	.long	4170844284
-	.long	1072684858
-	.long	961802263
-	.long	1072684674
-	.long	1941503454
-	.long	1072684487
-	.long	2812647170
-	.long	1072684298
-	.long	3572873869
-	.long	1072684107
-	.long	4219797823
-	.long	1072683914
-	.long	456039788
-	.long	1072683720
-	.long	869096151
-	.long	1072683523
-	.long	1161535119
-	.long	1072683324
-	.long	1330865866
-	.long	1072683123
-	.long	1374571204
-	.long	1072682920
-	.long	1290107538
-	.long	1072682715
-	.long	1074904836
-	.long	1072682508
-	.long	726366587
-	.long	1072682299
-	.long	241869763
-	.long	1072682088
-	.long	3913732079
-	.long	1072681874
-	.long	3149342765
-	.long	1072681659
-	.long	2240966306
-	.long	1072681442
-	.long	1185873216
-	.long	1072681223
-	.long	4276274591
-	.long	1072681001
-	.long	2919452883
-	.long	1072680778
-	.long	1407565635
-	.long	1072680553
-	.long	4032743551
-	.long	1072680325
-	.long	2202188565
-	.long	1072680096
-	.long	207977577
-	.long	1072679865
-	.long	2342160518
-	.long	1072679631
-	.long	11858423
-	.long	1072679396
-	.long	1804034453
-	.long	1072679158
-	.long	3420722787
-	.long	1072678918
-	.long	563930456
-	.long	1072678677
-	.long	1820539192
-	.long	1072678433
-	.long	2892501606
-	.long	1072678187
-	.long	3776710320
-	.long	1072677939
-	.long	175063337
-	.long	1072677690
-	.long	674333171
-	.long	1072677438
-	.long	976363026
-	.long	1072677184
-	.long	1077935934
-	.long	1072676928
-	.long	1921075490
-	.long	1072676540
-	.long	881493302
-	.long	1072676016
-	.long	3275752439
-	.long	1072675483
-	.long	486855588
-	.long	1072674943
-	.long	1077229111
-	.long	1072674394
-	.long	723950308
-	.long	1072673837
-	.long	3693582199
-	.long	1072673271
-	.long	1367335316
-	.long	1072672698
-	.long	2305837020
-	.long	1072672116
-	.long	2184358641
-	.long	1072671526
-	.long	972682840
-	.long	1072670928
-	.long	2935101762
-	.long	1072670321
-	.long	3745513263
-	.long	1072669706
-	.long	3372320886
-	.long	1072669083
-	.long	1783464620
-	.long	1072668452
-	.long	3241386215
-	.long	1072667812
-	.long	3418125284
-	.long	1072667164
-	.long	2280219148
-	.long	1072666508
-	.long	4088700758
-	.long	1072665843
-	.long	219227400
-	.long	1072665171
-	.long	3521816918
-	.long	1072664489
-	.long	1076205279
-	.long	1072663800
-	.long	1436484616
-	.long	1072663102
-	.long	271362610
-	.long	1072662396
-	.long	1838996688
-	.long	1072661681
-	.long	1807122518
-	.long	1072660958
-	.long	137953542
-	.long	1072660227
-	.long	1088178584
-	.long	1072659487
-	.long	324057537
-	.long	1072658739
-	.long	2101288076
-	.long	1072657982
-	.long	2085133974
-	.long	1072657217
-	.long	235324451
-	.long	1072656444
-	.long	806051592
-	.long	1072655662
-	.long	3756033140
-	.long	1072654871
-	.long	453542543
-	.long	1072654073
-	.long	3741177327
-	.long	1072653265
-	.long	691216109
-	.long	1072652450
-	.long	4145223372
-	.long	1072651625
-	.long	1174439091
-	.long	1072650793
-	.long	324416139
-	.long	1072649952
-	.long	1550246310
-	.long	1072649102
-	.long	511524674
-	.long	1072648244
-	.long	1457248482
-	.long	1072647377
-	.long	45944955
-	.long	1072646502
-	.long	525537397
-	.long	1072645618
-	.long	2848440188
-	.long	1072644725
-	.long	2671555633
-	.long	1072643824
-	.long	4241172637
-	.long	1072642914
-	.long	3213094278
-	.long	1072641996
-	.long	3832503688
-	.long	1072641069
-	.long	1754091534
-	.long	1072640134
-	.long	1221921804
-	.long	1072639190
-	.long	2184526489
-	.long	1072638237
-	.long	294902089
-	.long	1072637276
-	.long	4090375270
-	.long	1072636305
-	.long	632860906
-	.long	1072635327
-	.long	2753498702
-	.long	1072634339
-	.long	1808009252
-	.long	1072633343
-	.long	2036428672
-	.long	1072632338
-	.long	3383235626
-	.long	1072631324
-	.long	1497347484
-	.long	1072630302
-	.long	617018317
-	.long	1072629271
-	.long	684933058
-	.long	1072628231
-	.long	1643170798
-	.long	1072627182
-	.long	3011066360
-	.long	1072625592
-	.long	957158713
-	.long	1072623442
-	.long	1390907941
-	.long	1072621256
-	.long	3819155270
-	.long	1072619034
-	.long	3443571196
-	.long	1072616777
-	.long	4045412458
-	.long	1072614484
-	.long	805503923
-	.long	1072612156
-	.long	1778922015
-	.long	1072609791
-	.long	2125033665
-	.long	1072607390
-	.long	1287203863
-	.long	1072604953
-	.long	2992629568
-	.long	1072602479
-	.long	2367267127
-	.long	1072599969
-	.long	3115526047
-	.long	1072597422
-	.long	340219539
-	.long	1072594839
-	.long	2017215719
-	.long	1072592218
-	.long	3225443424
-	.long	1072589560
-	.long	3326565673
-	.long	1072586865
-	.long	1669811211
-	.long	1072584133
-	.long	1886735022
-	.long	1072581363
-	.long	3301071171
-	.long	1072578555
-	.long	928514283
-	.long	1072575710
-	.long	2656364059
-	.long	1072572826
-	.long	3473490507
-	.long	1072569904
-	.long	2649965606
-	.long	1072566944
-	.long	3736819052
-	.long	1072563945
-	.long	1680885175
-	.long	1072560908
-	.long	4413771
-	.long	1072557832
-	.long	2214869753
-	.long	1072554716
-	.long	3214725184
-	.long	1072551561
-	.long	2186079903
-	.long	1072548367
-	.long	2590372131
-	.long	1072545133
-	.long	3578146079
-	.long	1072541859
-	.long	4283712755
-	.long	1072538545
-	.long	3824834510
-	.long	1072535191
-	.long	1302400298
-	.long	1072531797
-	.long	95058636
-	.long	1072528362
-	.long	3563906063
-	.long	1072524885
-	.long	2167230730
-	.long	1072521368
-	.long	3524918334
-	.long	1072517809
-	.long	2353304918
-	.long	1072514209
-	.long	1939625839
-	.long	1072510567
-	.long	1256714581
-	.long	1072506883
-	.long	3552525848
-	.long	1072503156
-	.long	3464809522
-	.long	1072499387
-	.long	4200542593
-	.long	1072495575
-	.long	355609124
-	.long	1072491721
-	.long	3684139099
-	.long	1072487822
-	.long	148355918
-	.long	1072483881
-	.long	1457689242
-	.long	1072479895
-	.long	2118591596
-	.long	1072475865
-	.long	908848089
-	.long	1072471791
-	.long	877032689
-	.long	1072467672
-	.long	752012304
-	.long	1072463508
-	.long	3532301749
-	.long	1072459298
-	.long	3600563221
-	.long	1072455043
-	.long	3902857084
-	.long	1072450742
-	.long	3063101036
-	.long	1072446395
-	.long	3972344374
-	.long	1072442001
-	.long	903183549
-	.long	1072437561
-	.long	983892938
-	.long	1072433073
-	.long	2722858568
-	.long	1072428537
-	.long	302790515
-	.long	1072423954
-	.long	759811057
-	.long	1072419322
-	.long	2507809922
-	.long	1072414641
-	.long	2388408813
-	.long	1072407528
-	.long	2084492942
-	.long	1072397870
-	.long	2435703301
-	.long	1072388010
-	.long	1935433360
-	.long	1072377945
-	.long	2742047290
-	.long	1072367671
-	.long	2053284205
-	.long	1072357185
-	.long	657783367
-	.long	1072346483
-	.long	2893664841
-	.long	1072335560
-	.long	3718906405
-	.long	1072324413
-	.long	1547896303
-	.long	1072313038
-	.long	2494058440
-	.long	1072301429
-	.long	3133238742
-	.long	1072289582
-	.long	3327000086
-	.long	1072277492
-	.long	1860667274
-	.long	1072265154
-	.long	665340747
-	.long	1072252562
-	.long	443347841
-	.long	1072239710
-	.long	581282618
-	.long	1072226592
-	.long	3349780465
-	.long	1072213201
-	.long	914217606
-	.long	1072199532
-	.long	989797661
-	.long	1072185576
-	.long	945436416
-	.long	1072171326
-	.long	549291300
-	.long	1072156774
-	.long	1814636389
-	.long	1072141911
-	.long	239092858
-	.long	1072126729
-	.long	1794680724
-	.long	1072111217
-	.long	1241534678
-	.long	1072095366
-	.long	3366566214
-	.long	1072079164
-	.long	1244090828
-	.long	1072062601
-	.long	1708448120
-	.long	1072045663
-	.long	3544260650
-	.long	1072028337
-	.long	1402741403
-	.long	1072010610
-	.long	2551936888
-	.long	1071992465
-	.long	617669739
-	.long	1071973887
-	.long	794002186
-	.long	1071954857
-	.long	2021237693
-	.long	1071935356
-	.long	540450384
-	.long	1071915364
-	.long	1920555537
-	.long	1071894857
-	.long	2879585206
-	.long	1071873811
-	.long	3000237455
-	.long	1071852199
-	.long	3352974346
-	.long	1071829991
-	.long	569629937
-	.long	1071807155
-	.long	2077237208
-	.long	1071783653
-	.long	2284891805
-	.long	1071759446
-	.long	1226651784
-	.long	1071734489
-	.long	1102047405
-	.long	1071708731
-	.long	2009896384
-	.long	1071682115
-	.long	927419082
-	.long	1071654577
-	.long	85010366
-	.long	1071607413
-	.long	696431025
-	.long	1071548180
-	.long	2611410541
-	.long	1071486585
-	.long	2612593658
-	.long	1071422396
-	.long	3548155306
-	.long	1071355336
-	.long	3887997484
-	.long	1071285073
-	.long	244854763
-	.long	1071211202
-	.long	4214445648
-	.long	1071133216
-	.long	2303966727
-	.long	1071050478
-	.long	3991040013
-	.long	1070962152
-	.long	3126952278
-	.long	1070867118
-	.long	1817448378
-	.long	1070763804
-	.long	1793814864
-	.long	1070649884
-	.long	3507224072
-	.long	1070447193
-	.long	4027609105
-	.long	1070148772
-	.long	577507993
-	.long	1069779414
-	.long	2310232419
-	.long	1068931829
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	0
-	.long	0
-	.long	4294950912
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	4160749568
-	.long	4294967295
-	.long	4160749568
-	.long	4294967295
-	.long	0
-	.long	2147483584
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.type	static_const_table,@object
-	.size	static_const_table,6096
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_atan2.S b/libm/x86/e_atan2.S
deleted file mode 100644
index e491396..0000000
--- a/libm/x86/e_atan2.S
+++ /dev/null
@@ -1,1221 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//
-//1. The method is based on the relationship of atan2(Y,X) to atan(|Y/X|)
-//   as follows.
-//                   /  sign(Y) atan(|Y/X|)                if X > 0
-//       atan2(Y,X) =
-//                   \  sign(Y)*pi  - sign(Y)*atan(|Y/X|)  if X < 0
-//
-//   Thus, atan2(Y,X) is of the form  atan2(Y,X) = PI + sgn*atan(|Y/X|)
-//   where PI and sgn can be determined by the four possible combinations of
-//   of the pair (sign(X),sign(Y)). We concentrate on the numerical method
-//   for atan(|Y/X|).
-//
-//2. For |Y/X| < 2^(-64), atan(|Y/X|) ~=~ |Y/X|. Hence, atan2(Y,X) is  Y/X
-//   if X > 0, and sign(Y)*pi otherwise.
-//3. For |Y/X| >= 2^(65), atan(|Y/X|) ~=~ pi/2. Hence atan2(Y,X) is sign(Y)pi/2.
-//4. For 2^(-64) <= |Y/X| < 2^(-5), atan(|Y/X|) is approximated by a polynomial
-//   of the form  Z + Z*E*polynomial(E), where Z = |Y/X| and E = Z*Z.
-//5. For |Y/X| > 2^(5), atan(|Y/X|) = pi/2 + atan(-|X/Y|), and atan(-|X/Y|) is
-//   calculated using the polynomial in 4 above.
-//6. For 2^(-5) <= |Y/X| <= 2^(5), we employ a table lookup method. First,
-//   we obtain B = 2^k * 1.b1 b2 b3 b4 = 2^k * (1+k/16) that approximate
-//   |Y/X| to approximately 5 significant bits. Hence, atan(|Y/X|) is
-//
-//      atan(|Y/X|)  =  atan(B) + atan(Z), where  Z = (|Y|-B|X|)/(|X|+B|Y|).
-//                  ~=~   tau   + Z + Z*E*polynomial(E), where E = Z*Z.
-//
-//   B has the range from 2^(-6)*(1+14/16) to 2^5 = 2^(5)*(1+0/16), totally
-//   163 possible values. These values are calculated beforehand and stored
-//   in a table. The polynomial is the one used in 4.
-//
-// Special cases:
-//  atan2(+-0, +0) = +-0
-//  atan2(+-0, -0) = +-pi
-//  atan2(+-0, x) = +-0, for x > 0, and +-pi, for x < 0
-//  atan2(y, +-0) = +pi/2 for y > 0, and -pi/2 for y < 0
-//  atan2(+-y, +INF) = +-0, for finite y > 0
-//  atan2(+-y, -INF) = +-pi, for finite y > 0
-//  atan2(+-INF, x) = +-pi/2, for finite x
-//  atan2(+-INF, +INF) = +-pi/4
-//  atan2(+-INF, -INF) = +-3*pi/4
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  atan2
-ENTRY(atan2)
-# parameter 1: 8 + %ebp
-# parameter 2: 16 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 64(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     136(%esp), %xmm1
-        movsd     128(%esp), %xmm0
-        pextrw    $3, %xmm0, %eax
-        movq      %xmm0, 8(%esp)
-        andl      $32752, %eax
-        movq      %xmm1, 16(%esp)
-        subl      $14448, %eax
-        cmpl      $3840, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        subl      $14448, %eax
-        cmpl      $3840, %eax
-        ja        .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        unpcklpd  %xmm1, %xmm0
-        xorpd     %xmm5, %xmm5
-        xorpd     %xmm3, %xmm3
-        movl      $2048, %eax
-        pinsrw    $3, %eax, %xmm5
-        paddw     %xmm1, %xmm5
-        psrlq     $29, %xmm5
-        rcpss     %xmm5, %xmm3
-        xorpd     %xmm4, %xmm4
-        movl      $14336, %ecx
-        pinsrw    $3, %ecx, %xmm4
-        psllq     $29, %xmm3
-        paddw     %xmm4, %xmm3
-        mulsd     %xmm0, %xmm3
-        xorpd     %xmm2, %xmm2
-        xorpd     %xmm6, %xmm6
-        xorpd     %xmm7, %xmm7
-        movl      $32768, %eax
-        pinsrw    $2, %eax, %xmm6
-        movl      $32767, %ecx
-        pinsrw    $3, %ecx, %xmm7
-        paddd     %xmm6, %xmm3
-        andpd     %xmm7, %xmm3
-        movapd    %xmm3, %xmm5
-        pextrw    $3, %xmm3, %eax
-        movl      $16448, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        minsd     %xmm2, %xmm3
-        movmskpd  %xmm0, %edx
-        psllq     $1, %xmm0
-        psrlq     $1, %xmm0
-        cmpsd     $2, %xmm2, %xmm5
-        psllq     $1, %xmm1
-        psrlq     $1, %xmm1
-        movapd    %xmm1, %xmm6
-        movapd    %xmm1, %xmm7
-        movapd    %xmm0, %xmm2
-        movl      $0, %ecx
-        pinsrw    $0, %ecx, %xmm6
-        subsd     %xmm6, %xmm7
-        movapd    %xmm0, %xmm4
-        mulsd     %xmm3, %xmm6
-        mulsd     %xmm3, %xmm4
-        mulsd     %xmm3, %xmm7
-        andpd     %xmm5, %xmm0
-        subsd     %xmm6, %xmm0
-        andpd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm4
-        subsd     %xmm7, %xmm0
-        andl      $32752, %eax
-        subl      $16286, %eax
-        cmpl      $1121, %eax
-        ja        .L_2TAG_PACKET_3.0.2
-        divsd     %xmm4, %xmm0
-        pextrw    $3, %xmm3, %ecx
-        movsd     2944(%ebx), %xmm2
-        movsd     2960(%ebx), %xmm3
-        pextrw    $0, %xmm5, %eax
-        addl      %edx, %edx
-        movapd    2688(%ebx,%edx,8), %xmm6
-        movapd    2752(%ebx,%edx,8), %xmm1
-        subl      $16286, %ecx
-        notl      %eax
-        andl      $1, %eax
-        addl      %eax, %ecx
-        addl      %ecx, %ecx
-        movapd    (%ebx,%ecx,8), %xmm5
-        xorpd     %xmm1, %xmm5
-        addpd     %xmm6, %xmm5
-        movapd    %xmm5, %xmm6
-        unpckhpd  %xmm5, %xmm5
-        xorpd     %xmm0, %xmm1
-        movapd    %xmm1, %xmm4
-        mulsd     %xmm0, %xmm0
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm3
-        addsd     %xmm6, %xmm1
-        subsd     %xmm1, %xmm6
-        addsd     %xmm4, %xmm6
-        addsd     2952(%ebx), %xmm2
-        mulsd     %xmm0, %xmm3
-        mulsd     %xmm0, %xmm4
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm4, %xmm2
-        addsd     2968(%ebx), %xmm3
-        mulsd     %xmm3, %xmm2
-        addsd     %xmm6, %xmm2
-        addsd     %xmm2, %xmm1
-        movsd     %xmm1, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_3.0.2:
-        addl      $942, %eax
-        cmpl      $942, %eax
-        ja        .L_2TAG_PACKET_5.0.2
-        xorpd     %xmm4, %xmm4
-        movl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm4
-        divsd     %xmm1, %xmm4
-        addl      %edx, %edx
-        movapd    2752(%ebx,%edx,8), %xmm6
-        unpcklpd  %xmm3, %xmm3
-        xorpd     %xmm6, %xmm0
-        xorpd     %xmm6, %xmm2
-        xorpd     %xmm6, %xmm3
-        movapd    2816(%ebx,%edx,8), %xmm7
-        movsd     2944(%ebx), %xmm1
-        movsd     2960(%ebx), %xmm5
-        andpd     2880(%ebx,%edx,8), %xmm3
-        mulsd     %xmm4, %xmm2
-        mulsd     %xmm4, %xmm0
-        movapd    %xmm2, %xmm6
-        mulsd     %xmm2, %xmm2
-        mulsd     %xmm2, %xmm1
-        addsd     %xmm2, %xmm5
-        mulsd     %xmm2, %xmm6
-        addsd     2952(%ebx), %xmm1
-        mulsd     %xmm2, %xmm5
-        addsd     %xmm0, %xmm7
-        addpd     %xmm3, %xmm7
-        mulsd     %xmm6, %xmm1
-        addsd     2968(%ebx), %xmm5
-        mulsd     %xmm1, %xmm5
-        addsd     %xmm7, %xmm5
-        unpckhpd  %xmm7, %xmm7
-        addsd     %xmm7, %xmm5
-        movsd     %xmm5, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_5.0.2:
-        movsd     16(%esp), %xmm1
-        movsd     8(%esp), %xmm0
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      %eax, %ecx
-        jg        .L_2TAG_PACKET_6.0.2
-        pextrw    $3, %xmm1, %ecx
-        cmpl      $32767, %ecx
-        jg        .L_2TAG_PACKET_7.0.2
-        divsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_7.0.2:
-        andpd     2672(%ebx), %xmm0
-        movsd     2640(%ebx), %xmm2
-        xorpd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_6.0.2:
-        andpd     2672(%ebx), %xmm0
-        movsd     2624(%ebx), %xmm2
-        xorpd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_0.0.2:
-.L_2TAG_PACKET_1.0.2:
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %ecx
-        je        .L_2TAG_PACKET_8.0.2
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_9.0.2
-        movsd     2992(%ebx), %xmm3
-        movl      $1024, %edx
-        movsd     2976(%ebx), %xmm4
-        xorpd     %xmm6, %xmm6
-        movsd     3008(%ebx), %xmm7
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_10.0.2
-.L_2TAG_PACKET_11.0.2:
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_12.0.2
-.L_2TAG_PACKET_13.0.2:
-        addl      %ecx, %edx
-        subl      %eax, %edx
-        cmpl      $2048, %edx
-        ja        .L_2TAG_PACKET_5.0.2
-        addl      $15344, %edx
-        pinsrw    $3, %edx, %xmm6
-        andpd     %xmm4, %xmm0
-        andpd     %xmm4, %xmm1
-        orpd      %xmm6, %xmm0
-        orpd      %xmm7, %xmm1
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_10.0.2:
-        subl      $880, %edx
-        mulsd     %xmm3, %xmm0
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_14.0.2
-        jmp       .L_2TAG_PACKET_11.0.2
-.L_2TAG_PACKET_12.0.2:
-        addl      $880, %edx
-        mulsd     %xmm3, %xmm1
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_15.0.2
-        jmp       .L_2TAG_PACKET_13.0.2
-.L_2TAG_PACKET_8.0.2:
-        movd      %xmm0, %edx
-        movapd    %xmm0, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $1048575, %ecx
-        orl       %edx, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_16.0.2
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        cmpl      $32752, %eax
-        jae       .L_2TAG_PACKET_17.0.2
-        movapd    2624(%ebx), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-.L_2TAG_PACKET_18.0.2:
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_16.0.2:
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_18.0.2
-.L_2TAG_PACKET_17.0.2:
-        movd      %xmm1, %eax
-        movapd    %xmm1, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        movl      $-2147483648, %edx
-        andl      %ecx, %edx
-        andl      $1048575, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_19.0.2
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_20.0.2
-        movapd    2656(%ebx), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_19.0.2:
-        movapd    %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_20.0.2:
-        movapd    2656(%ebx), %xmm5
-        movapd    2624(%ebx), %xmm6
-        addpd     %xmm6, %xmm5
-        pshufd    $238, %xmm5, %xmm6
-        addpd     %xmm6, %xmm5
-        orpd      %xmm5, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_9.0.2:
-        movd      %xmm1, %eax
-        movapd    %xmm1, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        movl      $-2147483648, %edx
-        andl      %ecx, %edx
-        andl      $1048575, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_19.0.2
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_21.0.2
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_21.0.2:
-        movapd    2640(%ebx), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_14.0.2:
-        pextrw    $3, %xmm1, %edx
-        andl      $32768, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_22.0.2
-        movapd    2640(%ebx), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        comisd    %xmm0, %xmm1
-        orpd      %xmm5, %xmm0
-        jne       .L_2TAG_PACKET_23.0.2
-.L_2TAG_PACKET_24.0.2:
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_23.0.2:
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_22.0.2:
-        comisd    %xmm0, %xmm1
-        jne       .L_2TAG_PACKET_23.0.2
-        je        .L_2TAG_PACKET_24.0.2
-.L_2TAG_PACKET_15.0.2:
-        movapd    2624(%ebx), %xmm5
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-.L_2TAG_PACKET_4.0.2:
-        movl      64(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(atan2)
-# -- End  atan2
-
-# Start file scope ASM
-ALIAS_SYMBOL(atan2l, atan2);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	3390881280
-	.long	1067318733
-	.long	1411116779
-	.long	1018950063
-	.long	2985987840
-	.long	1067384211
-	.long	2088903695
-	.long	1018086027
-	.long	3148445184
-	.long	1067449685
-	.long	2044163806
-	.long	1017271335
-	.long	3667629184
-	.long	1067515494
-	.long	2353092775
-	.long	1019967309
-	.long	1546568832
-	.long	1067580954
-	.long	611991315
-	.long	1017602584
-	.long	3815996800
-	.long	1067646404
-	.long	466038598
-	.long	1019686426
-	.long	4050241920
-	.long	1067711845
-	.long	3265026328
-	.long	1019626952
-	.long	120454912
-	.long	1067777277
-	.long	1542207696
-	.long	1020155608
-	.long	2784639744
-	.long	1067842697
-	.long	3883834623
-	.long	1018602870
-	.long	1328010624
-	.long	1067908107
-	.long	1791097456
-	.long	1019053126
-	.long	2217794048
-	.long	1067973505
-	.long	551619938
-	.long	1018494194
-	.long	3333520000
-	.long	1068038891
-	.long	2390331823
-	.long	1019033022
-	.long	2557052032
-	.long	1068104265
-	.long	2423976108
-	.long	1019728674
-	.long	2067649536
-	.long	1068169626
-	.long	3757397745
-	.long	1018672362
-	.long	4047094784
-	.long	1068234973
-	.long	481613184
-	.long	1019275104
-	.long	2089853184
-	.long	1068300307
-	.long	1733914374
-	.long	1020124677
-	.long	2678003840
-	.long	1068365626
-	.long	1373600282
-	.long	1013935474
-	.long	3706496128
-	.long	1068430930
-	.long	1000610902
-	.long	1019673285
-	.long	3073179008
-	.long	1068496219
-	.long	1497143008
-	.long	1019900342
-	.long	2803716736
-	.long	1068562846
-	.long	1476677416
-	.long	1019444094
-	.long	3204984128
-	.long	1068628077
-	.long	1192335905
-	.long	1018748628
-	.long	831146624
-	.long	1068693273
-	.long	2733586224
-	.long	1018823295
-	.long	243029376
-	.long	1068758431
-	.long	950106081
-	.long	1019046675
-	.long	1735561920
-	.long	1068823549
-	.long	3546440856
-	.long	1020104712
-	.long	1339217792
-	.long	1068888626
-	.long	3028812387
-	.long	1019818321
-	.long	3706342144
-	.long	1068953659
-	.long	3814564029
-	.long	1017763871
-	.long	637726976
-	.long	1069018648
-	.long	3584007699
-	.long	1017976868
-	.long	1148779264
-	.long	1069083589
-	.long	2282532133
-	.long	1019483954
-	.long	1406131392
-	.long	1069148481
-	.long	1547359113
-	.long	1019786342
-	.long	1908875904
-	.long	1069213322
-	.long	1315508410
-	.long	1020009473
-	.long	3194947520
-	.long	1069278110
-	.long	3845393201
-	.long	1015803761
-	.long	1547487744
-	.long	1069342844
-	.long	3863107865
-	.long	1019810104
-	.long	1881061952
-	.long	1069407521
-	.long	4288343548
-	.long	1019687581
-	.long	563086336
-	.long	1069472140
-	.long	2582230241
-	.long	1020099350
-	.long	2594975552
-	.long	1069536698
-	.long	2306443764
-	.long	1019667244
-	.long	3438545024
-	.long	1069606573
-	.long	957455549
-	.long	1015587735
-	.long	4211357472
-	.long	1069670906
-	.long	2611778754
-	.long	1017877214
-	.long	3002835424
-	.long	1069735101
-	.long	235580458
-	.long	1020211685
-	.long	3905315424
-	.long	1069799150
-	.long	3630647617
-	.long	1018736849
-	.long	2849656576
-	.long	1069863047
-	.long	2412165062
-	.long	1019693004
-	.long	507429472
-	.long	1069926785
-	.long	1397750723
-	.long	1018412717
-	.long	2307470272
-	.long	1069990356
-	.long	1796470904
-	.long	1019796181
-	.long	1271814912
-	.long	1070053755
-	.long	189761565
-	.long	1016149115
-	.long	3800538144
-	.long	1070116974
-	.long	2524871582
-	.long	1018263353
-	.long	3916203552
-	.long	1070180008
-	.long	127848658
-	.long	1017672664
-	.long	457192032
-	.long	1070242851
-	.long	4020400938
-	.long	1019823010
-	.long	1385324704
-	.long	1070305495
-	.long	564511179
-	.long	1016079094
-	.long	2322869856
-	.long	1070367935
-	.long	2347103319
-	.long	1018927760
-	.long	3743438624
-	.long	1070430165
-	.long	877973862
-	.long	1019638162
-	.long	2392255552
-	.long	1070492180
-	.long	2432782267
-	.long	1018872629
-	.long	4180443328
-	.long	1070553973
-	.long	3102990015
-	.long	1020093101
-	.long	2547540832
-	.long	1070636485
-	.long	3877738253
-	.long	1017300424
-	.long	2735468912
-	.long	1070697461
-	.long	2446470256
-	.long	1019235378
-	.long	542633792
-	.long	1070757943
-	.long	583606328
-	.long	1018624131
-	.long	923265984
-	.long	1070817911
-	.long	1793926708
-	.long	1019714161
-	.long	918728448
-	.long	1070877348
-	.long	3726463586
-	.long	1019433296
-	.long	2572275008
-	.long	1070936237
-	.long	1845354238
-	.long	1019459238
-	.long	50974688
-	.long	1070994564
-	.long	983808064
-	.long	1016685418
-	.long	1105518320
-	.long	1071052313
-	.long	2357496692
-	.long	1015139882
-	.long	1264825328
-	.long	1071109472
-	.long	2244129354
-	.long	1019046344
-	.long	961157920
-	.long	1071166029
-	.long	3124185339
-	.long	1018541776
-	.long	1162701584
-	.long	1071221973
-	.long	1279780948
-	.long	1019268918
-	.long	3284935664
-	.long	1071277294
-	.long	2670033472
-	.long	1019833744
-	.long	497441888
-	.long	1071331985
-	.long	1032737410
-	.long	1019795212
-	.long	3377383904
-	.long	1071386036
-	.long	2356897182
-	.long	1020205553
-	.long	1126962000
-	.long	1071439443
-	.long	3723724586
-	.long	1015212418
-	.long	90291008
-	.long	1071492199
-	.long	4178672431
-	.long	1020186971
-	.long	190059536
-	.long	1071595741
-	.long	1763589807
-	.long	1019162163
-	.long	2497392840
-	.long	1071670654
-	.long	3036997041
-	.long	1020204325
-	.long	2616971944
-	.long	1071719773
-	.long	300151069
-	.long	1017041957
-	.long	2883518128
-	.long	1071767563
-	.long	2203981414
-	.long	1019190108
-	.long	1496354352
-	.long	1071814030
-	.long	332287966
-	.long	1016846435
-	.long	483276728
-	.long	1071859184
-	.long	653845024
-	.long	1018830914
-	.long	3097401072
-	.long	1071903039
-	.long	1514746408
-	.long	1019278972
-	.long	2737217248
-	.long	1071945615
-	.long	1358845067
-	.long	1017268275
-	.long	2072577560
-	.long	1071986933
-	.long	3041024735
-	.long	1019929672
-	.long	2266405656
-	.long	1072027017
-	.long	1271261130
-	.long	1012925070
-	.long	958652544
-	.long	1072065894
-	.long	2158017058
-	.long	1019955372
-	.long	3312993840
-	.long	1072103591
-	.long	765809169
-	.long	1019114443
-	.long	3177001304
-	.long	1072140139
-	.long	144180084
-	.long	1019822186
-	.long	3071642184
-	.long	1072175568
-	.long	4004602424
-	.long	1019420740
-	.long	4283953648
-	.long	1072209909
-	.long	1511950430
-	.long	1020176966
-	.long	1413754136
-	.long	1072243195
-	.long	856972295
-	.long	1015129638
-	.long	4073202944
-	.long	1072306725
-	.long	4068194804
-	.long	1019714860
-	.long	946117760
-	.long	1072366415
-	.long	694980733
-	.long	1020150135
-	.long	3980632032
-	.long	1072422512
-	.long	1313251280
-	.long	1019948709
-	.long	1468297112
-	.long	1072475260
-	.long	330111143
-	.long	1019809198
-	.long	3478063816
-	.long	1072524887
-	.long	2930067044
-	.long	1017784081
-	.long	1153979856
-	.long	1072571613
-	.long	2225786102
-	.long	1017634481
-	.long	2089828808
-	.long	1072615641
-	.long	474621367
-	.long	1017043414
-	.long	3531732632
-	.long	1072657163
-	.long	2276396220
-	.long	1018757240
-	.long	775214612
-	.long	1072694803
-	.long	3209744818
-	.long	1019963015
-	.long	662307284
-	.long	1072713319
-	.long	1381696763
-	.long	1019763781
-	.long	1192776652
-	.long	1072730830
-	.long	3017932994
-	.long	1015179769
-	.long	744202396
-	.long	1072747407
-	.long	2073854034
-	.long	1019512292
-	.long	8337908
-	.long	1072763115
-	.long	16004448
-	.long	1019599514
-	.long	3589868768
-	.long	1072778013
-	.long	1374369804
-	.long	1018019237
-	.long	121647320
-	.long	1072792159
-	.long	128481634
-	.long	1018115438
-	.long	2464923204
-	.long	1072805601
-	.long	1787331214
-	.long	1016798022
-	.long	4093304372
-	.long	1072830562
-	.long	3306868969
-	.long	1019384078
-	.long	1436891684
-	.long	1072853231
-	.long	676347266
-	.long	1017302183
-	.long	1104571840
-	.long	1072873890
-	.long	2870400285
-	.long	1019938149
-	.long	2037009832
-	.long	1072892781
-	.long	2956702105
-	.long	1016472908
-	.long	3139037960
-	.long	1072910111
-	.long	916057147
-	.long	1018364335
-	.long	1826698064
-	.long	1072926058
-	.long	2171961098
-	.long	1019669816
-	.long	1353941060
-	.long	1072940774
-	.long	1722928782
-	.long	1019926215
-	.long	1803191644
-	.long	1072954391
-	.long	1547878639
-	.long	1020259262
-	.long	1092591296
-	.long	1072967024
-	.long	3070107923
-	.long	1018320401
-	.long	2205372832
-	.long	1072978772
-	.long	787328196
-	.long	1014621351
-	.long	1291577100
-	.long	1072989723
-	.long	2964757301
-	.long	1020242528
-	.long	4234512804
-	.long	1072999952
-	.long	3136030038
-	.long	1017522144
-	.long	3248069132
-	.long	1073009528
-	.long	1506192355
-	.long	1018050472
-	.long	3932628500
-	.long	1073018509
-	.long	1045823554
-	.long	1019946655
-	.long	4195697848
-	.long	1073026948
-	.long	233443322
-	.long	1018917447
-	.long	2501811452
-	.long	1073034892
-	.long	901427976
-	.long	1017333852
-	.long	866379428
-	.long	1073049455
-	.long	2437443742
-	.long	1019678792
-	.long	1376865888
-	.long	1073062480
-	.long	3365790232
-	.long	1014547152
-	.long	3290094268
-	.long	1073074195
-	.long	3898947415
-	.long	1018683566
-	.long	354764884
-	.long	1073084787
-	.long	3854322404
-	.long	1019662058
-	.long	3332975496
-	.long	1073094406
-	.long	3171701655
-	.long	1017830922
-	.long	1141460088
-	.long	1073103181
-	.long	3946082701
-	.long	1020032019
-	.long	745761284
-	.long	1073111216
-	.long	1347210591
-	.long	1019106121
-	.long	1673304508
-	.long	1073118600
-	.long	1760606642
-	.long	1017324577
-	.long	983388240
-	.long	1073125409
-	.long	3740651204
-	.long	1019514104
-	.long	3895509100
-	.long	1073131706
-	.long	2409629983
-	.long	1020069322
-	.long	2128523668
-	.long	1073137548
-	.long	3045605368
-	.long	1018579174
-	.long	2075485692
-	.long	1073142981
-	.long	3720571789
-	.long	1017557436
-	.long	121855976
-	.long	1073148047
-	.long	2391744767
-	.long	1020160645
-	.long	4181733780
-	.long	1073152780
-	.long	995028816
-	.long	1019681295
-	.long	2887813280
-	.long	1073157214
-	.long	218733247
-	.long	1020003509
-	.long	2862180896
-	.long	1073161375
-	.long	2043806490
-	.long	1018602288
-	.long	3909375184
-	.long	1073168973
-	.long	1559903412
-	.long	1020103444
-	.long	3533966292
-	.long	1073175738
-	.long	734884149
-	.long	1018462962
-	.long	3815044608
-	.long	1073181799
-	.long	3630523428
-	.long	1017250093
-	.long	739639376
-	.long	1073187261
-	.long	4167476661
-	.long	1020008277
-	.long	1068309648
-	.long	1073192207
-	.long	2110061437
-	.long	1019295858
-	.long	2350566352
-	.long	1073196707
-	.long	582596516
-	.long	1018568821
-	.long	2529520024
-	.long	1073200819
-	.long	745552787
-	.long	1019053165
-	.long	1841667508
-	.long	1073204591
-	.long	3982568700
-	.long	1016503327
-	.long	2242261080
-	.long	1073208063
-	.long	3433582258
-	.long	1016196763
-	.long	715134328
-	.long	1073211270
-	.long	355901358
-	.long	1020087916
-	.long	2700735876
-	.long	1073214240
-	.long	3640957736
-	.long	1019780205
-	.long	141607580
-	.long	1073217000
-	.long	2488245051
-	.long	1020262395
-	.long	287934404
-	.long	1073219570
-	.long	2392691085
-	.long	1019883292
-	.long	2363373988
-	.long	1073221969
-	.long	4194561737
-	.long	1019237447
-	.long	3829340424
-	.long	1073224214
-	.long	429455526
-	.long	1019490975
-	.long	1988805928
-	.long	1073226320
-	.long	3029848706
-	.long	1018104889
-	.long	1647572320
-	.long	1073230161
-	.long	10289938
-	.long	1017394880
-	.long	3988000624
-	.long	1073233576
-	.long	1957559169
-	.long	1019434816
-	.long	4263843944
-	.long	1073236633
-	.long	204710264
-	.long	1019908761
-	.long	663197724
-	.long	1073239386
-	.long	1921757578
-	.long	1019778948
-	.long	3560800700
-	.long	1073241876
-	.long	3994348896
-	.long	1019230192
-	.long	2441785656
-	.long	1073244141
-	.long	871468611
-	.long	1014800505
-	.long	3277400272
-	.long	1073246209
-	.long	4092218139
-	.long	1020040842
-	.long	3951990120
-	.long	1073248105
-	.long	4276546478
-	.long	1019763677
-	.long	2737338540
-	.long	1073249850
-	.long	252776012
-	.long	1018794951
-	.long	1511361316
-	.long	1073251461
-	.long	3119653999
-	.long	1018514803
-	.long	3969162516
-	.long	1073252952
-	.long	1037069016
-	.long	1016792900
-	.long	413985240
-	.long	1073254338
-	.long	4110171432
-	.long	1020001345
-	.long	3681283576
-	.long	1073255627
-	.long	1463092818
-	.long	1020260354
-	.long	3146455488
-	.long	1073256831
-	.long	1031209123
-	.long	1016554799
-	.long	95214512
-	.long	1073257958
-	.long	1373808632
-	.long	1019493031
-	.long	4250240828
-	.long	1073259013
-	.long	3891047882
-	.long	1020108730
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	1072243195
-	.long	856972295
-	.long	1015129638
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	3221823995
-	.long	856972295
-	.long	3164710438
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	3164710438
-	.long	1413754136
-	.long	3221823995
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	2006262985
-	.long	1069310863
-	.long	2358449471
-	.long	3217342131
-	.long	3845454352
-	.long	1069952297
-	.long	2829679149
-	.long	1073771565
-	.long	4294967295
-	.long	2148532223
-	.long	0
-	.long	0
-	.long	0
-	.long	1130364928
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.type	static_const_table,@object
-	.size	static_const_table,3024
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_cosh.S b/libm/x86/e_cosh.S
deleted file mode 100644
index 567a9d0..0000000
--- a/libm/x86/e_cosh.S
+++ /dev/null
@@ -1,1349 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  cosh(x)=(exp(x)+exp(-x))/2
-//
-//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//          L2EH+L2EL (upper 26, lower 53 bits)
-//
-//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
-//                              f=0.b1 b2 ... b7, k integer
-//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
-//  Tp stores higher 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
-//
-//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
-//                       for |x| in [1/8,3*2^8)
-//  e^{-|x|}=2^{-k-f}*2^{-r}
-//
-//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
-//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
-//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)
-//
-//  For |x| in [1/8, 3*2^7), cosh(x) is formed as
-//   RN(2^k*Tp+2^{-k}*Tn)+2^k*Tp*P15+2^{-k}*Tn*P`15+2^{-k}*TnL+2^{-k}*Dn+2^k*Dp
-//
-//  For |x| in [3*2^7, 3*2^8), (e^|x|)/2 is returned, and
-//  the result is checked for overflow.
-//
-//  For |x|<1/8, a Taylor polynomial expansion is used (degree 10)
-//  (error bound for polynomial expansion is below 0.501 ulp)
-//
-// Special cases:
-//  cosh(NaN) = quiet NaN, and raise invalid exception
-//  cosh(INF) = that INF
-//  cosh(0)=1
-//  for finite argument, only cosh(0)=1 is exact
-//  For IEEE double
-//  cosh(x) overflows
-//  for x > 710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  cosh
-ENTRY(cosh)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 40(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        movsd     4240(%ebx), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     4192(%ebx), %xmm1
-        movsd     4200(%ebx), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     4096(%ebx), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        andl      $32767, %ecx
-        subl      $16320, %ecx
-        cmpl      $200, %ecx
-        jae       .L_2TAG_PACKET_0.0.2
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        movapd    %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        xorpd     %xmm5, %xmm5
-        subsd     %xmm6, %xmm3
-        movapd    4112(%ebx), %xmm4
-        addsd     %xmm1, %xmm2
-        movapd    4128(%ebx), %xmm6
-        subsd     %xmm3, %xmm7
-        movl      $32704, %edx
-        pinsrw    $3, %edx, %xmm5
-        movapd    4144(%ebx), %xmm1
-        addsd     %xmm7, %xmm2
-        movl      $127, %edx
-        andl      %eax, %edx
-        addl      %edx, %edx
-        shrl      $3, %eax
-        andl      $65520, %eax
-        addl      $16352, %eax
-        xorpd     %xmm0, %xmm0
-        cmpl      $184, %ecx
-        jae       .L_2TAG_PACKET_1.0.2
-        pshufd    $68, %xmm5, %xmm5
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        psubw     %xmm0, %xmm5
-        mulpd     (%ebx,%edx,8), %xmm0
-        mulpd     2048(%ebx,%edx,8), %xmm5
-        pshufd    $68, %xmm2, %xmm3
-        movapd    4160(%ebx), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        mulpd     %xmm3, %xmm3
-        mulpd     %xmm2, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulpd     4176(%ebx), %xmm2
-        mulpd     %xmm3, %xmm1
-        mulpd     %xmm3, %xmm7
-        mulpd     %xmm3, %xmm4
-        mulpd     %xmm3, %xmm1
-        addpd     %xmm7, %xmm6
-        movapd    %xmm0, %xmm7
-        addpd     %xmm1, %xmm4
-        shufpd    $0, %xmm5, %xmm7
-        addpd     %xmm5, %xmm0
-        mulpd     %xmm7, %xmm2
-        addpd     %xmm6, %xmm4
-        subsd     %xmm0, %xmm7
-        mulpd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm5, %xmm7
-        addpd     %xmm2, %xmm4
-        addsd     %xmm6, %xmm7
-        pshufd    $238, %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_0.0.2:
-        addl      $16320, %ecx
-        cmpl      $16320, %ecx
-        ja        .L_2TAG_PACKET_3.0.2
-        cmpl      $15952, %ecx
-        jae       .L_2TAG_PACKET_4.0.2
-        addsd     %xmm2, %xmm6
-        movsd     4248(%ebx), %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_1.0.2:
-        subl      $16352, %eax
-        movl      %eax, %ecx
-        andl      $32752, %eax
-        shrl      $1, %eax
-        andl      $65520, %eax
-        subl      %eax, %ecx
-        addl      $16352, %eax
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        mulpd     (%ebx,%edx,8), %xmm0
-        pshufd    $68, %xmm2, %xmm3
-        movsd     4160(%ebx), %xmm7
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm2, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     4176(%ebx), %xmm2
-        mulsd     %xmm3, %xmm1
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm3, %xmm4
-        addl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm5
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm4
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm6, %xmm4
-        mulsd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm6, %xmm4
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm5, %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        movl      $64, %edx
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_5.0.2
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_4.0.2:
-        movapd    4208(%ebx), %xmm1
-        mulpd     %xmm5, %xmm5
-        movapd    4224(%ebx), %xmm2
-        xorpd     %xmm3, %xmm3
-        movapd    %xmm5, %xmm0
-        mulpd     %xmm5, %xmm1
-        movsd     4248(%ebx), %xmm6
-        mulpd     %xmm5, %xmm5
-        movl      $16352, %eax
-        pinsrw    $3, %eax, %xmm3
-        addpd     %xmm2, %xmm1
-        mulpd     %xmm5, %xmm1
-        pshufd    $238, %xmm1, %xmm2
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm2
-        addsd     %xmm2, %xmm0
-        addsd     %xmm6, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_3.0.2:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        xorpd     %xmm0, %xmm0
-        movl      $32736, %eax
-        pinsrw    $3, %eax, %xmm0
-        mulsd     %xmm0, %xmm0
-        movl      $64, %edx
-.L_2TAG_PACKET_5.0.2:
-        movsd     %xmm0, (%esp)
-        movsd     112(%esp), %xmm0
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_6.0.2:
-        mulsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_2.0.2:
-        movsd     %xmm0, 24(%esp)
-        fldl      24(%esp)
-.L_2TAG_PACKET_7.0.2:
-        movl      40(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(cosh)
-# -- End  cosh
-
-# Start file scope ASM
-ALIAS_SYMBOL(coshl, cosh);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	2851812149
-	.long	1072698941
-	.long	2595802551
-	.long	1016815913
-	.long	1048019041
-	.long	1072704666
-	.long	1398474845
-	.long	3161559171
-	.long	3899555717
-	.long	1072710421
-	.long	427280750
-	.long	3163595548
-	.long	3541402996
-	.long	1072716208
-	.long	2759177317
-	.long	1015903202
-	.long	702412510
-	.long	1072722027
-	.long	3803266087
-	.long	3163328991
-	.long	410360776
-	.long	1072727877
-	.long	1269990655
-	.long	1013024446
-	.long	3402036099
-	.long	1072733758
-	.long	405889334
-	.long	1016154232
-	.long	1828292879
-	.long	1072739672
-	.long	1255956747
-	.long	1016636974
-	.long	728909815
-	.long	1072745618
-	.long	383930225
-	.long	1016078044
-	.long	852742562
-	.long	1072751596
-	.long	667253586
-	.long	1010842135
-	.long	2952712987
-	.long	1072757606
-	.long	3293494651
-	.long	3161168877
-	.long	3490863953
-	.long	1072763649
-	.long	960797498
-	.long	3163997456
-	.long	3228316108
-	.long	1072769725
-	.long	3010241991
-	.long	3159471380
-	.long	2930322912
-	.long	1072775834
-	.long	2599499422
-	.long	3163762623
-	.long	3366293073
-	.long	1072781976
-	.long	3119426314
-	.long	1015169130
-	.long	1014845819
-	.long	1072788152
-	.long	3117910646
-	.long	3162607681
-	.long	948735466
-	.long	1072794361
-	.long	3516338028
-	.long	3163623459
-	.long	3949972341
-	.long	1072800603
-	.long	2068408548
-	.long	1015962444
-	.long	2214878420
-	.long	1072806880
-	.long	892270087
-	.long	3164164998
-	.long	828946858
-	.long	1072813191
-	.long	10642492
-	.long	1016988014
-	.long	586995997
-	.long	1072819536
-	.long	41662348
-	.long	3163676568
-	.long	2288159958
-	.long	1072825915
-	.long	2169144469
-	.long	1015924597
-	.long	2440944790
-	.long	1072832329
-	.long	2492769774
-	.long	1015196030
-	.long	1853186616
-	.long	1072838778
-	.long	3066496371
-	.long	1016705150
-	.long	1337108031
-	.long	1072845262
-	.long	3203724452
-	.long	1015726421
-	.long	1709341917
-	.long	1072851781
-	.long	2571168217
-	.long	1015201075
-	.long	3790955393
-	.long	1072858335
-	.long	2352942462
-	.long	3164228666
-	.long	4112506593
-	.long	1072864925
-	.long	2947355221
-	.long	1015419624
-	.long	3504003472
-	.long	1072871551
-	.long	3594001060
-	.long	3158379228
-	.long	2799960843
-	.long	1072878213
-	.long	1423655381
-	.long	1016070727
-	.long	2839424854
-	.long	1072884911
-	.long	1171596163
-	.long	1014090255
-	.long	171030293
-	.long	1072891646
-	.long	3526460132
-	.long	1015477354
-	.long	4232894513
-	.long	1072898416
-	.long	2383938684
-	.long	1015717095
-	.long	2992903935
-	.long	1072905224
-	.long	2218154406
-	.long	1016276769
-	.long	1603444721
-	.long	1072912069
-	.long	1548633640
-	.long	3163249902
-	.long	926591435
-	.long	1072918951
-	.long	3208833762
-	.long	3163962090
-	.long	1829099622
-	.long	1072925870
-	.long	1016661181
-	.long	3164509581
-	.long	887463927
-	.long	1072932827
-	.long	3596744163
-	.long	3161842742
-	.long	3272845541
-	.long	1072939821
-	.long	928852419
-	.long	3164536824
-	.long	1276261410
-	.long	1072946854
-	.long	300981948
-	.long	1015732745
-	.long	78413852
-	.long	1072953925
-	.long	4183226867
-	.long	3164065827
-	.long	569847338
-	.long	1072961034
-	.long	472945272
-	.long	3160339305
-	.long	3645941911
-	.long	1072968181
-	.long	3814685081
-	.long	3162621917
-	.long	1617004845
-	.long	1072975368
-	.long	82804944
-	.long	1011391354
-	.long	3978100823
-	.long	1072982593
-	.long	3513027190
-	.long	1016894539
-	.long	3049340112
-	.long	1072989858
-	.long	3062915824
-	.long	1014219171
-	.long	4040676318
-	.long	1072997162
-	.long	4090609238
-	.long	1016712034
-	.long	3577096743
-	.long	1073004506
-	.long	2951496418
-	.long	1014842263
-	.long	2583551245
-	.long	1073011890
-	.long	3161094195
-	.long	1016655067
-	.long	1990012071
-	.long	1073019314
-	.long	3529070563
-	.long	3163861769
-	.long	2731501122
-	.long	1073026778
-	.long	1774031855
-	.long	3163518597
-	.long	1453150082
-	.long	1073034283
-	.long	498154669
-	.long	3162536638
-	.long	3395129871
-	.long	1073041828
-	.long	4025345435
-	.long	3163383964
-	.long	917841882
-	.long	1073049415
-	.long	18715565
-	.long	1016707884
-	.long	3566716925
-	.long	1073057042
-	.long	1536826856
-	.long	1015191009
-	.long	3712504873
-	.long	1073064711
-	.long	88491949
-	.long	1016476236
-	.long	2321106615
-	.long	1073072422
-	.long	2171176610
-	.long	1010584347
-	.long	363667784
-	.long	1073080175
-	.long	813753950
-	.long	1016833785
-	.long	3111574537
-	.long	1073087969
-	.long	2606161479
-	.long	3163808322
-	.long	2956612997
-	.long	1073095806
-	.long	2118169751
-	.long	3163784129
-	.long	885834528
-	.long	1073103686
-	.long	1973258547
-	.long	3163310140
-	.long	2186617381
-	.long	1073111608
-	.long	2270764084
-	.long	3164321289
-	.long	3561793907
-	.long	1073119573
-	.long	1157054053
-	.long	1012938926
-	.long	1719614413
-	.long	1073127582
-	.long	330458198
-	.long	3164331316
-	.long	1963711167
-	.long	1073135634
-	.long	1744767757
-	.long	3161622870
-	.long	1013258799
-	.long	1073143730
-	.long	1748797611
-	.long	3161177658
-	.long	4182873220
-	.long	1073151869
-	.long	629542646
-	.long	3163044879
-	.long	3907805044
-	.long	1073160053
-	.long	2257091225
-	.long	3162598983
-	.long	1218806132
-	.long	1073168282
-	.long	1818613052
-	.long	3163597017
-	.long	1447192521
-	.long	1073176555
-	.long	1462857171
-	.long	3163563097
-	.long	1339972927
-	.long	1073184873
-	.long	167908909
-	.long	1016620728
-	.long	1944781191
-	.long	1073193236
-	.long	3993278767
-	.long	3162772855
-	.long	19972402
-	.long	1073201645
-	.long	3507899862
-	.long	1017057868
-	.long	919555682
-	.long	1073210099
-	.long	3121969534
-	.long	1013996802
-	.long	1413356050
-	.long	1073218599
-	.long	1651349291
-	.long	3163716742
-	.long	2571947539
-	.long	1073227145
-	.long	3558159064
-	.long	3164425245
-	.long	1176749997
-	.long	1073235738
-	.long	2738998779
-	.long	3163084420
-	.long	2604962541
-	.long	1073244377
-	.long	2614425274
-	.long	3164587768
-	.long	3649726105
-	.long	1073253063
-	.long	4085036346
-	.long	1016698050
-	.long	1110089947
-	.long	1073261797
-	.long	1451641639
-	.long	1016523249
-	.long	380978316
-	.long	1073270578
-	.long	854188970
-	.long	3161511262
-	.long	2568320822
-	.long	1073279406
-	.long	2732824428
-	.long	1015401491
-	.long	194117574
-	.long	1073288283
-	.long	777528612
-	.long	3164460665
-	.long	2966275557
-	.long	1073297207
-	.long	2176155324
-	.long	3160891335
-	.long	3418903055
-	.long	1073306180
-	.long	2527457337
-	.long	3161869180
-	.long	2682146384
-	.long	1073315202
-	.long	2082178513
-	.long	3164411995
-	.long	1892288442
-	.long	1073324273
-	.long	2446255666
-	.long	3163648957
-	.long	2191782032
-	.long	1073333393
-	.long	2960257726
-	.long	1014791238
-	.long	434316067
-	.long	1073342563
-	.long	2028358766
-	.long	1014506698
-	.long	2069751141
-	.long	1073351782
-	.long	1562170675
-	.long	3163773257
-	.long	3964284211
-	.long	1073361051
-	.long	2111583915
-	.long	1016475740
-	.long	2990417245
-	.long	1073370371
-	.long	3683467745
-	.long	3164417902
-	.long	321958744
-	.long	1073379742
-	.long	3401933767
-	.long	1016843134
-	.long	1434058175
-	.long	1073389163
-	.long	251133233
-	.long	1016134345
-	.long	3218338682
-	.long	1073398635
-	.long	3404164304
-	.long	3163525684
-	.long	2572866477
-	.long	1073408159
-	.long	878562433
-	.long	1016570317
-	.long	697153126
-	.long	1073417735
-	.long	1283515429
-	.long	3164331765
-	.long	3092190715
-	.long	1073427362
-	.long	814012168
-	.long	3160571998
-	.long	2380618042
-	.long	1073437042
-	.long	3149557219
-	.long	3164369375
-	.long	4076559943
-	.long	1073446774
-	.long	2119478331
-	.long	3161806927
-	.long	815859274
-	.long	1073456560
-	.long	240396590
-	.long	3164536019
-	.long	2420883922
-	.long	1073466398
-	.long	2049810052
-	.long	1015168464
-	.long	1540824585
-	.long	1073476290
-	.long	1064017011
-	.long	3164536266
-	.long	3716502172
-	.long	1073486235
-	.long	2303740125
-	.long	1015091301
-	.long	1610600570
-	.long	1073496235
-	.long	3766732298
-	.long	1016808759
-	.long	777507147
-	.long	1073506289
-	.long	4282924205
-	.long	1016236109
-	.long	2483480501
-	.long	1073516397
-	.long	1216371780
-	.long	1014082748
-	.long	3706687593
-	.long	1073526560
-	.long	3521726940
-	.long	1014301643
-	.long	1432208378
-	.long	1073536779
-	.long	1401068914
-	.long	3163412539
-	.long	1242007932
-	.long	1073547053
-	.long	1132034716
-	.long	3164388407
-	.long	135105010
-	.long	1073557383
-	.long	1906148728
-	.long	3164424315
-	.long	3707479175
-	.long	1073567768
-	.long	3613079303
-	.long	1015213314
-	.long	382305176
-	.long	1073578211
-	.long	2347622376
-	.long	3163627201
-	.long	64696965
-	.long	1073588710
-	.long	1768797490
-	.long	1016865536
-	.long	4076975200
-	.long	1073599265
-	.long	2029000899
-	.long	1016257111
-	.long	863738719
-	.long	1073609879
-	.long	1326992220
-	.long	3163661773
-	.long	351641897
-	.long	1073620550
-	.long	2172261526
-	.long	3164059175
-	.long	3884662774
-	.long	1073631278
-	.long	2158611599
-	.long	1015258761
-	.long	4224142467
-	.long	1073642065
-	.long	3389820386
-	.long	1016255778
-	.long	2728693978
-	.long	1073652911
-	.long	396109971
-	.long	3164511267
-	.long	764307441
-	.long	1073663816
-	.long	3021057420
-	.long	3164378099
-	.long	3999357479
-	.long	1073674779
-	.long	2258941616
-	.long	1016973300
-	.long	929806999
-	.long	1073685803
-	.long	3205336643
-	.long	1016308133
-	.long	1533953344
-	.long	1073696886
-	.long	769171851
-	.long	1016714209
-	.long	2912730644
-	.long	1073708029
-	.long	3490067722
-	.long	3164453650
-	.long	2174652632
-	.long	1073719233
-	.long	4087714590
-	.long	1015498835
-	.long	730821105
-	.long	1073730498
-	.long	2523232743
-	.long	1013115764
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.long	3607404736
-	.long	1044146952
-	.long	3607404736
-	.long	3191630600
-	.long	4277811695
-	.long	1063661122
-	.long	4277811695
-	.long	3211144770
-	.long	2140175755
-	.long	1033864261
-	.long	2140175755
-	.long	1033864261
-	.long	4289495988
-	.long	1054113747
-	.long	4289495988
-	.long	1054113747
-	.long	4277811695
-	.long	1064709698
-	.long	4277811695
-	.long	3212193346
-	.long	1610612736
-	.long	1080497479
-	.long	4166901572
-	.long	1053077003
-	.long	3078135644
-	.long	1049787983
-	.long	381774870
-	.long	1062650220
-	.long	436314137
-	.long	1056571808
-	.long	1431655765
-	.long	1067799893
-	.long	4160749568
-	.long	2147483647
-	.long	0
-	.long	1072693248
-	.type	static_const_table,@object
-	.size	static_const_table,4256
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_hypot.S b/libm/x86/e_hypot.S
deleted file mode 100644
index 8422024..0000000
--- a/libm/x86/e_hypot.S
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// X87 version:
-// Use 80-bit FPU precision fmul, fsqrt to compute square and sqrt.
-//
-// SSE version:
-// Swap x, y if |x|<|y|
-// For x=2^k*x, get y=y*2^(-k)
-// Get S ~ sqrt(x^2+y^2)  (leading 1 + leading 25 mantissa bits)
-//
-// Get D = ( RN(x^2+y^2) - S^2 ) + ( x^2 - RN(x^2) ) +
-//                               + ( y^2 - ((RN(x^2+y^2)-RN(x^2)) )
-//
-// Result is 2^k*(S + Se),  where Se = S*e
-//        S*e is approximated as (D/2S)*( 1 - (D/2S)^2*1.0/S )
-//
-// Return 2^k*(S+Se)
-//
-// For |y/x|<2^(-64), return x
-//
-// For cases where maximum biased exponent is either greater than 7fdh or
-// below 32, take a special path to check for special cases (0, NaN, Inf),
-// possible overflow, and more accurate computation for denormal results
-//
-// Special cases:
-//  hypot(x,y), hypot(y,x), and hypot(x,-y) are equivalent
-//  hypot(x,+-0) is equivalent to fabs(x)
-//  hypot(x,y) = y if (x==NaN or x==INF) and y==INF
-//  hypot(x,y) = x if (x==NaN or x==INF) and y!=INF (even if y==NaN!)
-//  hypot(x,y) = y if (x!=NaN and x!=INF) and (y==NaN or y==INF)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  hypot
-ENTRY(hypot)
-# parameter 1: 8 + %ebp
-# parameter 2: 16 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $152, %esp
-        movl      %ebx, 96(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movapd    (%ebx), %xmm3
-        movsd     160(%esp), %xmm0
-        movsd     168(%esp), %xmm1
-        andpd     %xmm3, %xmm0
-        andpd     %xmm3, %xmm1
-        pextrw    $3, %xmm0, %eax
-        pextrw    $3, %xmm1, %edx
-        cmpl      $24528, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        cmpl      $24528, %edx
-        ja        .L_2TAG_PACKET_0.0.2
-.L_2TAG_PACKET_1.0.2:
-        fldl      160(%esp)
-        fldl      168(%esp)
-        fxch      %st(1)
-        fmul      %st(0), %st
-        fxch      %st(1)
-        nop       
-        fmul      %st(0), %st
-        faddp     %st, %st(1)
-        fsqrt     
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_0.0.2:
-        cmpl      $32752, %eax
-        movl      %eax, %ecx
-        jae       .L_2TAG_PACKET_3.0.2
-        subl      %edx, %ecx
-        cmpl      $32752, %edx
-        jae       .L_2TAG_PACKET_3.0.2
-        addl      $928, %ecx
-        addl      %edx, %eax
-        cmpl      $1856, %ecx
-        ja        .L_2TAG_PACKET_4.0.2
-        cmpl      $49056, %eax
-        jb        .L_2TAG_PACKET_1.0.2
-        fldl      160(%esp)
-        fldl      168(%esp)
-        fxch      %st(1)
-        fmul      %st(0), %st
-        fxch      %st(1)
-        nop       
-        fmul      %st(0), %st
-        faddp     %st, %st(1)
-        fsqrt     
-.L_2TAG_PACKET_5.0.2:
-        fstl      (%esp)
-        fstpt     16(%esp)
-        xorl      %eax, %eax
-        movw      24(%esp), %ax
-        cmpl      $17407, %eax
-        jae       .L_2TAG_PACKET_6.0.2
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_4.0.2:
-        movsd     %xmm0, 32(%esp)
-        movsd     %xmm1, 40(%esp)
-        fldl      32(%esp)
-        faddl     40(%esp)
-        jmp       .L_2TAG_PACKET_5.0.2
-.L_2TAG_PACKET_6.0.2:
-        movl      $46, %edx
-.L_2TAG_PACKET_8.0.2:
-        movsd     160(%esp), %xmm0
-        movsd     168(%esp), %xmm1
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_3.0.2:
-        shufpd    $0, %xmm1, %xmm0
-        movdqa    %xmm0, %xmm2
-        movdqa    16(%ebx), %xmm3
-        movsd     %xmm0, 32(%esp)
-        movsd     %xmm1, 40(%esp)
-        cmppd     $3, %xmm0, %xmm2
-        cmppd     $0, %xmm0, %xmm3
-        movmskpd  %xmm2, %edx
-        movmskpd  %xmm3, %eax
-        testl     %edx, %edx
-        je        .L_2TAG_PACKET_9.0.2
-        fldl      32(%esp)
-        fmull     40(%esp)
-        testl     $1, %eax
-        jne       .L_2TAG_PACKET_10.0.2
-        testl     $2, %eax
-        jne       .L_2TAG_PACKET_11.0.2
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_9.0.2:
-        fldl      32(%esp)
-        faddl     40(%esp)
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_10.0.2:
-        fstpl     40(%esp)
-        fldl      32(%esp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_11.0.2:
-        fstpl     32(%esp)
-        fldl      40(%esp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_2.0.2:
-.L_2TAG_PACKET_7.0.2:
-        movl      96(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(hypot)
-# -- End  hypot
-
-# Start file scope ASM
-ALIAS_SYMBOL(hypotl, hypot);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	4294967295
-	.long	2147483647
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	2146435072
-	.long	0
-	.long	2146435072
-	.type	static_const_table,@object
-	.size	static_const_table,32
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_log10.S b/libm/x86/e_log10.S
deleted file mode 100644
index 473cea3..0000000
--- a/libm/x86/e_log10.S
+++ /dev/null
@@ -1,795 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//    Let x=2^k * mx, mx in [1,2)
-//
-//    Get B~1/mx based on the output of rcpss instruction (B0)
-//    B = int((B0*LH*2^7+0.5))/2^7
-//    LH is a short approximation for log10(e)
-//
-//    Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
-//
-//    Result:  k*log10(2) - log(B) + p(r)
-//             p(r) is a degree 7 polynomial
-//             -log(B) read from data table (high, low parts)
-//             Result is formed from high and low parts
-//
-// Special cases:
-//  log10(0) = -INF with divide-by-zero exception raised                                           
-//  log10(1) = +0
-//  log10(x) = NaN with invalid exception raised if x < -0, including -INF
-//  log10(+INF) = +INF
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  log10
-ENTRY(log10)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 40(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        xorpd     %xmm2, %xmm2
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm2
-        movl      $1054736384, %ecx
-        movd      %ecx, %xmm7
-        xorpd     %xmm3, %xmm3
-        movl      $30704, %edx
-        pinsrw    $3, %edx, %xmm3
-        movsd     112(%esp), %xmm0
-        movapd    %xmm0, %xmm1
-        movl      $32768, %edx
-        movd      %edx, %xmm4
-        movapd    2128(%ebx), %xmm5
-        pextrw    $3, %xmm0, %eax
-        orpd      %xmm2, %xmm0
-        movl      $16352, %ecx
-        psllq     $5, %xmm0
-        movsd     2144(%ebx), %xmm2
-        psrlq     $34, %xmm0
-        rcpss     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $78, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        subl      $16, %eax
-        cmpl      $32736, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-.L_2TAG_PACKET_1.0.2:
-        mulss     %xmm7, %xmm0
-        orpd      %xmm3, %xmm1
-        andpd     %xmm1, %xmm5
-        paddd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm1
-        movd      %xmm0, %edx
-        psllq     $29, %xmm0
-        andpd     %xmm6, %xmm0
-        andl      $32752, %eax
-        subl      %ecx, %eax
-        cvtsi2sdl %eax, %xmm7
-        mulpd     %xmm0, %xmm5
-        mulsd     %xmm0, %xmm1
-        movsd     2064(%ebx), %xmm6
-        movapd    2080(%ebx), %xmm3
-        subsd     %xmm2, %xmm5
-        andl      $16711680, %edx
-        shrl      $12, %edx
-        movapd    -1504(%ebx,%edx), %xmm0
-        movapd    2096(%ebx), %xmm4
-        addsd     %xmm5, %xmm1
-        movapd    2112(%ebx), %xmm2
-        mulsd     %xmm7, %xmm6
-        pshufd    $68, %xmm1, %xmm5
-        mulsd     2072(%ebx), %xmm7
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm6, %xmm0
-        mulpd     %xmm5, %xmm4
-        movsd     2152(%ebx), %xmm6
-        mulpd     %xmm5, %xmm5
-        addpd     %xmm2, %xmm4
-        mulpd     %xmm5, %xmm3
-        pshufd    $228, %xmm0, %xmm2
-        addsd     %xmm1, %xmm0
-        mulsd     %xmm1, %xmm4
-        subsd     %xmm0, %xmm2
-        mulsd     %xmm1, %xmm6
-        addsd     %xmm2, %xmm1
-        pshufd    $238, %xmm0, %xmm2
-        mulsd     %xmm5, %xmm5
-        addsd     %xmm2, %xmm7
-        addsd     %xmm6, %xmm1
-        addpd     %xmm3, %xmm4
-        addsd     %xmm7, %xmm1
-        mulpd     %xmm5, %xmm4
-        addsd     %xmm4, %xmm1
-        pshufd    $238, %xmm4, %xmm5
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_0.0.2:
-        movsd     112(%esp), %xmm0
-        movapd    %xmm0, %xmm1
-        addl      $16, %eax
-        cmpl      $32768, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        cmpl      $16, %eax
-        jb        .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_5.0.2:
-        addsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_6.0.2:
-        ja        .L_2TAG_PACKET_5.0.2
-        cmpl      $0, %edx
-        ja        .L_2TAG_PACKET_5.0.2
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_3.0.2:
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        addl      %ecx, %ecx
-        cmpl      $-2097152, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_7.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %eax
-        pinsrw    $3, %eax, %xmm1
-        movl      $9, %edx
-        mulsd     %xmm1, %xmm0
-.L_2TAG_PACKET_9.0.2:
-        movsd     %xmm0, (%esp)
-        movsd     112(%esp), %xmm0
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_10.0.2
-.L_2TAG_PACKET_8.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        divsd     %xmm1, %xmm0
-        movl      $8, %edx
-        jmp       .L_2TAG_PACKET_9.0.2
-.L_2TAG_PACKET_4.0.2:
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_8.0.2
-        xorpd     %xmm1, %xmm1
-        movl      $18416, %eax
-        pinsrw    $3, %eax, %xmm1
-        mulsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm2
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm2
-        movapd    %xmm0, %xmm1
-        pextrw    $3, %xmm0, %eax
-        orpd      %xmm2, %xmm0
-        movl      $18416, %ecx
-        psllq     $5, %xmm0
-        movsd     2144(%ebx), %xmm2
-        psrlq     $34, %xmm0
-        rcpss     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $78, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        movsd     %xmm0, 24(%esp)
-        fldl      24(%esp)
-.L_2TAG_PACKET_10.0.2:
-        movl      40(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(log10)
-# -- End  log10
-
-# Start file scope ASM
-ALIAS_SYMBOL(log10l, log10);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	1352628224
-	.long	1070810131
-	.long	521319256
-	.long	1025503025
-	.long	2150839296
-	.long	1070801944
-	.long	3329350096
-	.long	3170190015
-	.long	1360613376
-	.long	1070793794
-	.long	2024059075
-	.long	1024991594
-	.long	1875350528
-	.long	1070785680
-	.long	2163882141
-	.long	3163564137
-	.long	2312126464
-	.long	1070777602
-	.long	1975711076
-	.long	1023674196
-	.long	1306336256
-	.long	1070769560
-	.long	3524899523
-	.long	3170508164
-	.long	1806334976
-	.long	1070761553
-	.long	4254777025
-	.long	1025238739
-	.long	2483193856
-	.long	1070753581
-	.long	3800671317
-	.long	3172916830
-	.long	2025350144
-	.long	1070745644
-	.long	1731514745
-	.long	1025501083
-	.long	3433285632
-	.long	1070737741
-	.long	2551857336
-	.long	3169662186
-	.long	1134317568
-	.long	1070729873
-	.long	3426297655
-	.long	3172637891
-	.long	2457152512
-	.long	1070722038
-	.long	63549415
-	.long	1025415416
-	.long	1861803008
-	.long	1070714237
-	.long	1910171636
-	.long	1023977580
-	.long	2414140416
-	.long	1070706469
-	.long	4002514337
-	.long	3170841618
-	.long	2900726784
-	.long	1070698734
-	.long	3268064083
-	.long	1022459609
-	.long	2123517952
-	.long	1070691032
-	.long	1767031218
-	.long	1022448156
-	.long	3194569728
-	.long	1070683362
-	.long	3402332618
-	.long	3171671160
-	.long	650882048
-	.long	1070675725
-	.long	4146023905
-	.long	3171023038
-	.long	1928988672
-	.long	1070668119
-	.long	1438617867
-	.long	1016360491
-	.long	1594908672
-	.long	1070660545
-	.long	971389377
-	.long	1024763979
-	.long	2818746368
-	.long	1070653002
-	.long	3555925341
-	.long	3172434821
-	.long	194584576
-	.long	1070645491
-	.long	943919215
-	.long	3172950063
-	.long	1215096832
-	.long	1070638010
-	.long	2283358588
-	.long	1022335098
-	.long	501519360
-	.long	1070630560
-	.long	480904295
-	.long	1024437959
-	.long	1278266368
-	.long	1070623140
-	.long	2755806066
-	.long	3172342012
-	.long	2487812096
-	.long	1070615750
-	.long	2489653202
-	.long	3172481099
-	.long	3085451264
-	.long	1070608390
-	.long	3759184951
-	.long	3172574892
-	.long	2039090176
-	.long	1070601060
-	.long	1361176676
-	.long	3172355319
-	.long	953057280
-	.long	1070591423
-	.long	1176587546
-	.long	3166422018
-	.long	3370524672
-	.long	1070576879
-	.long	3669570051
-	.long	1025376630
-	.long	749742080
-	.long	1070562394
-	.long	707700964
-	.long	3170814058
-	.long	4008353792
-	.long	1070547965
-	.long	3247327652
-	.long	1022431400
-	.long	2612455424
-	.long	1070533594
-	.long	2453457344
-	.long	3172322969
-	.long	3230920704
-	.long	1070519279
-	.long	1296781801
-	.long	1025115335
-	.long	3965253632
-	.long	1070505020
-	.long	373075289
-	.long	1017938528
-	.long	2593157120
-	.long	1070476669
-	.long	1068054086
-	.long	1021616576
-	.long	925962240
-	.long	1070448537
-	.long	850121213
-	.long	1023928989
-	.long	1732556800
-	.long	1070420620
-	.long	1305206740
-	.long	3172665570
-	.long	3815630848
-	.long	1070392915
-	.long	192642943
-	.long	3172699907
-	.long	2001758208
-	.long	1070365420
-	.long	2820786683
-	.long	1024704867
-	.long	16746496
-	.long	1070338131
-	.long	1399573110
-	.long	3171372773
-	.long	1886492672
-	.long	1070311044
-	.long	3621428075
-	.long	3172974358
-	.long	3338196992
-	.long	1070284157
-	.long	3793882035
-	.long	1025124701
-	.long	381769728
-	.long	1070257468
-	.long	3877933342
-	.long	3170195490
-	.long	2186491904
-	.long	1070230972
-	.long	1838687089
-	.long	1017927292
-	.long	1008330752
-	.long	1070204668
-	.long	2228321664
-	.long	1025352196
-	.long	2247065600
-	.long	1070178552
-	.long	1413900906
-	.long	3170902532
-	.long	2964070400
-	.long	1070152622
-	.long	3590454629
-	.long	1025016844
-	.long	465154048
-	.long	1070126876
-	.long	2079688550
-	.long	3172268183
-	.long	883615744
-	.long	1070101310
-	.long	989244452
-	.long	3171900485
-	.long	1993768960
-	.long	1070075922
-	.long	1124327841
-	.long	3172964992
-	.long	1794471936
-	.long	1070050710
-	.long	1140575046
-	.long	1022673726
-	.long	2797932544
-	.long	1070025671
-	.long	1894836933
-	.long	3172544059
-	.long	3433797632
-	.long	1070000803
-	.long	3221831166
-	.long	3171921685
-	.long	2338371584
-	.long	1069976104
-	.long	3732461053
-	.long	3164513518
-	.long	2644013056
-	.long	1069951571
-	.long	2519460462
-	.long	3172548740
-	.long	3383814144
-	.long	1069927202
-	.long	2290997657
-	.long	1025499649
-	.long	3781380096
-	.long	1069902995
-	.long	380479405
-	.long	1025184136
-	.long	3245785088
-	.long	1069878948
-	.long	1096398261
-	.long	3169885192
-	.long	1366712320
-	.long	1069855059
-	.long	2218343715
-	.long	3170281628
-	.long	2204717056
-	.long	1069831325
-	.long	2668334011
-	.long	1025264524
-	.long	1401772032
-	.long	1069807745
-	.long	4103993159
-	.long	1022925721
-	.long	3356721152
-	.long	1069784316
-	.long	3573790772
-	.long	3172186527
-	.long	4041148416
-	.long	1069761037
-	.long	4027691910
-	.long	3171276990
-	.long	3880151040
-	.long	1069737906
-	.long	4087118786
-	.long	3172710734
-	.long	3453364224
-	.long	1069714921
-	.long	99014299
-	.long	3172003077
-	.long	3491092480
-	.long	1069692080
-	.long	3801836701
-	.long	3172989287
-	.long	575580160
-	.long	1069669382
-	.long	1920406012
-	.long	3170874125
-	.long	22282240
-	.long	1069646824
-	.long	964193370
-	.long	1019363159
-	.long	2991429632
-	.long	1069624404
-	.long	3372589890
-	.long	1023425053
-	.long	2189645824
-	.long	1069602122
-	.long	2610503872
-	.long	1023652442
-	.long	3341467648
-	.long	1069579975
-	.long	1190292004
-	.long	1022425665
-	.long	3711293440
-	.long	1069557962
-	.long	1104795356
-	.long	1023625829
-	.long	1380401152
-	.long	1069524644
-	.long	1156998217
-	.long	1025100499
-	.long	765710336
-	.long	1069481144
-	.long	1736649113
-	.long	1024999439
-	.long	849412096
-	.long	1069437902
-	.long	2618178330
-	.long	3170853629
-	.long	1433104384
-	.long	1069394915
-	.long	43477267
-	.long	3170378811
-	.long	2548596736
-	.long	1069352180
-	.long	3967367063
-	.long	1025246584
-	.long	157577216
-	.long	1069309695
-	.long	100402533
-	.long	3172825502
-	.long	3326238720
-	.long	1069267455
-	.long	1176892909
-	.long	1025464099
-	.long	4155494400
-	.long	1069225459
-	.long	3713707617
-	.long	3172630046
-	.long	3545804800
-	.long	1069183704
-	.long	857007315
-	.long	1024965777
-	.long	2602520576
-	.long	1069142187
-	.long	2588758347
-	.long	1022463131
-	.long	2631196672
-	.long	1069100905
-	.long	2118424235
-	.long	1022490989
-	.long	838135808
-	.long	1069059856
-	.long	4117002727
-	.long	1024874520
-	.long	3210903552
-	.long	1069019036
-	.long	650070125
-	.long	3172012966
-	.long	3039211520
-	.long	1068978444
-	.long	438055812
-	.long	1017743757
-	.long	2385633280
-	.long	1068938077
-	.long	3011990369
-	.long	3171312044
-	.long	3491618816
-	.long	1068897932
-	.long	712813818
-	.long	3172720400
-	.long	183644160
-	.long	1068858008
-	.long	4287006742
-	.long	1022379728
-	.long	3639214080
-	.long	1068818300
-	.long	353762279
-	.long	3172980009
-	.long	3728416768
-	.long	1068778808
-	.long	1851367730
-	.long	1025486574
-	.long	3370094592
-	.long	1068739529
-	.long	4046594913
-	.long	3172567047
-	.long	1348407296
-	.long	1068700461
-	.long	143189675
-	.long	1025397632
-	.long	899403776
-	.long	1068661601
-	.long	3753687842
-	.long	3170772772
-	.long	1117708288
-	.long	1068622947
-	.long	1857340812
-	.long	3170782678
-	.long	1248276480
-	.long	1068584497
-	.long	1289858203
-	.long	1025222289
-	.long	683237376
-	.long	1068546249
-	.long	2356679608
-	.long	3171629170
-	.long	3253764096
-	.long	1068508200
-	.long	3267136556
-	.long	1018554987
-	.long	94478336
-	.long	1068441756
-	.long	1927868814
-	.long	3169378180
-	.long	3233144832
-	.long	1068366445
-	.long	2682188854
-	.long	1023964004
-	.long	2940297216
-	.long	1068291522
-	.long	275301289
-	.long	1023944679
-	.long	3677708288
-	.long	1068216982
-	.long	302658771
-	.long	1024465567
-	.long	1576968192
-	.long	1068142822
-	.long	3672035940
-	.long	3172254610
-	.long	1614069760
-	.long	1068069037
-	.long	480052905
-	.long	3172692062
-	.long	424435712
-	.long	1067995624
-	.long	2207869657
-	.long	3170965436
-	.long	3477782528
-	.long	1067922578
-	.long	2980661858
-	.long	3164990018
-	.long	3598401536
-	.long	1067849897
-	.long	1974393034
-	.long	3171357083
-	.long	2435235840
-	.long	1067777577
-	.long	1385289011
-	.long	1024615823
-	.long	1867333632
-	.long	1067705614
-	.long	3442236633
-	.long	1025334384
-	.long	3999301632
-	.long	1067634004
-	.long	3506472073
-	.long	1025132546
-	.long	2566971392
-	.long	1067562745
-	.long	1425757592
-	.long	3172358463
-	.long	112943104
-	.long	1067491833
-	.long	1693407156
-	.long	3172426603
-	.long	3079929856
-	.long	1067392159
-	.long	3999942455
-	.long	1018549369
-	.long	2443837440
-	.long	1067251701
-	.long	974534460
-	.long	1023963412
-	.long	359366656
-	.long	1067111917
-	.long	2204915018
-	.long	1013514416
-	.long	3564519424
-	.long	1066972799
-	.long	3977441659
-	.long	3170879860
-	.long	2011086848
-	.long	1066834343
-	.long	590145514
-	.long	1025390011
-	.long	3216982016
-	.long	1066696541
-	.long	3629120110
-	.long	1024330313
-	.long	2194128896
-	.long	1066559388
-	.long	2367098512
-	.long	3172260338
-	.long	2916220928
-	.long	1066422877
-	.long	2262431886
-	.long	1021229446
-	.long	2263941120
-	.long	1066172214
-	.long	3118507287
-	.long	1021484970
-	.long	3076292608
-	.long	1065901726
-	.long	1411737803
-	.long	3172957147
-	.long	1186136064
-	.long	1065632488
-	.long	3109349337
-	.long	1025397383
-	.long	3085303808
-	.long	1065364487
-	.long	584715031
-	.long	3172596519
-	.long	1821048832
-	.long	1064842211
-	.long	2182246895
-	.long	3172536214
-	.long	697368576
-	.long	1064311094
-	.long	3157561765
-	.long	3172716357
-	.long	894042112
-	.long	1063260131
-	.long	3237958154
-	.long	3172587292
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1352628224
-	.long	1066615827
-	.long	521319256
-	.long	1021308721
-	.long	3248877870
-	.long	1077250164
-	.long	1691676429
-	.long	3221787401
-	.long	945132465
-	.long	3223701783
-	.long	3700831335
-	.long	1073506818
-	.long	2141010593
-	.long	1075227551
-	.long	3698831637
-	.long	3220339442
-	.long	4160749568
-	.long	4294967295
-	.long	0
-	.long	4294959104
-	.long	0
-	.long	1071366144
-	.long	3207479560
-	.long	1062894188
-	.type	static_const_table,@object
-	.size	static_const_table,2160
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/e_sinh.S b/libm/x86/e_sinh.S
deleted file mode 100644
index b9a2930..0000000
--- a/libm/x86/e_sinh.S
+++ /dev/null
@@ -1,1407 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  sinh(x)=(exp(x)-exp(-x))/2
-//
-//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//          L2EH+L2EL (upper 26, lower 53 bits)
-//
-//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
-//                              f=0.b1 b2 ... b7, k integer
-//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
-//  Tp stores the high 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
-//
-//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
-//                       for |x| in [23/64,3*2^7)
-//  e^{-|x|}=2^{-k-f}*2^{-r}
-//
-//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
-//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
-//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)+2^{-k}*Dn
-//
-//  For |x| in [1/8, 3*2^7), sinh(x) is formed as
-//      RN(2^k*Tp-2^{-k}*Tn)+2^k*Tp*P15-2^{-k}*Tn*P`15-2^{-k}*TnL-2^{-k}*Dn+2^k*Dp
-//
-//  For x in (3*2^7, 3*2^8), sign(x)*(e^|x|)/2 is returned, and
-//  the result is checked for overflow.
-//
-//  For |x|<23/64, a Taylor polynomial expansion is used (degree 13)
-//  To reduce rounding errors, the p3*x^3 term is computed as
-//     (p3*xh^3)_high+[(p3*xl*(3*x*xh+xl^2))+(p3*xh^3)_low],
-//  where x=xh+xl, (xh are the leading 17 bits of x), and
-//     (p3*xh^3)_high=RN(x+p3*xh^3)-x
-//  (error bound for polynomial expansion is below 0.51 ulp)
-//
-// Special cases:
-//  sinh(NaN) = quiet NaN, and raise invalid exception
-//  sinh(+/-INF) = +/-INF
-//  sinh(x) = x for subnormals
-//  for finite argument, only sinh(0)=0 is exact
-//  For IEEE double
-//    sinh(x) overflows  for x > 
-//    710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  sinh
-ENTRY(sinh)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 40(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        movsd     4272(%ebx), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     4192(%ebx), %xmm1
-        movsd     4200(%ebx), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     4096(%ebx), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        movl      $32768, %edx
-        andl      %ecx, %edx
-        andl      $32767, %ecx
-        subl      $16343, %ecx
-        cmpl      $177, %ecx
-        jae       .L_2TAG_PACKET_0.0.2
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        shll      $3, %edx
-        orl       %edx, %eax
-        movapd    %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        xorpd     %xmm5, %xmm5
-        subsd     %xmm6, %xmm3
-        movapd    4112(%ebx), %xmm4
-        addsd     %xmm1, %xmm2
-        movapd    4128(%ebx), %xmm6
-        subsd     %xmm3, %xmm7
-        movl      $32704, %edx
-        pinsrw    $3, %edx, %xmm5
-        movapd    4144(%ebx), %xmm1
-        addsd     %xmm7, %xmm2
-        movl      $127, %edx
-        andl      %eax, %edx
-        addl      %edx, %edx
-        shrl      $3, %eax
-        andl      $65520, %eax
-        addl      $16352, %eax
-        xorpd     %xmm0, %xmm0
-        cmpl      $161, %ecx
-        jae       .L_2TAG_PACKET_1.0.2
-        pshufd    $68, %xmm5, %xmm5
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        psubw     %xmm0, %xmm5
-        mulpd     (%ebx,%edx,8), %xmm0
-        mulpd     2048(%ebx,%edx,8), %xmm5
-        pshufd    $68, %xmm2, %xmm3
-        movapd    4160(%ebx), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        mulpd     %xmm3, %xmm3
-        mulpd     %xmm2, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulpd     4176(%ebx), %xmm2
-        mulpd     %xmm3, %xmm1
-        mulpd     %xmm3, %xmm7
-        mulpd     %xmm3, %xmm4
-        mulpd     %xmm3, %xmm1
-        addpd     %xmm7, %xmm6
-        movapd    %xmm0, %xmm7
-        addpd     %xmm1, %xmm4
-        shufpd    $0, %xmm5, %xmm7
-        subpd     %xmm5, %xmm0
-        mulpd     %xmm7, %xmm2
-        addpd     %xmm6, %xmm4
-        subsd     %xmm0, %xmm7
-        mulpd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        subsd     %xmm5, %xmm7
-        addpd     %xmm2, %xmm4
-        addsd     %xmm6, %xmm7
-        pshufd    $238, %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_1.0.2:
-        subl      $16352, %eax
-        movl      %eax, %ecx
-        andl      $32752, %eax
-        shrl      $1, %eax
-        andl      $65520, %eax
-        subl      %eax, %ecx
-        addl      $16352, %eax
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        mulpd     (%ebx,%edx,8), %xmm0
-        pshufd    $68, %xmm2, %xmm3
-        movsd     4160(%ebx), %xmm7
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm2, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     4176(%ebx), %xmm2
-        mulsd     %xmm3, %xmm1
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm3, %xmm4
-        addl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm5
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm4
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm6, %xmm4
-        mulsd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm6, %xmm4
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm5, %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        movl      $127, %edx
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_3.0.2
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_0.0.2:
-        addl      $16343, %ecx
-        cmpl      $16343, %ecx
-        ja        .L_2TAG_PACKET_4.0.2
-        cmpl      $15856, %ecx
-        jb        .L_2TAG_PACKET_5.0.2
-        movapd    4208(%ebx), %xmm1
-        pshufd    $68, %xmm0, %xmm6
-        mulpd     %xmm5, %xmm5
-        movapd    4224(%ebx), %xmm2
-        pshufd    $68, %xmm0, %xmm7
-        movapd    4240(%ebx), %xmm3
-        pshufd    $68, %xmm0, %xmm4
-        andpd     4256(%ebx), %xmm6
-        mulpd     %xmm5, %xmm1
-        mulsd     %xmm5, %xmm2
-        subpd     %xmm6, %xmm4
-        mulpd     %xmm5, %xmm7
-        addpd     %xmm3, %xmm1
-        pshufd    $68, %xmm6, %xmm3
-        mulpd     %xmm5, %xmm5
-        mulsd     %xmm7, %xmm2
-        mulpd     %xmm7, %xmm1
-        pshufd    $68, %xmm0, %xmm7
-        mulsd     %xmm6, %xmm6
-        addsd     %xmm7, %xmm7
-        mulsd     %xmm4, %xmm4
-        mulpd     %xmm5, %xmm1
-        addsd     %xmm0, %xmm7
-        mulsd     %xmm3, %xmm6
-        mulsd     %xmm3, %xmm7
-        pshufd    $238, %xmm1, %xmm3
-        mulsd     %xmm5, %xmm1
-        pshufd    $238, %xmm4, %xmm5
-        addsd     %xmm2, %xmm3
-        pshufd    $238, %xmm2, %xmm2
-        addsd     %xmm4, %xmm7
-        movapd    %xmm0, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     %xmm5, %xmm7
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm2, %xmm7
-        subsd     %xmm0, %xmm4
-        addsd     %xmm7, %xmm1
-        addsd     %xmm4, %xmm6
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_5.0.2:
-        cmpl      $16, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        movapd    %xmm0, %xmm1
-        mulsd     %xmm1, %xmm1
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm2, %xmm2
-        movl      $17392, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        xorpd     %xmm3, %xmm3
-        movl      $15344, %edx
-        pinsrw    $3, %edx, %xmm3
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm3, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_4.0.2:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_7.0.2
-        xorpd     %xmm0, %xmm0
-        movl      $32736, %eax
-        pinsrw    $3, %eax, %xmm0
-        orl       %edx, %eax
-        pinsrw    $3, %eax, %xmm1
-        mulsd     %xmm1, %xmm0
-        movl      $127, %edx
-.L_2TAG_PACKET_3.0.2:
-        movsd     %xmm0, (%esp)
-        movsd     112(%esp), %xmm0
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_7.0.2:
-        xorpd     %xmm1, %xmm1
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm1
-        andnpd    %xmm0, %xmm1
-        mulsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_2.0.2:
-        movsd     %xmm0, 24(%esp)
-        fldl      24(%esp)
-.L_2TAG_PACKET_8.0.2:
-        movl      40(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(sinh)
-# -- End  sinh
-
-# Start file scope ASM
-ALIAS_SYMBOL(sinhl, sinh);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	2851812149
-	.long	1072698941
-	.long	2595802551
-	.long	1016815913
-	.long	1048019041
-	.long	1072704666
-	.long	1398474845
-	.long	3161559171
-	.long	3899555717
-	.long	1072710421
-	.long	427280750
-	.long	3163595548
-	.long	3541402996
-	.long	1072716208
-	.long	2759177317
-	.long	1015903202
-	.long	702412510
-	.long	1072722027
-	.long	3803266087
-	.long	3163328991
-	.long	410360776
-	.long	1072727877
-	.long	1269990655
-	.long	1013024446
-	.long	3402036099
-	.long	1072733758
-	.long	405889334
-	.long	1016154232
-	.long	1828292879
-	.long	1072739672
-	.long	1255956747
-	.long	1016636974
-	.long	728909815
-	.long	1072745618
-	.long	383930225
-	.long	1016078044
-	.long	852742562
-	.long	1072751596
-	.long	667253586
-	.long	1010842135
-	.long	2952712987
-	.long	1072757606
-	.long	3293494651
-	.long	3161168877
-	.long	3490863953
-	.long	1072763649
-	.long	960797498
-	.long	3163997456
-	.long	3228316108
-	.long	1072769725
-	.long	3010241991
-	.long	3159471380
-	.long	2930322912
-	.long	1072775834
-	.long	2599499422
-	.long	3163762623
-	.long	3366293073
-	.long	1072781976
-	.long	3119426314
-	.long	1015169130
-	.long	1014845819
-	.long	1072788152
-	.long	3117910646
-	.long	3162607681
-	.long	948735466
-	.long	1072794361
-	.long	3516338028
-	.long	3163623459
-	.long	3949972341
-	.long	1072800603
-	.long	2068408548
-	.long	1015962444
-	.long	2214878420
-	.long	1072806880
-	.long	892270087
-	.long	3164164998
-	.long	828946858
-	.long	1072813191
-	.long	10642492
-	.long	1016988014
-	.long	586995997
-	.long	1072819536
-	.long	41662348
-	.long	3163676568
-	.long	2288159958
-	.long	1072825915
-	.long	2169144469
-	.long	1015924597
-	.long	2440944790
-	.long	1072832329
-	.long	2492769774
-	.long	1015196030
-	.long	1853186616
-	.long	1072838778
-	.long	3066496371
-	.long	1016705150
-	.long	1337108031
-	.long	1072845262
-	.long	3203724452
-	.long	1015726421
-	.long	1709341917
-	.long	1072851781
-	.long	2571168217
-	.long	1015201075
-	.long	3790955393
-	.long	1072858335
-	.long	2352942462
-	.long	3164228666
-	.long	4112506593
-	.long	1072864925
-	.long	2947355221
-	.long	1015419624
-	.long	3504003472
-	.long	1072871551
-	.long	3594001060
-	.long	3158379228
-	.long	2799960843
-	.long	1072878213
-	.long	1423655381
-	.long	1016070727
-	.long	2839424854
-	.long	1072884911
-	.long	1171596163
-	.long	1014090255
-	.long	171030293
-	.long	1072891646
-	.long	3526460132
-	.long	1015477354
-	.long	4232894513
-	.long	1072898416
-	.long	2383938684
-	.long	1015717095
-	.long	2992903935
-	.long	1072905224
-	.long	2218154406
-	.long	1016276769
-	.long	1603444721
-	.long	1072912069
-	.long	1548633640
-	.long	3163249902
-	.long	926591435
-	.long	1072918951
-	.long	3208833762
-	.long	3163962090
-	.long	1829099622
-	.long	1072925870
-	.long	1016661181
-	.long	3164509581
-	.long	887463927
-	.long	1072932827
-	.long	3596744163
-	.long	3161842742
-	.long	3272845541
-	.long	1072939821
-	.long	928852419
-	.long	3164536824
-	.long	1276261410
-	.long	1072946854
-	.long	300981948
-	.long	1015732745
-	.long	78413852
-	.long	1072953925
-	.long	4183226867
-	.long	3164065827
-	.long	569847338
-	.long	1072961034
-	.long	472945272
-	.long	3160339305
-	.long	3645941911
-	.long	1072968181
-	.long	3814685081
-	.long	3162621917
-	.long	1617004845
-	.long	1072975368
-	.long	82804944
-	.long	1011391354
-	.long	3978100823
-	.long	1072982593
-	.long	3513027190
-	.long	1016894539
-	.long	3049340112
-	.long	1072989858
-	.long	3062915824
-	.long	1014219171
-	.long	4040676318
-	.long	1072997162
-	.long	4090609238
-	.long	1016712034
-	.long	3577096743
-	.long	1073004506
-	.long	2951496418
-	.long	1014842263
-	.long	2583551245
-	.long	1073011890
-	.long	3161094195
-	.long	1016655067
-	.long	1990012071
-	.long	1073019314
-	.long	3529070563
-	.long	3163861769
-	.long	2731501122
-	.long	1073026778
-	.long	1774031855
-	.long	3163518597
-	.long	1453150082
-	.long	1073034283
-	.long	498154669
-	.long	3162536638
-	.long	3395129871
-	.long	1073041828
-	.long	4025345435
-	.long	3163383964
-	.long	917841882
-	.long	1073049415
-	.long	18715565
-	.long	1016707884
-	.long	3566716925
-	.long	1073057042
-	.long	1536826856
-	.long	1015191009
-	.long	3712504873
-	.long	1073064711
-	.long	88491949
-	.long	1016476236
-	.long	2321106615
-	.long	1073072422
-	.long	2171176610
-	.long	1010584347
-	.long	363667784
-	.long	1073080175
-	.long	813753950
-	.long	1016833785
-	.long	3111574537
-	.long	1073087969
-	.long	2606161479
-	.long	3163808322
-	.long	2956612997
-	.long	1073095806
-	.long	2118169751
-	.long	3163784129
-	.long	885834528
-	.long	1073103686
-	.long	1973258547
-	.long	3163310140
-	.long	2186617381
-	.long	1073111608
-	.long	2270764084
-	.long	3164321289
-	.long	3561793907
-	.long	1073119573
-	.long	1157054053
-	.long	1012938926
-	.long	1719614413
-	.long	1073127582
-	.long	330458198
-	.long	3164331316
-	.long	1963711167
-	.long	1073135634
-	.long	1744767757
-	.long	3161622870
-	.long	1013258799
-	.long	1073143730
-	.long	1748797611
-	.long	3161177658
-	.long	4182873220
-	.long	1073151869
-	.long	629542646
-	.long	3163044879
-	.long	3907805044
-	.long	1073160053
-	.long	2257091225
-	.long	3162598983
-	.long	1218806132
-	.long	1073168282
-	.long	1818613052
-	.long	3163597017
-	.long	1447192521
-	.long	1073176555
-	.long	1462857171
-	.long	3163563097
-	.long	1339972927
-	.long	1073184873
-	.long	167908909
-	.long	1016620728
-	.long	1944781191
-	.long	1073193236
-	.long	3993278767
-	.long	3162772855
-	.long	19972402
-	.long	1073201645
-	.long	3507899862
-	.long	1017057868
-	.long	919555682
-	.long	1073210099
-	.long	3121969534
-	.long	1013996802
-	.long	1413356050
-	.long	1073218599
-	.long	1651349291
-	.long	3163716742
-	.long	2571947539
-	.long	1073227145
-	.long	3558159064
-	.long	3164425245
-	.long	1176749997
-	.long	1073235738
-	.long	2738998779
-	.long	3163084420
-	.long	2604962541
-	.long	1073244377
-	.long	2614425274
-	.long	3164587768
-	.long	3649726105
-	.long	1073253063
-	.long	4085036346
-	.long	1016698050
-	.long	1110089947
-	.long	1073261797
-	.long	1451641639
-	.long	1016523249
-	.long	380978316
-	.long	1073270578
-	.long	854188970
-	.long	3161511262
-	.long	2568320822
-	.long	1073279406
-	.long	2732824428
-	.long	1015401491
-	.long	194117574
-	.long	1073288283
-	.long	777528612
-	.long	3164460665
-	.long	2966275557
-	.long	1073297207
-	.long	2176155324
-	.long	3160891335
-	.long	3418903055
-	.long	1073306180
-	.long	2527457337
-	.long	3161869180
-	.long	2682146384
-	.long	1073315202
-	.long	2082178513
-	.long	3164411995
-	.long	1892288442
-	.long	1073324273
-	.long	2446255666
-	.long	3163648957
-	.long	2191782032
-	.long	1073333393
-	.long	2960257726
-	.long	1014791238
-	.long	434316067
-	.long	1073342563
-	.long	2028358766
-	.long	1014506698
-	.long	2069751141
-	.long	1073351782
-	.long	1562170675
-	.long	3163773257
-	.long	3964284211
-	.long	1073361051
-	.long	2111583915
-	.long	1016475740
-	.long	2990417245
-	.long	1073370371
-	.long	3683467745
-	.long	3164417902
-	.long	321958744
-	.long	1073379742
-	.long	3401933767
-	.long	1016843134
-	.long	1434058175
-	.long	1073389163
-	.long	251133233
-	.long	1016134345
-	.long	3218338682
-	.long	1073398635
-	.long	3404164304
-	.long	3163525684
-	.long	2572866477
-	.long	1073408159
-	.long	878562433
-	.long	1016570317
-	.long	697153126
-	.long	1073417735
-	.long	1283515429
-	.long	3164331765
-	.long	3092190715
-	.long	1073427362
-	.long	814012168
-	.long	3160571998
-	.long	2380618042
-	.long	1073437042
-	.long	3149557219
-	.long	3164369375
-	.long	4076559943
-	.long	1073446774
-	.long	2119478331
-	.long	3161806927
-	.long	815859274
-	.long	1073456560
-	.long	240396590
-	.long	3164536019
-	.long	2420883922
-	.long	1073466398
-	.long	2049810052
-	.long	1015168464
-	.long	1540824585
-	.long	1073476290
-	.long	1064017011
-	.long	3164536266
-	.long	3716502172
-	.long	1073486235
-	.long	2303740125
-	.long	1015091301
-	.long	1610600570
-	.long	1073496235
-	.long	3766732298
-	.long	1016808759
-	.long	777507147
-	.long	1073506289
-	.long	4282924205
-	.long	1016236109
-	.long	2483480501
-	.long	1073516397
-	.long	1216371780
-	.long	1014082748
-	.long	3706687593
-	.long	1073526560
-	.long	3521726940
-	.long	1014301643
-	.long	1432208378
-	.long	1073536779
-	.long	1401068914
-	.long	3163412539
-	.long	1242007932
-	.long	1073547053
-	.long	1132034716
-	.long	3164388407
-	.long	135105010
-	.long	1073557383
-	.long	1906148728
-	.long	3164424315
-	.long	3707479175
-	.long	1073567768
-	.long	3613079303
-	.long	1015213314
-	.long	382305176
-	.long	1073578211
-	.long	2347622376
-	.long	3163627201
-	.long	64696965
-	.long	1073588710
-	.long	1768797490
-	.long	1016865536
-	.long	4076975200
-	.long	1073599265
-	.long	2029000899
-	.long	1016257111
-	.long	863738719
-	.long	1073609879
-	.long	1326992220
-	.long	3163661773
-	.long	351641897
-	.long	1073620550
-	.long	2172261526
-	.long	3164059175
-	.long	3884662774
-	.long	1073631278
-	.long	2158611599
-	.long	1015258761
-	.long	4224142467
-	.long	1073642065
-	.long	3389820386
-	.long	1016255778
-	.long	2728693978
-	.long	1073652911
-	.long	396109971
-	.long	3164511267
-	.long	764307441
-	.long	1073663816
-	.long	3021057420
-	.long	3164378099
-	.long	3999357479
-	.long	1073674779
-	.long	2258941616
-	.long	1016973300
-	.long	929806999
-	.long	1073685803
-	.long	3205336643
-	.long	1016308133
-	.long	1533953344
-	.long	1073696886
-	.long	769171851
-	.long	1016714209
-	.long	2912730644
-	.long	1073708029
-	.long	3490067722
-	.long	3164453650
-	.long	2174652632
-	.long	1073719233
-	.long	4087714590
-	.long	1015498835
-	.long	730821105
-	.long	1073730498
-	.long	2523232743
-	.long	1013115764
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.long	3607404736
-	.long	1044146952
-	.long	3607404736
-	.long	3191630600
-	.long	4277811695
-	.long	1063661122
-	.long	4277811695
-	.long	3211144770
-	.long	2140175755
-	.long	1033864261
-	.long	2140175755
-	.long	1033864261
-	.long	4289495988
-	.long	1054113747
-	.long	4289495988
-	.long	1054113747
-	.long	4277811695
-	.long	1064709698
-	.long	4277811695
-	.long	1064709698
-	.long	1610612736
-	.long	1080497479
-	.long	4166901572
-	.long	1053077003
-	.long	329805064
-	.long	1038488134
-	.long	2773927730
-	.long	1053236707
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1069897045
-	.long	1744127201
-	.long	1046144581
-	.long	436314137
-	.long	1059717536
-	.long	0
-	.long	4294967280
-	.long	0
-	.long	4294967280
-	.long	4160749568
-	.long	2147483647
-	.type	static_const_table,@object
-	.size	static_const_table,4280
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/floor.S b/libm/x86/floor.S
deleted file mode 100644
index b859736..0000000
--- a/libm/x86/floor.S
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(floor)
-	mov    %esp,%eax
-	and    $0xfffffff8,%eax
-	movsd  0x4(%esp),%xmm0
-	roundsd $0x1,%xmm0,%xmm0
-	movlpd %xmm0,-0x8(%eax)
-	fldl   -0x8(%eax)
-	ret
-END(floor)
-
-ALIAS_SYMBOL(floorl, floor);
diff --git a/libm/x86/floorf.S b/libm/x86/floorf.S
deleted file mode 100644
index 79b9073..0000000
--- a/libm/x86/floorf.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(floorf)
-	movss  0x4(%esp),%xmm0
-	roundss $0x1,%xmm0,%xmm0
-	movss  %xmm0,-0x4(%esp)
-	flds   -0x4(%esp)
-	ret
-END(floorf)
diff --git a/libm/x86/libm_reduce_pi04l.S b/libm/x86/libm_reduce_pi04l.S
deleted file mode 100644
index 25976ea..0000000
--- a/libm/x86/libm_reduce_pi04l.S
+++ /dev/null
@@ -1,3718 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-# -- Begin  __libm_reduce_pi04l
-	.text
-       .align    16,0x90
-	.hidden __libm_reduce_pi04l
-	.globl __libm_reduce_pi04l
-__libm_reduce_pi04l:
-# parameter 1: 8 + %ebp
-# parameter 2: 20 + %ebp
-# parameter 3: 24 + %ebp
-..B1.1:
-        pushl     %ebp
-        movl      %esp, %ebp
-        andl      $-16, %esp
-        pushl     %esi
-        pushl     %edi
-        pushl     %ebx
-        subl      $20, %esp
-        movzwl    16(%ebp), %ebx
-        andl      $32767, %ebx
-        movl      20(%ebp), %eax
-        cmpl      $16413, %ebx
-        movl      24(%ebp), %esi
-        call      ..L2
-..L2:
-        popl      %edi
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%edi), %edi
-        movl      %eax, 4(%esp)
-        jge       ..B1.8
-..B1.2:
-        fldt      8(%ebp)
-        fldl      __4onpi_d@GOTOFF(%edi)
-        fmul      %st(1), %st
-        fstpt     8(%esp)
-        movzwl    16(%esp), %ecx
-        negl      %ecx
-        addl      $30, %ecx
-        movl      12(%esp), %eax
-        shrl      %cl, %eax
-        cmpl      $0, 4(%esp)
-        jne       ..B1.4
-..B1.3:
-        lea       1(%eax), %ecx
-        andl      $-2, %ecx
-        jmp       ..B1.5
-..B1.4:
-        movl      %eax, %ecx
-        addl      4(%esp), %eax
-        movl      %eax, %edx
-        andl      $1, %edx
-        addl      %edx, %ecx
-..B1.5:
-        fldl      _TWO_32H@GOTOFF(%edi)
-        cmpl      $16400, %ebx
-        movl      %ecx, (%esp)
-        fildl     (%esp)
-        jge       ..B1.7
-..B1.6:
-        fldl      _pi04_3d@GOTOFF(%edi)
-        fmul      %st(1), %st
-        fsubrp    %st, %st(3)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fld       %st(2)
-        fadd      %st(1), %st
-        fsubp     %st, %st(1)
-        fld       %st(0)
-        fxch      %st(1)
-        fsubr     %st, %st(3)
-        fldl      8+_pi04_3d@GOTOFF(%edi)
-        fmul      %st(3), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        fsub      %st(2), %st
-        fsubp     %st, %st(1)
-        faddp     %st, %st(3)
-        fldl      16+_pi04_3d@GOTOFF(%edi)
-        fmulp     %st, %st(2)
-        fld       %st(1)
-        fsubr     %st(1), %st
-        fsubr     %st, %st(1)
-        fxch      %st(2)
-        fsubrp    %st, %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        jmp       ..B1.15
-..B1.7:
-        fldl      _pi04_5d@GOTOFF(%edi)
-        fmul      %st(1), %st
-        fsubrp    %st, %st(3)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fld       %st(2)
-        fadd      %st(1), %st
-        fsubp     %st, %st(1)
-        fld       %st(0)
-        fxch      %st(1)
-        fsubr     %st, %st(3)
-        fldl      8+_pi04_5d@GOTOFF(%edi)
-        fmul      %st(3), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        fsub      %st(2), %st
-        fsubp     %st, %st(1)
-        faddp     %st, %st(3)
-        fldl      16+_pi04_5d@GOTOFF(%edi)
-        fmul      %st(2), %st
-        fld       %st(0)
-        fsubr     %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        fsubrp    %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(3)
-        fldl      24+_pi04_5d@GOTOFF(%edi)
-        fmul      %st(2), %st
-        fld       %st(0)
-        fsubr     %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        fsubrp    %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(3)
-        fldl      32+_pi04_5d@GOTOFF(%edi)
-        fmulp     %st, %st(2)
-        fld       %st(1)
-        fsubr     %st(1), %st
-        fsubr     %st, %st(1)
-        fxch      %st(2)
-        fsubrp    %st, %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        jmp       ..B1.15
-..B1.8:
-        fldt      8(%ebp)
-        addl      $-16417, %ebx
-        fmull     _SCALE@GOTOFF(%edi)
-        movl      $-2078209981, %eax
-        imull     %ebx
-        addl      %ebx, %edx
-        movl      %ebx, %ecx
-        sarl      $4, %edx
-        sarl      $31, %ecx
-        subl      %ecx, %edx
-        movl      %edx, %eax
-        shll      $5, %eax
-        fstpt     8(%ebp)
-        fldt      8(%ebp)
-        subl      %edx, %eax
-        movl      $0, 8(%ebp)
-        subl      %eax, %ebx
-        fldt      8(%ebp)
-        cmpl      $17, %ebx
-        fsubr     %st, %st(1)
-        jl        ..B1.10
-..B1.9:
-        lea       (,%edx,8), %eax
-        lea       (%eax,%edx,4), %ecx
-        incl      %edx
-        fldt      __4onpi_31l@GOTOFF(%ecx,%edi)
-        fmul      %st(2), %st
-        fldt      12+__4onpi_31l@GOTOFF(%edi,%ecx)
-        fmul      %st(2), %st
-        fld       %st(0)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fld       %st(1)
-        fadd      %st(1), %st
-        fstpt     8(%esp)
-        andl      $-16777216, 8(%esp)
-        fldt      8(%esp)
-        fsubrp    %st, %st(1)
-        jmp       ..B1.11
-..B1.10:
-        fldl      _zeros@GOTOFF(%edi)
-        fld       %st(0)
-..B1.11:
-        fld       %st(0)
-        lea       (,%edx,8), %eax
-        fld       %st(3)
-        lea       (%eax,%edx,4), %edx
-        fldt      __4onpi_31l@GOTOFF(%edx,%edi)
-        fmul      %st(6), %st
-        movl      %edx, (%esp)
-        fadd      %st, %st(2)
-        fxch      %st(2)
-        fsubr     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fldt      12+__4onpi_31l@GOTOFF(%edx,%edi)
-        fmul      %st, %st(2)
-        fld       %st(2)
-        fadd      %st(2), %st
-        fld       %st(0)
-        fxch      %st(1)
-        fsub      %st, %st(3)
-        fxch      %st(3)
-        fchs      
-        faddp     %st, %st(4)
-        fxch      %st(3)
-        faddp     %st, %st(4)
-        fxch      %st(2)
-        fadd      %st(3), %st
-        fxch      %st(2)
-        fmul      %st(5), %st
-        fadd      %st, %st(2)
-        fld       %st(4)
-        fldt      24+__4onpi_31l@GOTOFF(%edx,%edi)
-        fmul      %st, %st(1)
-        fxch      %st(1)
-        fadd      %st, %st(4)
-        fxch      %st(4)
-        fstpt     8(%esp)
-        movzwl    16(%esp), %ebx
-        andl      $32767, %ebx
-        cmpl      $16415, %ebx
-        jge       ..B1.13
-..B1.12:
-        negl      %ebx
-        addl      $30, %ebx
-        movl      %ebx, %ecx
-        movl      12(%esp), %eax
-        shrl      %cl, %eax
-        shll      %cl, %eax
-        movl      %eax, 12(%esp)
-        movl      $0, 8(%esp)
-        shrl      %cl, %eax
-        jmp       ..B1.14
-..B1.13:
-        negl      %ebx
-        addl      $30, %ebx
-        movl      %ebx, %ecx
-        movl      8(%esp), %edx
-        shrl      %cl, %edx
-        shll      %cl, %edx
-        negl      %ecx
-        movl      12(%esp), %eax
-        shll      %cl, %eax
-        movl      %ebx, %ecx
-        movl      %edx, 8(%esp)
-        shrl      %cl, %edx
-        orl       %edx, %eax
-..B1.14:
-        fldt      8(%esp)
-        addl      4(%esp), %eax
-        fsubrp    %st, %st(3)
-        fmul      %st(6), %st
-        fld       %st(4)
-        movl      %eax, %edx
-        andl      $1, %edx
-        fadd      %st(3), %st
-        movl      (%esp), %ecx
-        fsubr     %st, %st(3)
-        fxch      %st(3)
-        faddp     %st, %st(5)
-        fld       %st(1)
-        fxch      %st(3)
-        faddl     zero_none@GOTOFF(%edi,%edx,8)
-        fadd      %st, %st(3)
-        fsub      %st(3), %st
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(4)
-        fld       %st(2)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(3)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(3)
-        fld       %st(0)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fld       %st(2)
-        fldt      36+__4onpi_31l@GOTOFF(%ecx,%edi)
-        fmul      %st, %st(1)
-        fld       %st(1)
-        fadd      %st(3), %st
-        fsubr     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fld       %st(0)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fld       %st(2)
-        fldt      48+__4onpi_31l@GOTOFF(%ecx,%edi)
-        fmul      %st, %st(1)
-        fld       %st(1)
-        fadd      %st(3), %st
-        fsubr     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fld       %st(3)
-        fxch      %st(2)
-        fmul      %st(5), %st
-        fldt      60+__4onpi_31l@GOTOFF(%ecx,%edi)
-        fmul      %st, %st(3)
-        fxch      %st(3)
-        faddp     %st, %st(1)
-        fld       %st(0)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(3)
-        fld       %st(3)
-        fxch      %st(2)
-        fmul      %st(5), %st
-        fldt      72+__4onpi_31l@GOTOFF(%ecx,%edi)
-        fmul      %st, %st(3)
-        fxch      %st(3)
-        faddp     %st, %st(1)
-        fld       %st(0)
-        fadd      %st(2), %st
-        fsubr     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        faddp     %st, %st(3)
-        fxch      %st(1)
-        fmulp     %st, %st(4)
-        fldt      84+__4onpi_31l@GOTOFF(%edi,%ecx)
-        fmulp     %st, %st(3)
-        fxch      %st(2)
-        faddp     %st, %st(3)
-        fld       %st(2)
-        fadd      %st(2), %st
-        fldl      _TWO_32H@GOTOFF(%edi)
-        fmul      %st(1), %st
-        fadd      %st, %st(1)
-        fsubrp    %st, %st(1)
-        fsubr     %st, %st(2)
-        fxch      %st(3)
-        faddp     %st, %st(2)
-        faddp     %st, %st(1)
-        fldl      _pi04_2d@GOTOFF(%edi)
-        fld       %st(0)
-        fmul      %st(2), %st
-        fxch      %st(2)
-        fadd      %st(3), %st
-        fxch      %st(1)
-        fmulp     %st, %st(3)
-        fmull     8+_pi04_2d@GOTOFF(%edi)
-        faddp     %st, %st(1)
-..B1.15:
-        fldl      _TWO_12H@GOTOFF(%edi)
-        fld       %st(2)
-        fadd      %st(2), %st
-        fmul      %st, %st(1)
-        fstpt     8(%esp)
-        fldt      8(%esp)
-        fadd      %st(1), %st
-        fsubp     %st, %st(1)
-        fstl      (%esi)
-        fsubrp    %st, %st(2)
-        faddp     %st, %st(1)
-        fstpl     8(%esi)
-        addl      $20, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-        .align    16,0x90
-	.type	__libm_reduce_pi04l,@function
-	.size	__libm_reduce_pi04l,.-__libm_reduce_pi04l
-	.data
-# -- End  __libm_reduce_pi04l
-	.section .rodata, "a"
-	.align 8
-	.align 8
-zero_none:
-	.long	0x00000000,0x00000000
-	.long	0x00000000,0xbff00000
-	.type	zero_none,@object
-	.size	zero_none,16
-	.align 4
-__4onpi_d:
-	.long	1841940611
-	.long	1072979760
-	.type	__4onpi_d,@object
-	.size	__4onpi_d,8
-	.align 4
-_TWO_32H:
-	.long	0
-	.long	1106771968
-	.type	_TWO_32H,@object
-	.size	_TWO_32H,8
-	.align 4
-_pi04_3d:
-	.long	1413754112
-	.long	1072243195
-	.long	2563527040
-	.long	1021855384
-	.long	3417685868
-	.long	3118450936
-	.type	_pi04_3d,@object
-	.size	_pi04_3d,24
-	.align 4
-_pi04_5d:
-	.long	1413480448
-	.long	1072243195
-	.long	442499072
-	.long	1036039265
-	.long	771751936
-	.long	999496074
-	.long	622854144
-	.long	963347354
-	.long	1396597664
-	.long	922906692
-	.type	_pi04_5d,@object
-	.size	_pi04_5d,40
-	.align 4
-_SCALE:
-	.long	0
-	.long	845152256
-	.type	_SCALE,@object
-	.size	_SCALE,8
-	.align 4
-_zeros:
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.type	_zeros,@object
-	.size	_zeros,16
-	.align 4
-_pi04_2d:
-	.long	1413480448
-	.long	1072243195
-	.long	442655537
-	.long	1036039265
-	.type	_pi04_2d,@object
-	.size	_pi04_2d,16
-	.align 4
-_TWO_12H:
-	.long	0
-	.long	1085800448
-	.type	_TWO_12H,@object
-	.size	_TWO_12H,8
-	.align 2
-__4onpi_31l:
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	33646
-	.word	41721
-	.word	16600
-	.word	0
-	.word	0
-	.word	0
-	.word	10832
-	.word	40072
-	.word	16567
-	.word	0
-	.word	0
-	.word	0
-	.word	44008
-	.word	65043
-	.word	16537
-	.word	0
-	.word	0
-	.word	0
-	.word	28384
-	.word	64154
-	.word	16505
-	.word	0
-	.word	0
-	.word	0
-	.word	38272
-	.word	56162
-	.word	16472
-	.word	0
-	.word	0
-	.word	0
-	.word	7298
-	.word	51682
-	.word	16445
-	.word	0
-	.word	0
-	.word	0
-	.word	45504
-	.word	65320
-	.word	16409
-	.word	0
-	.word	0
-	.word	0
-	.word	61204
-	.word	44922
-	.word	16382
-	.word	0
-	.word	0
-	.word	0
-	.word	18652
-	.word	50030
-	.word	16351
-	.word	0
-	.word	0
-	.word	0
-	.word	14144
-	.word	59657
-	.word	16318
-	.word	0
-	.word	0
-	.word	0
-	.word	37450
-	.word	47105
-	.word	16290
-	.word	0
-	.word	0
-	.word	0
-	.word	14898
-	.word	56641
-	.word	16259
-	.word	0
-	.word	0
-	.word	0
-	.word	34680
-	.word	34623
-	.word	16226
-	.word	0
-	.word	0
-	.word	0
-	.word	4760
-	.word	45515
-	.word	16196
-	.word	0
-	.word	0
-	.word	0
-	.word	41480
-	.word	40187
-	.word	16166
-	.word	0
-	.word	0
-	.word	0
-	.word	47852
-	.word	55252
-	.word	16134
-	.word	0
-	.word	0
-	.word	0
-	.word	54072
-	.word	35081
-	.word	16103
-	.word	0
-	.word	0
-	.word	0
-	.word	26808
-	.word	57421
-	.word	16071
-	.word	0
-	.word	0
-	.word	0
-	.word	20068
-	.word	57232
-	.word	16042
-	.word	0
-	.word	0
-	.word	0
-	.word	49576
-	.word	60188
-	.word	16009
-	.word	0
-	.word	0
-	.word	0
-	.word	10016
-	.word	52861
-	.word	15978
-	.word	0
-	.word	0
-	.word	0
-	.word	30648
-	.word	35825
-	.word	15947
-	.word	0
-	.word	0
-	.word	0
-	.word	60542
-	.word	58528
-	.word	15918
-	.word	0
-	.word	0
-	.word	0
-	.word	65468
-	.word	61743
-	.word	15887
-	.word	0
-	.word	0
-	.word	0
-	.word	64960
-	.word	45825
-	.word	15851
-	.word	0
-	.word	0
-	.word	0
-	.word	50604
-	.word	38792
-	.word	15825
-	.word	0
-	.word	0
-	.word	0
-	.word	18394
-	.word	33435
-	.word	15794
-	.word	0
-	.word	0
-	.word	0
-	.word	55780
-	.word	42703
-	.word	15763
-	.word	0
-	.word	0
-	.word	0
-	.word	14056
-	.word	63841
-	.word	15731
-	.word	0
-	.word	0
-	.word	0
-	.word	63080
-	.word	62563
-	.word	15700
-	.word	0
-	.word	0
-	.word	0
-	.word	20840
-	.word	62207
-	.word	15669
-	.word	0
-	.word	0
-	.word	0
-	.word	30094
-	.word	59983
-	.word	15639
-	.word	0
-	.word	0
-	.word	0
-	.word	61818
-	.word	60389
-	.word	15608
-	.word	0
-	.word	0
-	.word	0
-	.word	40186
-	.word	40579
-	.word	15577
-	.word	0
-	.word	0
-	.word	0
-	.word	42170
-	.word	58004
-	.word	15546
-	.word	0
-	.word	0
-	.word	0
-	.word	55276
-	.word	39678
-	.word	15514
-	.word	0
-	.word	0
-	.word	0
-	.word	44672
-	.word	36806
-	.word	15481
-	.word	0
-	.word	0
-	.word	0
-	.word	13060
-	.word	34144
-	.word	15452
-	.word	0
-	.word	0
-	.word	0
-	.word	28016
-	.word	57231
-	.word	15419
-	.word	0
-	.word	0
-	.word	0
-	.word	16112
-	.word	44995
-	.word	15390
-	.word	0
-	.word	0
-	.word	0
-	.word	53464
-	.word	33387
-	.word	15358
-	.word	0
-	.word	0
-	.word	0
-	.word	7296
-	.word	60751
-	.word	15325
-	.word	0
-	.word	0
-	.word	0
-	.word	29452
-	.word	45231
-	.word	15297
-	.word	0
-	.word	0
-	.word	0
-	.word	26208
-	.word	49689
-	.word	15266
-	.word	0
-	.word	0
-	.word	0
-	.word	37900
-	.word	44002
-	.word	15235
-	.word	0
-	.word	0
-	.word	0
-	.word	57340
-	.word	33800
-	.word	15204
-	.word	0
-	.word	0
-	.word	0
-	.word	27544
-	.word	50178
-	.word	15173
-	.word	0
-	.word	0
-	.word	0
-	.word	6168
-	.word	40132
-	.word	15142
-	.word	0
-	.word	0
-	.word	0
-	.word	21392
-	.word	43702
-	.word	15109
-	.word	0
-	.word	0
-	.word	0
-	.word	45168
-	.word	54372
-	.word	15081
-	.word	0
-	.word	0
-	.word	0
-	.word	8986
-	.word	40688
-	.word	15050
-	.word	0
-	.word	0
-	.word	0
-	.word	1648
-	.word	53745
-	.word	15018
-	.word	0
-	.word	0
-	.word	0
-	.word	30520
-	.word	55795
-	.word	14986
-	.word	0
-	.word	0
-	.word	0
-	.word	43060
-	.word	32914
-	.word	14956
-	.word	0
-	.word	0
-	.word	0
-	.word	46172
-	.word	52771
-	.word	14925
-	.word	0
-	.word	0
-	.word	0
-	.word	14056
-	.word	45285
-	.word	14893
-	.word	0
-	.word	0
-	.word	0
-	.word	53590
-	.word	44868
-	.word	14864
-	.word	0
-	.word	0
-	.word	0
-	.word	40786
-	.word	35970
-	.word	14833
-	.word	0
-	.word	0
-	.word	0
-	.word	33436
-	.word	65411
-	.word	14801
-	.word	0
-	.word	0
-	.word	0
-	.word	32006
-	.word	61382
-	.word	14771
-	.word	0
-	.word	0
-	.word	0
-	.word	37856
-	.word	45239
-	.word	14738
-	.word	0
-	.word	0
-	.word	0
-	.word	60894
-	.word	49555
-	.word	14709
-	.word	0
-	.word	0
-	.word	0
-	.word	48064
-	.word	53065
-	.word	14674
-	.word	0
-	.word	0
-	.word	0
-	.word	48624
-	.word	54844
-	.word	14647
-	.word	0
-	.word	0
-	.word	0
-	.word	7988
-	.word	40762
-	.word	14616
-	.word	0
-	.word	0
-	.word	0
-	.word	16270
-	.word	58745
-	.word	14585
-	.word	0
-	.word	0
-	.word	0
-	.word	37064
-	.word	50168
-	.word	14553
-	.word	0
-	.word	0
-	.word	0
-	.word	18624
-	.word	63736
-	.word	14519
-	.word	0
-	.word	0
-	.word	0
-	.word	60758
-	.word	44966
-	.word	14492
-	.word	0
-	.word	0
-	.word	0
-	.word	33304
-	.word	47465
-	.word	14461
-	.word	0
-	.word	0
-	.word	0
-	.word	6226
-	.word	60503
-	.word	14430
-	.word	0
-	.word	0
-	.word	0
-	.word	26380
-	.word	54900
-	.word	14398
-	.word	0
-	.word	0
-	.word	0
-	.word	44352
-	.word	49860
-	.word	14368
-	.word	0
-	.word	0
-	.word	0
-	.word	11904
-	.word	42646
-	.word	14337
-	.word	0
-	.word	0
-	.word	0
-	.word	55296
-	.word	50279
-	.word	14300
-	.word	0
-	.word	0
-	.word	0
-	.word	15474
-	.word	50606
-	.word	14275
-	.word	0
-	.word	0
-	.word	0
-	.word	45062
-	.word	44137
-	.word	14244
-	.word	0
-	.word	0
-	.word	0
-	.word	13472
-	.word	36063
-	.word	14210
-	.word	0
-	.word	0
-	.word	0
-	.word	40658
-	.word	53854
-	.word	14182
-	.word	0
-	.word	0
-	.word	0
-	.word	28652
-	.word	43690
-	.word	14151
-	.word	0
-	.word	0
-	.word	0
-	.word	24640
-	.word	64348
-	.word	14118
-	.word	0
-	.word	0
-	.word	0
-	.word	30284
-	.word	41980
-	.word	14088
-	.word	0
-	.word	0
-	.word	0
-	.word	45652
-	.word	38222
-	.word	14057
-	.word	0
-	.word	0
-	.word	0
-	.word	15900
-	.word	62940
-	.word	14026
-	.word	0
-	.word	0
-	.word	0
-	.word	31494
-	.word	50741
-	.word	13996
-	.word	0
-	.word	0
-	.word	0
-	.word	43194
-	.word	55096
-	.word	13965
-	.word	0
-	.word	0
-	.word	0
-	.word	1740
-	.word	45646
-	.word	13933
-	.word	0
-	.word	0
-	.word	0
-	.word	28936
-	.word	44150
-	.word	13903
-	.word	0
-	.word	0
-	.word	0
-	.word	8996
-	.word	42955
-	.word	13872
-	.word	0
-	.word	0
-	.word	0
-	.word	44096
-	.word	61205
-	.word	13839
-	.word	0
-	.word	0
-	.word	0
-	.word	44614
-	.word	54550
-	.word	13810
-	.word	0
-	.word	0
-	.word	0
-	.word	24926
-	.word	57347
-	.word	13779
-	.word	0
-	.word	0
-	.word	0
-	.word	3312
-	.word	61415
-	.word	13745
-	.word	0
-	.word	0
-	.word	0
-	.word	64336
-	.word	63884
-	.word	13717
-	.word	0
-	.word	0
-	.word	0
-	.word	2748
-	.word	62259
-	.word	13685
-	.word	0
-	.word	0
-	.word	0
-	.word	56672
-	.word	51775
-	.word	13653
-	.word	0
-	.word	0
-	.word	0
-	.word	32438
-	.word	55423
-	.word	13624
-	.word	0
-	.word	0
-	.word	0
-	.word	17652
-	.word	45713
-	.word	13593
-	.word	0
-	.word	0
-	.word	0
-	.word	65408
-	.word	51586
-	.word	13558
-	.word	0
-	.word	0
-	.word	0
-	.word	40416
-	.word	55736
-	.word	13531
-	.word	0
-	.word	0
-	.word	0
-	.word	52546
-	.word	37734
-	.word	13500
-	.word	0
-	.word	0
-	.word	0
-	.word	48880
-	.word	64238
-	.word	13469
-	.word	0
-	.word	0
-	.word	0
-	.word	56004
-	.word	46833
-	.word	13437
-	.word	0
-	.word	0
-	.word	0
-	.word	61760
-	.word	38110
-	.word	13405
-	.word	0
-	.word	0
-	.word	0
-	.word	41496
-	.word	35659
-	.word	13374
-	.word	0
-	.word	0
-	.word	0
-	.word	25472
-	.word	41269
-	.word	13342
-	.word	0
-	.word	0
-	.word	0
-	.word	45444
-	.word	36018
-	.word	13314
-	.word	0
-	.word	0
-	.word	0
-	.word	6510
-	.word	56417
-	.word	13283
-	.word	0
-	.word	0
-	.word	0
-	.word	3072
-	.word	56837
-	.word	13252
-	.word	0
-	.word	0
-	.word	0
-	.word	61338
-	.word	48440
-	.word	13221
-	.word	0
-	.word	0
-	.word	0
-	.word	49568
-	.word	57088
-	.word	13189
-	.word	0
-	.word	0
-	.word	0
-	.word	4240
-	.word	39283
-	.word	13157
-	.word	0
-	.word	0
-	.word	0
-	.word	18562
-	.word	33537
-	.word	13128
-	.word	0
-	.word	0
-	.word	0
-	.word	31422
-	.word	44487
-	.word	13097
-	.word	0
-	.word	0
-	.word	0
-	.word	31930
-	.word	60459
-	.word	13066
-	.word	0
-	.word	0
-	.word	0
-	.word	42272
-	.word	36641
-	.word	13033
-	.word	0
-	.word	0
-	.word	0
-	.word	28940
-	.word	36150
-	.word	13004
-	.word	0
-	.word	0
-	.word	0
-	.word	21010
-	.word	50925
-	.word	12973
-	.word	0
-	.word	0
-	.word	0
-	.word	29448
-	.word	64886
-	.word	12941
-	.word	0
-	.word	0
-	.word	0
-	.word	20500
-	.word	54600
-	.word	12911
-	.word	0
-	.word	0
-	.word	0
-	.word	54258
-	.word	46233
-	.word	12880
-	.word	0
-	.word	0
-	.word	0
-	.word	32628
-	.word	42502
-	.word	12848
-	.word	0
-	.word	0
-	.word	0
-	.word	61608
-	.word	55072
-	.word	12818
-	.word	0
-	.word	0
-	.word	0
-	.word	6236
-	.word	57871
-	.word	12786
-	.word	0
-	.word	0
-	.word	0
-	.word	42408
-	.word	34616
-	.word	12756
-	.word	0
-	.word	0
-	.word	0
-	.word	56692
-	.word	51963
-	.word	12724
-	.word	0
-	.word	0
-	.word	0
-	.word	39094
-	.word	48526
-	.word	12694
-	.word	0
-	.word	0
-	.word	0
-	.word	59870
-	.word	38783
-	.word	12663
-	.word	0
-	.word	0
-	.word	0
-	.word	26560
-	.word	33165
-	.word	12632
-	.word	0
-	.word	0
-	.word	0
-	.word	58666
-	.word	37666
-	.word	12601
-	.word	0
-	.word	0
-	.word	0
-	.word	58728
-	.word	39788
-	.word	12569
-	.word	0
-	.word	0
-	.word	0
-	.word	9048
-	.word	43530
-	.word	12538
-	.word	0
-	.word	0
-	.word	0
-	.word	58496
-	.word	57659
-	.word	12505
-	.word	0
-	.word	0
-	.word	0
-	.word	12324
-	.word	37025
-	.word	12477
-	.word	0
-	.word	0
-	.word	0
-	.word	38432
-	.word	55856
-	.word	12445
-	.word	0
-	.word	0
-	.word	0
-	.word	35210
-	.word	45960
-	.word	12415
-	.word	0
-	.word	0
-	.word	0
-	.word	45644
-	.word	51345
-	.word	12384
-	.word	0
-	.word	0
-	.word	0
-	.word	32854
-	.word	63883
-	.word	12353
-	.word	0
-	.word	0
-	.word	0
-	.word	29348
-	.word	41450
-	.word	12321
-	.word	0
-	.word	0
-	.word	0
-	.word	27384
-	.word	38024
-	.word	12289
-	.word	0
-	.word	0
-	.word	0
-	.word	57356
-	.word	57291
-	.word	12260
-	.word	0
-	.word	0
-	.word	0
-	.word	61164
-	.word	51521
-	.word	12228
-	.word	0
-	.word	0
-	.word	0
-	.word	21472
-	.word	59151
-	.word	12196
-	.word	0
-	.word	0
-	.word	0
-	.word	36704
-	.word	39943
-	.word	12165
-	.word	0
-	.word	0
-	.word	0
-	.word	45864
-	.word	50151
-	.word	12136
-	.word	0
-	.word	0
-	.word	0
-	.word	37892
-	.word	63687
-	.word	12104
-	.word	0
-	.word	0
-	.word	0
-	.word	14560
-	.word	51615
-	.word	12073
-	.word	0
-	.word	0
-	.word	0
-	.word	38776
-	.word	55684
-	.word	12041
-	.word	0
-	.word	0
-	.word	0
-	.word	59136
-	.word	53570
-	.word	12010
-	.word	0
-	.word	0
-	.word	0
-	.word	55556
-	.word	37955
-	.word	11981
-	.word	0
-	.word	0
-	.word	0
-	.word	54458
-	.word	44670
-	.word	11950
-	.word	0
-	.word	0
-	.word	0
-	.word	36446
-	.word	34084
-	.word	11919
-	.word	0
-	.word	0
-	.word	0
-	.word	46416
-	.word	51693
-	.word	11886
-	.word	0
-	.word	0
-	.word	0
-	.word	21432
-	.word	34376
-	.word	11857
-	.word	0
-	.word	0
-	.word	0
-	.word	56036
-	.word	34809
-	.word	11826
-	.word	0
-	.word	0
-	.word	0
-	.word	10562
-	.word	55654
-	.word	11795
-	.word	0
-	.word	0
-	.word	0
-	.word	20264
-	.word	53052
-	.word	11763
-	.word	0
-	.word	0
-	.word	0
-	.word	64064
-	.word	50415
-	.word	11729
-	.word	0
-	.word	0
-	.word	0
-	.word	17444
-	.word	48295
-	.word	11701
-	.word	0
-	.word	0
-	.word	0
-	.word	11874
-	.word	52677
-	.word	11671
-	.word	0
-	.word	0
-	.word	0
-	.word	60808
-	.word	39275
-	.word	11640
-	.word	0
-	.word	0
-	.word	0
-	.word	31792
-	.word	55677
-	.word	11606
-	.word	0
-	.word	0
-	.word	0
-	.word	60710
-	.word	49006
-	.word	11578
-	.word	0
-	.word	0
-	.word	0
-	.word	10520
-	.word	37403
-	.word	11546
-	.word	0
-	.word	0
-	.word	0
-	.word	20004
-	.word	59470
-	.word	11515
-	.word	0
-	.word	0
-	.word	0
-	.word	28096
-	.word	37612
-	.word	11485
-	.word	0
-	.word	0
-	.word	0
-	.word	20268
-	.word	44280
-	.word	11453
-	.word	0
-	.word	0
-	.word	0
-	.word	50740
-	.word	61588
-	.word	11422
-	.word	0
-	.word	0
-	.word	0
-	.word	56432
-	.word	58835
-	.word	11390
-	.word	0
-	.word	0
-	.word	0
-	.word	8576
-	.word	42496
-	.word	11355
-	.word	0
-	.word	0
-	.word	0
-	.word	33920
-	.word	54912
-	.word	11324
-	.word	0
-	.word	0
-	.word	0
-	.word	35620
-	.word	54843
-	.word	11298
-	.word	0
-	.word	0
-	.word	0
-	.word	736
-	.word	43591
-	.word	11264
-	.word	0
-	.word	0
-	.word	0
-	.word	39632
-	.word	61060
-	.word	11235
-	.word	0
-	.word	0
-	.word	0
-	.word	63452
-	.word	63129
-	.word	11206
-	.word	0
-	.word	0
-	.word	0
-	.word	56798
-	.word	58512
-	.word	11175
-	.word	0
-	.word	0
-	.word	0
-	.word	13472
-	.word	46333
-	.word	11141
-	.word	0
-	.word	0
-	.word	0
-	.word	37300
-	.word	36598
-	.word	11112
-	.word	0
-	.word	0
-	.word	0
-	.word	41952
-	.word	41639
-	.word	11079
-	.word	0
-	.word	0
-	.word	0
-	.word	52452
-	.word	33459
-	.word	11050
-	.word	0
-	.word	0
-	.word	0
-	.word	58558
-	.word	33287
-	.word	11020
-	.word	0
-	.word	0
-	.word	0
-	.word	7570
-	.word	43843
-	.word	10989
-	.word	0
-	.word	0
-	.word	0
-	.word	59416
-	.word	63990
-	.word	10957
-	.word	0
-	.word	0
-	.word	0
-	.word	65298
-	.word	47744
-	.word	10927
-	.word	0
-	.word	0
-	.word	0
-	.word	21076
-	.word	34089
-	.word	10896
-	.word	0
-	.word	0
-	.word	0
-	.word	7048
-	.word	57394
-	.word	10865
-	.word	0
-	.word	0
-	.word	0
-	.word	12872
-	.word	55405
-	.word	10832
-	.word	0
-	.word	0
-	.word	0
-	.word	12608
-	.word	51669
-	.word	10798
-	.word	0
-	.word	0
-	.word	0
-	.word	5350
-	.word	48455
-	.word	10772
-	.word	0
-	.word	0
-	.word	0
-	.word	23568
-	.word	58692
-	.word	10740
-	.word	0
-	.word	0
-	.word	0
-	.word	40784
-	.word	37046
-	.word	10708
-	.word	0
-	.word	0
-	.word	0
-	.word	38992
-	.word	43861
-	.word	10678
-	.word	0
-	.word	0
-	.word	0
-	.word	10064
-	.word	40199
-	.word	10648
-	.word	0
-	.word	0
-	.word	0
-	.word	26368
-	.word	35771
-	.word	10611
-	.word	0
-	.word	0
-	.word	0
-	.word	23994
-	.word	60721
-	.word	10586
-	.word	0
-	.word	0
-	.word	0
-	.word	25052
-	.word	34302
-	.word	10554
-	.word	0
-	.word	0
-	.word	0
-	.word	39842
-	.word	54964
-	.word	10524
-	.word	0
-	.word	0
-	.word	0
-	.word	11568
-	.word	58277
-	.word	10491
-	.word	0
-	.word	0
-	.word	0
-	.word	26160
-	.word	46438
-	.word	10461
-	.word	0
-	.word	0
-	.word	0
-	.word	23252
-	.word	43049
-	.word	10431
-	.word	0
-	.word	0
-	.word	0
-	.word	35288
-	.word	58000
-	.word	10400
-	.word	0
-	.word	0
-	.word	0
-	.word	14614
-	.word	50216
-	.word	10369
-	.word	0
-	.word	0
-	.word	0
-	.word	1168
-	.word	48804
-	.word	10336
-	.word	0
-	.word	0
-	.word	0
-	.word	60934
-	.word	33006
-	.word	10307
-	.word	0
-	.word	0
-	.word	0
-	.word	64512
-	.word	62247
-	.word	10272
-	.word	0
-	.word	0
-	.word	0
-	.word	59968
-	.word	43121
-	.word	10240
-	.word	0
-	.word	0
-	.word	0
-	.word	25560
-	.word	39974
-	.word	10212
-	.word	0
-	.word	0
-	.word	0
-	.word	1978
-	.word	49353
-	.word	10183
-	.word	0
-	.word	0
-	.word	0
-	.word	16290
-	.word	38807
-	.word	10152
-	.word	0
-	.word	0
-	.word	0
-	.word	8646
-	.word	65226
-	.word	10121
-	.word	0
-	.word	0
-	.word	0
-	.word	56896
-	.word	34317
-	.word	10088
-	.word	0
-	.word	0
-	.word	0
-	.word	40136
-	.word	39118
-	.word	10057
-	.word	0
-	.word	0
-	.word	0
-	.word	14200
-	.word	41756
-	.word	10026
-	.word	0
-	.word	0
-	.word	0
-	.word	59256
-	.word	63202
-	.word	9995
-	.word	0
-	.word	0
-	.word	0
-	.word	22968
-	.word	63553
-	.word	9965
-	.word	0
-	.word	0
-	.word	0
-	.word	736
-	.word	44292
-	.word	9933
-	.word	0
-	.word	0
-	.word	0
-	.word	23186
-	.word	37760
-	.word	9904
-	.word	0
-	.word	0
-	.word	0
-	.word	51008
-	.word	34950
-	.word	9869
-	.word	0
-	.word	0
-	.word	0
-	.word	1664
-	.word	64248
-	.word	9836
-	.word	0
-	.word	0
-	.word	0
-	.word	64352
-	.word	35199
-	.word	9811
-	.word	0
-	.word	0
-	.word	0
-	.word	34656
-	.word	63747
-	.word	9780
-	.word	0
-	.word	0
-	.word	0
-	.word	44330
-	.word	49864
-	.word	9749
-	.word	0
-	.word	0
-	.word	0
-	.word	11654
-	.word	35567
-	.word	9718
-	.word	0
-	.word	0
-	.word	0
-	.word	7924
-	.word	58919
-	.word	9686
-	.word	0
-	.word	0
-	.word	0
-	.word	2532
-	.word	32800
-	.word	9655
-	.word	0
-	.word	0
-	.word	0
-	.word	30024
-	.word	53799
-	.word	9624
-	.word	0
-	.word	0
-	.word	0
-	.word	30172
-	.word	64347
-	.word	9593
-	.word	0
-	.word	0
-	.word	0
-	.word	60036
-	.word	51382
-	.word	9562
-	.word	0
-	.word	0
-	.word	0
-	.word	58576
-	.word	33093
-	.word	9531
-	.word	0
-	.word	0
-	.word	0
-	.word	13888
-	.word	38760
-	.word	9500
-	.word	0
-	.word	0
-	.word	0
-	.word	9322
-	.word	52460
-	.word	9470
-	.word	0
-	.word	0
-	.word	0
-	.word	20944
-	.word	41077
-	.word	9437
-	.word	0
-	.word	0
-	.word	0
-	.word	17976
-	.word	41861
-	.word	9407
-	.word	0
-	.word	0
-	.word	0
-	.word	55176
-	.word	55158
-	.word	9377
-	.word	0
-	.word	0
-	.word	0
-	.word	4976
-	.word	35223
-	.word	9346
-	.word	0
-	.word	0
-	.word	0
-	.word	7816
-	.word	39783
-	.word	9314
-	.word	0
-	.word	0
-	.word	0
-	.word	27656
-	.word	55669
-	.word	9284
-	.word	0
-	.word	0
-	.word	0
-	.word	64944
-	.word	53184
-	.word	9250
-	.word	0
-	.word	0
-	.word	0
-	.word	12544
-	.word	49190
-	.word	9222
-	.word	0
-	.word	0
-	.word	0
-	.word	50612
-	.word	44644
-	.word	9190
-	.word	0
-	.word	0
-	.word	0
-	.word	8832
-	.word	63111
-	.word	9155
-	.word	0
-	.word	0
-	.word	0
-	.word	11744
-	.word	36870
-	.word	9129
-	.word	0
-	.word	0
-	.word	0
-	.word	9404
-	.word	63025
-	.word	9098
-	.word	0
-	.word	0
-	.word	0
-	.word	47316
-	.word	43381
-	.word	9067
-	.word	0
-	.word	0
-	.word	0
-	.word	55716
-	.word	47433
-	.word	9035
-	.word	0
-	.word	0
-	.word	0
-	.word	46414
-	.word	48441
-	.word	9005
-	.word	0
-	.word	0
-	.word	0
-	.word	19116
-	.word	39506
-	.word	8974
-	.word	0
-	.word	0
-	.word	0
-	.word	48060
-	.word	53381
-	.word	8943
-	.word	0
-	.word	0
-	.word	0
-	.word	57112
-	.word	50739
-	.word	8911
-	.word	0
-	.word	0
-	.word	0
-	.word	5840
-	.word	60581
-	.word	8879
-	.word	0
-	.word	0
-	.word	0
-	.word	62112
-	.word	57199
-	.word	8846
-	.word	0
-	.word	0
-	.word	0
-	.word	35908
-	.word	59499
-	.word	8818
-	.word	0
-	.word	0
-	.word	0
-	.word	13760
-	.word	48116
-	.word	8787
-	.word	0
-	.word	0
-	.word	0
-	.word	3136
-	.word	56059
-	.word	8752
-	.word	0
-	.word	0
-	.word	0
-	.word	37596
-	.word	39221
-	.word	8726
-	.word	0
-	.word	0
-	.word	0
-	.word	3232
-	.word	48550
-	.word	8691
-	.word	0
-	.word	0
-	.word	0
-	.word	22872
-	.word	42749
-	.word	8662
-	.word	0
-	.word	0
-	.word	0
-	.word	41948
-	.word	40319
-	.word	8633
-	.word	0
-	.word	0
-	.word	0
-	.word	31196
-	.word	64693
-	.word	8601
-	.word	0
-	.word	0
-	.word	0
-	.word	62052
-	.word	52923
-	.word	8571
-	.word	0
-	.word	0
-	.word	0
-	.word	2750
-	.word	33544
-	.word	8540
-	.word	0
-	.word	0
-	.word	0
-	.word	12462
-	.word	46179
-	.word	8509
-	.word	0
-	.word	0
-	.word	0
-	.word	25128
-	.word	45120
-	.word	8476
-	.word	0
-	.word	0
-	.word	0
-	.word	51634
-	.word	62523
-	.word	8447
-	.word	0
-	.word	0
-	.word	0
-	.word	15758
-	.word	42163
-	.word	8416
-	.word	0
-	.word	0
-	.word	0
-	.word	34022
-	.word	36267
-	.word	8385
-	.word	0
-	.word	0
-	.word	0
-	.word	41252
-	.word	39796
-	.word	8353
-	.word	0
-	.word	0
-	.word	0
-	.word	49782
-	.word	54423
-	.word	8323
-	.word	0
-	.word	0
-	.word	0
-	.word	25428
-	.word	42086
-	.word	8291
-	.word	0
-	.word	0
-	.word	0
-	.word	34388
-	.word	44810
-	.word	8260
-	.word	0
-	.word	0
-	.word	0
-	.word	7456
-	.word	64092
-	.word	8228
-	.word	0
-	.word	0
-	.word	0
-	.word	48336
-	.word	62448
-	.word	8196
-	.word	0
-	.word	0
-	.word	0
-	.word	60912
-	.word	61622
-	.word	8167
-	.word	0
-	.word	0
-	.word	0
-	.word	17852
-	.word	37250
-	.word	8137
-	.word	0
-	.word	0
-	.word	0
-	.word	57940
-	.word	56453
-	.word	8106
-	.word	0
-	.word	0
-	.word	0
-	.word	47256
-	.word	59825
-	.word	8074
-	.word	0
-	.word	0
-	.word	0
-	.word	3774
-	.word	59120
-	.word	8044
-	.word	0
-	.word	0
-	.word	0
-	.word	43448
-	.word	62852
-	.word	8012
-	.word	0
-	.word	0
-	.word	0
-	.word	4840
-	.word	57195
-	.word	7982
-	.word	0
-	.word	0
-	.word	0
-	.word	40862
-	.word	52565
-	.word	7951
-	.word	0
-	.word	0
-	.word	0
-	.word	1440
-	.word	60474
-	.word	7919
-	.word	0
-	.word	0
-	.word	0
-	.word	55520
-	.word	38648
-	.word	7889
-	.word	0
-	.word	0
-	.word	0
-	.word	15316
-	.word	52422
-	.word	7857
-	.word	0
-	.word	0
-	.word	0
-	.word	18704
-	.word	47227
-	.word	7827
-	.word	0
-	.word	0
-	.word	0
-	.word	48892
-	.word	54283
-	.word	7795
-	.word	0
-	.word	0
-	.word	0
-	.word	12670
-	.word	41990
-	.word	7765
-	.word	0
-	.word	0
-	.word	0
-	.word	27570
-	.word	49842
-	.word	7734
-	.word	0
-	.word	0
-	.word	0
-	.word	47230
-	.word	47992
-	.word	7703
-	.word	0
-	.word	0
-	.word	0
-	.word	41020
-	.word	56253
-	.word	7671
-	.word	0
-	.word	0
-	.word	0
-	.word	23404
-	.word	58312
-	.word	7641
-	.word	0
-	.word	0
-	.word	0
-	.word	35176
-	.word	51854
-	.word	7610
-	.word	0
-	.word	0
-	.word	0
-	.word	49188
-	.word	59051
-	.word	7578
-	.word	0
-	.word	0
-	.word	0
-	.word	16656
-	.word	54507
-	.word	7546
-	.word	0
-	.word	0
-	.word	0
-	.word	41320
-	.word	48565
-	.word	7517
-	.word	0
-	.word	0
-	.word	0
-	.word	302
-	.word	42490
-	.word	7486
-	.word	0
-	.word	0
-	.word	0
-	.word	26680
-	.word	39967
-	.word	7454
-	.word	0
-	.word	0
-	.word	0
-	.word	41304
-	.word	43638
-	.word	7424
-	.word	0
-	.word	0
-	.word	0
-	.word	2314
-	.word	48533
-	.word	7393
-	.word	0
-	.word	0
-	.word	0
-	.word	63294
-	.word	35693
-	.word	7362
-	.word	0
-	.word	0
-	.word	0
-	.word	24538
-	.word	48319
-	.word	7331
-	.word	0
-	.word	0
-	.word	0
-	.word	56296
-	.word	47263
-	.word	7300
-	.word	0
-	.word	0
-	.word	0
-	.word	28236
-	.word	38599
-	.word	7268
-	.word	0
-	.word	0
-	.word	0
-	.word	6594
-	.word	62116
-	.word	7238
-	.word	0
-	.word	0
-	.word	0
-	.word	47104
-	.word	63573
-	.word	7198
-	.word	0
-	.word	0
-	.word	0
-	.word	34812
-	.word	34303
-	.word	7176
-	.word	0
-	.word	0
-	.word	0
-	.word	5144
-	.word	33695
-	.word	7145
-	.word	0
-	.word	0
-	.word	0
-	.word	24966
-	.word	55768
-	.word	7114
-	.word	0
-	.word	0
-	.word	0
-	.word	62720
-	.word	43946
-	.word	7078
-	.word	0
-	.word	0
-	.word	0
-	.word	31542
-	.word	56062
-	.word	7052
-	.word	0
-	.word	0
-	.word	0
-	.word	62356
-	.word	59096
-	.word	7020
-	.word	0
-	.word	0
-	.word	0
-	.word	28412
-	.word	40533
-	.word	6990
-	.word	0
-	.word	0
-	.word	0
-	.word	24080
-	.word	50467
-	.word	6958
-	.word	0
-	.word	0
-	.word	0
-	.word	33296
-	.word	46841
-	.word	6925
-	.word	0
-	.word	0
-	.word	0
-	.word	39600
-	.word	38627
-	.word	6897
-	.word	0
-	.word	0
-	.word	0
-	.word	14436
-	.word	37607
-	.word	6865
-	.word	0
-	.word	0
-	.word	0
-	.word	39032
-	.word	56421
-	.word	6833
-	.word	0
-	.word	0
-	.word	0
-	.word	64032
-	.word	54987
-	.word	6804
-	.word	0
-	.word	0
-	.word	0
-	.word	27648
-	.word	42212
-	.word	6768
-	.word	0
-	.word	0
-	.word	0
-	.word	43840
-	.word	46107
-	.word	6739
-	.word	0
-	.word	0
-	.word	0
-	.word	17316
-	.word	36574
-	.word	6711
-	.word	0
-	.word	0
-	.word	0
-	.word	8928
-	.word	37652
-	.word	6677
-	.word	0
-	.word	0
-	.word	0
-	.word	24944
-	.word	47433
-	.word	6648
-	.word	0
-	.word	0
-	.word	0
-	.word	27392
-	.word	57430
-	.word	6616
-	.word	0
-	.word	0
-	.word	0
-	.word	39848
-	.word	43340
-	.word	6585
-	.word	0
-	.word	0
-	.word	0
-	.word	64160
-	.word	43542
-	.word	6555
-	.word	0
-	.word	0
-	.word	0
-	.word	35226
-	.word	63015
-	.word	6525
-	.word	0
-	.word	0
-	.word	0
-	.word	40736
-	.word	64368
-	.word	6493
-	.word	0
-	.word	0
-	.word	0
-	.word	42168
-	.word	49526
-	.word	6462
-	.word	0
-	.word	0
-	.word	0
-	.word	45596
-	.word	34243
-	.word	6432
-	.word	0
-	.word	0
-	.word	0
-	.word	20690
-	.word	39705
-	.word	6401
-	.word	0
-	.word	0
-	.word	0
-	.word	54448
-	.word	46856
-	.word	6368
-	.word	0
-	.word	0
-	.word	0
-	.word	64392
-	.word	62736
-	.word	6337
-	.word	0
-	.word	0
-	.word	0
-	.word	12780
-	.word	56461
-	.word	6307
-	.word	0
-	.word	0
-	.word	0
-	.word	15360
-	.word	49145
-	.word	6277
-	.word	0
-	.word	0
-	.word	0
-	.word	20512
-	.word	49931
-	.word	6242
-	.word	0
-	.word	0
-	.word	0
-	.word	54512
-	.word	55820
-	.word	6212
-	.word	0
-	.word	0
-	.word	0
-	.word	8402
-	.word	39333
-	.word	6184
-	.word	0
-	.word	0
-	.word	0
-	.word	34094
-	.word	53593
-	.word	6153
-	.word	0
-	.word	0
-	.word	0
-	.word	31960
-	.word	38817
-	.word	6121
-	.word	0
-	.word	0
-	.word	0
-	.word	16954
-	.word	39291
-	.word	6091
-	.word	0
-	.word	0
-	.word	0
-	.word	49600
-	.word	48765
-	.word	6056
-	.word	0
-	.word	0
-	.word	0
-	.word	59580
-	.word	56541
-	.word	6029
-	.word	0
-	.word	0
-	.word	0
-	.word	35624
-	.word	44550
-	.word	5998
-	.word	0
-	.word	0
-	.word	0
-	.word	4142
-	.word	47316
-	.word	5967
-	.word	0
-	.word	0
-	.word	0
-	.word	43520
-	.word	43612
-	.word	5935
-	.word	0
-	.word	0
-	.word	0
-	.word	20976
-	.word	40896
-	.word	5902
-	.word	0
-	.word	0
-	.word	0
-	.word	63576
-	.word	57729
-	.word	5874
-	.word	0
-	.word	0
-	.word	0
-	.word	37288
-	.word	33122
-	.word	5843
-	.word	0
-	.word	0
-	.word	0
-	.word	24384
-	.word	52079
-	.word	5809
-	.word	0
-	.word	0
-	.word	0
-	.word	47952
-	.word	58719
-	.word	5779
-	.word	0
-	.word	0
-	.word	0
-	.word	44242
-	.word	55445
-	.word	5750
-	.word	0
-	.word	0
-	.word	0
-	.word	61232
-	.word	38847
-	.word	5716
-	.word	0
-	.word	0
-	.word	0
-	.word	63232
-	.word	46039
-	.word	5683
-	.word	0
-	.word	0
-	.word	0
-	.word	13396
-	.word	42933
-	.word	5657
-	.word	0
-	.word	0
-	.word	0
-	.word	27392
-	.word	43305
-	.word	5622
-	.word	0
-	.word	0
-	.word	0
-	.word	40708
-	.word	35319
-	.word	5595
-	.word	0
-	.word	0
-	.word	0
-	.word	44408
-	.word	55685
-	.word	5564
-	.word	0
-	.word	0
-	.word	0
-	.word	42090
-	.word	44607
-	.word	5533
-	.word	0
-	.word	0
-	.word	0
-	.word	25504
-	.word	53466
-	.word	5500
-	.word	0
-	.word	0
-	.word	0
-	.word	24208
-	.word	33149
-	.word	5470
-	.word	0
-	.word	0
-	.word	0
-	.word	5268
-	.word	45375
-	.word	5440
-	.word	0
-	.word	0
-	.word	0
-	.word	144
-	.word	40000
-	.word	5409
-	.word	0
-	.word	0
-	.word	0
-	.word	56688
-	.word	52358
-	.word	5376
-	.word	0
-	.word	0
-	.word	0
-	.word	25848
-	.word	56175
-	.word	5345
-	.word	0
-	.word	0
-	.word	0
-	.word	57900
-	.word	44055
-	.word	5315
-	.word	0
-	.word	0
-	.word	0
-	.word	24800
-	.word	43437
-	.word	5283
-	.word	0
-	.word	0
-	.word	0
-	.word	17984
-	.word	54872
-	.word	5249
-	.word	0
-	.word	0
-	.word	0
-	.word	25744
-	.word	41345
-	.word	5223
-	.word	0
-	.word	0
-	.word	0
-	.word	7668
-	.word	43682
-	.word	5191
-	.word	0
-	.word	0
-	.word	0
-	.word	47434
-	.word	36705
-	.word	5161
-	.word	0
-	.word	0
-	.word	0
-	.word	20888
-	.word	40323
-	.word	5129
-	.word	0
-	.word	0
-	.word	0
-	.word	3962
-	.word	43032
-	.word	5099
-	.word	0
-	.word	0
-	.word	0
-	.word	50270
-	.word	49260
-	.word	5068
-	.word	0
-	.word	0
-	.word	0
-	.word	20160
-	.word	64041
-	.word	5032
-	.word	0
-	.word	0
-	.word	0
-	.word	25624
-	.word	36013
-	.word	5004
-	.word	0
-	.word	0
-	.word	0
-	.word	48328
-	.word	59345
-	.word	4975
-	.word	0
-	.word	0
-	.word	0
-	.word	51508
-	.word	63920
-	.word	4943
-	.word	0
-	.word	0
-	.word	0
-	.word	27872
-	.word	39135
-	.word	4913
-	.word	0
-	.word	0
-	.word	0
-	.word	13590
-	.word	58857
-	.word	4882
-	.word	0
-	.word	0
-	.word	0
-	.word	50880
-	.word	61323
-	.word	4847
-	.word	0
-	.word	0
-	.word	0
-	.word	44802
-	.word	37181
-	.word	4820
-	.word	0
-	.word	0
-	.word	0
-	.word	53808
-	.word	57813
-	.word	4789
-	.word	0
-	.word	0
-	.word	0
-	.word	64424
-	.word	49714
-	.word	4757
-	.word	0
-	.word	0
-	.word	0
-	.word	31652
-	.word	44011
-	.word	4727
-	.word	0
-	.word	0
-	.word	0
-	.word	28252
-	.word	50834
-	.word	4696
-	.word	0
-	.word	0
-	.word	0
-	.word	30370
-	.word	38742
-	.word	4665
-	.word	0
-	.word	0
-	.word	0
-	.word	57728
-	.word	58403
-	.word	4628
-	.word	0
-	.word	0
-	.word	0
-	.word	35900
-	.word	37112
-	.word	4603
-	.word	0
-	.word	0
-	.word	0
-	.word	40764
-	.word	40914
-	.word	4572
-	.word	0
-	.word	0
-	.word	0
-	.word	21472
-	.word	46910
-	.word	4541
-	.word	0
-	.word	0
-	.word	0
-	.word	17854
-	.word	35030
-	.word	4510
-	.word	0
-	.word	0
-	.word	0
-	.word	4378
-	.word	35776
-	.word	4479
-	.word	0
-	.word	0
-	.word	0
-	.word	57962
-	.word	55295
-	.word	4448
-	.word	0
-	.word	0
-	.word	0
-	.word	64352
-	.word	56717
-	.word	4415
-	.word	0
-	.word	0
-	.word	0
-	.word	37744
-	.word	49416
-	.word	4384
-	.word	0
-	.word	0
-	.word	0
-	.word	38484
-	.word	35759
-	.word	4355
-	.word	0
-	.word	0
-	.word	0
-	.word	55020
-	.word	54969
-	.word	4324
-	.word	0
-	.word	0
-	.word	0
-	.word	9188
-	.word	55223
-	.word	4292
-	.word	0
-	.word	0
-	.word	0
-	.word	6822
-	.word	43079
-	.word	4262
-	.word	0
-	.word	0
-	.word	0
-	.word	48870
-	.word	40943
-	.word	4231
-	.word	0
-	.word	0
-	.word	0
-	.word	9936
-	.word	42731
-	.word	4198
-	.word	0
-	.word	0
-	.word	0
-	.word	23430
-	.word	43136
-	.word	4169
-	.word	0
-	.word	0
-	.word	0
-	.word	4700
-	.word	55665
-	.word	4137
-	.word	0
-	.word	0
-	.word	0
-	.word	8056
-	.word	40216
-	.word	4106
-	.word	0
-	.word	0
-	.word	0
-	.word	3716
-	.word	45403
-	.word	4075
-	.word	0
-	.word	0
-	.word	0
-	.word	53440
-	.word	49488
-	.word	4044
-	.word	0
-	.word	0
-	.word	0
-	.word	41776
-	.word	50188
-	.word	4013
-	.word	0
-	.word	0
-	.word	0
-	.word	20994
-	.word	64556
-	.word	3983
-	.word	0
-	.word	0
-	.word	0
-	.word	16252
-	.word	60661
-	.word	3951
-	.word	0
-	.word	0
-	.word	0
-	.word	61252
-	.word	65021
-	.word	3920
-	.word	0
-	.word	0
-	.word	0
-	.word	16236
-	.word	43803
-	.word	3889
-	.word	0
-	.word	0
-	.word	0
-	.word	63064
-	.word	35308
-	.word	3857
-	.word	0
-	.word	0
-	.word	0
-	.word	49096
-	.word	39848
-	.word	3828
-	.word	0
-	.word	0
-	.word	0
-	.word	15680
-	.word	48673
-	.word	3797
-	.word	0
-	.word	0
-	.word	0
-	.word	48068
-	.word	50957
-	.word	3766
-	.word	0
-	.word	0
-	.word	0
-	.word	20824
-	.word	56086
-	.word	3734
-	.word	0
-	.word	0
-	.word	0
-	.word	46504
-	.word	43224
-	.word	3704
-	.word	0
-	.word	0
-	.word	0
-	.word	52428
-	.word	46094
-	.word	3672
-	.word	0
-	.word	0
-	.word	0
-	.word	17548
-	.word	52066
-	.word	3642
-	.word	0
-	.word	0
-	.word	0
-	.word	61738
-	.word	35565
-	.word	3611
-	.word	0
-	.word	0
-	.word	0
-	.word	31184
-	.word	50588
-	.word	3579
-	.word	0
-	.word	0
-	.word	0
-	.word	1716
-	.word	52681
-	.word	3549
-	.word	0
-	.word	0
-	.word	0
-	.word	44656
-	.word	43385
-	.word	3518
-	.word	0
-	.word	0
-	.word	0
-	.word	12668
-	.word	43259
-	.word	3486
-	.word	0
-	.word	0
-	.word	0
-	.word	24544
-	.word	35408
-	.word	3453
-	.word	0
-	.word	0
-	.word	0
-	.word	28854
-	.word	65018
-	.word	3425
-	.word	0
-	.word	0
-	.word	0
-	.word	5696
-	.word	40391
-	.word	3393
-	.word	0
-	.word	0
-	.word	0
-	.word	39580
-	.word	56400
-	.word	3363
-	.word	0
-	.word	0
-	.word	0
-	.word	20428
-	.word	39579
-	.word	3332
-	.word	0
-	.word	0
-	.word	0
-	.word	32328
-	.word	36727
-	.word	3301
-	.word	0
-	.word	0
-	.word	0
-	.word	34020
-	.word	54457
-	.word	3270
-	.word	0
-	.word	0
-	.word	0
-	.word	34016
-	.word	48400
-	.word	3238
-	.word	0
-	.word	0
-	.word	0
-	.word	6922
-	.word	51417
-	.word	3208
-	.word	0
-	.word	0
-	.word	0
-	.word	27208
-	.word	64641
-	.word	3176
-	.word	0
-	.word	0
-	.word	0
-	.word	1802
-	.word	48886
-	.word	3146
-	.word	0
-	.word	0
-	.word	0
-	.word	35440
-	.word	61590
-	.word	3115
-	.word	0
-	.word	0
-	.word	0
-	.word	60610
-	.word	51604
-	.word	3084
-	.word	0
-	.word	0
-	.word	0
-	.word	5440
-	.word	38199
-	.word	3050
-	.word	0
-	.word	0
-	.word	0
-	.word	6914
-	.word	43867
-	.word	3022
-	.word	0
-	.word	0
-	.word	0
-	.word	24000
-	.word	45256
-	.word	2989
-	.word	0
-	.word	0
-	.word	0
-	.word	51496
-	.word	57396
-	.word	2959
-	.word	0
-	.word	0
-	.word	0
-	.word	11538
-	.word	46256
-	.word	2929
-	.word	0
-	.word	0
-	.word	0
-	.word	36802
-	.word	48020
-	.word	2898
-	.word	0
-	.word	0
-	.word	0
-	.word	57910
-	.word	57903
-	.word	2867
-	.word	0
-	.word	0
-	.word	0
-	.word	47484
-	.word	48798
-	.word	2835
-	.word	0
-	.word	0
-	.word	0
-	.word	57766
-	.word	57709
-	.word	2805
-	.word	0
-	.word	0
-	.word	0
-	.word	54064
-	.word	47856
-	.word	2774
-	.word	0
-	.word	0
-	.word	0
-	.word	49340
-	.word	48080
-	.word	2743
-	.word	0
-	.word	0
-	.word	0
-	.word	36454
-	.word	56731
-	.word	2712
-	.word	0
-	.word	0
-	.word	0
-	.word	51548
-	.word	63385
-	.word	2681
-	.word	0
-	.word	0
-	.word	0
-	.word	56000
-	.word	48716
-	.word	2645
-	.word	0
-	.word	0
-	.word	0
-	.word	44992
-	.word	50040
-	.word	2615
-	.word	0
-	.word	0
-	.word	0
-	.word	43136
-	.word	58177
-	.word	2585
-	.word	0
-	.word	0
-	.word	0
-	.word	49730
-	.word	33270
-	.word	2557
-	.word	0
-	.word	0
-	.word	0
-	.word	29808
-	.word	51063
-	.word	2526
-	.word	0
-	.word	0
-	.word	0
-	.word	25276
-	.word	46724
-	.word	2494
-	.word	0
-	.word	0
-	.word	0
-	.word	17324
-	.word	35928
-	.word	2463
-	.word	0
-	.word	0
-	.word	0
-	.word	52284
-	.word	63916
-	.word	2433
-	.word	0
-	.word	0
-	.word	0
-	.word	5414
-	.word	46704
-	.word	2402
-	.word	0
-	.word	0
-	.word	0
-	.word	51710
-	.word	57168
-	.word	2371
-	.word	0
-	.word	0
-	.word	0
-	.word	27366
-	.word	49253
-	.word	2340
-	.word	0
-	.word	0
-	.word	0
-	.word	45332
-	.word	53033
-	.word	2309
-	.word	0
-	.word	0
-	.word	0
-	.word	54152
-	.word	37418
-	.word	2276
-	.word	0
-	.word	0
-	.word	0
-	.word	53076
-	.word	47398
-	.word	2247
-	.word	0
-	.word	0
-	.word	0
-	.word	14374
-	.word	59477
-	.word	2216
-	.word	0
-	.word	0
-	.word	0
-	.word	59336
-	.word	33435
-	.word	2184
-	.word	0
-	.word	0
-	.word	0
-	.word	21612
-	.word	43267
-	.word	2154
-	.word	0
-	.word	0
-	.word	0
-	.word	34664
-	.word	39372
-	.word	2121
-	.word	0
-	.word	0
-	.word	0
-	.word	172
-	.word	62761
-	.word	2091
-	.word	0
-	.word	0
-	.word	0
-	.word	9816
-	.word	40715
-	.word	2060
-	.word	0
-	.word	0
-	.word	0
-	.word	65116
-	.word	40481
-	.word	2030
-	.word	0
-	.word	0
-	.word	0
-	.word	28066
-	.word	39184
-	.word	1999
-	.word	0
-	.word	0
-	.word	0
-	.word	37408
-	.word	63923
-	.word	1968
-	.word	0
-	.word	0
-	.word	0
-	.word	15760
-	.word	42305
-	.word	1937
-	.word	0
-	.word	0
-	.word	0
-	.word	28236
-	.word	59340
-	.word	1905
-	.word	0
-	.word	0
-	.word	0
-	.word	43258
-	.word	59402
-	.word	1875
-	.word	0
-	.word	0
-	.word	0
-	.word	19988
-	.word	50087
-	.word	1844
-	.word	0
-	.word	0
-	.word	0
-	.word	63456
-	.word	47833
-	.word	1810
-	.word	0
-	.word	0
-	.word	0
-	.word	65184
-	.word	61426
-	.word	1781
-	.word	0
-	.word	0
-	.word	0
-	.word	52982
-	.word	48456
-	.word	1751
-	.word	0
-	.word	0
-	.word	0
-	.word	30020
-	.word	62809
-	.word	1719
-	.word	0
-	.word	0
-	.word	0
-	.word	9096
-	.word	63061
-	.word	1688
-	.word	0
-	.word	0
-	.word	0
-	.word	59648
-	.word	44374
-	.word	1654
-	.word	0
-	.word	0
-	.word	0
-	.word	11456
-	.word	33847
-	.word	1625
-	.word	0
-	.word	0
-	.word	0
-	.word	12392
-	.word	50500
-	.word	1595
-	.word	0
-	.word	0
-	.word	0
-	.word	56432
-	.word	59196
-	.word	1563
-	.word	0
-	.word	0
-	.word	0
-	.word	61008
-	.word	40265
-	.word	1532
-	.word	0
-	.word	0
-	.word	0
-	.word	37842
-	.word	33270
-	.word	1503
-	.word	0
-	.word	0
-	.word	0
-	.word	37916
-	.word	44543
-	.word	1471
-	.word	0
-	.word	0
-	.word	0
-	.word	11490
-	.word	36421
-	.word	1441
-	.word	0
-	.word	0
-	.word	0
-	.word	19040
-	.word	38397
-	.word	1409
-	.word	0
-	.word	0
-	.word	0
-	.word	31224
-	.word	47162
-	.word	1379
-	.word	0
-	.word	0
-	.word	0
-	.word	52056
-	.word	41461
-	.word	1347
-	.word	0
-	.word	0
-	.word	0
-	.word	10810
-	.word	56374
-	.word	1317
-	.word	0
-	.word	0
-	.word	0
-	.word	5358
-	.word	35086
-	.word	1286
-	.word	0
-	.word	0
-	.word	0
-	.word	36640
-	.word	50226
-	.word	1251
-	.word	0
-	.word	0
-	.word	0
-	.word	33856
-	.word	45597
-	.word	1222
-	.word	0
-	.word	0
-	.word	0
-	.word	21552
-	.word	63128
-	.word	1191
-	.word	0
-	.word	0
-	.word	0
-	.word	1198
-	.word	35616
-	.word	1162
-	.word	0
-	.word	0
-	.word	0
-	.word	1232
-	.word	59506
-	.word	1131
-	.word	0
-	.word	0
-	.word	0
-	.word	51086
-	.word	34963
-	.word	1100
-	.word	0
-	.word	0
-	.word	0
-	.word	3960
-	.word	39061
-	.word	1067
-	.word	0
-	.word	0
-	.word	0
-	.word	4564
-	.word	57134
-	.word	1037
-	.word	0
-	.word	0
-	.word	0
-	.word	59468
-	.word	35285
-	.word	1007
-	.word	0
-	.word	0
-	.word	0
-	.word	63422
-	.word	35431
-	.word	976
-	.word	0
-	.word	0
-	.word	0
-	.word	38352
-	.word	51462
-	.word	945
-	.word	0
-	.word	0
-	.word	0
-	.word	25806
-	.word	55660
-	.word	914
-	.word	0
-	.word	0
-	.word	0
-	.word	38842
-	.word	41327
-	.word	883
-	.word	0
-	.word	0
-	.word	0
-	.word	17980
-	.word	50458
-	.word	852
-	.word	0
-	.word	0
-	.word	0
-	.word	61194
-	.word	59710
-	.word	821
-	.word	0
-	.word	0
-	.word	0
-	.word	21098
-	.word	42086
-	.word	790
-	.word	0
-	.word	0
-	.word	0
-	.word	16704
-	.word	43341
-	.word	757
-	.word	0
-	.word	0
-	.word	0
-	.word	46316
-	.word	52840
-	.word	728
-	.word	0
-	.word	0
-	.word	0
-	.word	20386
-	.word	33936
-	.word	697
-	.word	0
-	.word	0
-	.word	0
-	.word	20064
-	.word	51864
-	.word	664
-	.word	0
-	.word	0
-	.word	0
-	.word	2268
-	.word	57500
-	.word	634
-	.word	0
-	.word	0
-	.word	0
-	.word	11152
-	.word	51171
-	.word	604
-	.word	0
-	.word	0
-	.word	0
-	.word	23164
-	.word	63727
-	.word	572
-	.word	0
-	.word	0
-	.word	0
-	.word	20514
-	.word	40280
-	.word	542
-	.word	0
-	.word	0
-	.word	0
-	.word	21818
-	.word	57922
-	.word	511
-	.word	0
-	.word	0
-	.word	0
-	.word	32366
-	.word	46413
-	.word	480
-	.word	0
-	.word	0
-	.word	0
-	.word	53972
-	.word	43148
-	.word	449
-	.word	0
-	.word	0
-	.word	0
-	.word	30134
-	.word	65133
-	.word	418
-	.word	0
-	.word	0
-	.word	0
-	.word	15282
-	.word	61516
-	.word	387
-	.word	0
-	.word	0
-	.word	0
-	.word	49872
-	.word	49222
-	.word	355
-	.word	0
-	.word	0
-	.word	0
-	.word	9484
-	.word	63958
-	.word	325
-	.word	0
-	.word	0
-	.word	0
-	.word	47028
-	.word	35341
-	.word	294
-	.word	0
-	.word	0
-	.word	0
-	.word	6770
-	.word	58613
-	.word	263
-	.word	0
-	.word	0
-	.word	0
-	.word	33372
-	.word	43448
-	.word	232
-	.word	0
-	.word	0
-	.word	0
-	.word	27792
-	.word	51629
-	.word	198
-	.word	0
-	.word	0
-	.word	0
-	.word	19712
-	.word	53691
-	.word	170
-	.word	0
-	.word	0
-	.word	0
-	.word	42144
-	.word	60929
-	.word	135
-	.word	0
-	.word	0
-	.word	0
-	.word	35240
-	.word	48799
-	.word	107
-	.word	0
-	.word	0
-	.word	0
-	.word	910
-	.word	51212
-	.word	77
-	.word	0
-	.word	0
-	.word	0
-	.word	65062
-	.word	33668
-	.word	46
-	.word	0
-	.word	0
-	.word	0
-	.word	52624
-	.word	51799
-	.word	14
-	.word	0
-	.type	__4onpi_31l,@object
-	.size	__4onpi_31l,6444
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/libm_sincos_huge.S b/libm/x86/libm_sincos_huge.S
deleted file mode 100644
index 4601b87..0000000
--- a/libm/x86/libm_sincos_huge.S
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-# -- Begin  __libm_sincos_huge
-	.text
-       .align    16,0x90
-	.hidden __libm_sincos_huge
-	.globl __libm_sincos_huge
-__libm_sincos_huge:
-# parameter 1: 8 + %ebp
-# parameter 2: 16 + %ebp
-# parameter 3: 20 + %ebp
-..B1.1:
-        pushl     %ebp
-        movl      %esp, %ebp
-        andl      $-64, %esp
-        pushl     %esi
-        pushl     %edi
-        pushl     %ebx
-        subl      $52, %esp
-        movl      16(%ebp), %eax
-        movl      20(%ebp), %edx
-        movl      %eax, 32(%esp)
-        movl      %edx, 36(%esp)
-..B1.2:
-        fnstcw    30(%esp)
-..B1.3:
-        call      ..L2
-..L2:
-        popl      %edi
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%edi), %edi
-        movsd     8(%ebp), %xmm1
-        movl      12(%ebp), %esi
-        movl      %esi, %eax
-        andl      $2147483647, %eax
-        andps     .L_2il0floatpacket.0@GOTOFF(%edi), %xmm1
-        shrl      $31, %esi
-        movl      %eax, 40(%esp)
-        cmpl      $1104150528, %eax
-        movsd     %xmm1, 8(%ebp)
-        jae       ..B1.11
-..B1.4:
-        movsd     _Pi4Inv@GOTOFF(%edi), %xmm0
-        mulsd     %xmm1, %xmm0
-        movzwl    30(%esp), %edx
-        movl      %edx, %eax
-        andl      $768, %eax
-        movsd     %xmm0, (%esp)
-        cmpl      $768, %eax
-        je        ..B1.42
-..B1.5:
-        orl       $-64768, %edx
-        movw      %dx, 28(%esp)
-..B1.6:
-        fldcw     28(%esp)
-..B1.7:
-        movsd     8(%ebp), %xmm1
-        movl      $1, %ebx
-..B1.8:
-        movl      %ebx, 12(%esp)
-        movl      4(%esp), %ebx
-        movl      %ebx, %eax
-        movl      %esi, 8(%esp)
-        movl      %ebx, %esi
-        shrl      $20, %esi
-        andl      $1048575, %eax
-        movl      %esi, %ecx
-        orl       $1048576, %eax
-        negl      %ecx
-        movl      %eax, %edx
-        addl      $19, %ecx
-        addl      $13, %esi
-        movl      %ecx, 24(%esp)
-        shrl      %cl, %edx
-        movl      %esi, %ecx
-        shll      %cl, %eax
-        movl      24(%esp), %ecx
-        movl      (%esp), %esi
-        shrl      %cl, %esi
-        orl       %esi, %eax
-        cmpl      $1094713344, %ebx
-        movsd     %xmm1, 16(%esp)
-        fldl      16(%esp)
-        cmovb     %edx, %eax
-        movl      8(%esp), %esi
-        lea       1(%eax), %edx
-        movl      %edx, %ebx
-        andl      $-2, %ebx
-        movl      %ebx, 16(%esp)
-        fildl     16(%esp)
-        movl      12(%esp), %ebx
-        cmpl      $1094713344, 40(%esp)
-        jae       ..B1.10
-..B1.9:
-        fldl      _Pi4x3@GOTOFF(%edi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      8+_Pi4x3@GOTOFF(%edi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      16+_Pi4x3@GOTOFF(%edi)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        jmp       ..B1.17
-..B1.10:
-        fldl      _Pi4x4@GOTOFF(%edi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      8+_Pi4x4@GOTOFF(%edi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      16+_Pi4x4@GOTOFF(%edi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      24+_Pi4x4@GOTOFF(%edi)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        jmp       ..B1.17
-..B1.11:
-        movzwl    30(%esp), %edx
-        movl      %edx, %eax
-        andl      $768, %eax
-        cmpl      $768, %eax
-        je        ..B1.43
-..B1.12:
-        orl       $-64768, %edx
-        movw      %dx, 28(%esp)
-..B1.13:
-        fldcw     28(%esp)
-..B1.14:
-        movsd     8(%ebp), %xmm1
-        movl      $1, %ebx
-..B1.15:
-        movsd     %xmm1, 16(%esp)
-        fldl      16(%esp)
-        addl      $-32, %esp
-        lea       32(%esp), %eax
-        fstpt     (%esp)
-        movl      $0, 12(%esp)
-        movl      %eax, 16(%esp)
-        call      __libm_reduce_pi04l
-..B1.46:
-        addl      $32, %esp
-..B1.16:
-        fldl      (%esp)
-        lea       1(%eax), %edx
-        fldl      8(%esp)
-        faddp     %st, %st(1)
-..B1.17:
-        movl      %edx, %ecx
-        addl      $3, %eax
-        shrl      $2, %ecx
-        andl      $1, %ecx
-        shrl      $2, %eax
-        xorl      %ecx, %esi
-        movl      36(%esp), %ecx
-        andl      $1, %eax
-        andl      $3, %ecx
-        cmpl      $3, %ecx
-        jne       ..B1.25
-..B1.18:
-        fldt      84+_SP@GOTOFF(%edi)
-        fld       %st(1)
-        fmul      %st(2), %st
-        testb     $2, %dl
-        fmul      %st, %st(1)
-        fldt      72+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      60+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      48+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      36+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      24+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      12+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      _SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fmul      %st, %st(1)
-        fldt      84+_CP@GOTOFF(%edi)
-        fmul      %st(1), %st
-        fldt      72+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      60+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      48+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      36+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      24+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      12+_CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      _CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(1)
-        fldl      _ones@GOTOFF(%edi,%esi,8)
-        fldl      _ones@GOTOFF(%edi,%eax,8)
-        je        ..B1.22
-..B1.19:
-        fmulp     %st, %st(4)
-        testl     %ebx, %ebx
-        fxch      %st(2)
-        fmul      %st(3), %st
-        movl      32(%esp), %eax
-        faddp     %st, %st(3)
-        fxch      %st(2)
-        fstpl     (%eax)
-        fmul      %st, %st(1)
-        faddp     %st, %st(1)
-        fstpl     8(%eax)
-        je        ..B1.21
-..B1.20:
-        fldcw     30(%esp)
-..B1.21:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.22:
-        fxch      %st(1)
-        fmulp     %st, %st(4)
-        testl     %ebx, %ebx
-        fxch      %st(2)
-        fmul      %st(3), %st
-        movl      32(%esp), %eax
-        faddp     %st, %st(3)
-        fxch      %st(2)
-        fstpl     8(%eax)
-        fmul      %st, %st(1)
-        faddp     %st, %st(1)
-        fstpl     (%eax)
-        je        ..B1.24
-..B1.23:
-        fldcw     30(%esp)
-..B1.24:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.25:
-        testb     $2, 36(%esp)
-        je        ..B1.33
-..B1.26:
-        fld       %st(0)
-        testb     $2, %dl
-        fmul      %st(1), %st
-        fld       %st(0)
-        fmul      %st(1), %st
-        je        ..B1.30
-..B1.27:
-        fstp      %st(2)
-        fldt      84+_CP@GOTOFF(%edi)
-        testl     %ebx, %ebx
-        fmul      %st(2), %st
-        fldt      72+_CP@GOTOFF(%edi)
-        fmul      %st(3), %st
-        fldt      60+_CP@GOTOFF(%edi)
-        movl      32(%esp), %eax
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      48+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      36+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      24+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      12+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(3)
-        fldt      _CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        fldl      _ones@GOTOFF(%edi,%esi,8)
-        fmul      %st, %st(1)
-        faddp     %st, %st(1)
-        fstpl     8(%eax)
-        je        ..B1.29
-..B1.28:
-        fldcw     30(%esp)
-..B1.29:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.30:
-        fldt      84+_SP@GOTOFF(%edi)
-        testl     %ebx, %ebx
-        fmul      %st(1), %st
-        fldt      72+_SP@GOTOFF(%edi)
-        fmul      %st(2), %st
-        fldt      60+_SP@GOTOFF(%edi)
-        movl      32(%esp), %eax
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      48+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      36+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      24+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      12+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(2)
-        fldt      _SP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(2)
-        faddp     %st, %st(1)
-        fldl      _ones@GOTOFF(%edi,%esi,8)
-        fmulp     %st, %st(2)
-        fmul      %st(1), %st
-        faddp     %st, %st(1)
-        fstpl     8(%eax)
-        je        ..B1.32
-..B1.31:
-        fldcw     30(%esp)
-..B1.32:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.33:
-        testb     $1, 36(%esp)
-        je        ..B1.41
-..B1.34:
-        fld       %st(0)
-        testb     $2, %dl
-        fmul      %st(1), %st
-        fld       %st(0)
-        fmul      %st(1), %st
-        je        ..B1.38
-..B1.35:
-        fldt      84+_SP@GOTOFF(%edi)
-        testl     %ebx, %ebx
-        fmul      %st(1), %st
-        fldt      72+_SP@GOTOFF(%edi)
-        fmul      %st(2), %st
-        fldt      60+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      48+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      36+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      24+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      12+_SP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(2)
-        fldt      _SP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(2)
-        faddp     %st, %st(1)
-        fldl      _ones@GOTOFF(%edi,%eax,8)
-        fmulp     %st, %st(2)
-        fmul      %st(1), %st
-        movl      32(%esp), %eax
-        faddp     %st, %st(1)
-        fstpl     (%eax)
-        je        ..B1.37
-..B1.36:
-        fldcw     30(%esp)
-..B1.37:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.38:
-        fstp      %st(2)
-        fldt      84+_CP@GOTOFF(%edi)
-        testl     %ebx, %ebx
-        fmul      %st(2), %st
-        fldt      72+_CP@GOTOFF(%edi)
-        fmul      %st(3), %st
-        fldt      60+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      48+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      36+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      24+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(3), %st
-        fldt      12+_CP@GOTOFF(%edi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(3)
-        fldt      _CP@GOTOFF(%edi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        fldl      _ones@GOTOFF(%edi,%eax,8)
-        fmul      %st, %st(1)
-        movl      32(%esp), %eax
-        faddp     %st, %st(1)
-        fstpl     (%eax)
-        je        ..B1.40
-..B1.39:
-        fldcw     30(%esp)
-..B1.40:
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.41:
-        fstp      %st(0)
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.42:
-        xorl      %ebx, %ebx
-        jmp       ..B1.8
-..B1.43:
-        xorl      %ebx, %ebx
-        jmp       ..B1.15
-        .align    16,0x90
-	.type	__libm_sincos_huge,@function
-	.size	__libm_sincos_huge,.-__libm_sincos_huge
-	.data
-# -- End  __libm_sincos_huge
-	.section .rodata, "a"
-	.align 16
-	.align 16
-.L_2il0floatpacket.0:
-	.long	0xffffffff,0x7fffffff,0x00000000,0x00000000
-	.type	.L_2il0floatpacket.0,@object
-	.size	.L_2il0floatpacket.0,16
-	.align 16
-_Pi4Inv:
-	.long	1841940611
-	.long	1072979760
-	.type	_Pi4Inv,@object
-	.size	_Pi4Inv,8
-	.space 8, 0x00 	# pad
-	.align 16
-_Pi4x3:
-	.long	1413754880
-	.long	3219726843
-	.long	993632256
-	.long	1027030475
-	.long	3773204808
-	.long	3129236486
-	.type	_Pi4x3,@object
-	.size	_Pi4x3,24
-	.space 8, 0x00 	# pad
-	.align 16
-_Pi4x4:
-	.long	1413480448
-	.long	3219726843
-	.long	442499072
-	.long	3183522913
-	.long	771751936
-	.long	3146979722
-	.long	622873025
-	.long	3110831002
-	.type	_Pi4x4,@object
-	.size	_Pi4x4,32
-	.align 16
-_SP:
-	.word	43691
-	.word	43690
-	.word	43690
-	.word	43690
-	.word	49148
-	.word	0
-	.word	34951
-	.word	34952
-	.word	34952
-	.word	34952
-	.word	16376
-	.word	0
-	.word	50471
-	.word	3328
-	.word	208
-	.word	53261
-	.word	49138
-	.word	0
-	.word	17910
-	.word	46614
-	.word	7466
-	.word	47343
-	.word	16364
-	.word	0
-	.word	33371
-	.word	14743
-	.word	11071
-	.word	55090
-	.word	49125
-	.word	0
-	.word	48947
-	.word	35764
-	.word	12250
-	.word	45202
-	.word	16350
-	.word	0
-	.word	17574
-	.word	60698
-	.word	10735
-	.word	55102
-	.word	49110
-	.word	0
-	.word	34320
-	.word	12415
-	.word	25249
-	.word	51489
-	.word	16334
-	.word	0
-	.type	_SP,@object
-	.size	_SP,96
-	.align 16
-_CP:
-	.word	0
-	.word	0
-	.word	0
-	.word	32768
-	.word	49150
-	.word	0
-	.word	43685
-	.word	43690
-	.word	43690
-	.word	43690
-	.word	16378
-	.word	0
-	.word	39983
-	.word	2912
-	.word	24758
-	.word	46603
-	.word	49141
-	.word	0
-	.word	61476
-	.word	3244
-	.word	208
-	.word	53261
-	.word	16367
-	.word	0
-	.word	1022
-	.word	16229
-	.word	32187
-	.word	37874
-	.word	49129
-	.word	0
-	.word	55373
-	.word	44526
-	.word	50840
-	.word	36726
-	.word	16354
-	.word	0
-	.word	55994
-	.word	65145
-	.word	59958
-	.word	51657
-	.word	49114
-	.word	0
-	.word	15046
-	.word	2976
-	.word	1998
-	.word	54661
-	.word	16338
-	.word	0
-	.type	_CP,@object
-	.size	_CP,96
-	.align 16
-_ones:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	3220176896
-	.type	_ones,@object
-	.size	_ones,16
-	.data
-	.hidden __libm_reduce_pi04l
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/libm_tancot_huge.S b/libm/x86/libm_tancot_huge.S
deleted file mode 100644
index cdaa820..0000000
--- a/libm/x86/libm_tancot_huge.S
+++ /dev/null
@@ -1,750 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-# -- Begin  __libm_tancot_huge
-	.text
-       .align    16,0x90
-	.hidden __libm_tancot_huge
-	.globl __libm_tancot_huge
-__libm_tancot_huge:
-# parameter 1: 8 + %ebp
-# parameter 2: 16 + %ebp
-# parameter 3: 20 + %ebp
-..B1.1:
-        pushl     %ebp
-        movl      %esp, %ebp
-        andl      $-64, %esp
-        pushl     %esi
-        pushl     %edi
-        pushl     %ebx
-        subl      $52, %esp
-        movl      16(%ebp), %eax
-        movl      20(%ebp), %ebx
-        movl      %eax, 40(%esp)
-..B1.2:
-        fnstcw    38(%esp)
-..B1.3:
-        movl      12(%ebp), %edx
-        movl      %edx, %eax
-        andl      $2147483647, %eax
-        shrl      $31, %edx
-        movl      %edx, 44(%esp)
-        cmpl      $1104150528, %eax
-        call      ..L2
-..L2:
-        popl      %esi
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%esi), %esi
-        jae       ..B1.11
-..B1.4:
-        movsd     8(%ebp), %xmm1
-        movzwl    38(%esp), %ecx
-        movl      %ecx, %edx
-        andl      $768, %edx
-        andps     .L_2il0floatpacket.0@GOTOFF(%esi), %xmm1
-        cmpl      $768, %edx
-        movsd     _Pi4Inv@GOTOFF(%esi), %xmm0
-        mulsd     %xmm1, %xmm0
-        movsd     %xmm1, 8(%ebp)
-        movsd     %xmm0, (%esp)
-        je        ..B1.39
-..B1.5:
-        orl       $-64768, %ecx
-        movw      %cx, 36(%esp)
-..B1.6:
-        fldcw     36(%esp)
-..B1.7:
-        movsd     8(%ebp), %xmm1
-        movl      $1, %edi
-..B1.8:
-        movl      %esi, 12(%esp)
-        movl      4(%esp), %esi
-        movl      %esi, %edx
-        movl      %edi, 24(%esp)
-        movl      %esi, %edi
-        shrl      $20, %edi
-        andl      $1048575, %edx
-        movl      %edi, %ecx
-        orl       $1048576, %edx
-        negl      %ecx
-        addl      $13, %edi
-        movl      %ebx, 8(%esp)
-        addl      $19, %ecx
-        movl      %edx, %ebx
-        movl      %ecx, 28(%esp)
-        shrl      %cl, %ebx
-        movl      %edi, %ecx
-        shll      %cl, %edx
-        movl      28(%esp), %ecx
-        movl      (%esp), %edi
-        shrl      %cl, %edi
-        orl       %edi, %edx
-        cmpl      $1094713344, %esi
-        movsd     %xmm1, 16(%esp)
-        fldl      16(%esp)
-        cmovb     %ebx, %edx
-        movl      24(%esp), %edi
-        movl      12(%esp), %esi
-        lea       1(%edx), %ebx
-        andl      $-2, %ebx
-        movl      %ebx, 16(%esp)
-        cmpl      $1094713344, %eax
-        fildl     16(%esp)
-        movl      8(%esp), %ebx
-        jae       ..B1.10
-..B1.9:
-        fldl      _Pi4x3@GOTOFF(%esi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      8+_Pi4x3@GOTOFF(%esi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      16+_Pi4x3@GOTOFF(%esi)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        jmp       ..B1.17
-..B1.10:
-        fldl      _Pi4x4@GOTOFF(%esi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      8+_Pi4x4@GOTOFF(%esi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      16+_Pi4x4@GOTOFF(%esi)
-        fmul      %st(1), %st
-        faddp     %st, %st(2)
-        fldl      24+_Pi4x4@GOTOFF(%esi)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        jmp       ..B1.17
-..B1.11:
-        movzwl    38(%esp), %edx
-        movl      %edx, %eax
-        andl      $768, %eax
-        cmpl      $768, %eax
-        je        ..B1.40
-..B1.12:
-        orl       $-64768, %edx
-        movw      %dx, 36(%esp)
-..B1.13:
-        fldcw     36(%esp)
-..B1.14:
-        movl      $1, %edi
-..B1.15:
-        movsd     8(%ebp), %xmm0
-        addl      $-32, %esp
-        andps     .L_2il0floatpacket.0@GOTOFF(%esi), %xmm0
-        lea       32(%esp), %eax
-        movsd     %xmm0, 16(%eax)
-        fldl      16(%eax)
-        fstpt     (%esp)
-        movl      $0, 12(%esp)
-        movl      %eax, 16(%esp)
-        call      __libm_reduce_pi04l
-..B1.43:
-        movl      %eax, %edx
-        addl      $32, %esp
-..B1.16:
-        fldl      (%esp)
-        fldl      8(%esp)
-        faddp     %st, %st(1)
-..B1.17:
-        movl      %ebx, %eax
-        andl      $3, %eax
-        cmpl      $3, %eax
-        jne       ..B1.24
-..B1.18:
-        fldl      _ones@GOTOFF(%esi)
-        incl      %edx
-        fdiv      %st(1), %st
-        testb     $2, %dl
-        fstpt     24(%esp)
-        fld       %st(0)
-        fmul      %st(1), %st
-        fld       %st(0)
-        fmul      %st(1), %st
-        fldt      36+_TP@GOTOFF(%esi)
-        fmul      %st(2), %st
-        fldt      24+_TP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      12+_TP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      36+_TQ@GOTOFF(%esi)
-        fmul      %st(3), %st
-        fldt      24+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(3), %st
-        fldt      12+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(3), %st
-        fldt      _TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fldt      _TP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fldt      132+_GP@GOTOFF(%esi)
-        fmul      %st(3), %st
-        fldt      120+_GP@GOTOFF(%esi)
-        fmul      %st(4), %st
-        fldt      108+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      96+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      84+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      72+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      60+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      48+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      36+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(4), %st
-        fldt      24+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(4)
-        fldt      12+_GP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(4), %st
-        fmul      %st(5), %st
-        fldt      _GP@GOTOFF(%esi)
-        faddp     %st, %st(4)
-        fxch      %st(3)
-        fmul      %st(5), %st
-        faddp     %st, %st(3)
-        je        ..B1.20
-..B1.19:
-        fldt      24(%esp)
-        fxch      %st(1)
-        fdivrp    %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(3)
-        movl      44(%esp), %eax
-        xorl      $1, %eax
-        fxch      %st(2)
-        fmul      %st(3), %st
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(2)
-        fmul      %st, %st(3)
-        fxch      %st(3)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fstpl     16(%esp)
-        fmul      %st(1), %st
-        fxch      %st(1)
-        fmulp     %st, %st(2)
-        movsd     16(%esp), %xmm0
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm1
-        jmp       ..B1.21
-..B1.20:
-        fdivrp    %st, %st(1)
-        fmulp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        movl      44(%esp), %eax
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(1)
-        fmul      %st, %st(3)
-        fxch      %st(3)
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        fmul      %st(1), %st
-        fldt      24(%esp)
-        fmulp     %st, %st(2)
-        movsd     16(%esp), %xmm0
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm1
-..B1.21:
-        testl     %edi, %edi
-        je        ..B1.23
-..B1.22:
-        fldcw     38(%esp)
-..B1.23:
-        movl      40(%esp), %eax
-        movsd     %xmm0, (%eax)
-        movsd     %xmm1, 8(%eax)
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.24:
-        testb     $2, %bl
-        je        ..B1.31
-..B1.25:
-        incl      %edx
-        fld       %st(0)
-        fmul      %st(1), %st
-        testb     $2, %dl
-        je        ..B1.27
-..B1.26:
-        fldl      _ones@GOTOFF(%esi)
-        fdiv      %st(2), %st
-        fld       %st(1)
-        fmul      %st(2), %st
-        fldt      132+_GP@GOTOFF(%esi)
-        fmul      %st(1), %st
-        fldt      120+_GP@GOTOFF(%esi)
-        fmul      %st(2), %st
-        fldt      108+_GP@GOTOFF(%esi)
-        movl      44(%esp), %eax
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        xorl      $1, %eax
-        fldt      96+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      84+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      72+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      60+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      48+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      36+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      24+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(2)
-        fldt      12+_GP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(3)
-        fldt      _GP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(3), %st
-        fxch      %st(2)
-        fmulp     %st, %st(3)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(2)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm0
-        jmp       ..B1.28
-..B1.27:
-        fldt      36+_TP@GOTOFF(%esi)
-        fmul      %st(1), %st
-        fldt      24+_TP@GOTOFF(%esi)
-        movl      44(%esp), %eax
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        fldt      36+_TQ@GOTOFF(%esi)
-        fmul      %st(2), %st
-        fldt      24+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      12+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      _TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fldt      12+_TP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      _TP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fdivp     %st, %st(1)
-        fmulp     %st, %st(1)
-        fmul      %st(1), %st
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(1)
-        fmulp     %st, %st(2)
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm0
-..B1.28:
-        testl     %edi, %edi
-        je        ..B1.30
-..B1.29:
-        fldcw     38(%esp)
-..B1.30:
-        movl      40(%esp), %eax
-        movsd     %xmm0, (%eax)
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.31:
-        testb     $1, %bl
-        je        ..B1.38
-..B1.32:
-        incl      %edx
-        fld       %st(0)
-        fmul      %st(1), %st
-        testb     $2, %dl
-        je        ..B1.34
-..B1.33:
-        fldt      36+_TP@GOTOFF(%esi)
-        fmul      %st(1), %st
-        fldt      24+_TP@GOTOFF(%esi)
-        movl      44(%esp), %eax
-        faddp     %st, %st(1)
-        fmul      %st(1), %st
-        xorl      $1, %eax
-        fldt      36+_TQ@GOTOFF(%esi)
-        fmul      %st(2), %st
-        fldt      24+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      12+_TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(2), %st
-        fldt      _TQ@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fldt      12+_TP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      _TP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fdivp     %st, %st(1)
-        fmulp     %st, %st(1)
-        fmul      %st(1), %st
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(1)
-        fmulp     %st, %st(2)
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm0
-        jmp       ..B1.35
-..B1.34:
-        fldl      _ones@GOTOFF(%esi)
-        fdiv      %st(2), %st
-        fld       %st(1)
-        fmul      %st(2), %st
-        fldt      132+_GP@GOTOFF(%esi)
-        fmul      %st(1), %st
-        fldt      120+_GP@GOTOFF(%esi)
-        fmul      %st(2), %st
-        fldt      108+_GP@GOTOFF(%esi)
-        movl      44(%esp), %eax
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      96+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      84+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      72+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      60+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      48+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      36+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmul      %st(2), %st
-        fldt      24+_GP@GOTOFF(%esi)
-        faddp     %st, %st(2)
-        fxch      %st(1)
-        fmulp     %st, %st(2)
-        fldt      12+_GP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmulp     %st, %st(3)
-        fldt      _GP@GOTOFF(%esi)
-        faddp     %st, %st(1)
-        fmul      %st(3), %st
-        fxch      %st(2)
-        fmulp     %st, %st(3)
-        fxch      %st(1)
-        faddp     %st, %st(2)
-        fldl      _ones@GOTOFF(%esi,%eax,8)
-        fmul      %st, %st(2)
-        fmulp     %st, %st(1)
-        faddp     %st, %st(1)
-        fstpl     16(%esp)
-        movsd     16(%esp), %xmm0
-..B1.35:
-        testl     %edi, %edi
-        je        ..B1.37
-..B1.36:
-        fldcw     38(%esp)
-..B1.37:
-        movl      40(%esp), %eax
-        movsd     %xmm0, 8(%eax)
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.38:
-        fstp      %st(0)
-        addl      $52, %esp
-        popl      %ebx
-        popl      %edi
-        popl      %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B1.39:
-        xorl      %edi, %edi
-        jmp       ..B1.8
-..B1.40:
-        xorl      %edi, %edi
-        jmp       ..B1.15
-        .align    16,0x90
-	.type	__libm_tancot_huge,@function
-	.size	__libm_tancot_huge,.-__libm_tancot_huge
-	.data
-# -- End  __libm_tancot_huge
-	.section .rodata, "a"
-	.align 16
-	.align 16
-.L_2il0floatpacket.0:
-	.long	0xffffffff,0x7fffffff,0x00000000,0x00000000
-	.type	.L_2il0floatpacket.0,@object
-	.size	.L_2il0floatpacket.0,16
-	.align 16
-_Pi4Inv:
-	.long	1841940611
-	.long	1072979760
-	.type	_Pi4Inv,@object
-	.size	_Pi4Inv,8
-	.space 8, 0x00 	# pad
-	.align 16
-_Pi4x3:
-	.long	1413754880
-	.long	3219726843
-	.long	993632256
-	.long	1027030475
-	.long	3773204808
-	.long	3129236486
-	.type	_Pi4x3,@object
-	.size	_Pi4x3,24
-	.space 8, 0x00 	# pad
-	.align 16
-_Pi4x4:
-	.long	1413480448
-	.long	3219726843
-	.long	442499072
-	.long	3183522913
-	.long	771751936
-	.long	3146979722
-	.long	622873025
-	.long	3110831002
-	.type	_Pi4x4,@object
-	.size	_Pi4x4,32
-	.align 16
-_ones:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	3220176896
-	.type	_ones,@object
-	.size	_ones,16
-	.align 16
-_TP:
-	.word	19670
-	.word	44908
-	.word	50960
-	.word	50786
-	.word	49149
-	.word	0
-	.word	19206
-	.word	45228
-	.word	54194
-	.word	52268
-	.word	16377
-	.word	0
-	.word	227
-	.word	51280
-	.word	43560
-	.word	38195
-	.word	49139
-	.word	0
-	.word	12272
-	.word	18029
-	.word	6715
-	.word	45670
-	.word	16357
-	.word	0
-	.type	_TP,@object
-	.size	_TP,48
-	.align 16
-_TQ:
-	.word	14748
-	.word	33681
-	.word	5452
-	.word	38090
-	.word	49151
-	.word	0
-	.word	46755
-	.word	50026
-	.word	17634
-	.word	35372
-	.word	16382
-	.word	0
-	.word	46863
-	.word	53352
-	.word	42702
-	.word	59869
-	.word	49145
-	.word	0
-	.word	33295
-	.word	20942
-	.word	32118
-	.word	39935
-	.word	16371
-	.word	0
-	.type	_TQ,@object
-	.size	_TQ,48
-	.align 16
-_GP:
-	.word	43691
-	.word	43690
-	.word	43690
-	.word	43690
-	.word	49149
-	.word	0
-	.word	46639
-	.word	2912
-	.word	24758
-	.word	46603
-	.word	49145
-	.word	0
-	.word	57255
-	.word	2218
-	.word	21984
-	.word	35507
-	.word	49142
-	.word	0
-	.word	34208
-	.word	43033
-	.word	48281
-	.word	56811
-	.word	49138
-	.word	0
-	.word	28773
-	.word	27191
-	.word	31071
-	.word	45908
-	.word	49135
-	.word	0
-	.word	43257
-	.word	33777
-	.word	11976
-	.word	37184
-	.word	49132
-	.word	0
-	.word	62410
-	.word	35990
-	.word	36363
-	.word	60269
-	.word	49128
-	.word	0
-	.word	13659
-	.word	55568
-	.word	26569
-	.word	48851
-	.word	49125
-	.word	0
-	.word	10347
-	.word	46238
-	.word	47188
-	.word	39576
-	.word	49122
-	.word	0
-	.word	2161
-	.word	6703
-	.word	25719
-	.word	64708
-	.word	49118
-	.word	0
-	.word	42329
-	.word	7593
-	.word	44754
-	.word	47734
-	.word	49115
-	.word	0
-	.word	163
-	.word	32746
-	.word	39875
-	.word	61957
-	.word	49112
-	.word	0
-	.type	_GP,@object
-	.size	_GP,144
-	.data
-	.hidden __libm_reduce_pi04l
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/rint.S b/libm/x86/rint.S
deleted file mode 100644
index 282d3ed..0000000
--- a/libm/x86/rint.S
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(rint)
-  subl    $12,%esp
-  movsd   16(%esp),%xmm0
-  roundsd $4,%xmm0,%xmm0
-  movsd   %xmm0,(%esp)
-  fldl    (%esp)
-  addl    $12,%esp
-  ret
-END(rint)
-
-// LP32 sizeof(long double) == sizeof(double).
-ALIAS_SYMBOL(rintl, rint);
diff --git a/libm/x86/rintf.S b/libm/x86/rintf.S
deleted file mode 100644
index d5cbe78..0000000
--- a/libm/x86/rintf.S
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(rintf)
-  subl    $12,%esp
-  movss   16(%esp),%xmm0
-  roundss $4,%xmm0,%xmm0
-  movss   %xmm0,(%esp)
-  flds    (%esp)
-  add     $12,%esp
-  ret
-END(rintf)
diff --git a/libm/x86/s_atan.S b/libm/x86/s_atan.S
deleted file mode 100644
index 71ca4db..0000000
--- a/libm/x86/s_atan.S
+++ /dev/null
@@ -1,934 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// This implementation uses the main path for |x| in [2^{-5},2^65).
-// For |x| in [2^{-64},2^{-5}), a secondary path is used.
-// For the biased exponent of X within 3FFH-64 and 3FF+64, we use one branch.
-// We use the following definition of B and X` so that the formula
-// atan(X) = Tau + atan( (X`-B) / (One + BX) ) is correct
-//
-// X = (-1)^s * 2^k * 1. x1 x2 ... x52
-//
-// Define X`  = 0 if k >= 5; and X`  = |X| otherwise
-// Define One = 0 if k >= 5; and One = 1 otherwise
-// Define B  = 0 if k <= -6; B =  2^k * 1.x1 x2 x3 x4 1  if -5 <= k <= 4
-// Define B  =  2^5 * 1.0 0 ... 0   if  k >= 5
-//
-// Tau is 0 if k <= -6;
-// Tau is atan( B )  if -5 <= k <= 4
-// Tau is pi/2 if k >= 5
-//
-// Special cases:
-//  atan(NaN) = quiet NaN
-//  atan(+/-INF) = +/-Pi/2
-//  atan(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  atan
-ENTRY(atan)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 48(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        movsd     2640(%ebx), %xmm3
-        movsd     2624(%ebx), %xmm5
-        movsd     2656(%ebx), %xmm4
-        movsd     %xmm0, 8(%esp)
-        pextrw    $3, %xmm0, %edx
-        andpd     %xmm0, %xmm3
-        pshufd    $68, %xmm0, %xmm1
-        orpd      %xmm4, %xmm3
-        movl      %edx, %eax
-        andl      $32767, %edx
-        subl      $16288, %edx
-        cmpl      $159, %edx
-        ja        .L_2TAG_PACKET_0.0.2
-        mulsd     %xmm3, %xmm1
-        subsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm1
-        divsd     %xmm1, %xmm0
-        addl      $1, %edx
-        movsd     2672(%ebx), %xmm2
-        movsd     2688(%ebx), %xmm4
-        andl      $32768, %eax
-        xorpd     %xmm7, %xmm7
-        pinsrw    $3, %eax, %xmm7
-        addl      %edx, %edx
-        movsd     (%ebx,%edx,8), %xmm6
-        movsd     8(%ebx,%edx,8), %xmm5
-        xorpd     %xmm7, %xmm5
-        xorpd     %xmm7, %xmm6
-        movsd     2680(%ebx), %xmm7
-        pshufd    $68, %xmm0, %xmm1
-        mulsd     %xmm0, %xmm0
-        pshufd    $68, %xmm1, %xmm3
-        addsd     %xmm6, %xmm1
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm4
-        subsd     %xmm1, %xmm6
-        mulsd     %xmm0, %xmm4
-        addsd     %xmm7, %xmm2
-        mulsd     %xmm3, %xmm0
-        addsd     %xmm3, %xmm6
-        mulsd     %xmm2, %xmm0
-        addsd     2696(%ebx), %xmm4
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm6, %xmm0
-        addsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        addl      $944, %edx
-        cmpl      $1103, %edx
-        ja        .L_2TAG_PACKET_2.0.2
-        movsd     2672(%ebx), %xmm4
-        movsd     2688(%ebx), %xmm7
-        movsd     8(%esp), %xmm0
-        mulsd     %xmm1, %xmm1
-        movsd     2680(%ebx), %xmm2
-        movsd     2696(%ebx), %xmm5
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm1, %xmm7
-        movapd    %xmm1, %xmm6
-        mulsd     %xmm0, %xmm1
-        addsd     %xmm4, %xmm2
-        mulsd     %xmm6, %xmm7
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm5, %xmm7
-        mulsd     %xmm7, %xmm2
-        addsd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        addl      $15344, %edx
-        cmpl      $16368, %edx
-        ja        .L_2TAG_PACKET_3.0.2
-        movsd     8(%esp), %xmm0
-        movsd     8(%esp), %xmm1
-        cmpl      $16, %edx
-        jae       .L_2TAG_PACKET_4.0.2
-        mulsd     %xmm0, %xmm1
-.L_2TAG_PACKET_4.0.2:
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_3.0.2:
-        cmpl      $17392, %edx
-        jae       .L_2TAG_PACKET_5.0.2
-        xorpd     %xmm1, %xmm1
-        movl      $49136, %ecx
-        pinsrw    $3, %ecx, %xmm1
-        divsd     %xmm0, %xmm1
-        movsd     2672(%ebx), %xmm2
-        movsd     2688(%ebx), %xmm4
-        andl      $32768, %eax
-        xorpd     %xmm7, %xmm7
-        pinsrw    $3, %eax, %xmm7
-        addl      %edx, %edx
-        movsd     2592(%ebx), %xmm6
-        movsd     2600(%ebx), %xmm5
-        xorpd     %xmm7, %xmm5
-        xorpd     %xmm7, %xmm6
-        movsd     2680(%ebx), %xmm7
-        pshufd    $68, %xmm1, %xmm0
-        mulsd     %xmm1, %xmm1
-        pshufd    $68, %xmm0, %xmm3
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm1, %xmm4
-        subsd     %xmm0, %xmm6
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm7, %xmm2
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm3, %xmm6
-        mulsd     %xmm2, %xmm1
-        addsd     2696(%ebx), %xmm4
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm4, %xmm1
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_5.0.2:
-        movsd     8(%esp), %xmm4
-        movsd     2608(%ebx), %xmm0
-        movsd     2592(%ebx), %xmm2
-        movsd     2600(%ebx), %xmm3
-        movd      %xmm1, %eax
-        psrlq     $32, %xmm1
-        movd      %xmm1, %edx
-        andl      $2147483647, %edx
-        cmpl      $2146435072, %edx
-        jae       .L_2TAG_PACKET_6.0.2
-.L_2TAG_PACKET_7.0.2:
-        andnpd    %xmm4, %xmm0
-        orpd      %xmm0, %xmm2
-        orpd      %xmm3, %xmm0
-        addsd     %xmm2, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_6.0.2:
-        subl      $2146435072, %edx
-        orl       %edx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_7.0.2
-        movapd    %xmm4, %xmm0
-        addsd     %xmm0, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-.L_2TAG_PACKET_1.0.2:
-        movl      48(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(atan)
-# -- End  atan
-
-# Start file scope ASM
-ALIAS_SYMBOL(atanl, atan);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3819695742
-	.long	1067482761
-	.long	2398680355
-	.long	3155462074
-	.long	2998791009
-	.long	1067548225
-	.long	3868465248
-	.long	3157182472
-	.long	3339424991
-	.long	1067613680
-	.long	3296670360
-	.long	1010752543
-	.long	2710002256
-	.long	1067679126
-	.long	3403896007
-	.long	1010910768
-	.long	3275701428
-	.long	1067744562
-	.long	119959933
-	.long	1011482843
-	.long	2908636881
-	.long	1067809988
-	.long	2464489612
-	.long	1011545526
-	.long	3777889398
-	.long	1067875403
-	.long	3262682165
-	.long	1009703919
-	.long	3759667419
-	.long	1067940807
-	.long	1838130851
-	.long	3157373556
-	.long	732369940
-	.long	1068006200
-	.long	1203428313
-	.long	1010055371
-	.long	1166616461
-	.long	1068071580
-	.long	2901274051
-	.long	3158549977
-	.long	2945472892
-	.long	1068136947
-	.long	3726120658
-	.long	1009762715
-	.long	3954480976
-	.long	1068202301
-	.long	1289173457
-	.long	1009429861
-	.long	2081752829
-	.long	1068267642
-	.long	1836909874
-	.long	1006212095
-	.long	3807999788
-	.long	1068332968
-	.long	2172459940
-	.long	3156162078
-	.long	2731789884
-	.long	1068398280
-	.long	3450718392
-	.long	3159216547
-	.long	1044477961
-	.long	1068463577
-	.long	2230553229
-	.long	1011424339
-	.long	1486930287
-	.long	1068530218
-	.long	2861547474
-	.long	1012041376
-	.long	2293016881
-	.long	1068595466
-	.long	136843272
-	.long	1012684797
-	.long	201518157
-	.long	1068660680
-	.long	63231984
-	.long	1012427198
-	.long	4054234584
-	.long	1068725856
-	.long	3927006960
-	.long	1011878955
-	.long	1246477213
-	.long	1068790995
-	.long	1494265652
-	.long	3155219350
-	.long	678186699
-	.long	1068856093
-	.long	1264361424
-	.long	3159256693
-	.long	2690594995
-	.long	1068921148
-	.long	3906996379
-	.long	1009288267
-	.long	3362611517
-	.long	1068986159
-	.long	1650970041
-	.long	3158331771
-	.long	3102162111
-	.long	1069051124
-	.long	365917035
-	.long	3160264153
-	.long	2352611067
-	.long	1069116041
-	.long	4008970190
-	.long	3159478182
-	.long	1594134794
-	.long	1069180908
-	.long	466690178
-	.long	1012526501
-	.long	1345079306
-	.long	1069245723
-	.long	2268273568
-	.long	3160164092
-	.long	2163300970
-	.long	1069310484
-	.long	2750834800
-	.long	3158113482
-	.long	352522716
-	.long	1069375190
-	.long	1750411372
-	.long	1011790845
-	.long	848541647
-	.long	1069439838
-	.long	2164207573
-	.long	1011698350
-	.long	40647312
-	.long	1069504427
-	.long	2949165434
-	.long	3159107267
-	.long	2216766270
-	.long	1069574357
-	.long	2197920765
-	.long	3161055954
-	.long	1090914384
-	.long	1069638757
-	.long	2330454674
-	.long	1013365998
-	.long	387601244
-	.long	1069703022
-	.long	3185681168
-	.long	1013434071
-	.long	3991640484
-	.long	1069767144
-	.long	1313211590
-	.long	3161087959
-	.long	3322489502
-	.long	1069831118
-	.long	3013977995
-	.long	1013053011
-	.long	3121698570
-	.long	1069894936
-	.long	4069015667
-	.long	1013023362
-	.long	4289964660
-	.long	1069958591
-	.long	1736191156
-	.long	3158266731
-	.long	3903312386
-	.long	1070022077
-	.long	1833592413
-	.long	3159731471
-	.long	3818449864
-	.long	1070085387
-	.long	851036429
-	.long	3159730451
-	.long	2097480306
-	.long	1070148515
-	.long	3506390884
-	.long	3160462302
-	.long	1611694502
-	.long	1070211454
-	.long	2785735540
-	.long	3160465144
-	.long	1464694796
-	.long	1070274198
-	.long	4229277299
-	.long	3159907000
-	.long	1299612775
-	.long	1070336741
-	.long	4116653788
-	.long	3160427739
-	.long	1310544789
-	.long	1070399077
-	.long	1064430331
-	.long	1013218202
-	.long	2253168030
-	.long	1070461200
-	.long	1405044609
-	.long	3157623179
-	.long	1159567373
-	.long	1070523105
-	.long	2353445521
-	.long	3159992176
-	.long	1359373750
-	.long	1070605818
-	.long	1748171336
-	.long	3161879263
-	.long	908341706
-	.long	1070667034
-	.long	3372710815
-	.long	3161775245
-	.long	1743027350
-	.long	1070727765
-	.long	687089934
-	.long	3160507171
-	.long	2055355646
-	.long	1070787992
-	.long	2392855242
-	.long	1013682469
-	.long	690426164
-	.long	1070847697
-	.long	1103926666
-	.long	1014052810
-	.long	1483247847
-	.long	1070906862
-	.long	2082645847
-	.long	3161345479
-	.long	392040270
-	.long	1070965472
-	.long	2407720023
-	.long	1014053754
-	.long	2673846014
-	.long	1071023511
-	.long	1293605532
-	.long	3158464385
-	.long	1384215810
-	.long	1071080967
-	.long	2446095872
-	.long	3159216407
-	.long	3101660631
-	.long	1071137826
-	.long	698040758
-	.long	1014855328
-	.long	2094057058
-	.long	1071194078
-	.long	2282048339
-	.long	1014040385
-	.long	1712750594
-	.long	1071249712
-	.long	1204372378
-	.long	3162276464
-	.long	1411515787
-	.long	1071304719
-	.long	949080808
-	.long	1015006403
-	.long	931538085
-	.long	1071359091
-	.long	3027127039
-	.long	1014307233
-	.long	179139065
-	.long	1071412821
-	.long	4285547492
-	.long	3161934731
-	.long	3387721259
-	.long	1071465902
-	.long	373225773
-	.long	1013486625
-	.long	2132236852
-	.long	1071544299
-	.long	3250533429
-	.long	1014031677
-	.long	1942070284
-	.long	1071645596
-	.long	1237964179
-	.long	3163239113
-	.long	1532707802
-	.long	1071695380
-	.long	330645583
-	.long	1012495610
-	.long	2294184979
-	.long	1071743834
-	.long	3959472897
-	.long	1015833116
-	.long	3805060714
-	.long	1071790961
-	.long	2671256142
-	.long	1013727772
-	.long	2215037898
-	.long	1071836770
-	.long	2683359117
-	.long	1015831902
-	.long	483661594
-	.long	1071881273
-	.long	836288326
-	.long	3162648643
-	.long	1534679894
-	.long	1071924486
-	.long	373258696
-	.long	3162470096
-	.long	1538714628
-	.long	1071966430
-	.long	3199433068
-	.long	1015325501
-	.long	527642555
-	.long	1072007128
-	.long	3636832592
-	.long	3161843145
-	.long	291339150
-	.long	1072046605
-	.long	890169537
-	.long	3160586117
-	.long	2450210201
-	.long	1072084888
-	.long	1636353294
-	.long	3163193400
-	.long	2411367951
-	.long	1072122007
-	.long	374899873
-	.long	1011331750
-	.long	681549971
-	.long	1072157992
-	.long	506411689
-	.long	1015373954
-	.long	1466745541
-	.long	1072192873
-	.long	2143860931
-	.long	1013364334
-	.long	2845622366
-	.long	1072226682
-	.long	2869178209
-	.long	3162423682
-	.long	2838871438
-	.long	1072275456
-	.long	3742223599
-	.long	1014338577
-	.long	4200275274
-	.long	1072337034
-	.long	1566539915
-	.long	3161839550
-	.long	3034733530
-	.long	1072394897
-	.long	652621408
-	.long	3162261964
-	.long	3207412993
-	.long	1072449290
-	.long	3206124665
-	.long	1014408733
-	.long	624461478
-	.long	1072500450
-	.long	932437485
-	.long	1015204343
-	.long	767665908
-	.long	1072548600
-	.long	1037911952
-	.long	3163527627
-	.long	1110773639
-	.long	1072593952
-	.long	2371517912
-	.long	3160465741
-	.long	1940828530
-	.long	1072636704
-	.long	2731408428
-	.long	3162895795
-	.long	1911329388
-	.long	1072677041
-	.long	1773089615
-	.long	3159569267
-	.long	1764715788
-	.long	1072704191
-	.long	691346949
-	.long	3164069946
-	.long	3332979233
-	.long	1072722195
-	.long	3550733983
-	.long	1014770628
-	.long	1321870254
-	.long	1072739231
-	.long	1415315820
-	.long	1016224052
-	.long	3657429030
-	.long	1072755365
-	.long	3910539033
-	.long	1015966402
-	.long	4197624557
-	.long	1072770661
-	.long	2333399254
-	.long	3164546480
-	.long	1512059493
-	.long	1072785177
-	.long	2701510318
-	.long	1016178092
-	.long	453379037
-	.long	1072798965
-	.long	4046344253
-	.long	3162814364
-	.long	1942345162
-	.long	1072818388
-	.long	621134147
-	.long	1016335195
-	.long	4210176273
-	.long	1072842164
-	.long	2701013387
-	.long	3164326619
-	.long	4185644010
-	.long	1072863795
-	.long	4163699341
-	.long	1016203112
-	.long	679688788
-	.long	1072883543
-	.long	4147276762
-	.long	1014066750
-	.long	29432865
-	.long	1072901630
-	.long	970415797
-	.long	1016902063
-	.long	4070721092
-	.long	1072918247
-	.long	2539004411
-	.long	3163736096
-	.long	2252468843
-	.long	1072933561
-	.long	3424082887
-	.long	3163407177
-	.long	2929724825
-	.long	1072947712
-	.long	3661482235
-	.long	3163846989
-	.long	1377513368
-	.long	1072960824
-	.long	3987926680
-	.long	1013647908
-	.long	1031632908
-	.long	1072973003
-	.long	3672217151
-	.long	1016614619
-	.long	2516508130
-	.long	1072984342
-	.long	545855020
-	.long	3162728930
-	.long	3792452178
-	.long	1072994923
-	.long	3420119467
-	.long	1016471430
-	.long	3147791459
-	.long	1073004818
-	.long	1342204979
-	.long	1013937254
-	.long	999189752
-	.long	1073014090
-	.long	1006335472
-	.long	3162850919
-	.long	711011011
-	.long	1073022794
-	.long	4633488
-	.long	3162966895
-	.long	15640363
-	.long	1073030980
-	.long	1686389560
-	.long	3164376226
-	.long	1218463589
-	.long	1073042382
-	.long	1526837110
-	.long	3163533985
-	.long	2538470555
-	.long	1073056144
-	.long	2273304406
-	.long	3163784996
-	.long	1229720947
-	.long	1073068489
-	.long	2971628206
-	.long	3162356540
-	.long	3115427016
-	.long	1073079621
-	.long	4215132957
-	.long	3164282762
-	.long	4030612557
-	.long	1073089709
-	.long	1913251691
-	.long	3163671292
-	.long	2728521257
-	.long	1073098892
-	.long	2861089500
-	.long	1015454459
-	.long	1118696283
-	.long	1073107285
-	.long	1628948053
-	.long	1016179658
-	.long	2682711255
-	.long	1073114984
-	.long	2906306266
-	.long	1014142643
-	.long	2073898081
-	.long	1073122072
-	.long	1322740454
-	.long	3164497217
-	.long	1403700297
-	.long	1073128618
-	.long	416137895
-	.long	3162781466
-	.long	2502685617
-	.long	1073134681
-	.long	3242008732
-	.long	1014593495
-	.long	1531926851
-	.long	1073140313
-	.long	1362708094
-	.long	1016517604
-	.long	3572814411
-	.long	1073145557
-	.long	3709790527
-	.long	1012646874
-	.long	1695536111
-	.long	1073150453
-	.long	3980346340
-	.long	1016705136
-	.long	2363057203
-	.long	1073155033
-	.long	2551194792
-	.long	1012569695
-	.long	2873365682
-	.long	1073159327
-	.long	3181154748
-	.long	1017041450
-	.long	1053384691
-	.long	1073165288
-	.long	3074536879
-	.long	1016965660
-	.long	3270542712
-	.long	1073172451
-	.long	2535319415
-	.long	3163051778
-	.long	1353631484
-	.long	1073178850
-	.long	1173833755
-	.long	1015534537
-	.long	3511218460
-	.long	1073184599
-	.long	1243608109
-	.long	3161592122
-	.long	4121259284
-	.long	1073189793
-	.long	398584912
-	.long	3163829923
-	.long	1193862106
-	.long	1073194509
-	.long	1873745539
-	.long	3163802819
-	.long	3861949790
-	.long	1073198808
-	.long	3841261147
-	.long	1015587248
-	.long	1486904578
-	.long	1073202745
-	.long	1634726776
-	.long	3163847886
-	.long	2879153715
-	.long	1073206362
-	.long	200456242
-	.long	3164138657
-	.long	385353253
-	.long	1073209698
-	.long	1186355517
-	.long	1014887155
-	.long	1125865839
-	.long	1073212783
-	.long	203561262
-	.long	3161244927
-	.long	1221361475
-	.long	1073215645
-	.long	3382476563
-	.long	1014936138
-	.long	2077323573
-	.long	1073218307
-	.long	1005121005
-	.long	3164430752
-	.long	215611373
-	.long	1073220790
-	.long	353198764
-	.long	3164485137
-	.long	2347419265
-	.long	1073223110
-	.long	1103143360
-	.long	1016542137
-	.long	1379112765
-	.long	1073225284
-	.long	381583533
-	.long	3162870833
-	.long	3891198463
-	.long	1073228298
-	.long	1771275754
-	.long	1014654681
-	.long	3395914051
-	.long	1073231917
-	.long	2350900914
-	.long	3164013978
-	.long	2799919478
-	.long	1073235146
-	.long	2893950164
-	.long	3163260901
-	.long	1138673476
-	.long	1073238045
-	.long	2622204785
-	.long	3164174388
-	.long	3408855940
-	.long	1073240661
-	.long	2800881650
-	.long	1016008624
-	.long	2044858738
-	.long	1073243035
-	.long	604544785
-	.long	1017022901
-	.long	2578795176
-	.long	1073245198
-	.long	2557332925
-	.long	1016135165
-	.long	4196285314
-	.long	1073247177
-	.long	2032365307
-	.long	1016194735
-	.long	224877747
-	.long	1073248996
-	.long	497926916
-	.long	1016947111
-	.long	3271386490
-	.long	1073250671
-	.long	2689994846
-	.long	1016631513
-	.long	813635989
-	.long	1073252221
-	.long	747035277
-	.long	3164530136
-	.long	369829519
-	.long	1073253658
-	.long	2182033858
-	.long	3163190340
-	.long	1187679052
-	.long	1073254994
-	.long	673954443
-	.long	1016149821
-	.long	4232586098
-	.long	1073256239
-	.long	497775200
-	.long	3162179015
-	.long	426690558
-	.long	1073257404
-	.long	3063343247
-	.long	1016865578
-	.long	1624065902
-	.long	1073258494
-	.long	1354224996
-	.long	3163503778
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	4294901760
-	.long	0
-	.long	0
-	.long	0
-	.long	32768
-	.long	0
-	.long	0
-	.long	2006262985
-	.long	1069310863
-	.long	2358449471
-	.long	3217342131
-	.long	3845454352
-	.long	1069952297
-	.long	2829679149
-	.long	1073771565
-	.type	static_const_table,@object
-	.size	static_const_table,2704
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_cbrt.S b/libm/x86/s_cbrt.S
deleted file mode 100644
index 53d3cc2..0000000
--- a/libm/x86/s_cbrt.S
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//   Assume x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52, where j = 0,1,2.
-//   Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
-//   where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in double precision
-//   cbrt(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
-//   (T stores the high 53 bits, D stores the low order bits)
-//   Result=2^k*T+(2^k*T*r)*P+2^k*D
-//   where P=p1+p2*r+..+p8*r^7
-//
-// Special cases:
-//  cbrt(NaN) = quiet NaN, and raise invalid exception
-//  cbrt(INF) = that INF
-//  cbrt(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  cbrt
-ENTRY(cbrt)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %esi, 52(%esp)
-        call      static_func
-        movl      %eax, %esi
-        movsd     128(%esp), %xmm0
-        movapd    %xmm0, %xmm7
-        movsd     %xmm0, 8(%esp)
-        movl      $524032, %edx
-        movsd     64(%esi), %xmm5
-        movsd     80(%esi), %xmm3
-        psrlq     $44, %xmm7
-        pextrw    $0, %xmm7, %ecx
-        movd      %xmm7, %eax
-        movsd     96(%esi), %xmm1
-        movsd     112(%esi), %xmm2
-        movl      %ebx, 16(%esp)
-        andl      $248, %ecx
-        movsd     128(%ecx,%esi), %xmm4
-        movl      %eax, %ebx
-        andl      %eax, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_0.0.2
-        cmpl      $524032, %edx
-        je        .L_2TAG_PACKET_1.0.2
-        shrl      $8, %edx
-        shrl      $8, %ebx
-        andpd     %xmm0, %xmm2
-        andpd     %xmm5, %xmm0
-        orpd      %xmm2, %xmm3
-        orpd      %xmm0, %xmm1
-        movapd    (%esi), %xmm5
-        movl      $5462, %eax
-        movapd    16(%esi), %xmm6
-        mull      %edx
-        movl      %ebx, %edx
-        andl      $2047, %ebx
-        shrl      $14, %eax
-        andl      $2048, %edx
-        subl      %eax, %ebx
-        subl      %eax, %ebx
-        subl      %eax, %ebx
-        shll      $8, %ebx
-        addl      $682, %eax
-        orl       %edx, %eax
-        movd      %eax, %xmm7
-        addl      %ebx, %ecx
-        psllq     $52, %xmm7
-.L_2TAG_PACKET_2.0.2:
-        movapd    32(%esi), %xmm2
-        movapd    48(%esi), %xmm0
-        subsd     %xmm3, %xmm1
-        movq      %xmm7, %xmm3
-        mulsd     384(%ecx,%esi), %xmm7
-        mulsd     %xmm4, %xmm1
-        mulsd     1152(%ecx,%esi), %xmm3
-        movapd    %xmm1, %xmm4
-        unpcklpd  %xmm1, %xmm1
-        mulpd     %xmm1, %xmm5
-        mulpd     %xmm1, %xmm6
-        mulpd     %xmm1, %xmm1
-        addpd     %xmm5, %xmm2
-        addpd     %xmm6, %xmm0
-        mulpd     %xmm1, %xmm2
-        mulpd     %xmm1, %xmm1
-        mulsd     %xmm7, %xmm4
-        addpd     %xmm2, %xmm0
-        movl      16(%esp), %ebx
-        mulsd     %xmm0, %xmm1
-        unpckhpd  %xmm0, %xmm0
-        addsd     %xmm1, %xmm0
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm3, %xmm0
-        addsd     %xmm7, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_0.0.2:
-        mulsd     1984(%esi), %xmm0
-        movq      %xmm0, %xmm7
-        movl      $524032, %edx
-        psrlq     $44, %xmm7
-        pextrw    $0, %xmm7, %ecx
-        movd      %xmm7, %eax
-        andl      $248, %ecx
-        movsd     128(%ecx,%esi), %xmm4
-        movl      %eax, %ebx
-        andl      %eax, %edx
-        shrl      $8, %edx
-        shrl      $8, %ebx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_4.0.2
-        andpd     %xmm0, %xmm2
-        andpd     %xmm5, %xmm0
-        orpd      %xmm2, %xmm3
-        orpd      %xmm0, %xmm1
-        movapd    (%esi), %xmm5
-        movl      $5462, %eax
-        movapd    16(%esi), %xmm6
-        mull      %edx
-        movl      %ebx, %edx
-        andl      $2047, %ebx
-        shrl      $14, %eax
-        andl      $2048, %edx
-        subl      %eax, %ebx
-        subl      %eax, %ebx
-        subl      %eax, %ebx
-        shll      $8, %ebx
-        addl      $661, %eax
-        orl       %edx, %eax
-        movd      %eax, %xmm7
-        addl      %ebx, %ecx
-        psllq     $52, %xmm7
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_4.0.2:
-        cmpl      $0, %ebx
-        jne       .L_2TAG_PACKET_5.0.2
-        movl      16(%esp), %ebx
-        fldl      1952(%esi)
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_5.0.2:
-        movl      16(%esp), %ebx
-        fldl      1968(%esi)
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_1.0.2:
-        movl      16(%esp), %ebx
-        movl      132(%esp), %eax
-        movl      128(%esp), %edx
-        movl      %eax, %ecx
-        andl      $2147483647, %ecx
-        cmpl      $2146435072, %ecx
-        ja        .L_2TAG_PACKET_6.0.2
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_6.0.2
-        cmpl      $2146435072, %eax
-        jne       .L_2TAG_PACKET_7.0.2
-        fldl      1920(%esi)
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_7.0.2:
-        fldl      1936(%esi)
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_6.0.2:
-        movsd     8(%esp), %xmm0
-        addsd     %xmm0, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-.L_2TAG_PACKET_3.0.2:
-        movl      52(%esp), %esi
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(cbrt)
-# -- End  cbrt
-
-# Start file scope ASM
-ALIAS_SYMBOL(cbrtl, cbrt);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	1553778919
-	.long	3213899486
-	.long	3534952507
-	.long	3215266280
-	.long	1646371399
-	.long	3214412045
-	.long	477218588
-	.long	3216798151
-	.long	3582521621
-	.long	1066628362
-	.long	1007461464
-	.long	1068473053
-	.long	889629714
-	.long	1067378449
-	.long	1431655765
-	.long	1070945621
-	.long	4294967295
-	.long	1048575
-	.long	0
-	.long	0
-	.long	0
-	.long	3220193280
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	1032192
-	.long	0
-	.long	0
-	.long	528611360
-	.long	3220144632
-	.long	2884679527
-	.long	3220082993
-	.long	1991868891
-	.long	3220024928
-	.long	2298714891
-	.long	3219970134
-	.long	58835168
-	.long	3219918343
-	.long	3035110223
-	.long	3219869313
-	.long	1617585086
-	.long	3219822831
-	.long	2500867033
-	.long	3219778702
-	.long	4241943008
-	.long	3219736752
-	.long	258732970
-	.long	3219696825
-	.long	404232216
-	.long	3219658776
-	.long	2172167368
-	.long	3219622476
-	.long	1544257904
-	.long	3219587808
-	.long	377579543
-	.long	3219554664
-	.long	1616385542
-	.long	3219522945
-	.long	813783277
-	.long	3219492562
-	.long	3940743189
-	.long	3219463431
-	.long	2689777499
-	.long	3219435478
-	.long	1700977147
-	.long	3219408632
-	.long	3169102082
-	.long	3219382828
-	.long	327235604
-	.long	3219358008
-	.long	1244336319
-	.long	3219334115
-	.long	1300311200
-	.long	3219311099
-	.long	3095471925
-	.long	3219288912
-	.long	2166487928
-	.long	3219267511
-	.long	2913108253
-	.long	3219246854
-	.long	293672978
-	.long	3219226904
-	.long	288737297
-	.long	3219207624
-	.long	1810275472
-	.long	3219188981
-	.long	174592167
-	.long	3219170945
-	.long	3539053052
-	.long	3219153485
-	.long	2164392968
-	.long	3219136576
-	.long	572345495
-	.long	1072698681
-	.long	1998204467
-	.long	1072709382
-	.long	3861501553
-	.long	1072719872
-	.long	2268192434
-	.long	1072730162
-	.long	2981979308
-	.long	1072740260
-	.long	270859143
-	.long	1072750176
-	.long	2958651392
-	.long	1072759916
-	.long	313113243
-	.long	1072769490
-	.long	919449400
-	.long	1072778903
-	.long	2809328903
-	.long	1072788162
-	.long	2222981587
-	.long	1072797274
-	.long	2352530781
-	.long	1072806244
-	.long	594152517
-	.long	1072815078
-	.long	1555767199
-	.long	1072823780
-	.long	4282421314
-	.long	1072832355
-	.long	2355578597
-	.long	1072840809
-	.long	1162590619
-	.long	1072849145
-	.long	797864051
-	.long	1072857367
-	.long	431273680
-	.long	1072865479
-	.long	2669831148
-	.long	1072873484
-	.long	733477752
-	.long	1072881387
-	.long	4280220604
-	.long	1072889189
-	.long	801961634
-	.long	1072896896
-	.long	2915370760
-	.long	1072904508
-	.long	1159613482
-	.long	1072912030
-	.long	2689944798
-	.long	1072919463
-	.long	1248687822
-	.long	1072926811
-	.long	2967951030
-	.long	1072934075
-	.long	630170432
-	.long	1072941259
-	.long	3760898254
-	.long	1072948363
-	.long	0
-	.long	1072955392
-	.long	2370273294
-	.long	1072962345
-	.long	1261754802
-	.long	1072972640
-	.long	546334065
-	.long	1072986123
-	.long	1054893830
-	.long	1072999340
-	.long	1571187597
-	.long	1073012304
-	.long	1107975175
-	.long	1073025027
-	.long	3606909377
-	.long	1073037519
-	.long	1113616747
-	.long	1073049792
-	.long	4154744632
-	.long	1073061853
-	.long	3358931423
-	.long	1073073713
-	.long	4060702372
-	.long	1073085379
-	.long	747576176
-	.long	1073096860
-	.long	3023138255
-	.long	1073108161
-	.long	1419988548
-	.long	1073119291
-	.long	1914185305
-	.long	1073130255
-	.long	294389948
-	.long	1073141060
-	.long	3761802570
-	.long	1073151710
-	.long	978281566
-	.long	1073162213
-	.long	823148820
-	.long	1073172572
-	.long	2420954441
-	.long	1073182792
-	.long	3815449908
-	.long	1073192878
-	.long	2046058587
-	.long	1073202835
-	.long	1807524753
-	.long	1073212666
-	.long	2628681401
-	.long	1073222375
-	.long	3225667357
-	.long	1073231966
-	.long	1555307421
-	.long	1073241443
-	.long	3454043099
-	.long	1073250808
-	.long	1208137896
-	.long	1073260066
-	.long	3659916772
-	.long	1073269218
-	.long	1886261264
-	.long	1073278269
-	.long	3593647839
-	.long	1073287220
-	.long	3086012205
-	.long	1073296075
-	.long	2769796922
-	.long	1073304836
-	.long	888716057
-	.long	1073317807
-	.long	2201465623
-	.long	1073334794
-	.long	164369365
-	.long	1073351447
-	.long	3462666733
-	.long	1073367780
-	.long	2773905457
-	.long	1073383810
-	.long	1342879088
-	.long	1073399550
-	.long	2543933975
-	.long	1073415012
-	.long	1684477781
-	.long	1073430209
-	.long	3532178543
-	.long	1073445151
-	.long	1147747300
-	.long	1073459850
-	.long	1928031793
-	.long	1073474314
-	.long	2079717015
-	.long	1073488553
-	.long	4016765315
-	.long	1073502575
-	.long	3670431139
-	.long	1073516389
-	.long	3549227225
-	.long	1073530002
-	.long	11637607
-	.long	1073543422
-	.long	588220169
-	.long	1073556654
-	.long	2635407503
-	.long	1073569705
-	.long	2042029317
-	.long	1073582582
-	.long	1925128962
-	.long	1073595290
-	.long	4136375664
-	.long	1073607834
-	.long	759964600
-	.long	1073620221
-	.long	4257606771
-	.long	1073632453
-	.long	297278907
-	.long	1073644538
-	.long	3655053093
-	.long	1073656477
-	.long	2442253172
-	.long	1073668277
-	.long	1111876799
-	.long	1073679941
-	.long	3330973139
-	.long	1073691472
-	.long	3438879452
-	.long	1073702875
-	.long	3671565478
-	.long	1073714153
-	.long	1317849547
-	.long	1073725310
-	.long	1642364115
-	.long	1073736348
-	.long	4050900474
-	.long	1014427190
-	.long	1157977860
-	.long	1016444461
-	.long	1374568199
-	.long	1017271387
-	.long	2809163288
-	.long	1016882676
-	.long	3742377377
-	.long	1013168191
-	.long	3101606597
-	.long	1017541672
-	.long	65224358
-	.long	1017217597
-	.long	2691591250
-	.long	1017266643
-	.long	4020758549
-	.long	1017689313
-	.long	1316310992
-	.long	1018030788
-	.long	1031537856
-	.long	1014090882
-	.long	3261395239
-	.long	1016413641
-	.long	886424999
-	.long	1016313335
-	.long	3114776834
-	.long	1014195875
-	.long	1681120620
-	.long	1017825416
-	.long	1329600273
-	.long	1016625740
-	.long	465474623
-	.long	1017097119
-	.long	4251633980
-	.long	1017169077
-	.long	1986990133
-	.long	1017710645
-	.long	752958613
-	.long	1017159641
-	.long	2216216792
-	.long	1018020163
-	.long	4282860129
-	.long	1015924861
-	.long	1557627859
-	.long	1016039538
-	.long	3889219754
-	.long	1018086237
-	.long	3684996408
-	.long	1017353275
-	.long	723532103
-	.long	1017717141
-	.long	2951149676
-	.long	1012528470
-	.long	831890937
-	.long	1017830553
-	.long	1031212645
-	.long	1017387331
-	.long	2741737450
-	.long	1017604974
-	.long	2863311531
-	.long	1003776682
-	.long	4276736099
-	.long	1013153088
-	.long	4111778382
-	.long	1015673686
-	.long	1728065769
-	.long	1016413986
-	.long	2708718031
-	.long	1018078833
-	.long	1069335005
-	.long	1015291224
-	.long	700037144
-	.long	1016482032
-	.long	2904566452
-	.long	1017226861
-	.long	4074156649
-	.long	1017622651
-	.long	25019565
-	.long	1015245366
-	.long	3601952608
-	.long	1015771755
-	.long	3267129373
-	.long	1017904664
-	.long	503203103
-	.long	1014921629
-	.long	2122011730
-	.long	1018027866
-	.long	3927295461
-	.long	1014189456
-	.long	2790625147
-	.long	1016024251
-	.long	1330460186
-	.long	1016940346
-	.long	4033568463
-	.long	1015538390
-	.long	3695818227
-	.long	1017509621
-	.long	257573361
-	.long	1017208868
-	.long	3227697852
-	.long	1017337964
-	.long	234118548
-	.long	1017169577
-	.long	4009025803
-	.long	1017278524
-	.long	1948343394
-	.long	1017749310
-	.long	678398162
-	.long	1018144239
-	.long	3083864863
-	.long	1016669086
-	.long	2415453452
-	.long	1017890370
-	.long	175467344
-	.long	1017330033
-	.long	3197359580
-	.long	1010339928
-	.long	2071276951
-	.long	1015941358
-	.long	268372543
-	.long	1016737773
-	.long	938132959
-	.long	1017389108
-	.long	1816750559
-	.long	1017337448
-	.long	4119203749
-	.long	1017152174
-	.long	2578653878
-	.long	1013108497
-	.long	2470331096
-	.long	1014678606
-	.long	123855735
-	.long	1016553320
-	.long	1265650889
-	.long	1014782687
-	.long	3414398172
-	.long	1017182638
-	.long	1040773369
-	.long	1016158401
-	.long	3483628886
-	.long	1016886550
-	.long	4140499405
-	.long	1016191425
-	.long	3893477850
-	.long	1016964495
-	.long	3935319771
-	.long	1009634717
-	.long	2978982660
-	.long	1015027112
-	.long	2452709923
-	.long	1017990229
-	.long	3190365712
-	.long	1015835149
-	.long	4237588139
-	.long	1015832925
-	.long	2610678389
-	.long	1017962711
-	.long	2127316774
-	.long	1017405770
-	.long	824267502
-	.long	1017959463
-	.long	2165924042
-	.long	1017912225
-	.long	2774007076
-	.long	1013257418
-	.long	4123916326
-	.long	1017582284
-	.long	1976417958
-	.long	1016959909
-	.long	4092806412
-	.long	1017711279
-	.long	119251817
-	.long	1015363631
-	.long	3475418768
-	.long	1017675415
-	.long	1972580503
-	.long	1015470684
-	.long	815541017
-	.long	1017517969
-	.long	2429917451
-	.long	1017397776
-	.long	4062888482
-	.long	1016749897
-	.long	68284153
-	.long	1017925678
-	.long	2207779246
-	.long	1016320298
-	.long	1183466520
-	.long	1017408657
-	.long	143326427
-	.long	1017060403
-	.long	0
-	.long	2146435072
-	.long	0
-	.long	0
-	.long	0
-	.long	4293918720
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	1138753536
-	.long	0
-	.long	0
-	.type	static_const_table,@object
-	.size	static_const_table,2000
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_cos.S b/libm/x86/s_cos.S
deleted file mode 100644
index e47c63e..0000000
--- a/libm/x86/s_cos.S
+++ /dev/null
@@ -1,892 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//     1. RANGE REDUCTION
-//
-//     We perform an initial range reduction from X to r with
-//
-//          X =~= N * pi/32 + r
-//
-//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
-//     where |N| <= 932560. Beyond this, the range reduction is
-//     insufficiently accurate. For extremely small inputs, 
-//     denormalization can occur internally, impacting performance.
-//     This means that the main path is actually only taken for
-//     2^-252 <= |X| < 90112.
-//
-//     To avoid branches, we perform the range reduction to full
-//     accuracy each time.
-//
-//          X - N * (P_1 + P_2 + P_3)
-//
-//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
-//     is exact) and P_3 is a 53-bit number. Together, these
-//     approximate pi well enough for all cases in the restricted
-//     range.
-//
-//     The main reduction sequence is:
-//
-//             y = 32/pi * x
-//             N = integer(y)
-//     (computed by adding and subtracting off SHIFTER)
-//
-//             m_1 = N * P_1
-//             m_2 = N * P_2
-//             r_1 = x - m_1
-//             r = r_1 - m_2
-//     (this r can be used for most of the calculation)
-//
-//             c_1 = r_1 - r
-//             m_3 = N * P_3
-//             c_2 = c_1 - m_2
-//             c = c_2 - m_3
-//
-//     2. MAIN ALGORITHM
-//
-//     The algorithm uses a table lookup based on B = M * pi / 32
-//     where M = N mod 64. The stored values are:
-//       sigma             closest power of 2 to cos(B)
-//       C_hl              53-bit cos(B) - sigma
-//       S_hi + S_lo       2 * 53-bit sin(B)
-//
-//     The computation is organized as follows:
-//
-//          sin(B + r + c) = [sin(B) + sigma * r] +
-//                           r * (cos(B) - sigma) +
-//                           sin(B) * [cos(r + c) - 1] +
-//                           cos(B) * [sin(r + c) - r]
-//
-//     which is approximately:
-//
-//          [S_hi + sigma * r] +
-//          C_hl * r +
-//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
-//          (C_hl + sigma) * [(sin(r) - r) + c]
-//
-//     and this is what is actually computed. We separate this sum
-//     into four parts:
-//
-//          hi + med + pols + corr
-//
-//     where
-//
-//          hi       = S_hi + sigma r
-//          med      = C_hl * r
-//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-//     3. POLYNOMIAL
-//
-//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-//     (sin(r) - r) can be rearranged freely, since it is quite
-//     small, so we exploit parallelism to the fullest.
-//
-//          psc4       =   SC_4 * r_1
-//          msc4       =   psc4 * r
-//          r2         =   r * r
-//          msc2       =   SC_2 * r2
-//          r4         =   r2 * r2
-//          psc3       =   SC_3 + msc4
-//          psc1       =   SC_1 + msc2
-//          msc3       =   r4 * psc3
-//          sincospols =   psc1 + msc3
-//          pols       =   sincospols *
-//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-//     4. CORRECTION TERM
-//
-//     This is where the "c" component of the range reduction is
-//     taken into account; recall that just "r" is used for most of
-//     the calculation.
-//
-//          -c   = m_3 - c_2
-//          -d   = S_hi * r - (C_hl + sigma)
-//          corr = -c * -d + S_lo
-//
-//     5. COMPENSATED SUMMATIONS
-//
-//     The two successive compensated summations add up the high
-//     and medium parts, leaving just the low parts to add up at
-//     the end.
-//
-//          rs        =  sigma * r
-//          res_int   =  S_hi + rs
-//          k_0       =  S_hi - res_int
-//          k_2       =  k_0 + rs
-//          med       =  C_hl * r
-//          res_hi    =  res_int + med
-//          k_1       =  res_int - res_hi
-//          k_3       =  k_1 + med
-//
-//     6. FINAL SUMMATION
-//
-//     We now add up all the small parts:
-//
-//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-//     Now the overall result is just:
-//
-//          res_hi + res_lo
-//
-//     7. SMALL ARGUMENTS
-//
-//     Inputs with |X| < 2^-252 are treated specially as
-//     1 - |x|.
-//
-// Special cases:
-//  cos(NaN) = quiet NaN, and raise invalid exception
-//  cos(INF) = NaN and raise invalid exception
-//  cos(0) = 1
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  cos
-ENTRY(cos)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 56(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     128(%esp), %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        subl      $12336, %eax
-        cmpl      $4293, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        movsd     2160(%ebx), %xmm1
-        mulsd     %xmm0, %xmm1
-        movapd    2240(%ebx), %xmm5
-        movsd     2224(%ebx), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        movsd     2128(%ebx), %xmm3
-        movapd    2112(%ebx), %xmm2
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %edx
-        cvtsi2sdl %edx, %xmm1
-        mulsd     %xmm1, %xmm3
-        unpcklpd  %xmm1, %xmm1
-        addl      $1865232, %edx
-        movapd    %xmm0, %xmm4
-        andl      $63, %edx
-        movapd    2096(%ebx), %xmm5
-        lea       (%ebx), %eax
-        shll      $5, %edx
-        addl      %edx, %eax
-        mulpd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm0
-        mulsd     2144(%ebx), %xmm1
-        subsd     %xmm3, %xmm4
-        movsd     8(%eax), %xmm7
-        unpcklpd  %xmm0, %xmm0
-        movapd    %xmm4, %xmm3
-        subsd     %xmm2, %xmm4
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm2, %xmm0
-        movapd    2064(%ebx), %xmm6
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm2, %xmm3
-        movapd    (%eax), %xmm2
-        subsd     %xmm3, %xmm1
-        movsd     24(%eax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     2080(%ebx), %xmm5
-        mulsd     (%eax), %xmm4
-        addpd     2048(%ebx), %xmm6
-        mulpd     %xmm0, %xmm5
-        movapd    %xmm3, %xmm0
-        addsd     8(%eax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movapd    %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movsd     8(%eax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%eax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm0, %xmm5
-        addsd     %xmm7, %xmm3
-        addsd     %xmm5, %xmm1
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        unpckhpd  %xmm6, %xmm6
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm4
-        movsd     %xmm4, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        jg        .L_2TAG_PACKET_2.0.2
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        pinsrw    $3, %eax, %xmm0
-        movsd     2192(%ebx), %xmm1
-        subsd     %xmm0, %xmm1
-        movsd     %xmm1, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        movl      132(%esp), %eax
-        andl      $2146435072, %eax
-        cmpl      $2146435072, %eax
-        je        .L_2TAG_PACKET_3.0.2
-        subl      $32, %esp
-        movsd     %xmm0, (%esp)
-        lea       40(%esp), %eax
-        movl      %eax, 8(%esp)
-        movl      $1, %eax
-        movl      %eax, 12(%esp)
-        call      __libm_sincos_huge
-        addl      $32, %esp
-        fldl      8(%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_3.0.2:
-        fldl      128(%esp)
-        fmull     2208(%ebx)
-.L_2TAG_PACKET_1.0.2:
-        movl      56(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(cos)
-# -- End  cos
-
-# Start file scope ASM
-ALIAS_SYMBOL(cosl, cos);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	1072693248
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	1072693248
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	1071644672
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	1071644672
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	1070596096
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	1070596096
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	1069547520
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	3217031168
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	3218079744
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	3218079744
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	3219128320
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	3219128320
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	3220176896
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	3220176896
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	3219128320
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	3219128320
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	3218079744
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	3218079744
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	3217031168
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	1069547520
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	1070596096
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	1070596096
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	1071644672
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	1071644672
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	1072693248
-	.long	1431655765
-	.long	3217380693
-	.long	0
-	.long	3219128320
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1067799893
-	.long	436314138
-	.long	3207201184
-	.long	381774871
-	.long	3210133868
-	.long	2773927732
-	.long	1053236707
-	.long	436314138
-	.long	1056571808
-	.long	442499072
-	.long	1032893537
-	.long	442499072
-	.long	1032893537
-	.long	1413480448
-	.long	1069097467
-	.long	0
-	.long	0
-	.long	771977331
-	.long	996350346
-	.long	0
-	.long	0
-	.long	1841940611
-	.long	1076125488
-	.long	0
-	.long	0
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.type	static_const_table,@object
-	.size	static_const_table,2256
-	.data
-	.hidden __libm_sincos_huge
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_expm1.S b/libm/x86/s_expm1.S
deleted file mode 100644
index 1816f59..0000000
--- a/libm/x86/s_expm1.S
+++ /dev/null
@@ -1,702 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// Description:
-//  Let K = 64 (table size).
-//
-//  Four sub-domains:
-//    1. |x| < 1/(2*K)
-//      expm1(x) ~ P(x)
-//    2. 1/(2*K) <= |x| <= 56*log(2)
-//       x       x/log(2)    n
-//      e - 1 = 2         = 2 * T[j] * (1 + P(y)) - 1
-//    3. 56*log(2) < x < MAX_LOG
-//       x       x   x/log(2)    n
-//      e - 1 ~ e = 2         = 2 * T[j] * (1 + P(y))
-//    4. x < -56*log(2)
-//       x            x
-//      e - 1 = -1 + e ~ -1
-//    where
-//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
-//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
-//                  j/K
-//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
-//
-//       P(y) is a minimax polynomial approximation of exp(x)-1
-//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
-//
-//    In case 3, to avoid problems with arithmetic overflow and underflow,
-//              n                        n1  n2
-//    value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
-//    and BIAS is a value of exponent bias.
-//
-// Special cases:
-//  expm1(NaN) is NaN
-//  expm1(+INF) is +INF
-//  expm1(-INF) is -1
-//  expm1(x) is x for subnormals
-//  for finite argument, only expm1(0)=0 is exact.
-//  For IEEE double
-//    if x > 709.782712893383973096 then expm1(x) overflow
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  expm1
-ENTRY(expm1)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 64(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     128(%esp), %xmm0
-        unpcklpd  %xmm0, %xmm0
-        movapd    64(%ebx), %xmm1
-        movapd    48(%ebx), %xmm6
-        movapd    80(%ebx), %xmm2
-        movapd    96(%ebx), %xmm3
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        movl      $16527, %edx
-        subl      %eax, %edx
-        subl      $16304, %eax
-        orl       %eax, %edx
-        cmpl      $-2147483648, %edx
-        jae       .L_2TAG_PACKET_0.0.2
-        mulpd     %xmm0, %xmm1
-        addpd     %xmm6, %xmm1
-        movapd    %xmm1, %xmm7
-        subpd     %xmm6, %xmm1
-        mulpd     %xmm1, %xmm2
-        movapd    112(%ebx), %xmm4
-        mulpd     %xmm1, %xmm3
-        movapd    128(%ebx), %xmm5
-        subpd     %xmm2, %xmm0
-        movd      %xmm7, %eax
-        movl      %eax, %ecx
-        andl      $63, %ecx
-        shll      $4, %ecx
-        sarl      $6, %eax
-        movl      %eax, %edx
-        subpd     %xmm3, %xmm0
-        movapd    160(%ebx,%ecx), %xmm2
-        movsd     144(%ebx), %xmm3
-        mulpd     %xmm0, %xmm4
-        movapd    %xmm0, %xmm1
-        mulpd     %xmm0, %xmm0
-        mulsd     %xmm0, %xmm3
-        addpd     %xmm4, %xmm5
-        mulsd     %xmm0, %xmm0
-        movapd    %xmm2, %xmm4
-        unpckhpd  %xmm2, %xmm2
-        movdqa    16(%ebx), %xmm6
-        pand      %xmm6, %xmm7
-        movdqa    32(%ebx), %xmm6
-        paddq     %xmm6, %xmm7
-        psllq     $46, %xmm7
-        mulsd     %xmm0, %xmm3
-        mulpd     %xmm5, %xmm0
-        addl      $894, %edx
-        cmpl      $1916, %edx
-        ja        .L_2TAG_PACKET_1.0.2
-        addsd     %xmm3, %xmm0
-        xorpd     %xmm3, %xmm3
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm3
-        orpd      %xmm7, %xmm2
-        mulsd     %xmm4, %xmm7
-        movapd    %xmm3, %xmm6
-        addsd     %xmm1, %xmm3
-        pextrw    $3, %xmm2, %edx
-        pshufd    $238, %xmm0, %xmm5
-        psrlq     $38, %xmm3
-        psllq     $38, %xmm3
-        movapd    %xmm2, %xmm4
-        subsd     %xmm3, %xmm6
-        addsd     %xmm5, %xmm0
-        addsd     %xmm6, %xmm1
-        addsd     %xmm7, %xmm4
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm2, %xmm3
-        xorpd     %xmm5, %xmm5
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm5
-        addsd     %xmm1, %xmm0
-        movl      $17184, %ecx
-        subl      %edx, %ecx
-        subl      $16256, %edx
-        orl       %edx, %ecx
-        jl        .L_2TAG_PACKET_2.0.2
-        mulsd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm3
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-.L_2TAG_PACKET_3.0.2:
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_2.0.2:
-        cmpl      $0, %edx
-        jl        .L_2TAG_PACKET_5.0.2
-        mulsd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm7
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_5.0.2:
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        subsd     %xmm5, %xmm0
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_1.0.2:
-        movl      132(%esp), %ecx
-        addsd     %xmm0, %xmm1
-        unpckhpd  %xmm0, %xmm0
-        addsd     %xmm1, %xmm0
-        cmpl      $0, %ecx
-        jl        .L_2TAG_PACKET_6.0.2
-        fstcw     24(%esp)
-        movzwl    24(%esp), %edx
-        orl       $768, %edx
-        movw      %dx, 28(%esp)
-        fldcw     28(%esp)
-        movl      %eax, %edx
-        sarl      $1, %eax
-        subl      %eax, %edx
-        movdqa    (%ebx), %xmm6
-        pandn     %xmm2, %xmm6
-        addl      $1023, %eax
-        movd      %eax, %xmm3
-        psllq     $52, %xmm3
-        orpd      %xmm3, %xmm6
-        mulsd     %xmm3, %xmm4
-        movsd     %xmm0, 8(%esp)
-        fldl      8(%esp)
-        movsd     %xmm6, 16(%esp)
-        fldl      16(%esp)
-        movsd     %xmm4, 16(%esp)
-        fldl      16(%esp)
-        addl      $1023, %edx
-        movd      %edx, %xmm4
-        psllq     $52, %xmm4
-        faddp     %st, %st(1)
-        fmul      %st, %st(1)
-        faddp     %st, %st(1)
-        movsd     %xmm4, 8(%esp)
-        fldl      8(%esp)
-        fmulp     %st, %st(1)
-        fstpl     8(%esp)
-        movsd     8(%esp), %xmm0
-        fldcw     24(%esp)
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_7.0.2
-        jmp       .L_2TAG_PACKET_4.0.2
-        cmpl      $-2147483648, %ecx
-        jb        .L_2TAG_PACKET_7.0.2
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_7.0.2:
-        movl      $41, %edx
-.L_2TAG_PACKET_8.0.2:
-        movsd     %xmm0, (%esp)
-        movsd     128(%esp), %xmm0
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_9.0.2
-.L_2TAG_PACKET_10.0.2:
-        cmpl      $2146435072, %eax
-        jae       .L_2TAG_PACKET_11.0.2
-        movsd     1272(%ebx), %xmm0
-        mulsd     %xmm0, %xmm0
-        movl      $41, %edx
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_11.0.2:
-        movl      132(%esp), %eax
-        movl      128(%esp), %edx
-        movl      %eax, %ecx
-        andl      $2147483647, %eax
-        cmpl      $2146435072, %eax
-        ja        .L_2TAG_PACKET_12.0.2
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_12.0.2
-        cmpl      $0, %ecx
-        jl        .L_2TAG_PACKET_13.0.2
-        movsd     1256(%ebx), %xmm0
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_13.0.2:
-        jmp       .L_2TAG_PACKET_6.0.2
-.L_2TAG_PACKET_12.0.2:
-        movsd     128(%esp), %xmm0
-        addsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_14.0.2:
-        addl      $16304, %eax
-        cmpl      $15504, %eax
-        jb        .L_2TAG_PACKET_15.0.2
-        movapd    1184(%ebx), %xmm2
-        pshufd    $68, %xmm0, %xmm1
-        movapd    1200(%ebx), %xmm3
-        movapd    1216(%ebx), %xmm4
-        movsd     1232(%ebx), %xmm5
-        mulsd     %xmm1, %xmm1
-        xorpd     %xmm6, %xmm6
-        movl      $16352, %eax
-        pinsrw    $3, %eax, %xmm6
-        mulpd     %xmm0, %xmm2
-        xorpd     %xmm7, %xmm7
-        movl      $16368, %edx
-        pinsrw    $3, %edx, %xmm7
-        addpd     %xmm3, %xmm2
-        mulsd     %xmm1, %xmm5
-        pshufd    $228, %xmm1, %xmm3
-        mulpd     %xmm1, %xmm1
-        mulsd     %xmm0, %xmm6
-        mulpd     %xmm0, %xmm2
-        addpd     %xmm4, %xmm2
-        movapd    %xmm7, %xmm4
-        addsd     %xmm6, %xmm7
-        mulpd     %xmm3, %xmm1
-        psrlq     $27, %xmm7
-        psllq     $27, %xmm7
-        movsd     1288(%ebx), %xmm3
-        subsd     %xmm7, %xmm4
-        mulpd     %xmm1, %xmm2
-        addsd     %xmm4, %xmm6
-        pshufd    $238, %xmm2, %xmm1
-        addsd     %xmm2, %xmm6
-        andpd     %xmm0, %xmm3
-        movapd    %xmm0, %xmm4
-        addsd     %xmm6, %xmm1
-        subsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm1
-        mulsd     %xmm7, %xmm3
-        mulsd     %xmm7, %xmm0
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm4, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_15.0.2:
-        cmpl      $16, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        movapd    %xmm0, %xmm2
-        movd      %xmm0, %eax
-        psrlq     $31, %xmm2
-        movd      %xmm2, %ecx
-        orl       %ecx, %eax
-        je        .L_2TAG_PACKET_3.0.2
-        movl      $16, %edx
-        xorpd     %xmm1, %xmm1
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm1
-        movl      $42, %edx
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_0.0.2:
-        cmpl      $0, %eax
-        jl        .L_2TAG_PACKET_14.0.2
-        movl      132(%esp), %eax
-        cmpl      $1083179008, %eax
-        jge       .L_2TAG_PACKET_10.0.2
-        cmpl      $-1048576, %eax
-        jae       .L_2TAG_PACKET_11.0.2
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_4.0.2:
-        movsd     %xmm0, 48(%esp)
-        fldl      48(%esp)
-.L_2TAG_PACKET_9.0.2:
-        movl      64(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(expm1)
-# -- End  expm1
-
-# Start file scope ASM
-ALIAS_SYMBOL(expm1l, expm1);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	4293918720
-	.long	0
-	.long	4293918720
-	.long	4294967232
-	.long	0
-	.long	4294967232
-	.long	0
-	.long	65472
-	.long	0
-	.long	65472
-	.long	0
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	1127743488
-	.long	1697350398
-	.long	1079448903
-	.long	1697350398
-	.long	1079448903
-	.long	4277796864
-	.long	1065758274
-	.long	4277796864
-	.long	1065758274
-	.long	3164486458
-	.long	1025308570
-	.long	3164486458
-	.long	1025308570
-	.long	1963358694
-	.long	1065423121
-	.long	1431655765
-	.long	1069897045
-	.long	1431655765
-	.long	1067799893
-	.long	0
-	.long	1071644672
-	.long	381774871
-	.long	1062650220
-	.long	381774871
-	.long	1062650220
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1000070955
-	.long	1042145304
-	.long	1040187392
-	.long	11418
-	.long	988267849
-	.long	1039500660
-	.long	3539992576
-	.long	22960
-	.long	36755401
-	.long	1042114290
-	.long	402653184
-	.long	34629
-	.long	3634769483
-	.long	1042178627
-	.long	1820327936
-	.long	46424
-	.long	2155991225
-	.long	1041560680
-	.long	847249408
-	.long	58348
-	.long	2766913307
-	.long	1039293264
-	.long	3489660928
-	.long	70401
-	.long	3651174602
-	.long	1040488175
-	.long	2927624192
-	.long	82586
-	.long	3073892131
-	.long	1042240606
-	.long	1006632960
-	.long	94904
-	.long	1328391742
-	.long	1042019037
-	.long	3942645760
-	.long	107355
-	.long	2650893825
-	.long	1041903210
-	.long	822083584
-	.long	119943
-	.long	2397289153
-	.long	1041802037
-	.long	2281701376
-	.long	132667
-	.long	430997175
-	.long	1042110606
-	.long	1845493760
-	.long	145530
-	.long	1230936525
-	.long	1041801015
-	.long	1702887424
-	.long	158533
-	.long	740675935
-	.long	1040178913
-	.long	4110417920
-	.long	171677
-	.long	3489810261
-	.long	1041825986
-	.long	2793406464
-	.long	184965
-	.long	2532600530
-	.long	1040767882
-	.long	167772160
-	.long	198398
-	.long	3542557060
-	.long	1041827263
-	.long	2986344448
-	.long	211976
-	.long	1401563777
-	.long	1041061093
-	.long	922746880
-	.long	225703
-	.long	3129406026
-	.long	1041852413
-	.long	880803840
-	.long	239579
-	.long	900993572
-	.long	1039283234
-	.long	1275068416
-	.long	253606
-	.long	2115029358
-	.long	1042140042
-	.long	562036736
-	.long	267786
-	.long	1086643152
-	.long	1041785419
-	.long	1610612736
-	.long	282120
-	.long	82864366
-	.long	1041256244
-	.long	3045064704
-	.long	296610
-	.long	2392968152
-	.long	1040913683
-	.long	3573547008
-	.long	311258
-	.long	2905856183
-	.long	1040002214
-	.long	1988100096
-	.long	326066
-	.long	3742008261
-	.long	1040011137
-	.long	1451229184
-	.long	341035
-	.long	863393794
-	.long	1040880621
-	.long	914358272
-	.long	356167
-	.long	1446136837
-	.long	1041372426
-	.long	3707764736
-	.long	371463
-	.long	927855201
-	.long	1040617636
-	.long	360710144
-	.long	386927
-	.long	1492679939
-	.long	1041050306
-	.long	2952790016
-	.long	402558
-	.long	608827001
-	.long	1041582217
-	.long	2181038080
-	.long	418360
-	.long	606260204
-	.long	1042271987
-	.long	1711276032
-	.long	434334
-	.long	3163044019
-	.long	1041843851
-	.long	1006632960
-	.long	450482
-	.long	4148747325
-	.long	1041962972
-	.long	3900702720
-	.long	466805
-	.long	802924201
-	.long	1041275378
-	.long	1442840576
-	.long	483307
-	.long	3052749833
-	.long	1041940577
-	.long	1937768448
-	.long	499988
-	.long	2216116399
-	.long	1041486744
-	.long	914358272
-	.long	516851
-	.long	2729697836
-	.long	1041445764
-	.long	2566914048
-	.long	533897
-	.long	540608356
-	.long	1041310907
-	.long	2600468480
-	.long	551129
-	.long	2916344493
-	.long	1040535661
-	.long	1107296256
-	.long	568549
-	.long	731391814
-	.long	1039497014
-	.long	2566914048
-	.long	586158
-	.long	1024722704
-	.long	1041461625
-	.long	2961178624
-	.long	603959
-	.long	3806831748
-	.long	1041732499
-	.long	2675965952
-	.long	621954
-	.long	238953304
-	.long	1040316488
-	.long	2189426688
-	.long	640145
-	.long	749123235
-	.long	1041725785
-	.long	2063597568
-	.long	658534
-	.long	1168187977
-	.long	1041175214
-	.long	2986344448
-	.long	677123
-	.long	3506096399
-	.long	1042186095
-	.long	1426063360
-	.long	695915
-	.long	1470221620
-	.long	1041675499
-	.long	2566914048
-	.long	714911
-	.long	3182425146
-	.long	1041483134
-	.long	3087007744
-	.long	734114
-	.long	3131698208
-	.long	1042208657
-	.long	4068474880
-	.long	753526
-	.long	2300504125
-	.long	1041428596
-	.long	2415919104
-	.long	773150
-	.long	2290297931
-	.long	1037388400
-	.long	3716153344
-	.long	792987
-	.long	3532148223
-	.long	1041626194
-	.long	771751936
-	.long	813041
-	.long	1161884404
-	.long	1042015258
-	.long	3699376128
-	.long	833312
-	.long	876383176
-	.long	1037968878
-	.long	1241513984
-	.long	853805
-	.long	3379986796
-	.long	1042213153
-	.long	3699376128
-	.long	874520
-	.long	1545797737
-	.long	1041681569
-	.long	58720256
-	.long	895462
-	.long	2925146801
-	.long	1042212567
-	.long	855638016
-	.long	916631
-	.long	1316627971
-	.long	1038516204
-	.long	3883925504
-	.long	938030
-	.long	3267869137
-	.long	1040337004
-	.long	2726297600
-	.long	959663
-	.long	3720868999
-	.long	1041782409
-	.long	3992977408
-	.long	981531
-	.long	433316142
-	.long	1041994064
-	.long	1526726656
-	.long	1003638
-	.long	781232103
-	.long	1040093400
-	.long	2172649472
-	.long	1025985
-	.long	2773927732
-	.long	1053236707
-	.long	381774871
-	.long	1062650220
-	.long	379653899
-	.long	1056571845
-	.long	286331153
-	.long	1065423121
-	.long	436314138
-	.long	1059717536
-	.long	1431655765
-	.long	1067799893
-	.long	1431655765
-	.long	1069897045
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	2146435072
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	2146435071
-	.long	0
-	.long	1048576
-	.long	4227858432
-	.long	4294967295
-	.type	static_const_table,@object
-	.size	static_const_table,1296
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_log1p.S b/libm/x86/s_log1p.S
deleted file mode 100644
index de7b87b..0000000
--- a/libm/x86/s_log1p.S
+++ /dev/null
@@ -1,827 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//    Let x=2^k * mx, mx in [1,2)
-//
-//    Get B~1/mx based on the output of rcpps instruction (B0)
-//    B = int((B0*2^7+0.5))/2^7
-//
-//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
-//
-//    Result:  k*log(2) - log(B) + p(r)
-//             p(r) is a degree 7 polynomial
-//             -log(B) read from data table (high, low parts)
-//             Result is formed from high and low parts
-//
-// Special cases:
-//   log1p(NaN) = quiet NaN, and raise invalid exception
-//   log1p(+INF) = that INF
-//   log1p(x) = NaN if x < -1 or x = -INF, and raises invalid exception
-//   log1p(-1) = -INF, and raises divide-by-zero exception
-//   log1p(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  log1p
-ENTRY(log1p)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 40(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        xorpd     %xmm2, %xmm2
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm2
-        xorpd     %xmm3, %xmm3
-        movl      $32768, %ecx
-        movd      %ecx, %xmm4
-        movsd     2128(%ebx), %xmm5
-        pshufd    $68, %xmm0, %xmm7
-        movapd    %xmm2, %xmm6
-        pextrw    $3, %xmm0, %ecx
-        addsd     %xmm2, %xmm0
-        movapd    %xmm0, %xmm1
-        pextrw    $3, %xmm0, %eax
-        subsd     %xmm0, %xmm6
-        orpd      %xmm2, %xmm0
-        psllq     $5, %xmm0
-        psrlq     $34, %xmm0
-        subl      $16, %eax
-        cmpl      $32736, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-        addsd     %xmm6, %xmm7
-        rcpss     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $228, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        andl      $32752, %ecx
-        cmpl      $16256, %ecx
-        jb        .L_2TAG_PACKET_1.0.2
-        andl      $32752, %eax
-        movl      $32720, %ecx
-        subl      %eax, %ecx
-        pinsrw    $3, %ecx, %xmm3
-.L_2TAG_PACKET_2.0.2:
-        mulsd     %xmm3, %xmm7
-        paddd     %xmm4, %xmm0
-        xorpd     %xmm4, %xmm4
-        movl      $14336, %ecx
-        pinsrw    $3, %ecx, %xmm4
-        orpd      %xmm2, %xmm1
-        movd      %xmm0, %edx
-        psllq     $29, %xmm0
-        andpd     %xmm1, %xmm5
-        andpd     %xmm6, %xmm0
-        subsd     %xmm5, %xmm1
-        paddd     %xmm4, %xmm0
-        mulsd     %xmm0, %xmm5
-        movl      $16352, %ecx
-        subl      %ecx, %eax
-        cvtsi2sdl %eax, %xmm4
-        mulsd     %xmm0, %xmm7
-        mulsd     %xmm0, %xmm1
-        movsd     2064(%ebx), %xmm6
-        movapd    2080(%ebx), %xmm3
-        subsd     %xmm2, %xmm5
-        andl      $16711680, %edx
-        shrl      $12, %edx
-        movapd    (%ebx,%edx), %xmm0
-        movapd    2096(%ebx), %xmm2
-        addsd     %xmm5, %xmm1
-        movapd    %xmm1, %xmm5
-        addsd     %xmm7, %xmm1
-        subsd     %xmm1, %xmm5
-        addsd     %xmm5, %xmm7
-        mulsd     %xmm4, %xmm6
-        mulsd     2072(%ebx), %xmm4
-        mulsd     %xmm1, %xmm3
-        pshufd    $68, %xmm1, %xmm5
-        addsd     %xmm6, %xmm0
-        mulpd     %xmm5, %xmm2
-        mulpd     %xmm5, %xmm5
-        pshufd    $228, %xmm0, %xmm6
-        addsd     %xmm1, %xmm0
-        addpd     2112(%ebx), %xmm2
-        mulpd     %xmm5, %xmm3
-        subsd     %xmm0, %xmm6
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm7, %xmm4
-        mulsd     %xmm1, %xmm7
-        addsd     %xmm6, %xmm1
-        pshufd    $238, %xmm0, %xmm6
-        mulsd     %xmm5, %xmm5
-        addsd     %xmm6, %xmm4
-        subsd     %xmm7, %xmm1
-        addpd     %xmm3, %xmm2
-        addsd     %xmm4, %xmm1
-        mulpd     %xmm5, %xmm2
-        addsd     %xmm2, %xmm1
-        pshufd    $238, %xmm2, %xmm5
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_0.0.2:
-        movsd     112(%esp), %xmm0
-        movapd    %xmm0, %xmm1
-        addl      $16, %eax
-        cmpl      $32768, %eax
-        jae       .L_2TAG_PACKET_4.0.2
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_5.0.2
-.L_2TAG_PACKET_6.0.2:
-        addsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_7.0.2:
-        ja        .L_2TAG_PACKET_6.0.2
-        cmpl      $0, %edx
-        ja        .L_2TAG_PACKET_6.0.2
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_4.0.2:
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        addl      %ecx, %ecx
-        cmpl      $-2097152, %ecx
-        jae       .L_2TAG_PACKET_7.0.2
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_5.0.2
-.L_2TAG_PACKET_8.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %eax
-        pinsrw    $3, %eax, %xmm1
-        movl      $141, %edx
-        mulsd     %xmm1, %xmm0
-.L_2TAG_PACKET_9.0.2:
-        movsd     %xmm0, (%esp)
-        movsd     112(%esp), %xmm0
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_10.0.2
-.L_2TAG_PACKET_5.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        divsd     %xmm1, %xmm0
-        movl      $140, %edx
-        jmp       .L_2TAG_PACKET_9.0.2
-.L_2TAG_PACKET_1.0.2:
-        movsd     112(%esp), %xmm0
-        cmpl      $15504, %ecx
-        jb        .L_2TAG_PACKET_11.0.2
-        movapd    2144(%ebx), %xmm1
-        pshufd    $68, %xmm0, %xmm0
-        movapd    2160(%ebx), %xmm2
-        pshufd    $68, %xmm0, %xmm4
-        movapd    2176(%ebx), %xmm3
-        mulpd     %xmm0, %xmm1
-        xorpd     %xmm6, %xmm6
-        mulpd     %xmm4, %xmm4
-        addpd     %xmm2, %xmm1
-        pshufd    $68, %xmm4, %xmm5
-        mulpd     %xmm0, %xmm4
-        movl      $49120, %eax
-        pinsrw    $3, %eax, %xmm6
-        mulpd     %xmm0, %xmm1
-        mulsd     %xmm4, %xmm4
-        addpd     %xmm3, %xmm1
-        mulsd     %xmm6, %xmm5
-        mulpd     %xmm4, %xmm1
-        pshufd    $238, %xmm1, %xmm7
-        addsd     %xmm7, %xmm1
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_11.0.2:
-        cmpl      $16, %ecx
-        jb        .L_2TAG_PACKET_12.0.2
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_12.0.2:
-        movapd    %xmm0, %xmm1
-        mulsd     %xmm1, %xmm1
-        jmp       .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_3.0.2:
-        movsd     %xmm0, 24(%esp)
-        fldl      24(%esp)
-.L_2TAG_PACKET_10.0.2:
-        movl      40(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(log1p)
-# -- End  log1p
-
-# Start file scope ASM
-ALIAS_SYMBOL(log1pl, log1p);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	4277811200
-	.long	1072049730
-	.long	2479318832
-	.long	1026487127
-	.long	2854492160
-	.long	1072033410
-	.long	215631550
-	.long	1025638968
-	.long	1547061248
-	.long	1072017216
-	.long	2886781435
-	.long	1026423395
-	.long	649825280
-	.long	1072001146
-	.long	4281533405
-	.long	1024038923
-	.long	646346752
-	.long	1071985198
-	.long	1562735921
-	.long	1023790276
-	.long	2203734016
-	.long	1071969370
-	.long	1838397691
-	.long	3173936209
-	.long	1872169984
-	.long	1071953661
-	.long	3981202460
-	.long	1022325013
-	.long	669557760
-	.long	1071938069
-	.long	4182597802
-	.long	3173174122
-	.long	4076413952
-	.long	1071922591
-	.long	1209029111
-	.long	3170736207
-	.long	556125184
-	.long	1071907228
-	.long	821086028
-	.long	3173437049
-	.long	204914688
-	.long	1071891976
-	.long	2097025986
-	.long	3171071798
-	.long	387545088
-	.long	1071876834
-	.long	3142936996
-	.long	3173092218
-	.long	2912783360
-	.long	1071861800
-	.long	2502420140
-	.long	1024505919
-	.long	1144260608
-	.long	1071846874
-	.long	3315658140
-	.long	3173469843
-	.long	1471209472
-	.long	1071832053
-	.long	129621009
-	.long	3172443877
-	.long	1829683200
-	.long	1071817336
-	.long	3885467693
-	.long	1025535275
-	.long	288676864
-	.long	1071802722
-	.long	86139472
-	.long	3171639793
-	.long	3636378624
-	.long	1071788208
-	.long	1850238587
-	.long	1024654342
-	.long	1606817792
-	.long	1071773795
-	.long	3388899795
-	.long	3173675586
-	.long	1236164608
-	.long	1071759480
-	.long	3983599207
-	.long	1020046558
-	.long	1089616896
-	.long	1071745262
-	.long	4171974224
-	.long	1024773198
-	.long	4143093760
-	.long	1071731139
-	.long	2727587401
-	.long	3173965207
-	.long	600267776
-	.long	1071717112
-	.long	3147685042
-	.long	3173353031
-	.long	2249313280
-	.long	1071703177
-	.long	125835074
-	.long	1025255832
-	.long	3805303808
-	.long	1071689334
-	.long	2289991207
-	.long	1025460331
-	.long	87278592
-	.long	1071675583
-	.long	1106114045
-	.long	1025933602
-	.long	3195405312
-	.long	1071661920
-	.long	3885316576
-	.long	3171206239
-	.long	3853649920
-	.long	1071648346
-	.long	2977069852
-	.long	3171236771
-	.long	2944026624
-	.long	1071625048
-	.long	1008093493
-	.long	1023444474
-	.long	3993180160
-	.long	1071598247
-	.long	1862355595
-	.long	1024642533
-	.long	1454641152
-	.long	1071571617
-	.long	1514603089
-	.long	1026500596
-	.long	3286085632
-	.long	1071545154
-	.long	1400028424
-	.long	3173279056
-	.long	438773760
-	.long	1071518858
-	.long	120727864
-	.long	3172148914
-	.long	1212979200
-	.long	1071492725
-	.long	1625055594
-	.long	3172901933
-	.long	1189017600
-	.long	1071466754
-	.long	3920062376
-	.long	1025727407
-	.long	403064832
-	.long	1071440943
-	.long	1053271728
-	.long	3171391427
-	.long	3343210496
-	.long	1071415289
-	.long	3243395502
-	.long	3173627613
-	.long	1765777408
-	.long	1071389792
-	.long	2145968512
-	.long	1026354304
-	.long	461430784
-	.long	1071364449
-	.long	4094322285
-	.long	1026021467
-	.long	71706624
-	.long	1071339258
-	.long	763632021
-	.long	1024496933
-	.long	1380503552
-	.long	1071314217
-	.long	1383547992
-	.long	3173088453
-	.long	1015732224
-	.long	1071289325
-	.long	3198646877
-	.long	1025390322
-	.long	35977216
-	.long	1071264580
-	.long	2141026805
-	.long	1025754693
-	.long	3927306240
-	.long	1071239979
-	.long	282116272
-	.long	3173394334
-	.long	1125341184
-	.long	1071215523
-	.long	2768427504
-	.long	3172279059
-	.long	1666971648
-	.long	1071191208
-	.long	786837629
-	.long	3172427445
-	.long	2827694080
-	.long	1071167033
-	.long	3857122416
-	.long	3173014241
-	.long	2003683328
-	.long	1071142997
-	.long	859010954
-	.long	1026545007
-	.long	1004017664
-	.long	1071119098
-	.long	3356644970
-	.long	3173458064
-	.long	1753020416
-	.long	1071095334
-	.long	788338552
-	.long	1026157693
-	.long	1992718336
-	.long	1071071704
-	.long	1239179443
-	.long	1026394889
-	.long	3870234624
-	.long	1071048206
-	.long	2082614663
-	.long	1024926053
-	.long	1050437632
-	.long	1071024840
-	.long	660007840
-	.long	1025548499
-	.long	188395520
-	.long	1071001603
-	.long	3878792704
-	.long	3173889571
-	.long	3747176448
-	.long	1070978493
-	.long	144991708
-	.long	3171552042
-	.long	1405669376
-	.long	1070955511
-	.long	3999088879
-	.long	1025486317
-	.long	121151488
-	.long	1070932654
-	.long	2170865497
-	.long	1026473584
-	.long	2652319744
-	.long	1070909920
-	.long	453695652
-	.long	3173916809
-	.long	3262236672
-	.long	1070887309
-	.long	157800053
-	.long	3173984206
-	.long	601221120
-	.long	1070864820
-	.long	3968917661
-	.long	1023992886
-	.long	1999843328
-	.long	1070842450
-	.long	3053895004
-	.long	1024998228
-	.long	1992167424
-	.long	1070820199
-	.long	2968614856
-	.long	1024552653
-	.long	3788726272
-	.long	1070798065
-	.long	3542170808
-	.long	3173573242
-	.long	2094829568
-	.long	1070776048
-	.long	1246758132
-	.long	1026202874
-	.long	288675840
-	.long	1070754146
-	.long	3747328950
-	.long	1026331585
-	.long	1829681152
-	.long	1070732357
-	.long	3125197546
-	.long	1024100318
-	.long	1666869248
-	.long	1070710681
-	.long	1363656119
-	.long	1026336493
-	.long	3417110528
-	.long	1070689116
-	.long	4154791553
-	.long	1026267853
-	.long	2183653376
-	.long	1070667662
-	.long	1671819292
-	.long	3173785870
-	.long	1734434816
-	.long	1070646317
-	.long	373091049
-	.long	1025972363
-	.long	1615681536
-	.long	1070625080
-	.long	384650897
-	.long	1022926043
-	.long	1445382144
-	.long	1070603950
-	.long	344320330
-	.long	3172397196
-	.long	1823715328
-	.long	1070569756
-	.long	3389841200
-	.long	1025231852
-	.long	3839688704
-	.long	1070527917
-	.long	1706790417
-	.long	3167363349
-	.long	4293332992
-	.long	1070486286
-	.long	1614935088
-	.long	1019351591
-	.long	2966720512
-	.long	1070444861
-	.long	4145393717
-	.long	3173711658
-	.long	4066729984
-	.long	1070403639
-	.long	1974925028
-	.long	3171437182
-	.long	3337621504
-	.long	1070362619
-	.long	3314953170
-	.long	3169971314
-	.long	943448064
-	.long	1070321799
-	.long	1498682038
-	.long	3173862340
-	.long	1465634816
-	.long	1070281176
-	.long	1319952810
-	.long	3171693965
-	.long	1015734272
-	.long	1070240749
-	.long	1347821929
-	.long	3173544515
-	.long	118001664
-	.long	1070200516
-	.long	1751482746
-	.long	1026134093
-	.long	3707174912
-	.long	1070160474
-	.long	1486946159
-	.long	1023930920
-	.long	3946381312
-	.long	1070120623
-	.long	2867408081
-	.long	3171368276
-	.long	1699848192
-	.long	1070080961
-	.long	2590187139
-	.long	1025379803
-	.long	2235846656
-	.long	1070041485
-	.long	1888568069
-	.long	3172754960
-	.long	2339729408
-	.long	1070002194
-	.long	3852214753
-	.long	3173323149
-	.long	3196850176
-	.long	1069963086
-	.long	742141560
-	.long	1025101707
-	.long	1800683520
-	.long	1069924160
-	.long	3949500444
-	.long	3172102179
-	.long	3835801600
-	.long	1069885413
-	.long	3848895943
-	.long	1025913832
-	.long	2201202688
-	.long	1069846845
-	.long	1425913464
-	.long	1025868665
-	.long	2778279936
-	.long	1069808453
-	.long	2120889677
-	.long	3173831128
-	.long	2954203136
-	.long	1069770236
-	.long	592147081
-	.long	1019621288
-	.long	210141184
-	.long	1069732193
-	.long	3414275233
-	.long	1023647084
-	.long	709476352
-	.long	1069694321
-	.long	2413027164
-	.long	1024462115
-	.long	2116284416
-	.long	1069656619
-	.long	1144559924
-	.long	1026336654
-	.long	2183651328
-	.long	1069619086
-	.long	3459057650
-	.long	1025634168
-	.long	3047047168
-	.long	1069581720
-	.long	1879674924
-	.long	3173508573
-	.long	970711040
-	.long	1069541521
-	.long	1335954173
-	.long	3173332182
-	.long	2198478848
-	.long	1069467449
-	.long	2951103968
-	.long	3173892200
-	.long	1669611520
-	.long	1069393703
-	.long	531044147
-	.long	1025149248
-	.long	29114368
-	.long	1069320280
-	.long	3327831251
-	.long	1025918673
-	.long	2376949760
-	.long	1069247176
-	.long	737634533
-	.long	3172176000
-	.long	1085390848
-	.long	1069174390
-	.long	3108243400
-	.long	3171828406
-	.long	1566130176
-	.long	1069101918
-	.long	985483226
-	.long	1025708380
-	.long	792780800
-	.long	1069029758
-	.long	4184866295
-	.long	1024426204
-	.long	183156736
-	.long	1068957907
-	.long	2845699378
-	.long	1022107277
-	.long	1301782528
-	.long	1068886362
-	.long	1012735262
-	.long	3173804294
-	.long	1562411008
-	.long	1068815121
-	.long	2197086703
-	.long	3170187813
-	.long	2815549440
-	.long	1068744181
-	.long	2782613207
-	.long	1026345054
-	.long	2756124672
-	.long	1068673540
-	.long	2929486205
-	.long	3173037800
-	.long	3511050240
-	.long	1068603195
-	.long	1443733147
-	.long	3173331549
-	.long	3047047168
-	.long	1068533144
-	.long	1879674924
-	.long	3172459997
-	.long	3221667840
-	.long	1068427825
-	.long	1338588027
-	.long	3171815742
-	.long	3453861888
-	.long	1068288883
-	.long	1205348359
-	.long	3172624626
-	.long	3506110464
-	.long	1068150514
-	.long	893105198
-	.long	1025571866
-	.long	346013696
-	.long	1068012714
-	.long	3495569021
-	.long	3172563349
-	.long	4074029056
-	.long	1067875476
-	.long	3961106338
-	.long	3171065595
-	.long	3559784448
-	.long	1067738798
-	.long	1975385384
-	.long	3173783155
-	.long	797769728
-	.long	1067602675
-	.long	3760305787
-	.long	1026047642
-	.long	2313633792
-	.long	1067467101
-	.long	1559353171
-	.long	1023480256
-	.long	3960766464
-	.long	1067213778
-	.long	1067365107
-	.long	1025865926
-	.long	684261376
-	.long	1066944805
-	.long	844762164
-	.long	3173687482
-	.long	630718464
-	.long	1066676905
-	.long	2458269694
-	.long	1024033081
-	.long	1486061568
-	.long	1066410070
-	.long	115537874
-	.long	3173243995
-	.long	2743664640
-	.long	1065886792
-	.long	3665098304
-	.long	3173471607
-	.long	1971912704
-	.long	1065357333
-	.long	2577214440
-	.long	3171993451
-	.long	1498939392
-	.long	1064306693
-	.long	3409036923
-	.long	1025599151
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	4277811200
-	.long	1067855426
-	.long	2479318832
-	.long	1022292823
-	.long	2454267026
-	.long	1069697316
-	.long	0
-	.long	3218079744
-	.long	1030730101
-	.long	3217380702
-	.long	1431655765
-	.long	1070945621
-	.long	2576980378
-	.long	1070176665
-	.long	0
-	.long	3219128320
-	.long	0
-	.long	4294959104
-	.long	0
-	.long	4294959104
-	.long	0
-	.long	3217031168
-	.long	2576980378
-	.long	1070176665
-	.long	2454267026
-	.long	1069697316
-	.long	0
-	.long	3218079744
-	.long	1431655765
-	.long	3217380693
-	.long	1431655765
-	.long	1070945621
-	.type	static_const_table,@object
-	.size	static_const_table,2192
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_sin.S b/libm/x86/s_sin.S
deleted file mode 100644
index 74d1b86..0000000
--- a/libm/x86/s_sin.S
+++ /dev/null
@@ -1,907 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//     1. RANGE REDUCTION
-//
-//     We perform an initial range reduction from X to r with
-//
-//          X =~= N * pi/32 + r
-//
-//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
-//     where |N| <= 932560. Beyond this, the range reduction is
-//     insufficiently accurate. For extremely small inputs, 
-//     denormalization can occur internally, impacting performance.
-//     This means that the main path is actually only taken for
-//     2^-252 <= |X| < 90112.
-//
-//     To avoid branches, we perform the range reduction to full
-//     accuracy each time.
-//
-//          X - N * (P_1 + P_2 + P_3)
-//
-//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
-//     is exact) and P_3 is a 53-bit number. Together, these
-//     approximate pi well enough for all cases in the restricted
-//     range.
-//
-//     The main reduction sequence is:
-//
-//             y = 32/pi * x
-//             N = integer(y)
-//     (computed by adding and subtracting off SHIFTER)
-//
-//             m_1 = N * P_1
-//             m_2 = N * P_2
-//             r_1 = x - m_1
-//             r = r_1 - m_2
-//     (this r can be used for most of the calculation)
-//
-//             c_1 = r_1 - r
-//             m_3 = N * P_3
-//             c_2 = c_1 - m_2
-//             c = c_2 - m_3
-//
-//     2. MAIN ALGORITHM
-//
-//     The algorithm uses a table lookup based on B = M * pi / 32
-//     where M = N mod 64. The stored values are:
-//       sigma             closest power of 2 to cos(B)
-//       C_hl              53-bit cos(B) - sigma
-//       S_hi + S_lo       2 * 53-bit sin(B)
-//
-//     The computation is organized as follows:
-//
-//          sin(B + r + c) = [sin(B) + sigma * r] +
-//                           r * (cos(B) - sigma) +
-//                           sin(B) * [cos(r + c) - 1] +
-//                           cos(B) * [sin(r + c) - r]
-//
-//     which is approximately:
-//
-//          [S_hi + sigma * r] +
-//          C_hl * r +
-//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
-//          (C_hl + sigma) * [(sin(r) - r) + c]
-//
-//     and this is what is actually computed. We separate this sum
-//     into four parts:
-//
-//          hi + med + pols + corr
-//
-//     where
-//
-//          hi       = S_hi + sigma r
-//          med      = C_hl * r
-//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-//     3. POLYNOMIAL
-//
-//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-//     (sin(r) - r) can be rearranged freely, since it is quite
-//     small, so we exploit parallelism to the fullest.
-//
-//          psc4       =   SC_4 * r_1
-//          msc4       =   psc4 * r
-//          r2         =   r * r
-//          msc2       =   SC_2 * r2
-//          r4         =   r2 * r2
-//          psc3       =   SC_3 + msc4
-//          psc1       =   SC_1 + msc2
-//          msc3       =   r4 * psc3
-//          sincospols =   psc1 + msc3
-//          pols       =   sincospols *
-//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-//     4. CORRECTION TERM
-//
-//     This is where the "c" component of the range reduction is
-//     taken into account; recall that just "r" is used for most of
-//     the calculation.
-//
-//          -c   = m_3 - c_2
-//          -d   = S_hi * r - (C_hl + sigma)
-//          corr = -c * -d + S_lo
-//
-//     5. COMPENSATED SUMMATIONS
-//
-//     The two successive compensated summations add up the high
-//     and medium parts, leaving just the low parts to add up at
-//     the end.
-//
-//          rs        =  sigma * r
-//          res_int   =  S_hi + rs
-//          k_0       =  S_hi - res_int
-//          k_2       =  k_0 + rs
-//          med       =  C_hl * r
-//          res_hi    =  res_int + med
-//          k_1       =  res_int - res_hi
-//          k_3       =  k_1 + med
-//
-//     6. FINAL SUMMATION
-//
-//     We now add up all the small parts:
-//
-//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-//     Now the overall result is just:
-//
-//          res_hi + res_lo
-//
-//     7. SMALL ARGUMENTS
-//
-//     If |x| < SNN (SNN meaning the smallest normal number), we
-//     simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
-//     do 2^-55 * (2^55 * x - x).
-//
-// Special cases:
-//  sin(NaN) = quiet NaN, and raise invalid exception
-//  sin(INF) = NaN and raise invalid exception
-//  sin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  sin
-ENTRY(sin)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 56(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     128(%esp), %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        subl      $12336, %eax
-        cmpl      $4293, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        movsd     2160(%ebx), %xmm1
-        mulsd     %xmm0, %xmm1
-        movsd     2272(%ebx), %xmm5
-        movapd    2256(%ebx), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        movsd     2128(%ebx), %xmm3
-        movapd    2112(%ebx), %xmm2
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %edx
-        cvtsi2sdl %edx, %xmm1
-        mulsd     %xmm1, %xmm3
-        unpcklpd  %xmm1, %xmm1
-        addl      $1865216, %edx
-        movapd    %xmm0, %xmm4
-        andl      $63, %edx
-        movapd    2096(%ebx), %xmm5
-        lea       (%ebx), %eax
-        shll      $5, %edx
-        addl      %edx, %eax
-        mulpd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm0
-        mulsd     2144(%ebx), %xmm1
-        subsd     %xmm3, %xmm4
-        movsd     8(%eax), %xmm7
-        unpcklpd  %xmm0, %xmm0
-        movapd    %xmm4, %xmm3
-        subsd     %xmm2, %xmm4
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm2, %xmm0
-        movapd    2064(%ebx), %xmm6
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm2, %xmm3
-        movapd    (%eax), %xmm2
-        subsd     %xmm3, %xmm1
-        movsd     24(%eax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     2080(%ebx), %xmm5
-        mulsd     (%eax), %xmm4
-        addpd     2048(%ebx), %xmm6
-        mulpd     %xmm0, %xmm5
-        movapd    %xmm3, %xmm0
-        addsd     8(%eax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movapd    %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movsd     8(%eax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%eax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm0, %xmm5
-        addsd     %xmm7, %xmm3
-        addsd     %xmm5, %xmm1
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        unpckhpd  %xmm6, %xmm6
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm4
-        movsd     %xmm4, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        jg        .L_2TAG_PACKET_2.0.2
-        shrl      $4, %eax
-        cmpl      $268434685, %eax
-        jne       .L_2TAG_PACKET_3.0.2
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_3.0.2:
-        movsd     2192(%ebx), %xmm3
-        mulsd     %xmm0, %xmm3
-        subsd     %xmm0, %xmm3
-        mulsd     2208(%ebx), %xmm3
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        movl      132(%esp), %eax
-        andl      $2146435072, %eax
-        cmpl      $2146435072, %eax
-        je        .L_2TAG_PACKET_4.0.2
-        subl      $32, %esp
-        movsd     %xmm0, (%esp)
-        lea       40(%esp), %eax
-        movl      %eax, 8(%esp)
-        movl      $2, %eax
-        movl      %eax, 12(%esp)
-        call      __libm_sincos_huge
-        addl      $32, %esp
-        fldl      16(%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_4.0.2:
-        fldl      128(%esp)
-        fmull     2240(%ebx)
-.L_2TAG_PACKET_1.0.2:
-        movl      56(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(sin)
-# -- End  sin
-
-# Start file scope ASM
-ALIAS_SYMBOL(sinl, sin);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	1072693248
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	1072693248
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	1071644672
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	1071644672
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	1070596096
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	1070596096
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	1069547520
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	3217031168
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	3218079744
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	3218079744
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	3219128320
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	3219128320
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	3220176896
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	3220176896
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	3219128320
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	3219128320
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	3218079744
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	3218079744
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	3217031168
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	1069547520
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	1070596096
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	1070596096
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	1071644672
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	1071644672
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	1072693248
-	.long	1431655765
-	.long	3217380693
-	.long	0
-	.long	3219128320
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1067799893
-	.long	436314138
-	.long	3207201184
-	.long	381774871
-	.long	3210133868
-	.long	2773927732
-	.long	1053236707
-	.long	436314138
-	.long	1056571808
-	.long	442499072
-	.long	1032893537
-	.long	442499072
-	.long	1032893537
-	.long	1413480448
-	.long	1069097467
-	.long	0
-	.long	0
-	.long	771977331
-	.long	996350346
-	.long	0
-	.long	0
-	.long	1841940611
-	.long	1076125488
-	.long	0
-	.long	0
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	0
-	.long	0
-	.long	1130364928
-	.long	0
-	.long	0
-	.long	0
-	.long	1015021568
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	1072693247
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.type	static_const_table,@object
-	.size	static_const_table,2288
-	.data
-	.hidden __libm_sincos_huge
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_tan.S b/libm/x86/s_tan.S
deleted file mode 100644
index 7935efe..0000000
--- a/libm/x86/s_tan.S
+++ /dev/null
@@ -1,1766 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// Polynomials coefficients and other constants.
-//
-// Note that in this algorithm, there is a different polynomial for
-// each breakpoint, so there are 32 sets of polynomial coefficients
-// as well as 32 instances of the other constants.
-//
-// The polynomial coefficients and constants are offset from the start
-// of the main block as follows:
-//
-//   0:  c8 | c0
-//  16:  c9 | c1
-//  32: c10 | c2
-//  48: c11 | c3
-//  64: c12 | c4
-//  80: c13 | c5
-//  96: c14 | c6
-// 112: c15 | c7
-// 128: T_hi
-// 136: T_lo
-// 144: Sigma
-// 152: T_hl
-// 160: Tau
-// 168: Mask
-// 176: (end of block)
-//
-// The total table size is therefore 5632 bytes.
-//
-// Note that c0 and c1 are always zero. We could try storing
-// other constants here, and just loading the low part of the
-// SIMD register in these cases, after ensuring the high part
-// is zero.
-//
-// The higher terms of the polynomial are computed in the *low*
-// part of the SIMD register. This is so we can overlap the
-// multiplication by r^8 and the unpacking of the other part.
-//
-// The constants are:
-// T_hi + T_lo = accurate constant term in power series
-// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
-// Tau = multiplier for the reciprocal, always -1 or 0
-//
-// The basic reconstruction formula using these constants is:
-//
-// High = tau * recip_hi + t_hi
-// Med = (sgn * r + t_hl * r)_hi
-// Low = (sgn * r + t_hl * r)_lo +
-//       tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
-//
-// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
-//
-// (c0 = c1 = 0, but using them keeps SIMD regularity)
-//
-// We then do a compensated sum High + Med, add the low parts together
-// and then do the final sum.
-//
-// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
-// modulo pi/2
-//
-// Special cases:
-//  tan(NaN) = quiet NaN, and raise invalid exception
-//  tan(INF) = NaN and raise invalid exception
-//  tan(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  tan
-ENTRY(tan)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $120, %esp
-        movl      %ebx, 56(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     128(%esp), %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        subl      $14368, %eax
-        cmpl      $2216, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        movapd    5840(%ebx), %xmm5
-        movapd    5856(%ebx), %xmm6
-        unpcklpd  %xmm0, %xmm0
-        movapd    5712(%ebx), %xmm4
-        andpd     %xmm0, %xmm4
-        movapd    5632(%ebx), %xmm1
-        mulpd     %xmm0, %xmm1
-        orpd      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        movapd    %xmm1, %xmm7
-        unpckhpd  %xmm7, %xmm7
-        cvttsd2si %xmm7, %edx
-        cvttpd2dq %xmm1, %xmm1
-        cvtdq2pd  %xmm1, %xmm1
-        mulpd     %xmm6, %xmm1
-        movapd    5664(%ebx), %xmm3
-        movsd     5728(%ebx), %xmm5
-        addl      $469248, %edx
-        movapd    5680(%ebx), %xmm4
-        mulpd     %xmm1, %xmm3
-        andl      $31, %edx
-        mulsd     %xmm1, %xmm5
-        movl      %edx, %ecx
-        mulpd     %xmm1, %xmm4
-        shll      $1, %ecx
-        subpd     %xmm3, %xmm0
-        mulpd     5696(%ebx), %xmm1
-        addl      %ecx, %edx
-        shll      $2, %ecx
-        addl      %ecx, %edx
-        addsd     %xmm0, %xmm5
-        movapd    %xmm0, %xmm2
-        subpd     %xmm4, %xmm0
-        movsd     5744(%ebx), %xmm6
-        shll      $4, %edx
-        lea       (%ebx), %eax
-        andpd     5776(%ebx), %xmm5
-        movapd    %xmm0, %xmm3
-        addl      %edx, %eax
-        subpd     %xmm0, %xmm2
-        unpckhpd  %xmm0, %xmm0
-        divsd     %xmm5, %xmm6
-        subpd     %xmm4, %xmm2
-        movapd    16(%eax), %xmm7
-        subsd     %xmm5, %xmm3
-        mulpd     %xmm0, %xmm7
-        subpd     %xmm1, %xmm2
-        movapd    48(%eax), %xmm1
-        mulpd     %xmm0, %xmm1
-        movapd    96(%eax), %xmm4
-        mulpd     %xmm0, %xmm4
-        addsd     %xmm3, %xmm2
-        movapd    %xmm0, %xmm3
-        mulpd     %xmm0, %xmm0
-        addpd     (%eax), %xmm7
-        addpd     32(%eax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     80(%eax), %xmm4
-        addpd     %xmm1, %xmm7
-        movapd    112(%eax), %xmm1
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm0
-        addpd     %xmm1, %xmm4
-        movapd    64(%eax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     %xmm1, %xmm7
-        movapd    %xmm3, %xmm1
-        mulpd     %xmm0, %xmm3
-        mulsd     %xmm0, %xmm0
-        mulpd     144(%eax), %xmm1
-        mulpd     %xmm3, %xmm4
-        movapd    %xmm1, %xmm3
-        addpd     %xmm4, %xmm7
-        movapd    %xmm1, %xmm4
-        mulsd     %xmm7, %xmm0
-        unpckhpd  %xmm7, %xmm7
-        addsd     %xmm7, %xmm0
-        unpckhpd  %xmm1, %xmm1
-        addsd     %xmm1, %xmm3
-        subsd     %xmm3, %xmm4
-        addsd     %xmm4, %xmm1
-        movapd    %xmm2, %xmm4
-        movsd     144(%eax), %xmm7
-        unpckhpd  %xmm2, %xmm2
-        addsd     152(%eax), %xmm7
-        mulsd     %xmm2, %xmm7
-        addsd     136(%eax), %xmm7
-        addsd     %xmm1, %xmm7
-        addsd     %xmm7, %xmm0
-        movsd     5744(%ebx), %xmm7
-        mulsd     %xmm6, %xmm4
-        movsd     168(%eax), %xmm2
-        andpd     %xmm6, %xmm2
-        mulsd     %xmm2, %xmm5
-        mulsd     160(%eax), %xmm6
-        subsd     %xmm5, %xmm7
-        subsd     128(%eax), %xmm2
-        subsd     %xmm4, %xmm7
-        mulsd     %xmm6, %xmm7
-        movapd    %xmm3, %xmm4
-        subsd     %xmm2, %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm4
-        addsd     %xmm4, %xmm0
-        subsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        movsd     %xmm0, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        jg        .L_2TAG_PACKET_2.0.2
-        shrl      $4, %eax
-        cmpl      $268434558, %eax
-        jne       .L_2TAG_PACKET_3.0.2
-        movapd    %xmm0, %xmm3
-        mulsd     5808(%ebx), %xmm3
-.L_2TAG_PACKET_3.0.2:
-        movsd     5792(%ebx), %xmm3
-        mulsd     %xmm0, %xmm3
-        addsd     %xmm0, %xmm3
-        mulsd     5808(%ebx), %xmm3
-        movsd     %xmm3, (%esp)
-        fldl      (%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        movq      5712(%ebx), %xmm7
-        andpd     %xmm0, %xmm7
-        xorpd     %xmm0, %xmm7
-        ucomisd   5760(%ebx), %xmm7
-        je        .L_2TAG_PACKET_4.0.2
-        subl      $32, %esp
-        movsd     %xmm0, (%esp)
-        lea       40(%esp), %eax
-        movl      %eax, 8(%esp)
-        movl      $2, %eax
-        movl      %eax, 12(%esp)
-        call      __libm_tancot_huge
-        addl      $32, %esp
-        fldl      8(%esp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_4.0.2:
-        movq      %xmm0, (%esp)
-        fldl      (%esp)
-        fsubl     (%esp)
-.L_2TAG_PACKET_1.0.2:
-        movl      56(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(tan)
-# -- End  tan
-
-# Start file scope ASM
-ALIAS_SYMBOL(tanl, tan);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1066820852
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1441186365
-	.long	1065494243
-	.long	1431655765
-	.long	1070945621
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	236289504
-	.long	1064135997
-	.long	286331153
-	.long	1069617425
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1160476131
-	.long	1062722102
-	.long	463583772
-	.long	1068212666
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1313038235
-	.long	1066745731
-	.long	0
-	.long	0
-	.long	1013878342
-	.long	1067152618
-	.long	0
-	.long	0
-	.long	3663426833
-	.long	1065725283
-	.long	3693284251
-	.long	1069118808
-	.long	650852232
-	.long	1065882376
-	.long	1996245381
-	.long	1071000265
-	.long	2008746170
-	.long	1064664197
-	.long	3055842593
-	.long	1068578846
-	.long	1495406348
-	.long	1064652437
-	.long	2269530157
-	.long	1069711235
-	.long	285563696
-	.long	1063576465
-	.long	1046897440
-	.long	1067705865
-	.long	233429731
-	.long	1063453151
-	.long	522045958
-	.long	1068476590
-	.long	2354785698
-	.long	1069102779
-	.long	1317599141
-	.long	1012432133
-	.long	0
-	.long	1072693248
-	.long	2828230105
-	.long	1065606626
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1512545955
-	.long	1068119047
-	.long	0
-	.long	0
-	.long	1127048698
-	.long	1067909459
-	.long	0
-	.long	0
-	.long	2300200450
-	.long	1067254767
-	.long	3593250296
-	.long	1070233561
-	.long	3009365544
-	.long	1066902117
-	.long	1127373050
-	.long	1071173457
-	.long	3046103305
-	.long	1066371299
-	.long	24583402
-	.long	1069723988
-	.long	4082511758
-	.long	1065914199
-	.long	3223889699
-	.long	1070020367
-	.long	548927984
-	.long	1065415756
-	.long	558065897
-	.long	1068949418
-	.long	680073315
-	.long	1064940726
-	.long	388873200
-	.long	1068944270
-	.long	3763679576
-	.long	1070167541
-	.long	1497360404
-	.long	1009710547
-	.long	0
-	.long	1072693248
-	.long	64931152
-	.long	1067729411
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2467582782
-	.long	1069256389
-	.long	0
-	.long	0
-	.long	162150096
-	.long	1068946420
-	.long	0
-	.long	0
-	.long	3702794237
-	.long	1068579152
-	.long	3631919291
-	.long	1070936926
-	.long	3456821413
-	.long	1068217218
-	.long	2031366438
-	.long	1071495745
-	.long	1596664020
-	.long	1067799281
-	.long	1509038701
-	.long	1070601643
-	.long	583171477
-	.long	1067510148
-	.long	3785344682
-	.long	1070618476
-	.long	2402036048
-	.long	1067075736
-	.long	3233018412
-	.long	1069913186
-	.long	411280568
-	.long	1066710556
-	.long	1065584192
-	.long	1069747896
-	.long	895247324
-	.long	1070819848
-	.long	500078909
-	.long	3161288781
-	.long	0
-	.long	1072693248
-	.long	729983843
-	.long	1068994194
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1458794562
-	.long	1070398550
-	.long	0
-	.long	0
-	.long	2857777489
-	.long	1070137637
-	.long	0
-	.long	0
-	.long	1024359517
-	.long	1069876531
-	.long	2616040238
-	.long	1071582937
-	.long	1609024636
-	.long	1069675088
-	.long	2529240549
-	.long	1071836633
-	.long	1510128600
-	.long	1069440113
-	.long	2251697184
-	.long	1071253687
-	.long	1262761453
-	.long	1069142850
-	.long	1263091857
-	.long	1071190461
-	.long	3043383486
-	.long	1068885191
-	.long	2476932470
-	.long	1070842002
-	.long	3659995028
-	.long	1068669200
-	.long	855891755
-	.long	1070696894
-	.long	2583490354
-	.long	1071284857
-	.long	3062633575
-	.long	1014008623
-	.long	0
-	.long	1072693248
-	.long	2550940471
-	.long	1069938201
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3422807297
-	.long	1071640847
-	.long	0
-	.long	0
-	.long	1151658053
-	.long	1071494715
-	.long	0
-	.long	0
-	.long	929607071
-	.long	1071346340
-	.long	1037049034
-	.long	1072037305
-	.long	2786928657
-	.long	1071215282
-	.long	1447406859
-	.long	1072265209
-	.long	3490952107
-	.long	1071090851
-	.long	3205232916
-	.long	1071968658
-	.long	1297344304
-	.long	1070977120
-	.long	1066110976
-	.long	1071946035
-	.long	3803721480
-	.long	1070871082
-	.long	1496754229
-	.long	1071807201
-	.long	2982550683
-	.long	1070773243
-	.long	4014441989
-	.long	1071736222
-	.long	419968236
-	.long	1071717047
-	.long	3451266538
-	.long	3163444811
-	.long	0
-	.long	1072693248
-	.long	2960267235
-	.long	1070745841
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	724322768
-	.long	1072881308
-	.long	0
-	.long	0
-	.long	643153048
-	.long	1072905816
-	.long	0
-	.long	0
-	.long	4285079458
-	.long	1072928558
-	.long	3912524733
-	.long	1072622983
-	.long	118362272
-	.long	1072952754
-	.long	4107767972
-	.long	1072827408
-	.long	2689502883
-	.long	1072976922
-	.long	946523347
-	.long	1072772766
-	.long	573204189
-	.long	1073001761
-	.long	581531518
-	.long	1072826391
-	.long	1386236526
-	.long	1073026959
-	.long	3718905905
-	.long	1072832823
-	.long	1145558140
-	.long	1073052673
-	.long	513572637
-	.long	1072861969
-	.long	716700048
-	.long	1071997368
-	.long	547126769
-	.long	1015523525
-	.long	0
-	.long	1072693248
-	.long	1097907398
-	.long	1071420120
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3349892442
-	.long	1074290212
-	.long	0
-	.long	0
-	.long	3913197405
-	.long	1074501181
-	.long	0
-	.long	0
-	.long	2494034522
-	.long	1074739170
-	.long	1264738763
-	.long	1073084804
-	.long	1520293906
-	.long	1074899632
-	.long	1958936600
-	.long	1073411493
-	.long	2133649635
-	.long	1075052171
-	.long	4270740730
-	.long	1073574708
-	.long	1728930189
-	.long	1075224844
-	.long	1303998552
-	.long	1073799186
-	.long	618611933
-	.long	1075420255
-	.long	1769828046
-	.long	1073938542
-	.long	2200537986
-	.long	1075641421
-	.long	433361110
-	.long	1074105369
-	.long	719595600
-	.long	1072317184
-	.long	294527206
-	.long	3162140088
-	.long	0
-	.long	1073741824
-	.long	3811788216
-	.long	3218400550
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1704352102
-	.long	1075943001
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1076258036
-	.long	0
-	.long	0
-	.long	2211264291
-	.long	1076659010
-	.long	0
-	.long	1073741824
-	.long	1441186365
-	.long	1077028579
-	.long	1431655765
-	.long	1074091349
-	.long	876943673
-	.long	1077353622
-	.long	2863311531
-	.long	1074440874
-	.long	236289504
-	.long	1077767485
-	.long	286331153
-	.long	1074860305
-	.long	2805473311
-	.long	1078115278
-	.long	95443718
-	.long	1075163227
-	.long	1160476131
-	.long	1078450742
-	.long	463583772
-	.long	1075552698
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	1073741824
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1330165971
-	.long	3207850745
-	.long	0
-	.long	0
-	.long	217536623
-	.long	1059109098
-	.long	0
-	.long	0
-	.long	3492120849
-	.long	3205151475
-	.long	602185705
-	.long	3215678092
-	.long	760422958
-	.long	1056312597
-	.long	555127889
-	.long	1067545266
-	.long	3139784124
-	.long	3202470837
-	.long	3690544014
-	.long	3213150171
-	.long	95707915
-	.long	1053635428
-	.long	4003114407
-	.long	1064581412
-	.long	2034926231
-	.long	3199711161
-	.long	3759536023
-	.long	3210559989
-	.long	3826928214
-	.long	1050893819
-	.long	3837960785
-	.long	1061790379
-	.long	1526325248
-	.long	3217967566
-	.long	2356426521
-	.long	1025423456
-	.long	0
-	.long	0
-	.long	457728975
-	.long	1071088276
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1398462608
-	.long	3207303968
-	.long	0
-	.long	0
-	.long	26205983
-	.long	1058461213
-	.long	0
-	.long	0
-	.long	56226238
-	.long	3204528612
-	.long	2754706541
-	.long	3215359511
-	.long	2187799823
-	.long	1055634437
-	.long	790323742
-	.long	1067402587
-	.long	1372385848
-	.long	3201651479
-	.long	4097292716
-	.long	3212856302
-	.long	3348210357
-	.long	1052830099
-	.long	2442796466
-	.long	1064337602
-	.long	862608142
-	.long	3198830754
-	.long	170296152
-	.long	3210060867
-	.long	3755571428
-	.long	1049933343
-	.long	3614866008
-	.long	1061361670
-	.long	719978496
-	.long	3217669096
-	.long	1998842465
-	.long	3174703977
-	.long	0
-	.long	0
-	.long	3749156607
-	.long	1071048258
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3120498638
-	.long	3206749304
-	.long	0
-	.long	0
-	.long	2773578114
-	.long	1058009312
-	.long	0
-	.long	0
-	.long	2030783676
-	.long	3203817873
-	.long	2223654598
-	.long	3215071936
-	.long	2976134650
-	.long	1054987244
-	.long	706390066
-	.long	1067217386
-	.long	4258437615
-	.long	3200900378
-	.long	1066252975
-	.long	3212391267
-	.long	815777514
-	.long	1051989462
-	.long	3202745457
-	.long	1064010682
-	.long	2493556375
-	.long	3198004753
-	.long	1046243251
-	.long	3209678971
-	.long	2593078846
-	.long	1049017717
-	.long	2763962276
-	.long	1060970161
-	.long	701480960
-	.long	3217377742
-	.long	3205862232
-	.long	3174660915
-	.long	0
-	.long	0
-	.long	2267016812
-	.long	1071015664
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	2107155798
-	.long	3206166872
-	.long	0
-	.long	0
-	.long	2642992129
-	.long	1057424578
-	.long	0
-	.long	0
-	.long	1936992811
-	.long	3203204426
-	.long	1485063559
-	.long	3214682643
-	.long	1432914553
-	.long	1054319398
-	.long	3996381654
-	.long	1067075828
-	.long	2833029256
-	.long	3200223545
-	.long	2866066872
-	.long	3211982662
-	.long	2432888737
-	.long	1051234178
-	.long	3669764559
-	.long	1063748136
-	.long	2458496952
-	.long	3197170774
-	.long	1948234989
-	.long	3209098147
-	.long	2843698787
-	.long	1048163519
-	.long	3398041407
-	.long	1060559728
-	.long	2829230080
-	.long	3217092115
-	.long	1034046433
-	.long	3174271903
-	.long	0
-	.long	0
-	.long	298675305
-	.long	1070989821
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	437603223
-	.long	3205589761
-	.long	0
-	.long	0
-	.long	759330352
-	.long	1057048511
-	.long	0
-	.long	0
-	.long	3107463368
-	.long	3202507988
-	.long	3144465176
-	.long	3214191500
-	.long	2290961810
-	.long	1053841035
-	.long	1618153340
-	.long	1066971547
-	.long	3836869393
-	.long	3199400272
-	.long	584032116
-	.long	3211469261
-	.long	1245704358
-	.long	1050626462
-	.long	4247487438
-	.long	1063561943
-	.long	1669034927
-	.long	3196274812
-	.long	3844233498
-	.long	3208626322
-	.long	2706958524
-	.long	1047411374
-	.long	3857199098
-	.long	1060281647
-	.long	3593904128
-	.long	3216590719
-	.long	3267547836
-	.long	3172163321
-	.long	0
-	.long	0
-	.long	4076712227
-	.long	1070970214
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3290090340
-	.long	3204793485
-	.long	0
-	.long	0
-	.long	3685760367
-	.long	1056668370
-	.long	0
-	.long	0
-	.long	2655163949
-	.long	3201674917
-	.long	628750575
-	.long	3213566872
-	.long	680140505
-	.long	1053299777
-	.long	2954464709
-	.long	1066900026
-	.long	803201619
-	.long	3198516435
-	.long	1466315631
-	.long	3210837162
-	.long	1611220163
-	.long	1049972438
-	.long	2766187256
-	.long	1063437894
-	.long	1804579484
-	.long	3195331491
-	.long	3695969289
-	.long	3207854418
-	.long	2617238373
-	.long	1046675948
-	.long	3095830084
-	.long	1060095334
-	.long	3789570048
-	.long	3216034914
-	.long	23826559
-	.long	3172048060
-	.long	0
-	.long	0
-	.long	3870939386
-	.long	1070956467
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1571758758
-	.long	3203672535
-	.long	0
-	.long	0
-	.long	113026373
-	.long	1056416381
-	.long	0
-	.long	0
-	.long	1913766298
-	.long	3200523326
-	.long	2507068734
-	.long	3212502004
-	.long	4000648818
-	.long	1053003803
-	.long	2446607349
-	.long	1066858259
-	.long	912662124
-	.long	3197333001
-	.long	1349489537
-	.long	3209765608
-	.long	3412972607
-	.long	1049641401
-	.long	1721283327
-	.long	1063366855
-	.long	1466691883
-	.long	3194116746
-	.long	3852528092
-	.long	3206760861
-	.long	285443293
-	.long	1046158380
-	.long	1758739894
-	.long	1059895449
-	.long	1858781184
-	.long	3214984212
-	.long	3447575948
-	.long	1024675855
-	.long	0
-	.long	0
-	.long	2242038011
-	.long	1070948320
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	737611454
-	.long	1056336527
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3594790527
-	.long	1052911621
-	.long	381774871
-	.long	1066844524
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3303051618
-	.long	1049456050
-	.long	3154187623
-	.long	1063343722
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	528061788
-	.long	1045944910
-	.long	2469719819
-	.long	1059831159
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1431655765
-	.long	1070945621
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1571758758
-	.long	1056188887
-	.long	0
-	.long	0
-	.long	113026373
-	.long	1056416381
-	.long	0
-	.long	0
-	.long	1913766298
-	.long	1053039678
-	.long	2507068734
-	.long	1065018356
-	.long	4000648818
-	.long	1053003803
-	.long	2446607349
-	.long	1066858259
-	.long	912662124
-	.long	1049849353
-	.long	1349489537
-	.long	1062281960
-	.long	3412972607
-	.long	1049641401
-	.long	1721283327
-	.long	1063366855
-	.long	1466691883
-	.long	1046633098
-	.long	3852528092
-	.long	1059277213
-	.long	285443293
-	.long	1046158380
-	.long	1758739894
-	.long	1059895449
-	.long	1858781184
-	.long	1067500564
-	.long	3447575948
-	.long	3172159503
-	.long	0
-	.long	0
-	.long	2242038011
-	.long	1070948320
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3290090340
-	.long	1057309837
-	.long	0
-	.long	0
-	.long	3685760367
-	.long	1056668370
-	.long	0
-	.long	0
-	.long	2655163949
-	.long	1054191269
-	.long	628750575
-	.long	1066083224
-	.long	680140505
-	.long	1053299777
-	.long	2954464709
-	.long	1066900026
-	.long	803201619
-	.long	1051032787
-	.long	1466315631
-	.long	1063353514
-	.long	1611220163
-	.long	1049972438
-	.long	2766187256
-	.long	1063437894
-	.long	1804579484
-	.long	1047847843
-	.long	3695969289
-	.long	1060370770
-	.long	2617238373
-	.long	1046675948
-	.long	3095830084
-	.long	1060095334
-	.long	3789570048
-	.long	1068551266
-	.long	23826559
-	.long	1024564412
-	.long	0
-	.long	0
-	.long	3870939386
-	.long	1070956467
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	437603223
-	.long	1058106113
-	.long	0
-	.long	0
-	.long	759330352
-	.long	1057048511
-	.long	0
-	.long	0
-	.long	3107463368
-	.long	1055024340
-	.long	3144465176
-	.long	1066707852
-	.long	2290961810
-	.long	1053841035
-	.long	1618153340
-	.long	1066971547
-	.long	3836869393
-	.long	1051916624
-	.long	584032116
-	.long	1063985613
-	.long	1245704358
-	.long	1050626462
-	.long	4247487438
-	.long	1063561943
-	.long	1669034927
-	.long	1048791164
-	.long	3844233498
-	.long	1061142674
-	.long	2706958524
-	.long	1047411374
-	.long	3857199098
-	.long	1060281647
-	.long	3593904128
-	.long	1069107071
-	.long	3267547836
-	.long	1024679673
-	.long	0
-	.long	0
-	.long	4076712227
-	.long	1070970214
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	2107155798
-	.long	1058683224
-	.long	0
-	.long	0
-	.long	2642992129
-	.long	1057424578
-	.long	0
-	.long	0
-	.long	1936992811
-	.long	1055720778
-	.long	1485063559
-	.long	1067198995
-	.long	1432914553
-	.long	1054319398
-	.long	3996381654
-	.long	1067075828
-	.long	2833029256
-	.long	1052739897
-	.long	2866066872
-	.long	1064499014
-	.long	2432888737
-	.long	1051234178
-	.long	3669764559
-	.long	1063748136
-	.long	2458496952
-	.long	1049687126
-	.long	1948234989
-	.long	1061614499
-	.long	2843698787
-	.long	1048163519
-	.long	3398041407
-	.long	1060559728
-	.long	2829230080
-	.long	1069608467
-	.long	1034046433
-	.long	1026788255
-	.long	0
-	.long	0
-	.long	298675305
-	.long	1070989821
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3120498638
-	.long	1059265656
-	.long	0
-	.long	0
-	.long	2773578114
-	.long	1058009312
-	.long	0
-	.long	0
-	.long	2030783676
-	.long	1056334225
-	.long	2223654598
-	.long	1067588288
-	.long	2976134650
-	.long	1054987244
-	.long	706390066
-	.long	1067217386
-	.long	4258437615
-	.long	1053416730
-	.long	1066252975
-	.long	1064907619
-	.long	815777514
-	.long	1051989462
-	.long	3202745457
-	.long	1064010682
-	.long	2493556375
-	.long	1050521105
-	.long	1046243251
-	.long	1062195323
-	.long	2593078846
-	.long	1049017717
-	.long	2763962276
-	.long	1060970161
-	.long	701480960
-	.long	1069894094
-	.long	3205862232
-	.long	1027177267
-	.long	0
-	.long	0
-	.long	2267016812
-	.long	1071015664
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1398462608
-	.long	1059820320
-	.long	0
-	.long	0
-	.long	26205983
-	.long	1058461213
-	.long	0
-	.long	0
-	.long	56226238
-	.long	1057044964
-	.long	2754706541
-	.long	1067875863
-	.long	2187799823
-	.long	1055634437
-	.long	790323742
-	.long	1067402587
-	.long	1372385848
-	.long	1054167831
-	.long	4097292716
-	.long	1065372654
-	.long	3348210357
-	.long	1052830099
-	.long	2442796466
-	.long	1064337602
-	.long	862608142
-	.long	1051347106
-	.long	170296152
-	.long	1062577219
-	.long	3755571428
-	.long	1049933343
-	.long	3614866008
-	.long	1061361670
-	.long	719978496
-	.long	1070185448
-	.long	1998842465
-	.long	1027220329
-	.long	0
-	.long	0
-	.long	3749156607
-	.long	1071048258
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1330165971
-	.long	1060367097
-	.long	0
-	.long	0
-	.long	217536623
-	.long	1059109098
-	.long	0
-	.long	0
-	.long	3492120849
-	.long	1057667827
-	.long	602185705
-	.long	1068194444
-	.long	760422958
-	.long	1056312597
-	.long	555127889
-	.long	1067545266
-	.long	3139784124
-	.long	1054987189
-	.long	3690544014
-	.long	1065666523
-	.long	95707915
-	.long	1053635428
-	.long	4003114407
-	.long	1064581412
-	.long	2034926231
-	.long	1052227513
-	.long	3759536023
-	.long	1063076341
-	.long	3826928214
-	.long	1050893819
-	.long	3837960785
-	.long	1061790379
-	.long	1526325248
-	.long	1070483918
-	.long	2356426521
-	.long	3172907104
-	.long	0
-	.long	0
-	.long	457728975
-	.long	1071088276
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1704352102
-	.long	3223426649
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1076258036
-	.long	0
-	.long	0
-	.long	2211264291
-	.long	3224142658
-	.long	0
-	.long	3221225472
-	.long	1441186365
-	.long	1077028579
-	.long	1431655765
-	.long	1074091349
-	.long	876943673
-	.long	3224837270
-	.long	2863311531
-	.long	3221924522
-	.long	236289504
-	.long	1077767485
-	.long	286331153
-	.long	1074860305
-	.long	2805473311
-	.long	3225598926
-	.long	95443718
-	.long	3222646875
-	.long	1160476131
-	.long	1078450742
-	.long	463583772
-	.long	1075552698
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	1073741824
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3349892442
-	.long	3221773860
-	.long	0
-	.long	0
-	.long	3913197405
-	.long	1074501181
-	.long	0
-	.long	0
-	.long	2494034522
-	.long	3222222818
-	.long	1264738763
-	.long	3220568452
-	.long	1520293906
-	.long	1074899632
-	.long	1958936600
-	.long	1073411493
-	.long	2133649635
-	.long	3222535819
-	.long	4270740730
-	.long	3221058356
-	.long	1728930189
-	.long	1075224844
-	.long	1303998552
-	.long	1073799186
-	.long	618611933
-	.long	3222903903
-	.long	1769828046
-	.long	3221422190
-	.long	2200537986
-	.long	1075641421
-	.long	433361110
-	.long	1074105369
-	.long	719595600
-	.long	3219800832
-	.long	294527206
-	.long	1014656440
-	.long	0
-	.long	1073741824
-	.long	3811788216
-	.long	3218400550
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	724322768
-	.long	3220364956
-	.long	0
-	.long	0
-	.long	643153048
-	.long	1072905816
-	.long	0
-	.long	0
-	.long	4285079458
-	.long	3220412206
-	.long	3912524733
-	.long	3220106631
-	.long	118362272
-	.long	1072952754
-	.long	4107767972
-	.long	1072827408
-	.long	2689502883
-	.long	3220460570
-	.long	946523347
-	.long	3220256414
-	.long	573204189
-	.long	1073001761
-	.long	581531518
-	.long	1072826391
-	.long	1386236526
-	.long	3220510607
-	.long	3718905905
-	.long	3220316471
-	.long	1145558140
-	.long	1073052673
-	.long	513572637
-	.long	1072861969
-	.long	716700048
-	.long	3219481016
-	.long	547126769
-	.long	3163007173
-	.long	0
-	.long	1072693248
-	.long	1097907398
-	.long	1071420120
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3422807297
-	.long	3219124495
-	.long	0
-	.long	0
-	.long	1151658053
-	.long	1071494715
-	.long	0
-	.long	0
-	.long	929607071
-	.long	3218829988
-	.long	1037049034
-	.long	3219520953
-	.long	2786928657
-	.long	1071215282
-	.long	1447406859
-	.long	1072265209
-	.long	3490952107
-	.long	3218574499
-	.long	3205232916
-	.long	3219452306
-	.long	1297344304
-	.long	1070977120
-	.long	1066110976
-	.long	1071946035
-	.long	3803721480
-	.long	3218354730
-	.long	1496754229
-	.long	3219290849
-	.long	2982550683
-	.long	1070773243
-	.long	4014441989
-	.long	1071736222
-	.long	419968236
-	.long	3219200695
-	.long	3451266538
-	.long	1015961163
-	.long	0
-	.long	1072693248
-	.long	2960267235
-	.long	1070745841
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1458794562
-	.long	3217882198
-	.long	0
-	.long	0
-	.long	2857777489
-	.long	1070137637
-	.long	0
-	.long	0
-	.long	1024359517
-	.long	3217360179
-	.long	2616040238
-	.long	3219066585
-	.long	1609024636
-	.long	1069675088
-	.long	2529240549
-	.long	1071836633
-	.long	1510128600
-	.long	3216923761
-	.long	2251697184
-	.long	3218737335
-	.long	1262761453
-	.long	1069142850
-	.long	1263091857
-	.long	1071190461
-	.long	3043383486
-	.long	3216368839
-	.long	2476932470
-	.long	3218325650
-	.long	3659995028
-	.long	1068669200
-	.long	855891755
-	.long	1070696894
-	.long	2583490354
-	.long	3218768505
-	.long	3062633575
-	.long	3161492271
-	.long	0
-	.long	1072693248
-	.long	2550940471
-	.long	1069938201
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2467582782
-	.long	3216740037
-	.long	0
-	.long	0
-	.long	162150096
-	.long	1068946420
-	.long	0
-	.long	0
-	.long	3702794237
-	.long	3216062800
-	.long	3631919291
-	.long	3218420574
-	.long	3456821413
-	.long	1068217218
-	.long	2031366438
-	.long	1071495745
-	.long	1596664020
-	.long	3215282929
-	.long	1509038701
-	.long	3218085291
-	.long	583171477
-	.long	1067510148
-	.long	3785344682
-	.long	1070618476
-	.long	2402036048
-	.long	3214559384
-	.long	3233018412
-	.long	3217396834
-	.long	411280568
-	.long	1066710556
-	.long	1065584192
-	.long	1069747896
-	.long	895247324
-	.long	3218303496
-	.long	500078909
-	.long	1013805133
-	.long	0
-	.long	1072693248
-	.long	729983843
-	.long	1068994194
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1512545955
-	.long	3215602695
-	.long	0
-	.long	0
-	.long	1127048698
-	.long	1067909459
-	.long	0
-	.long	0
-	.long	2300200450
-	.long	3214738415
-	.long	3593250296
-	.long	3217717209
-	.long	3009365544
-	.long	1066902117
-	.long	1127373050
-	.long	1071173457
-	.long	3046103305
-	.long	3213854947
-	.long	24583402
-	.long	3217207636
-	.long	4082511758
-	.long	1065914199
-	.long	3223889699
-	.long	1070020367
-	.long	548927984
-	.long	3212899404
-	.long	558065897
-	.long	3216433066
-	.long	680073315
-	.long	1064940726
-	.long	388873200
-	.long	1068944270
-	.long	3763679576
-	.long	3217651189
-	.long	1497360404
-	.long	3157194195
-	.long	0
-	.long	1072693248
-	.long	64931152
-	.long	1067729411
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1313038235
-	.long	3214229379
-	.long	0
-	.long	0
-	.long	1013878342
-	.long	1067152618
-	.long	0
-	.long	0
-	.long	3663426833
-	.long	3213208931
-	.long	3693284251
-	.long	3216602456
-	.long	650852232
-	.long	1065882376
-	.long	1996245381
-	.long	1071000265
-	.long	2008746170
-	.long	3212147845
-	.long	3055842593
-	.long	3216062494
-	.long	1495406348
-	.long	1064652437
-	.long	2269530157
-	.long	1069711235
-	.long	285563696
-	.long	3211060113
-	.long	1046897440
-	.long	3215189513
-	.long	233429731
-	.long	1063453151
-	.long	522045958
-	.long	1068476590
-	.long	2354785698
-	.long	3216586427
-	.long	1317599141
-	.long	3159915781
-	.long	0
-	.long	1072693248
-	.long	2828230105
-	.long	1065606626
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1841940611
-	.long	1071931184
-	.long	1841940611
-	.long	1076125488
-	.long	0
-	.long	1131937792
-	.long	0
-	.long	1127743488
-	.long	1413758976
-	.long	1069097467
-	.long	1413742592
-	.long	1069097467
-	.long	1734819840
-	.long	3174229945
-	.long	1280049152
-	.long	1028033571
-	.long	923219018
-	.long	984130272
-	.long	57701189
-	.long	988383790
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	1734816687
-	.long	1026746297
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	2146435072
-	.long	0
-	.long	0
-	.long	4294705152
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	0
-	.long	1130364928
-	.long	0
-	.long	0
-	.long	0
-	.long	1015021568
-	.long	0
-	.long	0
-	.long	0
-	.long	1017118720
-	.long	0
-	.long	0
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1076887552
-	.long	0
-	.long	1072693248
-	.type	static_const_table,@object
-	.size	static_const_table,5872
-	.data
-	.hidden __libm_tancot_huge
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/s_tanh.S b/libm/x86/s_tanh.S
deleted file mode 100644
index 777519f..0000000
--- a/libm/x86/s_tanh.S
+++ /dev/null
@@ -1,1361 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))=(1-exp(-2*x))/(1+exp(-2*x))
-//
-// Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-// log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//         L2EH+L2EL (upper 26, lower 53 bits)
-//
-// Let xH*L2EH=k+f+r`, where (k+f)*2^8*2=int(xH*L2EH*2^9),
-//                             f=0.b1 b2 ... b8, k integer
-// 2^{-f} is approximated as Tn[f]+Dn[f]
-// Tn stores the high 53 bits, Dn stores (2^{-f}-Tn[f]) rounded to double precision
-//
-//  r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-9}+2^{-14},
-//                      for |x| in [23/64,3*2^7)
-// e^{-2*|x|}=2^{-k-f}*2^{-r} ~ 2^{-k}*(Tn+Dn)*(1+p)=(T0+D0)*(1+p)
-//
-// For |x| in [2^{-4},2^5):
-//         2^{-r}-1 ~ p=c1*r+c2*r^2+..+c5*r^5
-//      Let R=1/(1+T0+p*T0), truncated to 35 significant bits
-//  R=1/(1+T0+D0+p*(T0+D0))*(1+eps), |eps|<2^{-33}
-//  1+T0+D0+p*(T0+D0)=KH+KL, where
-//       KH=(1+T0+c1*r*T0)_high (leading 17 bits)
-//       KL=T0_low+D0+(c1*r*T0)_low+c1*r*D0+(c2*r^2+..c5*r^5)*T0
-//  eps ~ (R*KH-1)+R*KL
-//  1/(1+T0+D0+p*(T0+D0)) ~ R-R*eps
-//  The result is approximated as (1-T0-D0-(T0+D0)*p)*(R-R*eps)
-//  1-T0-D0-(T0+D0)*p=-((KH-2)+KL)
-//    The result is formed as
-//    (KH-2)*R+(-(KH-2)*R*eps+(KL*R-KL*R*eps)), with the correct sign
-//                                                  set at the end
-//
-// For |x| in [2^{-64},2^{-4}):
-//  A Taylor series expansion is used  (x+p3*x^3+..+p13*x^{13})
-//
-// For |x|<2^{-64}:  x is returned
-//
-// For |x|>=2^32: return +/-1
-//
-// Special cases:
-//  tanh(NaN) = quiet NaN, and raise invalid exception
-//  tanh(INF) = that INF
-//  tanh(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  static_func
-        .text
-        .align __bionic_asm_align
-        .type static_func, @function
-static_func:
-..B1.1:
-        call      ..L2
-..L2:
-        popl      %eax
-        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
-        lea       static_const_table@GOTOFF(%eax), %eax
-        ret
-        .size   static_func,.-static_func
-# -- End  static_func
-
-# -- Begin  tanh
-ENTRY(tanh)
-# parameter 1: 8 + %ebp
-..B2.1:
-..B2.2:
-        pushl     %ebp
-        movl      %esp, %ebp
-        subl      $104, %esp
-        movl      %ebx, 40(%esp)
-        call      static_func
-        movl      %eax, %ebx
-        movsd     112(%esp), %xmm0
-        movsd     4256(%ebx), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     4112(%ebx), %xmm1
-        movsd     4120(%ebx), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     4096(%ebx), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        movl      $32768, %edx
-        andl      %ecx, %edx
-        andl      $32767, %ecx
-        subl      $16304, %ecx
-        cmpl      $144, %ecx
-        jae       .L_2TAG_PACKET_0.0.2
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        movapd    %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        movsd     4264(%ebx), %xmm4
-        subsd     %xmm6, %xmm3
-        xorpd     %xmm0, %xmm0
-        addsd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm7
-        movapd    4128(%ebx), %xmm6
-        addsd     %xmm7, %xmm2
-        movl      $255, %ecx
-        andl      %eax, %ecx
-        addl      %ecx, %ecx
-        movapd    (%ebx,%ecx,8), %xmm5
-        shrl      $4, %eax
-        andl      $65520, %eax
-        subl      $16368, %eax
-        negl      %eax
-        pinsrw    $3, %eax, %xmm0
-        movapd    4144(%ebx), %xmm1
-        pshufd    $68, %xmm0, %xmm0
-        mulpd     %xmm5, %xmm0
-        movsd     4160(%ebx), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        movapd    %xmm4, %xmm5
-        addsd     %xmm0, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulsd     %xmm2, %xmm7
-        mulpd     %xmm2, %xmm2
-        addpd     %xmm6, %xmm1
-        mulsd     %xmm2, %xmm2
-        movsd     4264(%ebx), %xmm3
-        mulpd     %xmm2, %xmm1
-        pshufd    $78, %xmm1, %xmm6
-        addsd     %xmm6, %xmm1
-        movapd    %xmm1, %xmm6
-        addsd     %xmm7, %xmm1
-        mulsd     %xmm0, %xmm1
-        addsd     %xmm4, %xmm1
-        andpd     4224(%ebx), %xmm4
-        divsd     %xmm1, %xmm5
-        subsd     %xmm4, %xmm3
-        pshufd    $238, %xmm0, %xmm1
-        addsd     %xmm0, %xmm3
-        movapd    %xmm4, %xmm2
-        addsd     %xmm1, %xmm3
-        mulsd     %xmm7, %xmm1
-        mulsd     %xmm0, %xmm7
-        addsd     %xmm1, %xmm3
-        addsd     %xmm7, %xmm4
-        movsd     4240(%ebx), %xmm1
-        mulsd     %xmm0, %xmm6
-        andpd     4224(%ebx), %xmm4
-        addsd     %xmm6, %xmm3
-        movapd    %xmm4, %xmm6
-        subsd     %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        movsd     4264(%ebx), %xmm7
-        andpd     %xmm1, %xmm5
-        addsd     %xmm2, %xmm3
-        mulsd     %xmm5, %xmm4
-        xorpd     %xmm2, %xmm2
-        mulsd     %xmm5, %xmm3
-        subsd     4272(%ebx), %xmm6
-        subsd     %xmm7, %xmm4
-        xorl      $32768, %edx
-        pinsrw    $3, %edx, %xmm2
-        addsd     %xmm3, %xmm4
-        mulsd     %xmm5, %xmm6
-        movapd    %xmm3, %xmm1
-        mulsd     %xmm4, %xmm3
-        movapd    %xmm6, %xmm0
-        mulsd     %xmm4, %xmm6
-        subsd     %xmm3, %xmm1
-        subsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_0.0.2:
-        addl      $960, %ecx
-        cmpl      $1104, %ecx
-        jae       .L_2TAG_PACKET_2.0.2
-        movapd    4176(%ebx), %xmm2
-        pshufd    $68, %xmm0, %xmm1
-        movapd    4192(%ebx), %xmm3
-        mulpd     %xmm1, %xmm1
-        movapd    4208(%ebx), %xmm4
-        mulpd     %xmm1, %xmm2
-        pshufd    $68, %xmm1, %xmm5
-        addpd     %xmm3, %xmm2
-        mulsd     %xmm5, %xmm5
-        mulpd     %xmm1, %xmm2
-        mulsd     %xmm5, %xmm5
-        addpd     %xmm4, %xmm2
-        mulpd     %xmm5, %xmm2
-        pshufd    $238, %xmm2, %xmm5
-        addsd     %xmm5, %xmm2
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        addl      $15344, %ecx
-        cmpl      $16448, %ecx
-        jae       .L_2TAG_PACKET_3.0.2
-        cmpl      $16, %ecx
-        jb        .L_2TAG_PACKET_4.0.2
-        xorpd     %xmm2, %xmm2
-        movl      $17392, %eax
-        pinsrw    $3, %eax, %xmm2
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm2
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_4.0.2:
-        movapd    %xmm0, %xmm2
-        mulsd     %xmm2, %xmm2
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_3.0.2:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_5.0.2
-        xorpd     %xmm2, %xmm2
-        movl      $15344, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        movapd    %xmm2, %xmm3
-        mulsd     %xmm2, %xmm2
-        addsd     %xmm3, %xmm2
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm0, %xmm0
-        orl       $16368, %edx
-        pinsrw    $3, %edx, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_5.0.2:
-        movapd    %xmm0, %xmm2
-        movd      %xmm0, %eax
-        psrlq     $20, %xmm2
-        movd      %xmm2, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_6.0.2
-        addsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_1.0.2:
-        movsd     %xmm0, 24(%esp)
-        fldl      24(%esp)
-.L_2TAG_PACKET_7.0.2:
-        movl      40(%esp), %ebx
-        movl      %ebp, %esp
-        popl      %ebp
-        ret       
-..B2.3:
-END(tanh)
-# -- End  tanh
-
-# Start file scope ASM
-ALIAS_SYMBOL(tanhl, tanh);
-# End file scope ASM
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	1797923801
-	.long	1072687577
-	.long	1950547427
-	.long	1013229059
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	915592468
-	.long	1072676282
-	.long	352947894
-	.long	3161024371
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	35929225
-	.long	1072665048
-	.long	2809788041
-	.long	3159436968
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	2038973688
-	.long	1072653874
-	.long	892941374
-	.long	1016046459
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	1222472308
-	.long	1072642761
-	.long	1054357470
-	.long	3161021018
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	481706282
-	.long	1072631708
-	.long	1696079173
-	.long	3162710528
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	2719515920
-	.long	1072620714
-	.long	2760332941
-	.long	1015137933
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2256325230
-	.long	1072609780
-	.long	580117746
-	.long	1015317295
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	2009970496
-	.long	1072598905
-	.long	2159039665
-	.long	3162572948
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	610758006
-	.long	1072588089
-	.long	1965209397
-	.long	3161866232
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	991358482
-	.long	1072577331
-	.long	838715019
-	.long	3163157668
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	1796832535
-	.long	1072566631
-	.long	3176955716
-	.long	3160585513
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	1679558232
-	.long	1072555989
-	.long	2390342287
-	.long	3163333970
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	3594158869
-	.long	1072545404
-	.long	2456521700
-	.long	3163256561
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	1912561781
-	.long	1072534877
-	.long	3147495102
-	.long	1015678253
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3898795731
-	.long	1072524406
-	.long	1249994144
-	.long	1011869818
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	3939148246
-	.long	1072513992
-	.long	3210352148
-	.long	1015274323
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	721996136
-	.long	1072503635
-	.long	563754734
-	.long	1015371318
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1532734324
-	.long	1072493333
-	.long	3094216535
-	.long	3163162857
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	778901109
-	.long	1072483087
-	.long	2248183955
-	.long	3161268751
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	1464976603
-	.long	1072472896
-	.long	3507292405
-	.long	3161977534
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	2307442995
-	.long	1072462760
-	.long	3190117721
-	.long	3162404539
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	2029714210
-	.long	1072452679
-	.long	613660079
-	.long	1015099143
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3657065772
-	.long	1072442652
-	.long	399025623
-	.long	3162957078
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1631695677
-	.long	1072432680
-	.long	2717633076
-	.long	3162344026
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	3287523847
-	.long	1072422761
-	.long	1625971539
-	.long	3157009955
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	3080351519
-	.long	1072412896
-	.long	3379126788
-	.long	3157218001
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4062661092
-	.long	1072403084
-	.long	1422616006
-	.long	3163255318
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	703710506
-	.long	1072393326
-	.long	1384660846
-	.long	1015195891
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	364333489
-	.long	1072383620
-	.long	3923737744
-	.long	3161421373
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	1822067026
-	.long	1072373966
-	.long	1241994956
-	.long	1015340290
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	3861050111
-	.long	1072364364
-	.long	254893773
-	.long	3162813180
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	977020788
-	.long	1072354815
-	.long	3065100517
-	.long	1015541563
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	557149882
-	.long	1072345317
-	.long	3672720709
-	.long	1014537265
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	1405169241
-	.long	1072335870
-	.long	2998539689
-	.long	3162830951
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2331271250
-	.long	1072326474
-	.long	812057446
-	.long	1012207446
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	2152073944
-	.long	1072317129
-	.long	1486860576
-	.long	3163203456
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	3985553595
-	.long	1072307834
-	.long	4002146062
-	.long	1015834136
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	2366108318
-	.long	1072298590
-	.long	2867985102
-	.long	3161762254
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	424392917
-	.long	1072289396
-	.long	2749202995
-	.long	3162838718
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1297350157
-	.long	1072280251
-	.long	1308022040
-	.long	3163412558
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	3833209506
-	.long	1072271155
-	.long	2722920684
-	.long	1013754842
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	2591453363
-	.long	1072262109
-	.long	2132396182
-	.long	3159074198
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	727685349
-	.long	1072253112
-	.long	2038246809
-	.long	3162358742
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	1403662306
-	.long	1072244163
-	.long	2788809599
-	.long	3161671007
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	3492293770
-	.long	1072235262
-	.long	2248032210
-	.long	1015386826
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	1577608921
-	.long	1072226410
-	.long	1875489510
-	.long	3162968394
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	3134592888
-	.long	1072217605
-	.long	4232266862
-	.long	1015991134
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	2759350287
-	.long	1072208848
-	.long	1148526634
-	.long	1015894933
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	3643909174
-	.long	1072200138
-	.long	3537586109
-	.long	1014354647
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	396319521
-	.long	1072191476
-	.long	4172420816
-	.long	3159074632
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	515457527
-	.long	1072182860
-	.long	836709333
-	.long	1015651226
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	2916157145
-	.long	1072174290
-	.long	219487565
-	.long	1015309367
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	2224145553
-	.long	1072165767
-	.long	3482522030
-	.long	3161489169
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	1660913392
-	.long	1072157290
-	.long	4218599604
-	.long	1015135707
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	158781403
-	.long	1072148859
-	.long	2221464712
-	.long	3163286453
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	950803702
-	.long	1072140473
-	.long	1655364926
-	.long	1015237032
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	2980802057
-	.long	1072132132
-	.long	378619896
-	.long	1015773303
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	903334909
-	.long	1072123837
-	.long	1636462108
-	.long	1015039997
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	2263535754
-	.long	1072115586
-	.long	752233586
-	.long	3162639008
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	1727278727
-	.long	1072107380
-	.long	3562710623
-	.long	1011471940
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	2555984613
-	.long	1072099218
-	.long	2652555442
-	.long	3162552692
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	3721688645
-	.long	1072091100
-	.long	3069276937
-	.long	1015839401
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	4201977662
-	.long	1072083026
-	.long	748330254
-	.long	1013594357
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	2979960120
-	.long	1072074996
-	.long	2599109725
-	.long	1014498493
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	3339203574
-	.long	1072067009
-	.long	1483497780
-	.long	3162408754
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	4273770423
-	.long	1072059065
-	.long	3383180809
-	.long	3163218901
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	488188413
-	.long	1072051165
-	.long	3199821029
-	.long	1015564048
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3872257780
-	.long	1072043306
-	.long	1253592103
-	.long	1015958334
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	551349105
-	.long	1072035491
-	.long	3821916050
-	.long	3162106589
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2425981843
-	.long	1072027717
-	.long	2830390851
-	.long	3163346599
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	4222122499
-	.long	1072019985
-	.long	1277378074
-	.long	3163256737
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	671025100
-	.long	1072012296
-	.long	3832014351
-	.long	3163022030
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	3689071823
-	.long	1072004647
-	.long	2321004996
-	.long	3162552716
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3723038930
-	.long	1071997040
-	.long	378465264
-	.long	3162569582
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	4109806887
-	.long	1071989474
-	.long	422403966
-	.long	1014469229
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	3896463087
-	.long	1071981949
-	.long	1139797873
-	.long	3161233805
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	2135241198
-	.long	1071974465
-	.long	1236747871
-	.long	1013589147
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2178460671
-	.long	1071967021
-	.long	777878098
-	.long	3162842493
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3088564500
-	.long	1071959617
-	.long	1762311517
-	.long	1015045673
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	3933059031
-	.long	1071952253
-	.long	2133366768
-	.long	3161531832
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3784486610
-	.long	1071944929
-	.long	1581883040
-	.long	3161698953
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	1720398391
-	.long	1071937645
-	.long	3980678963
-	.long	3163300080
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1118294578
-	.long	1071930400
-	.long	2197495694
-	.long	3159909401
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	1065662932
-	.long	1071923194
-	.long	2533670915
-	.long	1014530238
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	654919306
-	.long	1071916027
-	.long	3232961757
-	.long	3163047469
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	3278348324
-	.long	1071908898
-	.long	3069497416
-	.long	1014750712
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	3743175029
-	.long	1071901808
-	.long	2072812490
-	.long	3162175075
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	1156440435
-	.long	1071894757
-	.long	2351451249
-	.long	1013967056
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	3219942644
-	.long	1071887743
-	.long	3798990616
-	.long	1015368806
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	460407023
-	.long	1071880768
-	.long	4237175092
-	.long	3163138469
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	589198666
-	.long	1071873830
-	.long	2664346172
-	.long	3163157962
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	2732492859
-	.long	1071866929
-	.long	2691479646
-	.long	3162255684
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	1726216749
-	.long	1071860066
-	.long	2466808228
-	.long	3161676405
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	1000925746
-	.long	1071853240
-	.long	1018491672
-	.long	3163309544
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	3991843581
-	.long	1071846450
-	.long	4092853457
-	.long	1014585763
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	1253935211
-	.long	1071839698
-	.long	1395382931
-	.long	3159702613
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	526652809
-	.long	1071832982
-	.long	4223459736
-	.long	1015879375
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	964107055
-	.long	1071826302
-	.long	2800439588
-	.long	3162833221
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	1724976915
-	.long	1071819658
-	.long	420909223
-	.long	3163117379
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	1972484976
-	.long	1071813050
-	.long	675290301
-	.long	3161640050
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	874372905
-	.long	1071806478
-	.long	100263788
-	.long	1015940732
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1897844341
-	.long	1071799941
-	.long	1254300460
-	.long	1015275938
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	4219606026
-	.long	1071793439
-	.long	2434574742
-	.long	1014681548
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2725843665
-	.long	1071786973
-	.long	1433917087
-	.long	1014838523
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	897099801
-	.long	1071780542
-	.long	754756297
-	.long	1015241005
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	2218315341
-	.long	1071774145
-	.long	2694295388
-	.long	3163288868
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	1588871207
-	.long	1071767783
-	.long	143439582
-	.long	3162963416
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2502433899
-	.long	1071761455
-	.long	2148595913
-	.long	1015023991
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	4162030108
-	.long	1071755161
-	.long	2763428480
-	.long	1015529349
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	1480023343
-	.long	1071748902
-	.long	2247196168
-	.long	1015327453
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	2257959872
-	.long	1071742676
-	.long	3802946148
-	.long	1012964927
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	1416741826
-	.long	1071736484
-	.long	2196380210
-	.long	1011413563
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2471440686
-	.long	1071730325
-	.long	968836267
-	.long	3162214888
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	351405227
-	.long	1071724200
-	.long	3125337328
-	.long	3159822479
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	2875075254
-	.long	1071718107
-	.long	4144233330
-	.long	3163333716
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	685187902
-	.long	1071712048
-	.long	378731989
-	.long	1014843115
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	1608493509
-	.long	1071706021
-	.long	3159622171
-	.long	3162807737
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	590962156
-	.long	1071700027
-	.long	3829346666
-	.long	3163275597
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1172597893
-	.long	1071694065
-	.long	114433263
-	.long	1015347593
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	2602514713
-	.long	1071688135
-	.long	2268929336
-	.long	1014354284
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	4133881824
-	.long	1071682237
-	.long	2148155345
-	.long	3162931299
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	728934454
-	.long	1071676372
-	.long	1413842688
-	.long	1014178612
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	238821257
-	.long	1071670538
-	.long	1469694871
-	.long	3162884987
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	1928746161
-	.long	1071664735
-	.long	983617676
-	.long	1014285177
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	772914124
-	.long	1071658964
-	.long	4004372762
-	.long	1012230161
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	339411585
-	.long	1071653224
-	.long	264588982
-	.long	3161636657
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.long	4200250559
-	.long	1071647514
-	.long	2808127345
-	.long	3161781938
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.long	1610612736
-	.long	1082594631
-	.long	4166901572
-	.long	1055174155
-	.long	3884607281
-	.long	3168131199
-	.long	3607404735
-	.long	3190582024
-	.long	1874480759
-	.long	1032041131
-	.long	4286760334
-	.long	1053736893
-	.long	4277811695
-	.long	3211144770
-	.long	0
-	.long	0
-	.long	236289503
-	.long	1064135997
-	.long	463583772
-	.long	3215696314
-	.long	1441186365
-	.long	3212977891
-	.long	286331153
-	.long	1069617425
-	.long	2284589306
-	.long	1066820852
-	.long	1431655765
-	.long	3218429269
-	.long	0
-	.long	4294967280
-	.long	0
-	.long	4294967280
-	.long	4294705152
-	.long	4294967295
-	.long	4294705152
-	.long	4294967295
-	.long	4160749568
-	.long	2147483647
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	1073741824
-	.type	static_const_table,@object
-	.size	static_const_table,4280
-	.data
-	.section .note.GNU-stack, "",@progbits
-# End
diff --git a/libm/x86/sqrt.S b/libm/x86/sqrt.S
deleted file mode 100644
index c9d434d..0000000
--- a/libm/x86/sqrt.S
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrt)
-	mov		%esp,%eax
-	and		$0xfffffff8,%eax
-	movsd	0x4(%esp),%xmm0
-	sqrtsd	%xmm0,%xmm0
-	movlpd	%xmm0,-0x8(%eax)
-	fldl   -0x8(%eax)
-	ret
-END(sqrt)
-
-ALIAS_SYMBOL(sqrtl, sqrt);
diff --git a/libm/x86/sqrtf.S b/libm/x86/sqrtf.S
deleted file mode 100644
index 78c183b..0000000
--- a/libm/x86/sqrtf.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrtf)
-	movss  0x4(%esp),%xmm0
-	sqrtss %xmm0,%xmm0
-	movss  %xmm0,-0x4(%esp)
-	flds   -0x4(%esp)
-	ret
-END(sqrtf)
diff --git a/libm/x86/trunc.S b/libm/x86/trunc.S
deleted file mode 100644
index da9d5fb..0000000
--- a/libm/x86/trunc.S
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(trunc)
-	mov    %esp,%eax
-	and    $0xfffffff8,%eax
-	movsd  0x4(%esp),%xmm0
-	roundsd $0x3,%xmm0,%xmm0
-	movlpd %xmm0,-0x8(%eax)
-	fldl   -0x8(%eax)
-	ret
-END(trunc)
-
-ALIAS_SYMBOL(truncl, trunc);
diff --git a/libm/x86/truncf.S b/libm/x86/truncf.S
deleted file mode 100644
index d3e3f4a..0000000
--- a/libm/x86/truncf.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(truncf)
-	movss  0x4(%esp),%xmm0
-	roundss $0x3,%xmm0,%xmm0
-	movss  %xmm0,-0x4(%esp)
-	flds   -0x4(%esp)
-	ret
-END(truncf)
diff --git a/libm/x86_64/ceil.S b/libm/x86_64/ceil.S
deleted file mode 100644
index d4492c4..0000000
--- a/libm/x86_64/ceil.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(ceil)
-roundsd $0x2,%xmm0,%xmm0
-retq
-END(ceil)
diff --git a/libm/x86_64/ceilf.S b/libm/x86_64/ceilf.S
deleted file mode 100644
index 0e1ca95..0000000
--- a/libm/x86_64/ceilf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(ceilf)
-roundss $0x2,%xmm0,%xmm0
-retq
-END(ceilf)
diff --git a/libm/x86_64/e_acos.S b/libm/x86_64/e_acos.S
deleted file mode 100644
index 57c910e..0000000
--- a/libm/x86_64/e_acos.S
+++ /dev/null
@@ -1,1957 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  To compute acos(s), separate schemes are used when s is in different
-//  intervals.
-//
-//  |s| in [2^{-4}, sqrt(3)/2):
-//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
-//       acos(s)=pi/2-asin(t)-asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
-//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
-//       For the first degree term, r is evaluated as
-//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
-//       (sqrt(1-t^2) read from table)
-//  The main source of error is still R (may still be affected by up to 3 ulps
-//  of rounding error). The table size must be sufficiently large, to minimize
-//  this effect.
-//
-//  |s| in [sqrt(3)/2, 255/256):
-//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
-//       acos(|s|)=asin(t)-asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
-//   acos(-|s|)=pi-acos(|s|)
-//       (The -PI constant, or 0, is added to the result. The sign is set at
-//        the end)
-//       asin(r) evaluated as a polynomial (same as above)
-//       The first degree term is evaluated as
-//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
-//
-//  |s|<2^{-4}: acos(s)=pi/2-asin(s)
-//              evaluate asin(s) as 13-degree polynomial
-//
-//  |s| in [255/256,1): acos(|s|)=2*asin(q), where q=sqrt((1-|s|)/2)
-//  asin(q) is evaluated as 13-degree polynomial
-//      q^2=(1-|s|)/2 is obtained in advance
-//         2*q*eps ~ ((1-|s|)/2-q^2)/q used for first term
-//   acos(-|s|)=pi-acos(|s|)
-//       (The -PI constant, or 0, is added to the result. The sign is set at
-//        the end)
-//
-// Special cases:
-//  acos(NaN) = quiet NaN, and raise invalid exception
-//  acos(INF) = QNaN and raise invalid exception
-//  acos(x) = QNaN and raise invalid exception, for |x|>1.0
-//  acos(1) = +0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  acos
-ENTRY(acos)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_acos.1:
-        subq      $24, %rsp
-..___tag_value_acos.3:
-        movsd     %xmm0, (%rsp)
-..B1.2:
-        movsd     ABSVALMASK(%rip), %xmm4
-        movsd     ONEMASK(%rip), %xmm3
-        xorpd     %xmm5, %xmm5
-        movsd     TMASK(%rip), %xmm2
-        movq      %xmm0, %xmm1
-        psrlq     $44, %xmm0
-        movd      %xmm0, %edx
-        movq      %xmm1, %xmm7
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movq      %xmm1, %xmm0
-        movl      $524287, %eax
-        andl      %edx, %eax
-        subl      $260864, %eax
-        cmpl      $955, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-        mulsd     %xmm1, %xmm1
-        andl      $65535, %edx
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andpd     %xmm7, %xmm2
-        andl      $-4, %edx
-        subl      $64256, %edx
-        lea       T_table(%rip), %r8
-        movsd     (%r8,%rdx,2), %xmm1
-        orpd      %xmm5, %xmm2
-        lea       Tbl_addr(%rip), %r8
-        movapd    (%r8,%rdx,4), %xmm4
-        movq      %xmm7, %xmm6
-        addsd     %xmm2, %xmm7
-        subsd     %xmm2, %xmm0
-        mulsd     %xmm0, %xmm7
-        mulsd     %xmm1, %xmm6
-        mulsd     %xmm2, %xmm3
-        movq      %xmm6, %xmm1
-        addsd     %xmm3, %xmm6
-        divsd     %xmm6, %xmm7
-        movsd     24+cv(%rip), %xmm0
-        movsd     8+cv(%rip), %xmm5
-        subsd     %xmm3, %xmm1
-        psrlq     $63, %xmm2
-        movq      %xmm1, %xmm3
-        psllq     $63, %xmm2
-        mulsd     %xmm1, %xmm1
-        pshufd    $68, %xmm2, %xmm2
-        movsd     16+cv(%rip), %xmm6
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm4
-        mulsd     %xmm3, %xmm5
-        subpd     PI_BY_2(%rip), %xmm4
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm3, %xmm0
-        subsd     %xmm4, %xmm5
-        pshufd    $238, %xmm4, %xmm4
-        addsd     %xmm5, %xmm0
-        subsd     %xmm7, %xmm0
-        subsd     %xmm4, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        subl      $955, %eax
-        cmpl      $65, %eax
-        jae       .L_2TAG_PACKET_1.0.2
-        psrlq     $38, %xmm7
-        psllq     $38, %xmm7
-        pmovmskb  %xmm0, %eax
-        andnpd    %xmm0, %xmm4
-        subsd     %xmm7, %xmm1
-        movq      %xmm7, %xmm6
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm6, %xmm0
-        orpd      %xmm4, %xmm5
-        subsd     %xmm7, %xmm3
-        mulsd     %xmm1, %xmm0
-        movq      %xmm3, %xmm4
-        subsd     %xmm0, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andl      $128, %eax
-        shrl      $7, %eax
-        negl      %eax
-        movq      %xmm3, %xmm7
-        andpd     %xmm3, %xmm2
-        psllq     $2, %xmm3
-        pextrw    $3, %xmm3, %edx
-        orpd      %xmm5, %xmm2
-        movd      %eax, %xmm3
-        pshufd    $0, %xmm3, %xmm3
-        subl      $65216, %edx
-        addl      %edx, %edx
-        lea       T_table(%rip), %r8
-        mulsd     (%r8,%rdx,4), %xmm7
-        mulsd     %xmm2, %xmm6
-        mulsd     %xmm2, %xmm1
-        mulsd     %xmm2, %xmm2
-        subsd     %xmm7, %xmm6
-        andpd     NEG_PI(%rip), %xmm3
-        addsd     %xmm1, %xmm6
-        subsd     %xmm2, %xmm4
-        addsd     %xmm7, %xmm7
-        movsd     8+cv(%rip), %xmm5
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm7
-        movsd     24+cv(%rip), %xmm0
-        divsd     %xmm7, %xmm4
-        movsd     16+cv(%rip), %xmm2
-        lea       Tbl_addr(%rip), %r8
-        addpd     (%r8,%rdx,8), %xmm3
-        movq      %xmm6, %xmm1
-        mulsd     %xmm6, %xmm6
-        mulsd     %xmm6, %xmm0
-        mulsd     %xmm6, %xmm1
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm6, %xmm1
-        addsd     %xmm2, %xmm0
-        pxor      %xmm6, %xmm6
-        mulsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm5
-        addsd     %xmm5, %xmm0
-        andl      $32768, %eax
-        pinsrw    $3, %eax, %xmm6
-        movq      %xmm4, %xmm5
-        pshufd    $238, %xmm3, %xmm3
-        addsd     %xmm3, %xmm4
-        subsd     %xmm4, %xmm3
-        addsd     %xmm3, %xmm5
-        addsd     %xmm5, %xmm0
-        addsd     %xmm4, %xmm0
-        xorpd     %xmm6, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_1.0.2:
-        addl      $15291, %eax
-        cmpl      $14336, %eax
-        jae       .L_2TAG_PACKET_2.0.2
-        unpcklpd  %xmm0, %xmm0
-        movapd    cv2(%rip), %xmm6
-        unpcklpd  %xmm0, %xmm1
-        movapd    16+cv2(%rip), %xmm2
-        movapd    32+cv2(%rip), %xmm4
-        mulpd     %xmm0, %xmm0
-        movapd    PI_BY_2(%rip), %xmm5
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm6
-        mulpd     %xmm0, %xmm0
-        movq      %xmm1, %xmm3
-        mulsd     %xmm1, %xmm1
-        addpd     %xmm2, %xmm6
-        mulpd     %xmm0, %xmm4
-        mulsd     %xmm3, %xmm1
-        addpd     %xmm4, %xmm6
-        pshufd    $238, %xmm5, %xmm0
-        mulpd     %xmm6, %xmm1
-        pshufd    $238, %xmm5, %xmm6
-        subsd     %xmm7, %xmm0
-        pshufd    $238, %xmm1, %xmm2
-        subsd     %xmm1, %xmm5
-        subsd     %xmm0, %xmm6
-        subsd     %xmm2, %xmm5
-        subsd     %xmm6, %xmm7
-        subsd     %xmm7, %xmm5
-        addsd     %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_2.0.2:
-        subl      $15356, %eax
-        cmpl      $4, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        xorpd     %xmm6, %xmm6
-        andpd     ABSVALMASK(%rip), %xmm7
-        movsd     ONE_BY_2(%rip), %xmm4
-        movapd    cv2(%rip), %xmm1
-        mulsd     %xmm4, %xmm7
-        movapd    16+cv2(%rip), %xmm2
-        subsd     %xmm7, %xmm4
-        movapd    32+cv2(%rip), %xmm3
-        pshufd    $68, %xmm4, %xmm7
-        sqrtsd    %xmm4, %xmm4
-        mulpd     %xmm7, %xmm1
-        pshufd    $68, %xmm7, %xmm5
-        pextrw    $3, %xmm0, %eax
-        mulpd     %xmm7, %xmm7
-        addpd     %xmm1, %xmm2
-        movsd     HALFMASK(%rip), %xmm1
-        mulpd     %xmm7, %xmm3
-        cmpsd     $1, %xmm6, %xmm0
-        mulsd     %xmm5, %xmm7
-        addpd     %xmm3, %xmm2
-        pshufd    $68, %xmm0, %xmm0
-        mulsd     %xmm7, %xmm2
-        andpd     NEG_PI(%rip), %xmm0
-        mulpd     %xmm5, %xmm2
-        andpd     %xmm4, %xmm1
-        pshufd    $68, %xmm4, %xmm3
-        subsd     %xmm1, %xmm4
-        addsd     %xmm3, %xmm3
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm4, %xmm3
-        subsd     %xmm1, %xmm5
-        mulsd     %xmm3, %xmm4
-        pshufd    $238, %xmm3, %xmm3
-        subsd     %xmm4, %xmm5
-        divsd     %xmm3, %xmm5
-        addpd     %xmm3, %xmm3
-        mulpd     %xmm3, %xmm2
-        pshufd    $238, %xmm2, %xmm4
-        addsd     %xmm0, %xmm2
-        andl      $32768, %eax
-        pinsrw    $3, %eax, %xmm6
-        pshufd    $238, %xmm0, %xmm0
-        addsd     %xmm4, %xmm2
-        addsd     %xmm5, %xmm2
-        addsd     %xmm3, %xmm2
-        addsd     %xmm2, %xmm0
-        xorpd     %xmm6, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_3.0.2:
-        addl      $261884, %eax
-        cmpl      $261888, %eax
-        jb        .L_2TAG_PACKET_4.0.2
-        movd      %xmm7, %ecx
-        psrlq     $32, %xmm7
-        movd      %xmm7, %edx
-        andl      $2147483647, %edx
-        movl      $1072693248, %eax
-        subl      %edx, %eax
-        orl       %ecx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_5.0.2
-        movsd     (%rsp), %xmm2
-        movd      %xmm2, %edx
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $2147483647, %ecx
-        subl      $1, %edx
-        sbbl      $2146435072, %ecx
-        cmpl      $0, %ecx
-        jge       .L_2TAG_PACKET_6.0.2
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %edx
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_5.0.2:
-        pextrw    $1, %xmm7, %edx
-        shrl      $15, %edx
-        negl      %edx
-        movd      %edx, %xmm7
-        pshufd    $0, %xmm7, %xmm7
-        movsd     PI(%rip), %xmm2
-        movsd     8+PI(%rip), %xmm0
-        andpd     %xmm7, %xmm2
-        andpd     %xmm7, %xmm0
-        addsd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        movsd     PI_BY_2(%rip), %xmm2
-        movsd     8+PI_BY_2(%rip), %xmm0
-        addsd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm6, %xmm6
-        addsd     %xmm6, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_7.0.2:
-        movq      %xmm0, 8(%rsp)
-..B1.3:
-        movq      8(%rsp), %xmm0
-.L_2TAG_PACKET_8.0.2:
-..B1.5:
-        addq      $24, %rsp
-..___tag_value_acos.4:
-        ret       
-..___tag_value_acos.5:
-END(acos)
-# -- End  acos
-	.section .rodata, "a"
-	.align 16
-	.align 16
-ABSVALMASK:
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	0
-	.type	ABSVALMASK,@object
-	.size	ABSVALMASK,16
-	.align 16
-T_table:
-	.long	2642784509
-	.long	1072689083
-	.long	1514442531
-	.long	1072688953
-	.long	333108933
-	.long	1072688821
-	.long	3392112024
-	.long	1072688686
-	.long	2099852862
-	.long	1072688550
-	.long	749609004
-	.long	1072688412
-	.long	3634632596
-	.long	1072688271
-	.long	2163248461
-	.long	1072688129
-	.long	628657846
-	.long	1072687985
-	.long	3324036511
-	.long	1072687838
-	.long	1657632815
-	.long	1072687690
-	.long	4217538760
-	.long	1072687539
-	.long	2411951597
-	.long	1072687387
-	.long	533944872
-	.long	1072687233
-	.long	2876566508
-	.long	1072687076
-	.long	847936891
-	.long	1072686918
-	.long	3036019913
-	.long	1072686757
-	.long	848884575
-	.long	1072686595
-	.long	2874443326
-	.long	1072686430
-	.long	520713666
-	.long	1072686264
-	.long	2375556481
-	.long	1072686095
-	.long	4141904948
-	.long	1072685924
-	.long	1522666382
-	.long	1072685752
-	.long	3105624104
-	.long	1072685577
-	.long	298666327
-	.long	1072685401
-	.long	1689524500
-	.long	1072685222
-	.long	2981002200
-	.long	1072685041
-	.long	4170844284
-	.long	1072684858
-	.long	961802263
-	.long	1072684674
-	.long	1941503454
-	.long	1072684487
-	.long	2812647170
-	.long	1072684298
-	.long	3572873869
-	.long	1072684107
-	.long	4219797823
-	.long	1072683914
-	.long	456039788
-	.long	1072683720
-	.long	869096151
-	.long	1072683523
-	.long	1161535119
-	.long	1072683324
-	.long	1330865866
-	.long	1072683123
-	.long	1374571204
-	.long	1072682920
-	.long	1290107538
-	.long	1072682715
-	.long	1074904836
-	.long	1072682508
-	.long	726366587
-	.long	1072682299
-	.long	241869763
-	.long	1072682088
-	.long	3913732079
-	.long	1072681874
-	.long	3149342765
-	.long	1072681659
-	.long	2240966306
-	.long	1072681442
-	.long	1185873216
-	.long	1072681223
-	.long	4276274591
-	.long	1072681001
-	.long	2919452883
-	.long	1072680778
-	.long	1407565635
-	.long	1072680553
-	.long	4032743551
-	.long	1072680325
-	.long	2202188565
-	.long	1072680096
-	.long	207977577
-	.long	1072679865
-	.long	2342160518
-	.long	1072679631
-	.long	11858423
-	.long	1072679396
-	.long	1804034453
-	.long	1072679158
-	.long	3420722787
-	.long	1072678918
-	.long	563930456
-	.long	1072678677
-	.long	1820539192
-	.long	1072678433
-	.long	2892501606
-	.long	1072678187
-	.long	3776710320
-	.long	1072677939
-	.long	175063337
-	.long	1072677690
-	.long	674333171
-	.long	1072677438
-	.long	976363026
-	.long	1072677184
-	.long	1077935934
-	.long	1072676928
-	.long	1921075490
-	.long	1072676540
-	.long	881493302
-	.long	1072676016
-	.long	3275752439
-	.long	1072675483
-	.long	486855588
-	.long	1072674943
-	.long	1077229111
-	.long	1072674394
-	.long	723950308
-	.long	1072673837
-	.long	3693582199
-	.long	1072673271
-	.long	1367335316
-	.long	1072672698
-	.long	2305837020
-	.long	1072672116
-	.long	2184358641
-	.long	1072671526
-	.long	972682840
-	.long	1072670928
-	.long	2935101762
-	.long	1072670321
-	.long	3745513263
-	.long	1072669706
-	.long	3372320886
-	.long	1072669083
-	.long	1783464620
-	.long	1072668452
-	.long	3241386215
-	.long	1072667812
-	.long	3418125284
-	.long	1072667164
-	.long	2280219148
-	.long	1072666508
-	.long	4088700758
-	.long	1072665843
-	.long	219227400
-	.long	1072665171
-	.long	3521816918
-	.long	1072664489
-	.long	1076205279
-	.long	1072663800
-	.long	1436484616
-	.long	1072663102
-	.long	271362610
-	.long	1072662396
-	.long	1838996688
-	.long	1072661681
-	.long	1807122518
-	.long	1072660958
-	.long	137953542
-	.long	1072660227
-	.long	1088178584
-	.long	1072659487
-	.long	324057537
-	.long	1072658739
-	.long	2101288076
-	.long	1072657982
-	.long	2085133974
-	.long	1072657217
-	.long	235324451
-	.long	1072656444
-	.long	806051592
-	.long	1072655662
-	.long	3756033140
-	.long	1072654871
-	.long	453542543
-	.long	1072654073
-	.long	3741177327
-	.long	1072653265
-	.long	691216109
-	.long	1072652450
-	.long	4145223372
-	.long	1072651625
-	.long	1174439091
-	.long	1072650793
-	.long	324416139
-	.long	1072649952
-	.long	1550246310
-	.long	1072649102
-	.long	511524674
-	.long	1072648244
-	.long	1457248482
-	.long	1072647377
-	.long	45944955
-	.long	1072646502
-	.long	525537397
-	.long	1072645618
-	.long	2848440188
-	.long	1072644725
-	.long	2671555633
-	.long	1072643824
-	.long	4241172637
-	.long	1072642914
-	.long	3213094278
-	.long	1072641996
-	.long	3832503688
-	.long	1072641069
-	.long	1754091534
-	.long	1072640134
-	.long	1221921804
-	.long	1072639190
-	.long	2184526489
-	.long	1072638237
-	.long	294902089
-	.long	1072637276
-	.long	4090375270
-	.long	1072636305
-	.long	632860906
-	.long	1072635327
-	.long	2753498702
-	.long	1072634339
-	.long	1808009252
-	.long	1072633343
-	.long	2036428672
-	.long	1072632338
-	.long	3383235626
-	.long	1072631324
-	.long	1497347484
-	.long	1072630302
-	.long	617018317
-	.long	1072629271
-	.long	684933058
-	.long	1072628231
-	.long	1643170798
-	.long	1072627182
-	.long	3011066360
-	.long	1072625592
-	.long	957158713
-	.long	1072623442
-	.long	1390907941
-	.long	1072621256
-	.long	3819155270
-	.long	1072619034
-	.long	3443571196
-	.long	1072616777
-	.long	4045412458
-	.long	1072614484
-	.long	805503923
-	.long	1072612156
-	.long	1778922015
-	.long	1072609791
-	.long	2125033665
-	.long	1072607390
-	.long	1287203863
-	.long	1072604953
-	.long	2992629568
-	.long	1072602479
-	.long	2367267127
-	.long	1072599969
-	.long	3115526047
-	.long	1072597422
-	.long	340219539
-	.long	1072594839
-	.long	2017215719
-	.long	1072592218
-	.long	3225443424
-	.long	1072589560
-	.long	3326565673
-	.long	1072586865
-	.long	1669811211
-	.long	1072584133
-	.long	1886735022
-	.long	1072581363
-	.long	3301071171
-	.long	1072578555
-	.long	928514283
-	.long	1072575710
-	.long	2656364059
-	.long	1072572826
-	.long	3473490507
-	.long	1072569904
-	.long	2649965606
-	.long	1072566944
-	.long	3736819052
-	.long	1072563945
-	.long	1680885175
-	.long	1072560908
-	.long	4413771
-	.long	1072557832
-	.long	2214869753
-	.long	1072554716
-	.long	3214725184
-	.long	1072551561
-	.long	2186079903
-	.long	1072548367
-	.long	2590372131
-	.long	1072545133
-	.long	3578146079
-	.long	1072541859
-	.long	4283712755
-	.long	1072538545
-	.long	3824834510
-	.long	1072535191
-	.long	1302400298
-	.long	1072531797
-	.long	95058636
-	.long	1072528362
-	.long	3563906063
-	.long	1072524885
-	.long	2167230730
-	.long	1072521368
-	.long	3524918334
-	.long	1072517809
-	.long	2353304918
-	.long	1072514209
-	.long	1939625839
-	.long	1072510567
-	.long	1256714581
-	.long	1072506883
-	.long	3552525848
-	.long	1072503156
-	.long	3464809522
-	.long	1072499387
-	.long	4200542593
-	.long	1072495575
-	.long	355609124
-	.long	1072491721
-	.long	3684139099
-	.long	1072487822
-	.long	148355918
-	.long	1072483881
-	.long	1457689242
-	.long	1072479895
-	.long	2118591596
-	.long	1072475865
-	.long	908848089
-	.long	1072471791
-	.long	877032689
-	.long	1072467672
-	.long	752012304
-	.long	1072463508
-	.long	3532301749
-	.long	1072459298
-	.long	3600563221
-	.long	1072455043
-	.long	3902857084
-	.long	1072450742
-	.long	3063101036
-	.long	1072446395
-	.long	3972344374
-	.long	1072442001
-	.long	903183549
-	.long	1072437561
-	.long	983892938
-	.long	1072433073
-	.long	2722858568
-	.long	1072428537
-	.long	302790515
-	.long	1072423954
-	.long	759811057
-	.long	1072419322
-	.long	2507809922
-	.long	1072414641
-	.long	2388408813
-	.long	1072407528
-	.long	2084492942
-	.long	1072397870
-	.long	2435703301
-	.long	1072388010
-	.long	1935433360
-	.long	1072377945
-	.long	2742047290
-	.long	1072367671
-	.long	2053284205
-	.long	1072357185
-	.long	657783367
-	.long	1072346483
-	.long	2893664841
-	.long	1072335560
-	.long	3718906405
-	.long	1072324413
-	.long	1547896303
-	.long	1072313038
-	.long	2494058440
-	.long	1072301429
-	.long	3133238742
-	.long	1072289582
-	.long	3327000086
-	.long	1072277492
-	.long	1860667274
-	.long	1072265154
-	.long	665340747
-	.long	1072252562
-	.long	443347841
-	.long	1072239710
-	.long	581282618
-	.long	1072226592
-	.long	3349780465
-	.long	1072213201
-	.long	914217606
-	.long	1072199532
-	.long	989797661
-	.long	1072185576
-	.long	945436416
-	.long	1072171326
-	.long	549291300
-	.long	1072156774
-	.long	1814636389
-	.long	1072141911
-	.long	239092858
-	.long	1072126729
-	.long	1794680724
-	.long	1072111217
-	.long	1241534678
-	.long	1072095366
-	.long	3366566214
-	.long	1072079164
-	.long	1244090828
-	.long	1072062601
-	.long	1708448120
-	.long	1072045663
-	.long	3544260650
-	.long	1072028337
-	.long	1402741403
-	.long	1072010610
-	.long	2551936888
-	.long	1071992465
-	.long	617669739
-	.long	1071973887
-	.long	794002186
-	.long	1071954857
-	.long	2021237693
-	.long	1071935356
-	.long	540450384
-	.long	1071915364
-	.long	1920555537
-	.long	1071894857
-	.long	2879585206
-	.long	1071873811
-	.long	3000237455
-	.long	1071852199
-	.long	3352974346
-	.long	1071829991
-	.long	569629937
-	.long	1071807155
-	.long	2077237208
-	.long	1071783653
-	.long	2284891805
-	.long	1071759446
-	.long	1226651784
-	.long	1071734489
-	.long	1102047405
-	.long	1071708731
-	.long	2009896384
-	.long	1071682115
-	.long	927419082
-	.long	1071654577
-	.long	85010366
-	.long	1071607413
-	.long	696431025
-	.long	1071548180
-	.long	2611410541
-	.long	1071486585
-	.long	2612593658
-	.long	1071422396
-	.long	3548155306
-	.long	1071355336
-	.long	3887997484
-	.long	1071285073
-	.long	244854763
-	.long	1071211202
-	.long	4214445648
-	.long	1071133216
-	.long	2303966727
-	.long	1071050478
-	.long	3991040013
-	.long	1070962152
-	.long	3126952278
-	.long	1070867118
-	.long	1817448378
-	.long	1070763804
-	.long	1793814864
-	.long	1070649884
-	.long	3507224072
-	.long	1070447193
-	.long	4027609105
-	.long	1070148772
-	.long	577507993
-	.long	1069779414
-	.long	2310232419
-	.long	1068931829
-	.type	T_table,@object
-	.size	T_table,2048
-	.align 16
-Tbl_addr:
-	.long	3822952792
-	.long	1021639372
-	.long	182792448
-	.long	1068507836
-	.long	2264213271
-	.long	1019558908
-	.long	649052928
-	.long	1068524253
-	.long	1797139609
-	.long	1022295143
-	.long	1243095296
-	.long	1068540671
-	.long	1415938756
-	.long	1021439537
-	.long	2033294592
-	.long	1068557090
-	.long	2356809978
-	.long	1021777916
-	.long	3088063744
-	.long	1068573510
-	.long	2669055318
-	.long	1022124482
-	.long	180888576
-	.long	1068589932
-	.long	3566445325
-	.long	1021358712
-	.long	1970196992
-	.long	1068606354
-	.long	896980323
-	.long	1021319659
-	.long	4229555456
-	.long	1068622777
-	.long	436049712
-	.long	1021319758
-	.long	2732572160
-	.long	1068639202
-	.long	583123209
-	.long	1020797960
-	.long	1842831872
-	.long	1068655628
-	.long	1370449804
-	.long	1021429270
-	.long	1628994560
-	.long	1068672055
-	.long	2411391464
-	.long	1021057980
-	.long	2159763712
-	.long	1068688483
-	.long	1208692749
-	.long	1021943903
-	.long	3503886336
-	.long	1068704912
-	.long	538793309
-	.long	1019744063
-	.long	1435187200
-	.long	1068721343
-	.long	4085087612
-	.long	1020608419
-	.long	317469952
-	.long	1068737775
-	.long	144386942
-	.long	1021440732
-	.long	219617280
-	.long	1068754208
-	.long	2940088361
-	.long	1019981122
-	.long	1210558208
-	.long	1068770642
-	.long	2176850347
-	.long	1018373705
-	.long	3359268352
-	.long	1068787077
-	.long	2395611454
-	.long	1021889042
-	.long	2439803648
-	.long	1068803514
-	.long	1650705253
-	.long	1020227966
-	.long	2816203520
-	.long	1068819952
-	.long	3702166386
-	.long	1019379914
-	.long	262620672
-	.long	1068836392
-	.long	1855649370
-	.long	1020453124
-	.long	3438159616
-	.long	1068852832
-	.long	923063860
-	.long	1019273834
-	.long	3822105856
-	.long	1068869274
-	.long	4289947947
-	.long	1019434249
-	.long	1483729920
-	.long	1068885718
-	.long	787455814
-	.long	1020738379
-	.long	787321088
-	.long	1068902163
-	.long	3321653337
-	.long	1021842569
-	.long	1802253312
-	.long	1068918609
-	.long	2653633526
-	.long	1021821525
-	.long	302985984
-	.long	1068935057
-	.long	161272028
-	.long	1021655149
-	.long	653966080
-	.long	1068951506
-	.long	2566098667
-	.long	1020066219
-	.long	2924727296
-	.long	1068967956
-	.long	3646493722
-	.long	1014292285
-	.long	2889890304
-	.long	1068984408
-	.long	1081009196
-	.long	1022189620
-	.long	619098112
-	.long	1069000862
-	.long	4011643355
-	.long	1021773297
-	.long	477017600
-	.long	1069017317
-	.long	4030305534
-	.long	1021292252
-	.long	2533403904
-	.long	1069033773
-	.long	2645187591
-	.long	1019527099
-	.long	2563102208
-	.long	1069050231
-	.long	3857293792
-	.long	1022311697
-	.long	635982336
-	.long	1069066691
-	.long	3625936637
-	.long	1017511744
-	.long	1116940800
-	.long	1069083152
-	.long	3653872993
-	.long	1022016631
-	.long	4075964160
-	.long	1069099614
-	.long	2468900271
-	.long	1021769532
-	.long	993165568
-	.long	1069116079
-	.long	1358104224
-	.long	1021199776
-	.long	528586752
-	.long	1069132545
-	.long	2200950332
-	.long	1022024872
-	.long	2752395776
-	.long	1069149012
-	.long	3197072454
-	.long	1017751319
-	.long	3439855616
-	.long	1069165481
-	.long	1651081806
-	.long	1020809338
-	.long	2661257728
-	.long	1069181952
-	.long	539032752
-	.long	1021728805
-	.long	486957312
-	.long	1069198425
-	.long	3136045149
-	.long	1016888671
-	.long	1282340352
-	.long	1069214899
-	.long	2593963259
-	.long	1018956103
-	.long	822921728
-	.long	1069231375
-	.long	2146032737
-	.long	1022306465
-	.long	3474216192
-	.long	1069247852
-	.long	3976811625
-	.long	1021350207
-	.long	716902656
-	.long	1069264332
-	.long	718267222
-	.long	1018624727
-	.long	1211594496
-	.long	1069280813
-	.long	1485641389
-	.long	1018447451
-	.long	734070272
-	.long	1069297296
-	.long	354455128
-	.long	1021341291
-	.long	3650110720
-	.long	1069313780
-	.long	682185947
-	.long	1021651853
-	.long	1440663040
-	.long	1069330267
-	.long	3558574550
-	.long	1021615110
-	.long	2766612224
-	.long	1069346755
-	.long	874607978
-	.long	1017746872
-	.long	3404011008
-	.long	1069363245
-	.long	4154988502
-	.long	1021439906
-	.long	3423949056
-	.long	1069379737
-	.long	2263202309
-	.long	1021479615
-	.long	2897587712
-	.long	1069396231
-	.long	2562065031
-	.long	1022090363
-	.long	1896159232
-	.long	1069412727
-	.long	3836237663
-	.long	1019867288
-	.long	490968576
-	.long	1069429225
-	.long	3322056743
-	.long	1006752762
-	.long	3048360192
-	.long	1069445724
-	.long	1152314833
-	.long	1013122252
-	.long	1049850624
-	.long	1069462226
-	.long	3601590727
-	.long	1022214610
-	.long	3156899584
-	.long	1069478729
-	.long	1855169970
-	.long	1019487271
-	.long	851173376
-	.long	1069495235
-	.long	312649594
-	.long	1020868604
-	.long	2794281728
-	.long	1069511742
-	.long	1093490181
-	.long	1020777577
-	.long	468042496
-	.long	1069528252
-	.long	1152540679
-	.long	1021403732
-	.long	2534219264
-	.long	1069544763
-	.long	2292126035
-	.long	1021872430
-	.long	1376146432
-	.long	1069558527
-	.long	3293753641
-	.long	1020500454
-	.long	4175442432
-	.long	1069575044
-	.long	3626347564
-	.long	1021610969
-	.long	3523113472
-	.long	1069591566
-	.long	339956500
-	.long	1021119039
-	.long	4003350528
-	.long	1069608092
-	.long	3429333082
-	.long	1022813542
-	.long	1611067392
-	.long	1069624623
-	.long	2298017544
-	.long	1021977587
-	.long	931782144
-	.long	1069641158
-	.long	2164684743
-	.long	1021250988
-	.long	2256725504
-	.long	1069657697
-	.long	1138762335
-	.long	1021443776
-	.long	1582853120
-	.long	1069674241
-	.long	1084010382
-	.long	1022994693
-	.long	3497758720
-	.long	1069690789
-	.long	406366244
-	.long	1022713586
-	.long	3999816960
-	.long	1069707342
-	.long	1488723042
-	.long	1023381290
-	.long	3383096064
-	.long	1069723900
-	.long	2541558953
-	.long	1019137887
-	.long	1942403584
-	.long	1069740463
-	.long	1879620343
-	.long	1022653642
-	.long	4268263680
-	.long	1069757030
-	.long	3039077047
-	.long	1022252545
-	.long	2067062272
-	.long	1069773603
-	.long	4190670677
-	.long	1020725863
-	.long	4225828096
-	.long	1069790180
-	.long	1998567321
-	.long	1022014385
-	.long	2452507136
-	.long	1069806763
-	.long	1511628873
-	.long	1021900300
-	.long	1340746240
-	.long	1069823351
-	.long	788367341
-	.long	1022726208
-	.long	1190035456
-	.long	1069839944
-	.long	3856337230
-	.long	1021834118
-	.long	2300688384
-	.long	1069856542
-	.long	3211396579
-	.long	1022621365
-	.long	678886400
-	.long	1069873146
-	.long	4001011887
-	.long	1022042646
-	.long	921594112
-	.long	1069889755
-	.long	557811968
-	.long	1023065533
-	.long	3331668992
-	.long	1069906369
-	.long	1877060679
-	.long	1022419742
-	.long	3917875200
-	.long	1069922989
-	.long	1181055171
-	.long	1022752712
-	.long	2984829696
-	.long	1069939615
-	.long	4294526932
-	.long	1021499988
-	.long	838049024
-	.long	1069956247
-	.long	3658081878
-	.long	1022957952
-	.long	2078928384
-	.long	1069972884
-	.long	820353701
-	.long	1019391107
-	.long	2719854336
-	.long	1069989527
-	.long	1644022489
-	.long	1023378240
-	.long	3069117696
-	.long	1070006176
-	.long	2771393702
-	.long	1019319954
-	.long	3435962368
-	.long	1070022831
-	.long	3876394145
-	.long	1023024433
-	.long	4130595328
-	.long	1070039492
-	.long	1630447748
-	.long	1021465882
-	.long	1169236224
-	.long	1070056160
-	.long	2828355997
-	.long	1020458120
-	.long	3453997312
-	.long	1070072833
-	.long	164091641
-	.long	1020388279
-	.long	2708127744
-	.long	1070089513
-	.long	3036550223
-	.long	1023328684
-	.long	3540797696
-	.long	1070106199
-	.long	3710949463
-	.long	1022568805
-	.long	1972276736
-	.long	1070122892
-	.long	3885277950
-	.long	1019761674
-	.long	2613815552
-	.long	1070139591
-	.long	2764165077
-	.long	1022921023
-	.long	1487791616
-	.long	1070156297
-	.long	1330644769
-	.long	1023162679
-	.long	3207593472
-	.long	1070173009
-	.long	3911007221
-	.long	1022993496
-	.long	3797764608
-	.long	1070189728
-	.long	979712598
-	.long	1022554580
-	.long	3578920448
-	.long	1070206454
-	.long	2825738223
-	.long	1020223708
-	.long	2872795648
-	.long	1070223187
-	.long	392451124
-	.long	1022666279
-	.long	2002258432
-	.long	1070239927
-	.long	3730407632
-	.long	1023148291
-	.long	1291326464
-	.long	1070256674
-	.long	3723802980
-	.long	1022514089
-	.long	1065180928
-	.long	1070273428
-	.long	2635617463
-	.long	1022654470
-	.long	1650181632
-	.long	1070290189
-	.long	2061982883
-	.long	1022853411
-	.long	3373882880
-	.long	1070306957
-	.long	319732785
-	.long	1022017175
-	.long	2270081280
-	.long	1070323733
-	.long	2237757411
-	.long	1023064087
-	.long	2963732736
-	.long	1070340516
-	.long	468839165
-	.long	1023293774
-	.long	1491099904
-	.long	1070357307
-	.long	1502657946
-	.long	1021533479
-	.long	2479636480
-	.long	1070374105
-	.long	482913562
-	.long	1021986286
-	.long	1968133632
-	.long	1070390911
-	.long	3281474337
-	.long	1022646400
-	.long	291639040
-	.long	1070407725
-	.long	2453320259
-	.long	1022812423
-	.long	2081472512
-	.long	1070424546
-	.long	2939989570
-	.long	1023091888
-	.long	3380340480
-	.long	1070441375
-	.long	2850707499
-	.long	1021921109
-	.long	232287488
-	.long	1070458213
-	.long	3674625342
-	.long	1020725130
-	.long	1567614208
-	.long	1070475058
-	.long	9347334
-	.long	1022024009
-	.long	3433091072
-	.long	1070491911
-	.long	282524999
-	.long	1021433523
-	.long	1876877312
-	.long	1070508773
-	.long	3470449440
-	.long	1019309721
-	.long	1538472192
-	.long	1070525643
-	.long	2089486825
-	.long	1019698916
-	.long	2763830784
-	.long	1070542521
-	.long	443498115
-	.long	1020505194
-	.long	1605381632
-	.long	1070559408
-	.long	3018871601
-	.long	1022869913
-	.long	2706946048
-	.long	1070576303
-	.long	3936260892
-	.long	1023175875
-	.long	2123887360
-	.long	1070593207
-	.long	2994220655
-	.long	1022825948
-	.long	104015104
-	.long	1070603108
-	.long	335054493
-	.long	1023441853
-	.long	2904568832
-	.long	1070615800
-	.long	1451215633
-	.long	1023853857
-	.long	3456197120
-	.long	1070632739
-	.long	436334733
-	.long	1024026432
-	.long	252452352
-	.long	1070649697
-	.long	34596167
-	.long	1024031396
-	.long	3328018432
-	.long	1070666672
-	.long	2644547073
-	.long	1024296758
-	.long	1255829248
-	.long	1070683667
-	.long	552832586
-	.long	1023763122
-	.long	4097058560
-	.long	1070700680
-	.long	1955640623
-	.long	1021394654
-	.long	451770112
-	.long	1070717714
-	.long	3428903777
-	.long	1022941142
-	.long	408920832
-	.long	1070734767
-	.long	165503263
-	.long	1023894958
-	.long	1186960640
-	.long	1070751840
-	.long	435826450
-	.long	1024026134
-	.long	19078656
-	.long	1070768934
-	.long	1834169749
-	.long	1022899284
-	.long	2743490304
-	.long	1070786048
-	.long	494581074
-	.long	1018818479
-	.long	2328961024
-	.long	1070803184
-	.long	2987908834
-	.long	1022581110
-	.long	350011392
-	.long	1070820342
-	.long	240771184
-	.long	1024143083
-	.long	2692326912
-	.long	1070837521
-	.long	666056837
-	.long	1022394776
-	.long	2373274368
-	.long	1070854723
-	.long	2484337770
-	.long	1024228156
-	.long	1017131520
-	.long	1070871948
-	.long	3285648279
-	.long	1024025789
-	.long	265558272
-	.long	1070889196
-	.long	392241896
-	.long	1024252809
-	.long	1778008064
-	.long	1070906467
-	.long	1536107943
-	.long	1023949300
-	.long	2937184768
-	.long	1070923762
-	.long	3541062251
-	.long	1019448646
-	.long	1144442880
-	.long	1070941082
-	.long	3691683781
-	.long	1022123948
-	.long	2410165504
-	.long	1070958426
-	.long	1804181960
-	.long	1023945221
-	.long	4174350848
-	.long	1070975795
-	.long	2016094861
-	.long	1021716585
-	.long	3897012480
-	.long	1070993190
-	.long	175294410
-	.long	1023703404
-	.long	3353623040
-	.long	1071010611
-	.long	167973242
-	.long	1023240839
-	.long	45671168
-	.long	1071028059
-	.long	2166856113
-	.long	1021565413
-	.long	86063872
-	.long	1071045533
-	.long	2676254727
-	.long	1023985299
-	.long	1019772672
-	.long	1071063034
-	.long	989043593
-	.long	1021549587
-	.long	414297344
-	.long	1071080563
-	.long	3960972046
-	.long	1024307251
-	.long	155173120
-	.long	1071098120
-	.long	1830919291
-	.long	1021592251
-	.long	2151562240
-	.long	1071115705
-	.long	405408666
-	.long	1023423128
-	.long	4041854720
-	.long	1071133319
-	.long	2043497827
-	.long	1024411503
-	.long	3489224192
-	.long	1071150963
-	.long	3072215864
-	.long	1022698635
-	.long	2477196288
-	.long	1071168637
-	.long	1812195139
-	.long	1022689192
-	.long	3015298816
-	.long	1071186341
-	.long	764841969
-	.long	1021027331
-	.long	2844731136
-	.long	1071204076
-	.long	2878117321
-	.long	1019116513
-	.long	4028950528
-	.long	1071221842
-	.long	698911452
-	.long	1023265602
-	.long	69441536
-	.long	1071239641
-	.long	3253467847
-	.long	1020795075
-	.long	1676209920
-	.long	1071257471
-	.long	4272431167
-	.long	1022873982
-	.long	2408752384
-	.long	1071275334
-	.long	648519100
-	.long	1024385717
-	.long	151623680
-	.long	1071293231
-	.long	345257017
-	.long	1019561408
-	.long	1410154240
-	.long	1071311161
-	.long	197863993
-	.long	1023224207
-	.long	4131351552
-	.long	1071329125
-	.long	2620801789
-	.long	1024411169
-	.long	1999664384
-	.long	1071347125
-	.long	3952692616
-	.long	1024168086
-	.long	1617668864
-	.long	1071365160
-	.long	3019889809
-	.long	1021907692
-	.long	1032074240
-	.long	1071383231
-	.long	59469899
-	.long	1023656194
-	.long	2619492096
-	.long	1071401338
-	.long	1417526820
-	.long	1021457783
-	.long	202429440
-	.long	1071419483
-	.long	2927667935
-	.long	1019175447
-	.long	525044224
-	.long	1071437665
-	.long	38166811
-	.long	1023981879
-	.long	1779258880
-	.long	1071455885
-	.long	481252500
-	.long	1023310234
-	.long	2195673600
-	.long	1071474144
-	.long	3962395981
-	.long	1021339088
-	.long	44573696
-	.long	1071492443
-	.long	3936281395
-	.long	1023014829
-	.long	2226905344
-	.long	1071510781
-	.long	1515320476
-	.long	1024320623
-	.long	2800512512
-	.long	1071529160
-	.long	1225403697
-	.long	1021081846
-	.long	161113600
-	.long	1071547581
-	.long	3064809733
-	.long	1024173917
-	.long	1338410240
-	.long	1071566043
-	.long	2027604973
-	.long	1024362526
-	.long	522433280
-	.long	1071584548
-	.long	2055171723
-	.long	1023858825
-	.long	539595776
-	.long	1071603096
-	.long	3868820135
-	.long	1022936424
-	.long	4264017664
-	.long	1071621687
-	.long	3228065145
-	.long	1023479578
-	.long	1733924096
-	.long	1071640324
-	.long	3511934475
-	.long	1022496355
-	.long	108880384
-	.long	1071651839
-	.long	615880967
-	.long	1023519706
-	.long	3517856512
-	.long	1071661202
-	.long	3113108559
-	.long	1025190289
-	.long	4043153152
-	.long	1071670589
-	.long	1571836218
-	.long	1023106116
-	.long	3251299072
-	.long	1071680000
-	.long	3444076102
-	.long	1022187841
-	.long	2736921600
-	.long	1071689435
-	.long	272771483
-	.long	1025095280
-	.long	3897698560
-	.long	1071703633
-	.long	2075390188
-	.long	1022489022
-	.long	3209485056
-	.long	1071722652
-	.long	1438094065
-	.long	1021844944
-	.long	3781432064
-	.long	1071741774
-	.long	1675017145
-	.long	1024143828
-	.long	2684184064
-	.long	1071761003
-	.long	2259963753
-	.long	1024731393
-	.long	1840489728
-	.long	1071780342
-	.long	3372883597
-	.long	1023431408
-	.long	3764087808
-	.long	1071799794
-	.long	3307523102
-	.long	1024485788
-	.long	3006232320
-	.long	1071819364
-	.long	3088971966
-	.long	1025213251
-	.long	3374881280
-	.long	1071839055
-	.long	834437749
-	.long	1025236452
-	.long	797284864
-	.long	1071858872
-	.long	3122663941
-	.long	1025320473
-	.long	545765120
-	.long	1071878818
-	.long	826539625
-	.long	1022450955
-	.long	107562240
-	.long	1071898898
-	.long	339584600
-	.long	1022481255
-	.long	2123649024
-	.long	1071919116
-	.long	3912959833
-	.long	1024321009
-	.long	1562385664
-	.long	1071939478
-	.long	2846067230
-	.long	1023343981
-	.long	2963085824
-	.long	1071959988
-	.long	954548627
-	.long	1021475211
-	.long	3325550592
-	.long	1071980652
-	.long	3459651155
-	.long	1025305573
-	.long	775752448
-	.long	1072001476
-	.long	3582746667
-	.long	1023859460
-	.long	3238590720
-	.long	1072022464
-	.long	634636162
-	.long	1024472353
-	.long	2758801920
-	.long	1072043624
-	.long	3078216319
-	.long	1025304516
-	.long	1370319104
-	.long	1072064962
-	.long	2570569078
-	.long	1025099442
-	.long	2615805184
-	.long	1072086484
-	.long	3729933412
-	.long	1024605112
-	.long	3077336576
-	.long	1072108198
-	.long	1948916066
-	.long	1024781603
-	.long	1099528192
-	.long	1072130112
-	.long	3139143157
-	.long	1023729360
-	.long	1231903232
-	.long	1072152233
-	.long	1349513477
-	.long	1024737515
-	.long	1507504128
-	.long	1072174570
-	.long	3484516322
-	.long	1024000959
-	.long	2214659840
-	.long	1072197132
-	.long	2563820917
-	.long	1025225535
-	.long	1804739840
-	.long	1072219929
-	.long	760038746
-	.long	1024482855
-	.long	1413746688
-	.long	1072242971
-	.long	3401734714
-	.long	1025129838
-	.long	821409536
-	.long	1072266269
-	.long	3729772551
-	.long	1025484796
-	.long	3031825664
-	.long	1072289834
-	.long	122256749
-	.long	1024752594
-	.long	1710784256
-	.long	1072313680
-	.long	1518205483
-	.long	1024724809
-	.long	3025265152
-	.long	1072337819
-	.long	409951989
-	.long	1022835555
-	.long	287769088
-	.long	1072362267
-	.long	800355594
-	.long	1022484850
-	.long	198179840
-	.long	1072387038
-	.long	3502926213
-	.long	1024209373
-	.long	1909130496
-	.long	1072412149
-	.long	3064694319
-	.long	1025380823
-	.long	1941732096
-	.long	1072437619
-	.long	4112930390
-	.long	1024294679
-	.long	3492010496
-	.long	1072463467
-	.long	2684918107
-	.long	1023220233
-	.long	81959680
-	.long	1072489716
-	.long	220021366
-	.long	1020635131
-	.long	2297837056
-	.long	1072516387
-	.long	4027683826
-	.long	1021041185
-	.long	270404096
-	.long	1072543508
-	.long	2012766065
-	.long	1021780753
-	.long	3667376896
-	.long	1072571105
-	.long	2727981522
-	.long	1023009874
-	.long	330400256
-	.long	1072599212
-	.long	2940017003
-	.long	1025393439
-	.long	1119293952
-	.long	1072627861
-	.long	1608550416
-	.long	1022675612
-	.long	3536155904
-	.long	1072657091
-	.long	349665778
-	.long	1025156751
-	.long	3078046720
-	.long	1072686946
-	.long	2016159996
-	.long	1022193169
-	.long	455228416
-	.long	1072705361
-	.long	1908539328
-	.long	1026126332
-	.long	1871505664
-	.long	1072720988
-	.long	2784700894
-	.long	1025922277
-	.long	1630994432
-	.long	1072737010
-	.long	361107678
-	.long	1022887244
-	.long	2084558336
-	.long	1072753462
-	.type	Tbl_addr,@object
-	.size	Tbl_addr,3840
-	.space 768, 0x00 	# pad
-	.align 16
-cv:
-	.long	0
-	.long	0
-	.long	1431655765
-	.long	3217380693
-	.long	858993459
-	.long	3216192307
-	.long	3067833783
-	.long	3215383405
-	.type	cv,@object
-	.size	cv,32
-	.align 16
-PI_BY_2:
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.type	PI_BY_2,@object
-	.size	PI_BY_2,16
-	.align 16
-NEG_PI:
-	.long	856972295
-	.long	3164710438
-	.long	1413754136
-	.long	3221823995
-	.type	NEG_PI,@object
-	.size	NEG_PI,16
-	.align 16
-cv2:
-	.long	780903145
-	.long	1066854586
-	.long	858993459
-	.long	1068708659
-	.long	3340530119
-	.long	1067392113
-	.long	1431655765
-	.long	1069897045
-	.long	1321528399
-	.long	1066517740
-	.long	3067833783
-	.long	1067899757
-	.long	2021159460
-	.long	1065855096
-	.long	2576980378
-	.long	1066178969
-	.type	cv2,@object
-	.size	cv2,64
-	.align 16
-HALFMASK:
-	.long	4160749568
-	.long	4294967295
-	.long	4160749568
-	.long	4294967295
-	.type	HALFMASK,@object
-	.size	HALFMASK,16
-	.align 16
-PI:
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	1074340347
-	.type	PI,@object
-	.size	PI,16
-	.align 4
-ONEMASK:
-	.long	0
-	.long	1072693248
-	.type	ONEMASK,@object
-	.size	ONEMASK,8
-	.align 4
-TMASK:
-	.long	0
-	.long	4294950912
-	.type	TMASK,@object
-	.size	TMASK,8
-	.align 4
-ONE_BY_2:
-	.long	0
-	.long	1071644672
-	.type	ONE_BY_2,@object
-	.size	ONE_BY_2,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_acos.1-.
-	.4byte ..___tag_value_acos.5-..___tag_value_acos.1
-	.2byte 0x0400
-	.4byte ..___tag_value_acos.3-..___tag_value_acos.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_acos.4-..___tag_value_acos.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/e_asin.S b/libm/x86_64/e_asin.S
deleted file mode 100644
index 4242543..0000000
--- a/libm/x86_64/e_asin.S
+++ /dev/null
@@ -1,2036 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  To compute asin(s), separate schemes are used when s is in different
-//  intervals.
-//
-//  |s| in [2^{-4}, sqrt(3)/2):
-//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
-//       asin(s)=asin(t)+asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
-//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
-//       For the first degree term, r is evaluated as
-//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
-//       (sqrt(1-t^2) read from table)
-//  The main source of error is still R (may still be affected by up to 3 ulps
-//  of rounding error). The table size must be sufficiently large, to minimize
-//  this effect.
-//
-//  |s| in [sqrt(3)/2, 255/256):
-//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
-//       asin(|s|)=pi/2-asin(t)+asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
-//       asin(r) evaluated as polynomial (same as above)
-//       The first degree term is evaluated as
-//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
-//
-//  |s|<2^{-4}: evaluate as 13-degree polynomial
-//
-//  |s| in [255/256,1): asin(|s|)=pi/2-asin(sqrt(1-s^2))
-//         use 17-degree polynomial, get error term
-//         Q*eps ~ (1-s^2-Q^2)/(2*Q) for first term
-//                 ( Q(1+eps)=sqrt(1-s^2) )
-//
-// Special cases:
-//  asin(NaN) = quiet NaN, and raise invalid exception
-//  asin(INF) = QNaN and raise invalid exception
-//  asin(x) = QNaN and raise invalid exception, for |x|>1.0
-//  asin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  asin
-ENTRY(asin)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_asin.1:
-        subq      $24, %rsp
-..___tag_value_asin.3:
-        movsd     %xmm0, (%rsp)
-..B1.2:
-        stmxcsr   16(%rsp)
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        jne       .L_2TAG_PACKET_0.0.2
-.L_2TAG_PACKET_1.0.2:
-        movsd     ABSVALMASK(%rip), %xmm4
-        movsd     ONEMASK(%rip), %xmm3
-        xorpd     %xmm5, %xmm5
-        movsd     TMASK(%rip), %xmm2
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movq      %xmm0, %xmm1
-        psrlq     $44, %xmm0
-        movd      %xmm0, %edx
-        movq      %xmm1, %xmm7
-        movl      $8192, %ecx
-        pinsrw    $2, %ecx, %xmm5
-        movq      %xmm1, %xmm0
-        movl      $524287, %eax
-        andl      %edx, %eax
-        subl      $260864, %eax
-        cmpl      $955, %eax
-        jae       .L_2TAG_PACKET_2.0.2
-        mulsd     %xmm1, %xmm1
-        andl      $65535, %edx
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        andpd     %xmm7, %xmm2
-        andl      $-4, %edx
-        subl      $64256, %edx
-        lea       T_table(%rip), %r8
-        movsd     (%r8,%rdx,2), %xmm1
-        orpd      %xmm5, %xmm2
-        lea       Tbl_addr(%rip), %r8
-        movapd    (%r8,%rdx,4), %xmm4
-        movq      %xmm7, %xmm6
-        addsd     %xmm2, %xmm7
-        subsd     %xmm2, %xmm0
-        mulsd     %xmm7, %xmm0
-        mulsd     %xmm1, %xmm6
-        mulsd     %xmm2, %xmm3
-        movq      %xmm6, %xmm1
-        addsd     %xmm3, %xmm6
-        divsd     %xmm6, %xmm0
-        movsd     16+cv(%rip), %xmm7
-        movsd     cv(%rip), %xmm5
-        subsd     %xmm3, %xmm1
-        andpd     SIGNMASK(%rip), %xmm2
-        movq      %xmm1, %xmm3
-        mulsd     %xmm1, %xmm1
-        movsd     8+cv(%rip), %xmm6
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm1, %xmm7
-        mulsd     %xmm3, %xmm5
-        xorpd     %xmm2, %xmm4
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm7, %xmm6
-        mulsd     %xmm3, %xmm6
-        addsd     %xmm4, %xmm5
-        pshufd    $238, %xmm4, %xmm4
-        addsd     %xmm5, %xmm6
-        orpd      %xmm2, %xmm4
-        addsd     %xmm6, %xmm0
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_3.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_3.0.2:
-        addsd     %xmm4, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_2.0.2:
-        subl      $955, %eax
-        cmpl      $67, %eax
-        jae       .L_2TAG_PACKET_4.0.2
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        movl      %edx, %eax
-        andpd     ABSVALMASK(%rip), %xmm0
-        andpd     HALFMASK2(%rip), %xmm7
-        movq      %xmm0, %xmm1
-        movsd     ONEMASK(%rip), %xmm4
-        movq      %xmm7, %xmm6
-        subsd     %xmm7, %xmm1
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm6, %xmm0
-        subsd     %xmm7, %xmm4
-        mulsd     %xmm1, %xmm0
-        movq      %xmm3, %xmm7
-        andpd     %xmm3, %xmm2
-        psllq     $2, %xmm3
-        pextrw    $3, %xmm3, %edx
-        orpd      %xmm5, %xmm2
-        subl      $65216, %edx
-        addl      %edx, %edx
-        lea       T_table(%rip), %r8
-        mulsd     (%r8,%rdx,4), %xmm7
-        mulsd     %xmm2, %xmm6
-        movapd    PI_BY_2(%rip), %xmm3
-        mulsd     %xmm2, %xmm1
-        mulsd     %xmm2, %xmm2
-        subsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm6
-        subsd     %xmm2, %xmm4
-        addsd     %xmm7, %xmm7
-        movsd     cv(%rip), %xmm5
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm7
-        movsd     16+cv(%rip), %xmm0
-        divsd     %xmm7, %xmm4
-        movsd     8+cv(%rip), %xmm2
-        lea       Tbl_addr(%rip), %r8
-        subpd     (%r8,%rdx,8), %xmm3
-        movq      %xmm6, %xmm1
-        mulsd     %xmm6, %xmm6
-        andl      $524288, %eax
-        shrl      $4, %eax
-        mulsd     %xmm6, %xmm0
-        mulsd     %xmm6, %xmm1
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm6, %xmm1
-        addsd     %xmm2, %xmm0
-        pxor      %xmm6, %xmm6
-        mulsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm5
-        pinsrw    $3, %eax, %xmm6
-        addsd     %xmm5, %xmm0
-        movq      %xmm4, %xmm5
-        pshufd    $238, %xmm3, %xmm3
-        subsd     %xmm3, %xmm4
-        addsd     %xmm4, %xmm3
-        subsd     %xmm3, %xmm5
-        subsd     %xmm5, %xmm0
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_5.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_5.0.2:
-        xorpd     %xmm6, %xmm0
-        xorpd     %xmm6, %xmm4
-        subsd     %xmm4, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        addl      $15291, %eax
-        cmpl      $14336, %eax
-        jae       .L_2TAG_PACKET_6.0.2
-        unpcklpd  %xmm7, %xmm7
-        movapd    cv2(%rip), %xmm1
-        movapd    %xmm7, %xmm6
-        movapd    16+cv2(%rip), %xmm2
-        movapd    32+cv2(%rip), %xmm4
-        mulpd     %xmm7, %xmm7
-        mulpd     %xmm7, %xmm6
-        mulpd     %xmm7, %xmm1
-        mulpd     %xmm7, %xmm7
-        movq      %xmm6, %xmm3
-        mulsd     %xmm6, %xmm6
-        addpd     %xmm2, %xmm1
-        mulpd     %xmm7, %xmm4
-        mulsd     %xmm3, %xmm6
-        addpd     %xmm4, %xmm1
-        mulpd     %xmm6, %xmm1
-        pshufd    $238, %xmm1, %xmm2
-        addsd     %xmm2, %xmm1
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_7.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_7.0.2:
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_6.0.2:
-        subl      $15358, %eax
-        cmpl      $2, %eax
-        jae       .L_2TAG_PACKET_8.0.2
-        mulsd     %xmm1, %xmm1
-        subsd     %xmm1, %xmm3
-        sqrtsd    %xmm3, %xmm3
-        movl      %edx, %eax
-        andpd     HALFMASK(%rip), %xmm7
-        pshufd    $68, %xmm3, %xmm5
-        andpd     HALFMASK(%rip), %xmm3
-        movq      %xmm7, %xmm1
-        movsd     ONEMASK(%rip), %xmm4
-        movq      %xmm7, %xmm6
-        subsd     %xmm7, %xmm0
-        mulsd     %xmm7, %xmm7
-        addsd     %xmm1, %xmm1
-        mulsd     %xmm0, %xmm1
-        subsd     %xmm7, %xmm4
-        movq      %xmm3, %xmm6
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm0, %xmm0
-        subsd     %xmm1, %xmm4
-        subsd     %xmm5, %xmm6
-        addsd     %xmm5, %xmm5
-        subsd     %xmm3, %xmm4
-        movapd    cv2(%rip), %xmm2
-        pshufd    $238, %xmm5, %xmm3
-        subsd     %xmm0, %xmm4
-        addsd     %xmm6, %xmm5
-        pshufd    $238, %xmm3, %xmm7
-        addsd     %xmm3, %xmm3
-        mulsd     %xmm6, %xmm5
-        addsd     %xmm5, %xmm4
-        pshufd    $238, %xmm7, %xmm6
-        divsd     %xmm3, %xmm4
-        movapd    48+cv2(%rip), %xmm1
-        movapd    16+cv2(%rip), %xmm5
-        movapd    32+cv2(%rip), %xmm0
-        mulpd     %xmm7, %xmm7
-        movq      %xmm6, %xmm3
-        mulpd     %xmm7, %xmm2
-        mulpd     %xmm7, %xmm6
-        shrl      $4, %eax
-        andl      $32768, %eax
-        mulsd     %xmm7, %xmm1
-        mulpd     %xmm7, %xmm7
-        addpd     %xmm2, %xmm5
-        movapd    %xmm6, %xmm2
-        mulsd     %xmm6, %xmm6
-        mulpd     %xmm0, %xmm7
-        movapd    PI_BY_2(%rip), %xmm0
-        mulsd     %xmm6, %xmm2
-        addpd     %xmm5, %xmm7
-        pshufd    $238, %xmm1, %xmm5
-        mulsd     %xmm2, %xmm6
-        mulpd     %xmm2, %xmm7
-        addsd     %xmm5, %xmm1
-        xorpd     %xmm5, %xmm5
-        pshufd    $238, %xmm7, %xmm2
-        mulsd     %xmm6, %xmm1
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm2, %xmm7
-        movq      %xmm3, %xmm2
-        pinsrw    $3, %eax, %xmm5
-        subsd     %xmm6, %xmm3
-        addsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm6
-        addsd     %xmm4, %xmm7
-        subsd     %xmm6, %xmm2
-        subsd     %xmm7, %xmm0
-        subsd     %xmm2, %xmm0
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_9.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_9.0.2:
-        xorpd     %xmm5, %xmm0
-        xorpd     %xmm5, %xmm3
-        subsd     %xmm3, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_8.0.2:
-        addl      $261886, %eax
-        cmpl      $261888, %eax
-        jb        .L_2TAG_PACKET_10.0.2
-        movd      %xmm0, %ecx
-        psrlq     $32, %xmm0
-        movd      %xmm0, %edx
-        andl      $2147483647, %edx
-        movl      $1072693248, %eax
-        subl      %edx, %eax
-        orl       %ecx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_11.0.2
-        movsd     (%rsp), %xmm2
-        movd      %xmm2, %edx
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $2147483647, %ecx
-        subl      $1, %edx
-        sbbl      $2146435072, %ecx
-        cmpl      $0, %ecx
-        jge       .L_2TAG_PACKET_10.0.2
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %edx
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_12.0.2
-.L_2TAG_PACKET_11.0.2:
-        movsd     ABSVALMASK(%rip), %xmm1
-        movsd     PI_BY_2(%rip), %xmm2
-        movsd     8+PI_BY_2(%rip), %xmm0
-        addsd     %xmm2, %xmm0
-        andnpd    %xmm7, %xmm1
-        orpd      %xmm1, %xmm0
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_13.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_13.0.2:
-        jmp       ..B1.5
-.L_2TAG_PACKET_10.0.2:
-        movsd     (%rsp), %xmm0
-        xorpd     %xmm6, %xmm6
-        movq      %xmm0, %xmm7
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_14.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_14.0.2:
-        pextrw    $3, %xmm0, %edx
-        andl      $32752, %edx
-        subl      $16, %edx
-        cmpl      $32736, %edx
-        jb        .L_2TAG_PACKET_15.0.2
-        addsd     %xmm0, %xmm6
-        orpd      %xmm6, %xmm0
-        mulsd     %xmm0, %xmm7
-.L_2TAG_PACKET_15.0.2:
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        movl      %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_12.0.2:
-        movl      16(%rsp), %eax
-        andl      $-24577, %eax
-        cmpl      16(%rsp), %eax
-        je        .L_2TAG_PACKET_16.0.2
-        stmxcsr   20(%rsp)
-        movl      16(%rsp), %eax
-        andl      $24576, %eax
-        orl       %eax, 20(%rsp)
-        ldmxcsr   20(%rsp)
-.L_2TAG_PACKET_16.0.2:
-        movq      %xmm0, 8(%rsp)
-..B1.3:
-        movq      8(%rsp), %xmm0
-.L_2TAG_PACKET_17.0.2:
-..B1.5:
-        addq      $24, %rsp
-..___tag_value_asin.4:
-        ret       
-..___tag_value_asin.5:
-END(asin)
-# -- End  asin
-	.section .rodata, "a"
-	.align 16
-	.align 16
-ABSVALMASK:
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	0
-	.type	ABSVALMASK,@object
-	.size	ABSVALMASK,16
-	.align 16
-T_table:
-	.long	2642784509
-	.long	1072689083
-	.long	1514442531
-	.long	1072688953
-	.long	333108933
-	.long	1072688821
-	.long	3392112024
-	.long	1072688686
-	.long	2099852862
-	.long	1072688550
-	.long	749609004
-	.long	1072688412
-	.long	3634632596
-	.long	1072688271
-	.long	2163248461
-	.long	1072688129
-	.long	628657846
-	.long	1072687985
-	.long	3324036511
-	.long	1072687838
-	.long	1657632815
-	.long	1072687690
-	.long	4217538760
-	.long	1072687539
-	.long	2411951597
-	.long	1072687387
-	.long	533944872
-	.long	1072687233
-	.long	2876566508
-	.long	1072687076
-	.long	847936891
-	.long	1072686918
-	.long	3036019913
-	.long	1072686757
-	.long	848884575
-	.long	1072686595
-	.long	2874443326
-	.long	1072686430
-	.long	520713666
-	.long	1072686264
-	.long	2375556481
-	.long	1072686095
-	.long	4141904948
-	.long	1072685924
-	.long	1522666382
-	.long	1072685752
-	.long	3105624104
-	.long	1072685577
-	.long	298666327
-	.long	1072685401
-	.long	1689524500
-	.long	1072685222
-	.long	2981002200
-	.long	1072685041
-	.long	4170844284
-	.long	1072684858
-	.long	961802263
-	.long	1072684674
-	.long	1941503454
-	.long	1072684487
-	.long	2812647170
-	.long	1072684298
-	.long	3572873869
-	.long	1072684107
-	.long	4219797823
-	.long	1072683914
-	.long	456039788
-	.long	1072683720
-	.long	869096151
-	.long	1072683523
-	.long	1161535119
-	.long	1072683324
-	.long	1330865866
-	.long	1072683123
-	.long	1374571204
-	.long	1072682920
-	.long	1290107538
-	.long	1072682715
-	.long	1074904836
-	.long	1072682508
-	.long	726366587
-	.long	1072682299
-	.long	241869763
-	.long	1072682088
-	.long	3913732079
-	.long	1072681874
-	.long	3149342765
-	.long	1072681659
-	.long	2240966306
-	.long	1072681442
-	.long	1185873216
-	.long	1072681223
-	.long	4276274591
-	.long	1072681001
-	.long	2919452883
-	.long	1072680778
-	.long	1407565635
-	.long	1072680553
-	.long	4032743551
-	.long	1072680325
-	.long	2202188565
-	.long	1072680096
-	.long	207977577
-	.long	1072679865
-	.long	2342160518
-	.long	1072679631
-	.long	11858423
-	.long	1072679396
-	.long	1804034453
-	.long	1072679158
-	.long	3420722787
-	.long	1072678918
-	.long	563930456
-	.long	1072678677
-	.long	1820539192
-	.long	1072678433
-	.long	2892501606
-	.long	1072678187
-	.long	3776710320
-	.long	1072677939
-	.long	175063337
-	.long	1072677690
-	.long	674333171
-	.long	1072677438
-	.long	976363026
-	.long	1072677184
-	.long	1077935934
-	.long	1072676928
-	.long	1921075490
-	.long	1072676540
-	.long	881493302
-	.long	1072676016
-	.long	3275752439
-	.long	1072675483
-	.long	486855588
-	.long	1072674943
-	.long	1077229111
-	.long	1072674394
-	.long	723950308
-	.long	1072673837
-	.long	3693582199
-	.long	1072673271
-	.long	1367335316
-	.long	1072672698
-	.long	2305837020
-	.long	1072672116
-	.long	2184358641
-	.long	1072671526
-	.long	972682840
-	.long	1072670928
-	.long	2935101762
-	.long	1072670321
-	.long	3745513263
-	.long	1072669706
-	.long	3372320886
-	.long	1072669083
-	.long	1783464620
-	.long	1072668452
-	.long	3241386215
-	.long	1072667812
-	.long	3418125284
-	.long	1072667164
-	.long	2280219148
-	.long	1072666508
-	.long	4088700758
-	.long	1072665843
-	.long	219227400
-	.long	1072665171
-	.long	3521816918
-	.long	1072664489
-	.long	1076205279
-	.long	1072663800
-	.long	1436484616
-	.long	1072663102
-	.long	271362610
-	.long	1072662396
-	.long	1838996688
-	.long	1072661681
-	.long	1807122518
-	.long	1072660958
-	.long	137953542
-	.long	1072660227
-	.long	1088178584
-	.long	1072659487
-	.long	324057537
-	.long	1072658739
-	.long	2101288076
-	.long	1072657982
-	.long	2085133974
-	.long	1072657217
-	.long	235324451
-	.long	1072656444
-	.long	806051592
-	.long	1072655662
-	.long	3756033140
-	.long	1072654871
-	.long	453542543
-	.long	1072654073
-	.long	3741177327
-	.long	1072653265
-	.long	691216109
-	.long	1072652450
-	.long	4145223372
-	.long	1072651625
-	.long	1174439091
-	.long	1072650793
-	.long	324416139
-	.long	1072649952
-	.long	1550246310
-	.long	1072649102
-	.long	511524674
-	.long	1072648244
-	.long	1457248482
-	.long	1072647377
-	.long	45944955
-	.long	1072646502
-	.long	525537397
-	.long	1072645618
-	.long	2848440188
-	.long	1072644725
-	.long	2671555633
-	.long	1072643824
-	.long	4241172637
-	.long	1072642914
-	.long	3213094278
-	.long	1072641996
-	.long	3832503688
-	.long	1072641069
-	.long	1754091534
-	.long	1072640134
-	.long	1221921804
-	.long	1072639190
-	.long	2184526489
-	.long	1072638237
-	.long	294902089
-	.long	1072637276
-	.long	4090375270
-	.long	1072636305
-	.long	632860906
-	.long	1072635327
-	.long	2753498702
-	.long	1072634339
-	.long	1808009252
-	.long	1072633343
-	.long	2036428672
-	.long	1072632338
-	.long	3383235626
-	.long	1072631324
-	.long	1497347484
-	.long	1072630302
-	.long	617018317
-	.long	1072629271
-	.long	684933058
-	.long	1072628231
-	.long	1643170798
-	.long	1072627182
-	.long	3011066360
-	.long	1072625592
-	.long	957158713
-	.long	1072623442
-	.long	1390907941
-	.long	1072621256
-	.long	3819155270
-	.long	1072619034
-	.long	3443571196
-	.long	1072616777
-	.long	4045412458
-	.long	1072614484
-	.long	805503923
-	.long	1072612156
-	.long	1778922015
-	.long	1072609791
-	.long	2125033665
-	.long	1072607390
-	.long	1287203863
-	.long	1072604953
-	.long	2992629568
-	.long	1072602479
-	.long	2367267127
-	.long	1072599969
-	.long	3115526047
-	.long	1072597422
-	.long	340219539
-	.long	1072594839
-	.long	2017215719
-	.long	1072592218
-	.long	3225443424
-	.long	1072589560
-	.long	3326565673
-	.long	1072586865
-	.long	1669811211
-	.long	1072584133
-	.long	1886735022
-	.long	1072581363
-	.long	3301071171
-	.long	1072578555
-	.long	928514283
-	.long	1072575710
-	.long	2656364059
-	.long	1072572826
-	.long	3473490507
-	.long	1072569904
-	.long	2649965606
-	.long	1072566944
-	.long	3736819052
-	.long	1072563945
-	.long	1680885175
-	.long	1072560908
-	.long	4413771
-	.long	1072557832
-	.long	2214869753
-	.long	1072554716
-	.long	3214725184
-	.long	1072551561
-	.long	2186079903
-	.long	1072548367
-	.long	2590372131
-	.long	1072545133
-	.long	3578146079
-	.long	1072541859
-	.long	4283712755
-	.long	1072538545
-	.long	3824834510
-	.long	1072535191
-	.long	1302400298
-	.long	1072531797
-	.long	95058636
-	.long	1072528362
-	.long	3563906063
-	.long	1072524885
-	.long	2167230730
-	.long	1072521368
-	.long	3524918334
-	.long	1072517809
-	.long	2353304918
-	.long	1072514209
-	.long	1939625839
-	.long	1072510567
-	.long	1256714581
-	.long	1072506883
-	.long	3552525848
-	.long	1072503156
-	.long	3464809522
-	.long	1072499387
-	.long	4200542593
-	.long	1072495575
-	.long	355609124
-	.long	1072491721
-	.long	3684139099
-	.long	1072487822
-	.long	148355918
-	.long	1072483881
-	.long	1457689242
-	.long	1072479895
-	.long	2118591596
-	.long	1072475865
-	.long	908848089
-	.long	1072471791
-	.long	877032689
-	.long	1072467672
-	.long	752012304
-	.long	1072463508
-	.long	3532301749
-	.long	1072459298
-	.long	3600563221
-	.long	1072455043
-	.long	3902857084
-	.long	1072450742
-	.long	3063101036
-	.long	1072446395
-	.long	3972344374
-	.long	1072442001
-	.long	903183549
-	.long	1072437561
-	.long	983892938
-	.long	1072433073
-	.long	2722858568
-	.long	1072428537
-	.long	302790515
-	.long	1072423954
-	.long	759811057
-	.long	1072419322
-	.long	2507809922
-	.long	1072414641
-	.long	2388408813
-	.long	1072407528
-	.long	2084492942
-	.long	1072397870
-	.long	2435703301
-	.long	1072388010
-	.long	1935433360
-	.long	1072377945
-	.long	2742047290
-	.long	1072367671
-	.long	2053284205
-	.long	1072357185
-	.long	657783367
-	.long	1072346483
-	.long	2893664841
-	.long	1072335560
-	.long	3718906405
-	.long	1072324413
-	.long	1547896303
-	.long	1072313038
-	.long	2494058440
-	.long	1072301429
-	.long	3133238742
-	.long	1072289582
-	.long	3327000086
-	.long	1072277492
-	.long	1860667274
-	.long	1072265154
-	.long	665340747
-	.long	1072252562
-	.long	443347841
-	.long	1072239710
-	.long	581282618
-	.long	1072226592
-	.long	3349780465
-	.long	1072213201
-	.long	914217606
-	.long	1072199532
-	.long	989797661
-	.long	1072185576
-	.long	945436416
-	.long	1072171326
-	.long	549291300
-	.long	1072156774
-	.long	1814636389
-	.long	1072141911
-	.long	239092858
-	.long	1072126729
-	.long	1794680724
-	.long	1072111217
-	.long	1241534678
-	.long	1072095366
-	.long	3366566214
-	.long	1072079164
-	.long	1244090828
-	.long	1072062601
-	.long	1708448120
-	.long	1072045663
-	.long	3544260650
-	.long	1072028337
-	.long	1402741403
-	.long	1072010610
-	.long	2551936888
-	.long	1071992465
-	.long	617669739
-	.long	1071973887
-	.long	794002186
-	.long	1071954857
-	.long	2021237693
-	.long	1071935356
-	.long	540450384
-	.long	1071915364
-	.long	1920555537
-	.long	1071894857
-	.long	2879585206
-	.long	1071873811
-	.long	3000237455
-	.long	1071852199
-	.long	3352974346
-	.long	1071829991
-	.long	569629937
-	.long	1071807155
-	.long	2077237208
-	.long	1071783653
-	.long	2284891805
-	.long	1071759446
-	.long	1226651784
-	.long	1071734489
-	.long	1102047405
-	.long	1071708731
-	.long	2009896384
-	.long	1071682115
-	.long	927419082
-	.long	1071654577
-	.long	85010366
-	.long	1071607413
-	.long	696431025
-	.long	1071548180
-	.long	2611410541
-	.long	1071486585
-	.long	2612593658
-	.long	1071422396
-	.long	3548155306
-	.long	1071355336
-	.long	3887997484
-	.long	1071285073
-	.long	244854763
-	.long	1071211202
-	.long	4214445648
-	.long	1071133216
-	.long	2303966727
-	.long	1071050478
-	.long	3991040013
-	.long	1070962152
-	.long	3126952278
-	.long	1070867118
-	.long	1817448378
-	.long	1070763804
-	.long	1793814864
-	.long	1070649884
-	.long	3507224072
-	.long	1070447193
-	.long	4027609105
-	.long	1070148772
-	.long	577507993
-	.long	1069779414
-	.long	2310232419
-	.long	1068931829
-	.type	T_table,@object
-	.size	T_table,2048
-	.align 16
-Tbl_addr:
-	.long	3822952792
-	.long	1021639372
-	.long	182792448
-	.long	1068507836
-	.long	2264213271
-	.long	1019558908
-	.long	649052928
-	.long	1068524253
-	.long	1797139609
-	.long	1022295143
-	.long	1243095296
-	.long	1068540671
-	.long	1415938756
-	.long	1021439537
-	.long	2033294592
-	.long	1068557090
-	.long	2356809978
-	.long	1021777916
-	.long	3088063744
-	.long	1068573510
-	.long	2669055318
-	.long	1022124482
-	.long	180888576
-	.long	1068589932
-	.long	3566445325
-	.long	1021358712
-	.long	1970196992
-	.long	1068606354
-	.long	896980323
-	.long	1021319659
-	.long	4229555456
-	.long	1068622777
-	.long	436049712
-	.long	1021319758
-	.long	2732572160
-	.long	1068639202
-	.long	583123209
-	.long	1020797960
-	.long	1842831872
-	.long	1068655628
-	.long	1370449804
-	.long	1021429270
-	.long	1628994560
-	.long	1068672055
-	.long	2411391464
-	.long	1021057980
-	.long	2159763712
-	.long	1068688483
-	.long	1208692749
-	.long	1021943903
-	.long	3503886336
-	.long	1068704912
-	.long	538793309
-	.long	1019744063
-	.long	1435187200
-	.long	1068721343
-	.long	4085087612
-	.long	1020608419
-	.long	317469952
-	.long	1068737775
-	.long	144386942
-	.long	1021440732
-	.long	219617280
-	.long	1068754208
-	.long	2940088361
-	.long	1019981122
-	.long	1210558208
-	.long	1068770642
-	.long	2176850347
-	.long	1018373705
-	.long	3359268352
-	.long	1068787077
-	.long	2395611454
-	.long	1021889042
-	.long	2439803648
-	.long	1068803514
-	.long	1650705253
-	.long	1020227966
-	.long	2816203520
-	.long	1068819952
-	.long	3702166386
-	.long	1019379914
-	.long	262620672
-	.long	1068836392
-	.long	1855649370
-	.long	1020453124
-	.long	3438159616
-	.long	1068852832
-	.long	923063860
-	.long	1019273834
-	.long	3822105856
-	.long	1068869274
-	.long	4289947947
-	.long	1019434249
-	.long	1483729920
-	.long	1068885718
-	.long	787455814
-	.long	1020738379
-	.long	787321088
-	.long	1068902163
-	.long	3321653337
-	.long	1021842569
-	.long	1802253312
-	.long	1068918609
-	.long	2653633526
-	.long	1021821525
-	.long	302985984
-	.long	1068935057
-	.long	161272028
-	.long	1021655149
-	.long	653966080
-	.long	1068951506
-	.long	2566098667
-	.long	1020066219
-	.long	2924727296
-	.long	1068967956
-	.long	3646493722
-	.long	1014292285
-	.long	2889890304
-	.long	1068984408
-	.long	1081009196
-	.long	1022189620
-	.long	619098112
-	.long	1069000862
-	.long	4011643355
-	.long	1021773297
-	.long	477017600
-	.long	1069017317
-	.long	4030305534
-	.long	1021292252
-	.long	2533403904
-	.long	1069033773
-	.long	2645187591
-	.long	1019527099
-	.long	2563102208
-	.long	1069050231
-	.long	3857293792
-	.long	1022311697
-	.long	635982336
-	.long	1069066691
-	.long	3625936637
-	.long	1017511744
-	.long	1116940800
-	.long	1069083152
-	.long	3653872993
-	.long	1022016631
-	.long	4075964160
-	.long	1069099614
-	.long	2468900271
-	.long	1021769532
-	.long	993165568
-	.long	1069116079
-	.long	1358104224
-	.long	1021199776
-	.long	528586752
-	.long	1069132545
-	.long	2200950332
-	.long	1022024872
-	.long	2752395776
-	.long	1069149012
-	.long	3197072454
-	.long	1017751319
-	.long	3439855616
-	.long	1069165481
-	.long	1651081806
-	.long	1020809338
-	.long	2661257728
-	.long	1069181952
-	.long	539032752
-	.long	1021728805
-	.long	486957312
-	.long	1069198425
-	.long	3136045149
-	.long	1016888671
-	.long	1282340352
-	.long	1069214899
-	.long	2593963259
-	.long	1018956103
-	.long	822921728
-	.long	1069231375
-	.long	2146032737
-	.long	1022306465
-	.long	3474216192
-	.long	1069247852
-	.long	3976811625
-	.long	1021350207
-	.long	716902656
-	.long	1069264332
-	.long	718267222
-	.long	1018624727
-	.long	1211594496
-	.long	1069280813
-	.long	1485641389
-	.long	1018447451
-	.long	734070272
-	.long	1069297296
-	.long	354455128
-	.long	1021341291
-	.long	3650110720
-	.long	1069313780
-	.long	682185947
-	.long	1021651853
-	.long	1440663040
-	.long	1069330267
-	.long	3558574550
-	.long	1021615110
-	.long	2766612224
-	.long	1069346755
-	.long	874607978
-	.long	1017746872
-	.long	3404011008
-	.long	1069363245
-	.long	4154988502
-	.long	1021439906
-	.long	3423949056
-	.long	1069379737
-	.long	2263202309
-	.long	1021479615
-	.long	2897587712
-	.long	1069396231
-	.long	2562065031
-	.long	1022090363
-	.long	1896159232
-	.long	1069412727
-	.long	3836237663
-	.long	1019867288
-	.long	490968576
-	.long	1069429225
-	.long	3322056743
-	.long	1006752762
-	.long	3048360192
-	.long	1069445724
-	.long	1152314833
-	.long	1013122252
-	.long	1049850624
-	.long	1069462226
-	.long	3601590727
-	.long	1022214610
-	.long	3156899584
-	.long	1069478729
-	.long	1855169970
-	.long	1019487271
-	.long	851173376
-	.long	1069495235
-	.long	312649594
-	.long	1020868604
-	.long	2794281728
-	.long	1069511742
-	.long	1093490181
-	.long	1020777577
-	.long	468042496
-	.long	1069528252
-	.long	1152540679
-	.long	1021403732
-	.long	2534219264
-	.long	1069544763
-	.long	2292126035
-	.long	1021872430
-	.long	1376146432
-	.long	1069558527
-	.long	3293753641
-	.long	1020500454
-	.long	4175442432
-	.long	1069575044
-	.long	3626347564
-	.long	1021610969
-	.long	3523113472
-	.long	1069591566
-	.long	339956500
-	.long	1021119039
-	.long	4003350528
-	.long	1069608092
-	.long	3429333082
-	.long	1022813542
-	.long	1611067392
-	.long	1069624623
-	.long	2298017544
-	.long	1021977587
-	.long	931782144
-	.long	1069641158
-	.long	2164684743
-	.long	1021250988
-	.long	2256725504
-	.long	1069657697
-	.long	1138762335
-	.long	1021443776
-	.long	1582853120
-	.long	1069674241
-	.long	1084010382
-	.long	1022994693
-	.long	3497758720
-	.long	1069690789
-	.long	406366244
-	.long	1022713586
-	.long	3999816960
-	.long	1069707342
-	.long	1488723042
-	.long	1023381290
-	.long	3383096064
-	.long	1069723900
-	.long	2541558953
-	.long	1019137887
-	.long	1942403584
-	.long	1069740463
-	.long	1879620343
-	.long	1022653642
-	.long	4268263680
-	.long	1069757030
-	.long	3039077047
-	.long	1022252545
-	.long	2067062272
-	.long	1069773603
-	.long	4190670677
-	.long	1020725863
-	.long	4225828096
-	.long	1069790180
-	.long	1998567321
-	.long	1022014385
-	.long	2452507136
-	.long	1069806763
-	.long	1511628873
-	.long	1021900300
-	.long	1340746240
-	.long	1069823351
-	.long	788367341
-	.long	1022726208
-	.long	1190035456
-	.long	1069839944
-	.long	3856337230
-	.long	1021834118
-	.long	2300688384
-	.long	1069856542
-	.long	3211396579
-	.long	1022621365
-	.long	678886400
-	.long	1069873146
-	.long	4001011887
-	.long	1022042646
-	.long	921594112
-	.long	1069889755
-	.long	557811968
-	.long	1023065533
-	.long	3331668992
-	.long	1069906369
-	.long	1877060679
-	.long	1022419742
-	.long	3917875200
-	.long	1069922989
-	.long	1181055171
-	.long	1022752712
-	.long	2984829696
-	.long	1069939615
-	.long	4294526932
-	.long	1021499988
-	.long	838049024
-	.long	1069956247
-	.long	3658081878
-	.long	1022957952
-	.long	2078928384
-	.long	1069972884
-	.long	820353701
-	.long	1019391107
-	.long	2719854336
-	.long	1069989527
-	.long	1644022489
-	.long	1023378240
-	.long	3069117696
-	.long	1070006176
-	.long	2771393702
-	.long	1019319954
-	.long	3435962368
-	.long	1070022831
-	.long	3876394145
-	.long	1023024433
-	.long	4130595328
-	.long	1070039492
-	.long	1630447748
-	.long	1021465882
-	.long	1169236224
-	.long	1070056160
-	.long	2828355997
-	.long	1020458120
-	.long	3453997312
-	.long	1070072833
-	.long	164091641
-	.long	1020388279
-	.long	2708127744
-	.long	1070089513
-	.long	3036550223
-	.long	1023328684
-	.long	3540797696
-	.long	1070106199
-	.long	3710949463
-	.long	1022568805
-	.long	1972276736
-	.long	1070122892
-	.long	3885277950
-	.long	1019761674
-	.long	2613815552
-	.long	1070139591
-	.long	2764165077
-	.long	1022921023
-	.long	1487791616
-	.long	1070156297
-	.long	1330644769
-	.long	1023162679
-	.long	3207593472
-	.long	1070173009
-	.long	3911007221
-	.long	1022993496
-	.long	3797764608
-	.long	1070189728
-	.long	979712598
-	.long	1022554580
-	.long	3578920448
-	.long	1070206454
-	.long	2825738223
-	.long	1020223708
-	.long	2872795648
-	.long	1070223187
-	.long	392451124
-	.long	1022666279
-	.long	2002258432
-	.long	1070239927
-	.long	3730407632
-	.long	1023148291
-	.long	1291326464
-	.long	1070256674
-	.long	3723802980
-	.long	1022514089
-	.long	1065180928
-	.long	1070273428
-	.long	2635617463
-	.long	1022654470
-	.long	1650181632
-	.long	1070290189
-	.long	2061982883
-	.long	1022853411
-	.long	3373882880
-	.long	1070306957
-	.long	319732785
-	.long	1022017175
-	.long	2270081280
-	.long	1070323733
-	.long	2237757411
-	.long	1023064087
-	.long	2963732736
-	.long	1070340516
-	.long	468839165
-	.long	1023293774
-	.long	1491099904
-	.long	1070357307
-	.long	1502657946
-	.long	1021533479
-	.long	2479636480
-	.long	1070374105
-	.long	482913562
-	.long	1021986286
-	.long	1968133632
-	.long	1070390911
-	.long	3281474337
-	.long	1022646400
-	.long	291639040
-	.long	1070407725
-	.long	2453320259
-	.long	1022812423
-	.long	2081472512
-	.long	1070424546
-	.long	2939989570
-	.long	1023091888
-	.long	3380340480
-	.long	1070441375
-	.long	2850707499
-	.long	1021921109
-	.long	232287488
-	.long	1070458213
-	.long	3674625342
-	.long	1020725130
-	.long	1567614208
-	.long	1070475058
-	.long	9347334
-	.long	1022024009
-	.long	3433091072
-	.long	1070491911
-	.long	282524999
-	.long	1021433523
-	.long	1876877312
-	.long	1070508773
-	.long	3470449440
-	.long	1019309721
-	.long	1538472192
-	.long	1070525643
-	.long	2089486825
-	.long	1019698916
-	.long	2763830784
-	.long	1070542521
-	.long	443498115
-	.long	1020505194
-	.long	1605381632
-	.long	1070559408
-	.long	3018871601
-	.long	1022869913
-	.long	2706946048
-	.long	1070576303
-	.long	3936260892
-	.long	1023175875
-	.long	2123887360
-	.long	1070593207
-	.long	2994220655
-	.long	1022825948
-	.long	104015104
-	.long	1070603108
-	.long	335054493
-	.long	1023441853
-	.long	2904568832
-	.long	1070615800
-	.long	1451215633
-	.long	1023853857
-	.long	3456197120
-	.long	1070632739
-	.long	436334733
-	.long	1024026432
-	.long	252452352
-	.long	1070649697
-	.long	34596167
-	.long	1024031396
-	.long	3328018432
-	.long	1070666672
-	.long	2644547073
-	.long	1024296758
-	.long	1255829248
-	.long	1070683667
-	.long	552832586
-	.long	1023763122
-	.long	4097058560
-	.long	1070700680
-	.long	1955640623
-	.long	1021394654
-	.long	451770112
-	.long	1070717714
-	.long	3428903777
-	.long	1022941142
-	.long	408920832
-	.long	1070734767
-	.long	165503263
-	.long	1023894958
-	.long	1186960640
-	.long	1070751840
-	.long	435826450
-	.long	1024026134
-	.long	19078656
-	.long	1070768934
-	.long	1834169749
-	.long	1022899284
-	.long	2743490304
-	.long	1070786048
-	.long	494581074
-	.long	1018818479
-	.long	2328961024
-	.long	1070803184
-	.long	2987908834
-	.long	1022581110
-	.long	350011392
-	.long	1070820342
-	.long	240771184
-	.long	1024143083
-	.long	2692326912
-	.long	1070837521
-	.long	666056837
-	.long	1022394776
-	.long	2373274368
-	.long	1070854723
-	.long	2484337770
-	.long	1024228156
-	.long	1017131520
-	.long	1070871948
-	.long	3285648279
-	.long	1024025789
-	.long	265558272
-	.long	1070889196
-	.long	392241896
-	.long	1024252809
-	.long	1778008064
-	.long	1070906467
-	.long	1536107943
-	.long	1023949300
-	.long	2937184768
-	.long	1070923762
-	.long	3541062251
-	.long	1019448646
-	.long	1144442880
-	.long	1070941082
-	.long	3691683781
-	.long	1022123948
-	.long	2410165504
-	.long	1070958426
-	.long	1804181960
-	.long	1023945221
-	.long	4174350848
-	.long	1070975795
-	.long	2016094861
-	.long	1021716585
-	.long	3897012480
-	.long	1070993190
-	.long	175294410
-	.long	1023703404
-	.long	3353623040
-	.long	1071010611
-	.long	167973242
-	.long	1023240839
-	.long	45671168
-	.long	1071028059
-	.long	2166856113
-	.long	1021565413
-	.long	86063872
-	.long	1071045533
-	.long	2676254727
-	.long	1023985299
-	.long	1019772672
-	.long	1071063034
-	.long	989043593
-	.long	1021549587
-	.long	414297344
-	.long	1071080563
-	.long	3960972046
-	.long	1024307251
-	.long	155173120
-	.long	1071098120
-	.long	1830919291
-	.long	1021592251
-	.long	2151562240
-	.long	1071115705
-	.long	405408666
-	.long	1023423128
-	.long	4041854720
-	.long	1071133319
-	.long	2043497827
-	.long	1024411503
-	.long	3489224192
-	.long	1071150963
-	.long	3072215864
-	.long	1022698635
-	.long	2477196288
-	.long	1071168637
-	.long	1812195139
-	.long	1022689192
-	.long	3015298816
-	.long	1071186341
-	.long	764841969
-	.long	1021027331
-	.long	2844731136
-	.long	1071204076
-	.long	2878117321
-	.long	1019116513
-	.long	4028950528
-	.long	1071221842
-	.long	698911452
-	.long	1023265602
-	.long	69441536
-	.long	1071239641
-	.long	3253467847
-	.long	1020795075
-	.long	1676209920
-	.long	1071257471
-	.long	4272431167
-	.long	1022873982
-	.long	2408752384
-	.long	1071275334
-	.long	648519100
-	.long	1024385717
-	.long	151623680
-	.long	1071293231
-	.long	345257017
-	.long	1019561408
-	.long	1410154240
-	.long	1071311161
-	.long	197863993
-	.long	1023224207
-	.long	4131351552
-	.long	1071329125
-	.long	2620801789
-	.long	1024411169
-	.long	1999664384
-	.long	1071347125
-	.long	3952692616
-	.long	1024168086
-	.long	1617668864
-	.long	1071365160
-	.long	3019889809
-	.long	1021907692
-	.long	1032074240
-	.long	1071383231
-	.long	59469899
-	.long	1023656194
-	.long	2619492096
-	.long	1071401338
-	.long	1417526820
-	.long	1021457783
-	.long	202429440
-	.long	1071419483
-	.long	2927667935
-	.long	1019175447
-	.long	525044224
-	.long	1071437665
-	.long	38166811
-	.long	1023981879
-	.long	1779258880
-	.long	1071455885
-	.long	481252500
-	.long	1023310234
-	.long	2195673600
-	.long	1071474144
-	.long	3962395981
-	.long	1021339088
-	.long	44573696
-	.long	1071492443
-	.long	3936281395
-	.long	1023014829
-	.long	2226905344
-	.long	1071510781
-	.long	1515320476
-	.long	1024320623
-	.long	2800512512
-	.long	1071529160
-	.long	1225403697
-	.long	1021081846
-	.long	161113600
-	.long	1071547581
-	.long	3064809733
-	.long	1024173917
-	.long	1338410240
-	.long	1071566043
-	.long	2027604973
-	.long	1024362526
-	.long	522433280
-	.long	1071584548
-	.long	2055171723
-	.long	1023858825
-	.long	539595776
-	.long	1071603096
-	.long	3868820135
-	.long	1022936424
-	.long	4264017664
-	.long	1071621687
-	.long	3228065145
-	.long	1023479578
-	.long	1733924096
-	.long	1071640324
-	.long	3511934475
-	.long	1022496355
-	.long	108880384
-	.long	1071651839
-	.long	615880967
-	.long	1023519706
-	.long	3517856512
-	.long	1071661202
-	.long	3113108559
-	.long	1025190289
-	.long	4043153152
-	.long	1071670589
-	.long	1571836218
-	.long	1023106116
-	.long	3251299072
-	.long	1071680000
-	.long	3444076102
-	.long	1022187841
-	.long	2736921600
-	.long	1071689435
-	.long	272771483
-	.long	1025095280
-	.long	3897698560
-	.long	1071703633
-	.long	2075390188
-	.long	1022489022
-	.long	3209485056
-	.long	1071722652
-	.long	1438094065
-	.long	1021844944
-	.long	3781432064
-	.long	1071741774
-	.long	1675017145
-	.long	1024143828
-	.long	2684184064
-	.long	1071761003
-	.long	2259963753
-	.long	1024731393
-	.long	1840489728
-	.long	1071780342
-	.long	3372883597
-	.long	1023431408
-	.long	3764087808
-	.long	1071799794
-	.long	3307523102
-	.long	1024485788
-	.long	3006232320
-	.long	1071819364
-	.long	3088971966
-	.long	1025213251
-	.long	3374881280
-	.long	1071839055
-	.long	834437749
-	.long	1025236452
-	.long	797284864
-	.long	1071858872
-	.long	3122663941
-	.long	1025320473
-	.long	545765120
-	.long	1071878818
-	.long	826539625
-	.long	1022450955
-	.long	107562240
-	.long	1071898898
-	.long	339584600
-	.long	1022481255
-	.long	2123649024
-	.long	1071919116
-	.long	3912959833
-	.long	1024321009
-	.long	1562385664
-	.long	1071939478
-	.long	2846067230
-	.long	1023343981
-	.long	2963085824
-	.long	1071959988
-	.long	954548627
-	.long	1021475211
-	.long	3325550592
-	.long	1071980652
-	.long	3459651155
-	.long	1025305573
-	.long	775752448
-	.long	1072001476
-	.long	3582746667
-	.long	1023859460
-	.long	3238590720
-	.long	1072022464
-	.long	634636162
-	.long	1024472353
-	.long	2758801920
-	.long	1072043624
-	.long	3078216319
-	.long	1025304516
-	.long	1370319104
-	.long	1072064962
-	.long	2570569078
-	.long	1025099442
-	.long	2615805184
-	.long	1072086484
-	.long	3729933412
-	.long	1024605112
-	.long	3077336576
-	.long	1072108198
-	.long	1948916066
-	.long	1024781603
-	.long	1099528192
-	.long	1072130112
-	.long	3139143157
-	.long	1023729360
-	.long	1231903232
-	.long	1072152233
-	.long	1349513477
-	.long	1024737515
-	.long	1507504128
-	.long	1072174570
-	.long	3484516322
-	.long	1024000959
-	.long	2214659840
-	.long	1072197132
-	.long	2563820917
-	.long	1025225535
-	.long	1804739840
-	.long	1072219929
-	.long	760038746
-	.long	1024482855
-	.long	1413746688
-	.long	1072242971
-	.long	3401734714
-	.long	1025129838
-	.long	821409536
-	.long	1072266269
-	.long	3729772551
-	.long	1025484796
-	.long	3031825664
-	.long	1072289834
-	.long	122256749
-	.long	1024752594
-	.long	1710784256
-	.long	1072313680
-	.long	1518205483
-	.long	1024724809
-	.long	3025265152
-	.long	1072337819
-	.long	409951989
-	.long	1022835555
-	.long	287769088
-	.long	1072362267
-	.long	800355594
-	.long	1022484850
-	.long	198179840
-	.long	1072387038
-	.long	3502926213
-	.long	1024209373
-	.long	1909130496
-	.long	1072412149
-	.long	3064694319
-	.long	1025380823
-	.long	1941732096
-	.long	1072437619
-	.long	4112930390
-	.long	1024294679
-	.long	3492010496
-	.long	1072463467
-	.long	2684918107
-	.long	1023220233
-	.long	81959680
-	.long	1072489716
-	.long	220021366
-	.long	1020635131
-	.long	2297837056
-	.long	1072516387
-	.long	4027683826
-	.long	1021041185
-	.long	270404096
-	.long	1072543508
-	.long	2012766065
-	.long	1021780753
-	.long	3667376896
-	.long	1072571105
-	.long	2727981522
-	.long	1023009874
-	.long	330400256
-	.long	1072599212
-	.long	2940017003
-	.long	1025393439
-	.long	1119293952
-	.long	1072627861
-	.long	1608550416
-	.long	1022675612
-	.long	3536155904
-	.long	1072657091
-	.long	349665778
-	.long	1025156751
-	.long	3078046720
-	.long	1072686946
-	.long	2016159996
-	.long	1022193169
-	.long	455228416
-	.long	1072705361
-	.long	1908539328
-	.long	1026126332
-	.long	1871505664
-	.long	1072720988
-	.long	2784700894
-	.long	1025922277
-	.long	1630994432
-	.long	1072737010
-	.long	361107678
-	.long	1022887244
-	.long	2084558336
-	.long	1072753462
-	.type	Tbl_addr,@object
-	.size	Tbl_addr,3840
-	.space 768, 0x00 	# pad
-	.align 16
-SIGNMASK:
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.type	SIGNMASK,@object
-	.size	SIGNMASK,16
-	.align 16
-HALFMASK2:
-	.long	0
-	.long	2147483584
-	.long	0
-	.long	0
-	.type	HALFMASK2,@object
-	.size	HALFMASK2,16
-	.align 16
-PI_BY_2:
-	.long	856972295
-	.long	1016178214
-	.long	1413754136
-	.long	1073291771
-	.type	PI_BY_2,@object
-	.size	PI_BY_2,16
-	.align 16
-cv2:
-	.long	780903145
-	.long	1066854586
-	.long	858993459
-	.long	1068708659
-	.long	3340530119
-	.long	1067392113
-	.long	1431655765
-	.long	1069897045
-	.long	1321528399
-	.long	1066517740
-	.long	3067833783
-	.long	1067899757
-	.long	2021159460
-	.long	1065855096
-	.long	2576980378
-	.long	1066178969
-	.type	cv2,@object
-	.size	cv2,64
-	.align 16
-HALFMASK:
-	.long	4160749568
-	.long	4294967295
-	.long	4160749568
-	.long	4294967295
-	.type	HALFMASK,@object
-	.size	HALFMASK,16
-	.align 4
-ONEMASK:
-	.long	0
-	.long	1072693248
-	.type	ONEMASK,@object
-	.size	ONEMASK,8
-	.align 4
-TMASK:
-	.long	0
-	.long	4294950912
-	.type	TMASK,@object
-	.size	TMASK,8
-	.align 4
-cv:
-	.long	1431655765
-	.long	1069897045
-	.long	858993459
-	.long	1068708659
-	.long	3067833783
-	.long	1067899757
-	.type	cv,@object
-	.size	cv,24
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_asin.1-.
-	.4byte ..___tag_value_asin.5-..___tag_value_asin.1
-	.2byte 0x0400
-	.4byte ..___tag_value_asin.3-..___tag_value_asin.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_asin.4-..___tag_value_asin.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/e_atan2.S b/libm/x86_64/e_atan2.S
deleted file mode 100644
index f0ba43c..0000000
--- a/libm/x86_64/e_atan2.S
+++ /dev/null
@@ -1,1242 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//
-//1. The method is based on the relationship of atan2(Y,X) to atan(|Y/X|)
-//   as follows.
-//                   /  sign(Y) atan(|Y/X|)                if X > 0
-//       atan2(Y,X) =
-//                   \  sign(Y)*pi  - sign(Y)*atan(|Y/X|)  if X < 0
-//
-//   Thus, atan2(Y,X) is of the form  atan2(Y,X) = PI + sgn*atan(|Y/X|)
-//   where PI and sgn can be determined by the four possible combinations of
-//   of the pair (sign(X),sign(Y)). We concentrate on the numerical method
-//   for atan(|Y/X|).
-//
-//2. For |Y/X| < 2^(-64), atan(|Y/X|) ~=~ |Y/X|. Hence, atan2(Y,X) is  Y/X
-//   if X > 0, and sign(Y)*pi otherwise.
-//3. For |Y/X| >= 2^(65), atan(|Y/X|) ~=~ pi/2. Hence atan2(Y,X) is sign(Y)pi/2.
-//4. For 2^(-64) <= |Y/X| < 2^(-5), atan(|Y/X|) is approximated by a polynomial
-//   of the form  Z + Z*E*polynomial(E), where Z = |Y/X| and E = Z*Z.
-//5. For |Y/X| > 2^(5), atan(|Y/X|) = pi/2 + atan(-|X/Y|), and atan(-|X/Y|) is
-//   calculated using the polynomial in 4 above.
-//6. For 2^(-5) <= |Y/X| <= 2^(5), we employ a table lookup method. First,
-//   we obtain B = 2^k * 1.b1 b2 b3 b4 = 2^k * (1+k/16) that approximate
-//   |Y/X| to approximately 5 significant bits. Hence, atan(|Y/X|) is
-//
-//      atan(|Y/X|)  =  atan(B) + atan(Z), where  Z = (|Y|-B|X|)/(|X|+B|Y|).
-//                  ~=~   tau   + Z + Z*E*polynomial(E), where E = Z*Z.
-//
-//   B has the range from 2^(-6)*(1+14/16) to 2^5 = 2^(5)*(1+0/16), totally
-//   163 possible values. These values are calculated beforehand and stored
-//   in a table. The polynomial is the one used in 4.
-//
-// Special cases:
-//  atan2(+-0, +0) = +-0
-//  atan2(+-0, -0) = +-pi
-//  atan2(+-0, x) = +-0, for x > 0, and +-pi, for x < 0
-//  atan2(y, +-0) = +pi/2 for y > 0, and -pi/2 for y < 0
-//  atan2(+-y, +INF) = +-0, for finite y > 0
-//  atan2(+-y, -INF) = +-pi, for finite y > 0
-//  atan2(+-INF, x) = +-pi/2, for finite x
-//  atan2(+-INF, +INF) = +-pi/4
-//  atan2(+-INF, -INF) = +-3*pi/4
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  atan2
-ENTRY(atan2)
-# parameter 1: %xmm0
-# parameter 2: %xmm1
-..B1.1:
-..___tag_value_atan2.1:
-        subq      $24, %rsp
-..___tag_value_atan2.3:
-        movsd     %xmm0, (%rsp)
-        movsd     %xmm1, 8(%rsp)
-..B1.2:
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        subl      $14448, %eax
-        cmpl      $3840, %eax
-        ja        .L_2TAG_PACKET_0.0.2
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        subl      $14448, %eax
-        cmpl      $3840, %eax
-        ja        .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        unpcklpd  %xmm1, %xmm0
-        xorpd     %xmm5, %xmm5
-        xorpd     %xmm3, %xmm3
-        movl      $2048, %eax
-        pinsrw    $3, %eax, %xmm5
-        paddw     %xmm1, %xmm5
-        psrlq     $29, %xmm5
-        rcpss     %xmm5, %xmm3
-        xorpd     %xmm4, %xmm4
-        movl      $14336, %ecx
-        pinsrw    $3, %ecx, %xmm4
-        psllq     $29, %xmm3
-        paddw     %xmm4, %xmm3
-        mulsd     %xmm0, %xmm3
-        xorpd     %xmm2, %xmm2
-        xorpd     %xmm6, %xmm6
-        xorpd     %xmm7, %xmm7
-        movl      $32768, %eax
-        pinsrw    $2, %eax, %xmm6
-        movl      $32767, %ecx
-        pinsrw    $3, %ecx, %xmm7
-        paddd     %xmm6, %xmm3
-        andpd     %xmm7, %xmm3
-        movq      %xmm3, %xmm5
-        pextrw    $3, %xmm3, %eax
-        movl      $16448, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        minsd     %xmm2, %xmm3
-        movmskpd  %xmm0, %edx
-        psllq     $1, %xmm0
-        psrlq     $1, %xmm0
-        cmpsd     $2, %xmm2, %xmm5
-        psllq     $1, %xmm1
-        psrlq     $1, %xmm1
-        movq      %xmm1, %xmm6
-        movq      %xmm1, %xmm7
-        movq      %xmm0, %xmm2
-        movl      $0, %ecx
-        pinsrw    $0, %ecx, %xmm6
-        subsd     %xmm6, %xmm7
-        movq      %xmm0, %xmm4
-        mulsd     %xmm3, %xmm6
-        mulsd     %xmm3, %xmm4
-        mulsd     %xmm3, %xmm7
-        andpd     %xmm5, %xmm0
-        subsd     %xmm6, %xmm0
-        andpd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm4
-        subsd     %xmm7, %xmm0
-        andl      $32752, %eax
-        subl      $16286, %eax
-        cmpl      $1121, %eax
-        ja        .L_2TAG_PACKET_3.0.2
-        divsd     %xmm4, %xmm0
-        pextrw    $3, %xmm3, %ecx
-        movsd     a2(%rip), %xmm2
-        movsd     b2(%rip), %xmm3
-        pextrw    $0, %xmm5, %eax
-        addl      %edx, %edx
-        lea       P_TBL(%rip), %r8
-        movapd    (%r8,%rdx,8), %xmm6
-        lea       SGN_TBL(%rip), %r8
-        movapd    (%r8,%rdx,8), %xmm1
-        subl      $16286, %ecx
-        notl      %eax
-        andl      $1, %eax
-        addl      %eax, %ecx
-        addl      %ecx, %ecx
-        lea       ATAN_TBL(%rip), %r8
-        movapd    (%r8,%rcx,8), %xmm5
-        xorpd     %xmm1, %xmm5
-        addpd     %xmm6, %xmm5
-        movq      %xmm5, %xmm6
-        unpckhpd  %xmm5, %xmm5
-        xorpd     %xmm0, %xmm1
-        movq      %xmm1, %xmm4
-        mulsd     %xmm0, %xmm0
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm3
-        addsd     %xmm6, %xmm1
-        subsd     %xmm1, %xmm6
-        addsd     %xmm4, %xmm6
-        addsd     8+a2(%rip), %xmm2
-        mulsd     %xmm0, %xmm3
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm2, %xmm0
-        addsd     8+b2(%rip), %xmm3
-        mulsd     %xmm3, %xmm0
-        addsd     %xmm6, %xmm0
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_3.0.2:
-        addl      $942, %eax
-        cmpl      $942, %eax
-        ja        .L_2TAG_PACKET_4.0.2
-        xorpd     %xmm4, %xmm4
-        movl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm4
-        divsd     %xmm1, %xmm4
-        addl      %edx, %edx
-        lea       SGN_TBL(%rip), %r8
-        movapd    (%r8,%rdx,8), %xmm6
-        unpcklpd  %xmm3, %xmm3
-        xorpd     %xmm6, %xmm0
-        xorpd     %xmm6, %xmm2
-        xorpd     %xmm6, %xmm3
-        lea       P_TBL2(%rip), %r8
-        movapd    (%r8,%rdx,8), %xmm7
-        movsd     a2(%rip), %xmm1
-        movsd     b2(%rip), %xmm5
-        lea       SELECT_B(%rip), %r8
-        andpd     (%r8,%rdx,8), %xmm3
-        mulsd     %xmm4, %xmm2
-        mulsd     %xmm4, %xmm0
-        movq      %xmm2, %xmm6
-        mulsd     %xmm2, %xmm2
-        mulsd     %xmm2, %xmm1
-        addsd     %xmm2, %xmm5
-        mulsd     %xmm2, %xmm6
-        addsd     8+a2(%rip), %xmm1
-        mulsd     %xmm2, %xmm5
-        addsd     %xmm0, %xmm7
-        addpd     %xmm3, %xmm7
-        mulsd     %xmm6, %xmm1
-        addsd     8+b2(%rip), %xmm5
-        mulsd     %xmm1, %xmm5
-        addsd     %xmm7, %xmm5
-        pshufd    $238, %xmm7, %xmm0
-        addsd     %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        movsd     8(%rsp), %xmm1
-        movsd     (%rsp), %xmm0
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      %eax, %ecx
-        jg        .L_2TAG_PACKET_5.0.2
-        pextrw    $3, %xmm1, %ecx
-        cmpl      $32767, %ecx
-        jg        .L_2TAG_PACKET_6.0.2
-        divsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_6.0.2:
-        andpd     SGNMASK(%rip), %xmm0
-        movsd     pi_table(%rip), %xmm2
-        xorpd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_5.0.2:
-        andpd     SGNMASK(%rip), %xmm0
-        movsd     pi2_table(%rip), %xmm2
-        xorpd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-.L_2TAG_PACKET_1.0.2:
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %ecx
-        je        .L_2TAG_PACKET_7.0.2
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_8.0.2
-        movsd     POW55(%rip), %xmm3
-        movl      $1024, %edx
-        movsd     INVEXPMASK(%rip), %xmm4
-        xorpd     %xmm6, %xmm6
-        movsd     EXPMASK(%rip), %xmm7
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_9.0.2
-.L_2TAG_PACKET_10.0.2:
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_11.0.2
-.L_2TAG_PACKET_12.0.2:
-        addl      %ecx, %edx
-        subl      %eax, %edx
-        cmpl      $2048, %edx
-        ja        .L_2TAG_PACKET_4.0.2
-        addl      $15344, %edx
-        pinsrw    $3, %edx, %xmm6
-        andpd     %xmm4, %xmm0
-        andpd     %xmm4, %xmm1
-        orpd      %xmm6, %xmm0
-        orpd      %xmm7, %xmm1
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_9.0.2:
-        subl      $880, %edx
-        mulsd     %xmm3, %xmm0
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_13.0.2
-        jmp       .L_2TAG_PACKET_10.0.2
-.L_2TAG_PACKET_11.0.2:
-        addl      $880, %edx
-        mulsd     %xmm3, %xmm1
-        pextrw    $3, %xmm1, %eax
-        andl      $32752, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_14.0.2
-        jmp       .L_2TAG_PACKET_12.0.2
-.L_2TAG_PACKET_7.0.2:
-        movd      %xmm0, %edx
-        movq      %xmm0, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        andl      $1048575, %ecx
-        orl       %edx, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_15.0.2
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        cmpl      $32752, %eax
-        jae       .L_2TAG_PACKET_16.0.2
-        movapd    pi2_table(%rip), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_15.0.2:
-        addsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_16.0.2:
-        movd      %xmm1, %eax
-        movq      %xmm1, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        movl      $-2147483648, %edx
-        andl      %ecx, %edx
-        andl      $1048575, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_17.0.2
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_18.0.2
-        movapd    pi4_table(%rip), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_17.0.2:
-        movq      %xmm1, %xmm0
-        addsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_18.0.2:
-        movapd    pi4_table(%rip), %xmm5
-        movapd    pi2_table(%rip), %xmm6
-        addpd     %xmm6, %xmm5
-        pshufd    $238, %xmm5, %xmm6
-        addpd     %xmm6, %xmm5
-        orpd      %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_8.0.2:
-        movd      %xmm1, %eax
-        movq      %xmm1, %xmm2
-        psrlq     $32, %xmm2
-        movd      %xmm2, %ecx
-        movl      $-2147483648, %edx
-        andl      %ecx, %edx
-        andl      $1048575, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        jne       .L_2TAG_PACKET_17.0.2
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_19.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_19.0.2:
-        movapd    pi_table(%rip), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_13.0.2:
-        pextrw    $3, %xmm1, %edx
-        andl      $32768, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_20.0.2
-        movapd    pi_table(%rip), %xmm5
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        comisd    %xmm0, %xmm1
-        orpd      %xmm5, %xmm0
-        je        .L_2TAG_PACKET_21.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_20.0.2:
-        comisd    %xmm0, %xmm1
-        je        .L_2TAG_PACKET_21.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_14.0.2:
-        movapd    pi2_table(%rip), %xmm5
-        psrlq     $63, %xmm0
-        psllq     $63, %xmm0
-        pshufd    $238, %xmm5, %xmm4
-        addsd     %xmm4, %xmm5
-        orpd      %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_21.0.2:
-        movq      %xmm0, 16(%rsp)
-..B1.3:
-        movq      16(%rsp), %xmm0
-.L_2TAG_PACKET_22.0.2:
-..B1.5:
-        addq      $24, %rsp
-..___tag_value_atan2.4:
-        ret       
-..___tag_value_atan2.5:
-END(atan2)
-# -- End  atan2
-	.section .rodata, "a"
-	.align 16
-	.align 16
-a2:
-	.long	2006262985
-	.long	1069310863
-	.long	2358449471
-	.long	3217342131
-	.type	a2,@object
-	.size	a2,16
-	.align 16
-b2:
-	.long	3845454352
-	.long	1069952297
-	.long	2829679149
-	.long	1073771565
-	.type	b2,@object
-	.size	b2,16
-	.align 16
-P_TBL:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	3221823995
-	.long	856972295
-	.long	3164710438
-	.type	P_TBL,@object
-	.size	P_TBL,64
-	.align 16
-SGN_TBL:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.type	SGN_TBL,@object
-	.size	SGN_TBL,64
-	.align 16
-ATAN_TBL:
-	.long	3390881280
-	.long	1067318733
-	.long	1411116779
-	.long	1018950063
-	.long	2985987840
-	.long	1067384211
-	.long	2088903695
-	.long	1018086027
-	.long	3148445184
-	.long	1067449685
-	.long	2044163806
-	.long	1017271335
-	.long	3667629184
-	.long	1067515494
-	.long	2353092775
-	.long	1019967309
-	.long	1546568832
-	.long	1067580954
-	.long	611991315
-	.long	1017602584
-	.long	3815996800
-	.long	1067646404
-	.long	466038598
-	.long	1019686426
-	.long	4050241920
-	.long	1067711845
-	.long	3265026328
-	.long	1019626952
-	.long	120454912
-	.long	1067777277
-	.long	1542207696
-	.long	1020155608
-	.long	2784639744
-	.long	1067842697
-	.long	3883834623
-	.long	1018602870
-	.long	1328010624
-	.long	1067908107
-	.long	1791097456
-	.long	1019053126
-	.long	2217794048
-	.long	1067973505
-	.long	551619938
-	.long	1018494194
-	.long	3333520000
-	.long	1068038891
-	.long	2390331823
-	.long	1019033022
-	.long	2557052032
-	.long	1068104265
-	.long	2423976108
-	.long	1019728674
-	.long	2067649536
-	.long	1068169626
-	.long	3757397745
-	.long	1018672362
-	.long	4047094784
-	.long	1068234973
-	.long	481613184
-	.long	1019275104
-	.long	2089853184
-	.long	1068300307
-	.long	1733914374
-	.long	1020124677
-	.long	2678003840
-	.long	1068365626
-	.long	1373600282
-	.long	1013935474
-	.long	3706496128
-	.long	1068430930
-	.long	1000610902
-	.long	1019673285
-	.long	3073179008
-	.long	1068496219
-	.long	1497143008
-	.long	1019900342
-	.long	2803716736
-	.long	1068562846
-	.long	1476677416
-	.long	1019444094
-	.long	3204984128
-	.long	1068628077
-	.long	1192335905
-	.long	1018748628
-	.long	831146624
-	.long	1068693273
-	.long	2733586224
-	.long	1018823295
-	.long	243029376
-	.long	1068758431
-	.long	950106081
-	.long	1019046675
-	.long	1735561920
-	.long	1068823549
-	.long	3546440856
-	.long	1020104712
-	.long	1339217792
-	.long	1068888626
-	.long	3028812387
-	.long	1019818321
-	.long	3706342144
-	.long	1068953659
-	.long	3814564029
-	.long	1017763871
-	.long	637726976
-	.long	1069018648
-	.long	3584007699
-	.long	1017976868
-	.long	1148779264
-	.long	1069083589
-	.long	2282532133
-	.long	1019483954
-	.long	1406131392
-	.long	1069148481
-	.long	1547359113
-	.long	1019786342
-	.long	1908875904
-	.long	1069213322
-	.long	1315508410
-	.long	1020009473
-	.long	3194947520
-	.long	1069278110
-	.long	3845393201
-	.long	1015803761
-	.long	1547487744
-	.long	1069342844
-	.long	3863107865
-	.long	1019810104
-	.long	1881061952
-	.long	1069407521
-	.long	4288343548
-	.long	1019687581
-	.long	563086336
-	.long	1069472140
-	.long	2582230241
-	.long	1020099350
-	.long	2594975552
-	.long	1069536698
-	.long	2306443764
-	.long	1019667244
-	.long	3438545024
-	.long	1069606573
-	.long	957455549
-	.long	1015587735
-	.long	4211357472
-	.long	1069670906
-	.long	2611778754
-	.long	1017877214
-	.long	3002835424
-	.long	1069735101
-	.long	235580458
-	.long	1020211685
-	.long	3905315424
-	.long	1069799150
-	.long	3630647617
-	.long	1018736849
-	.long	2849656576
-	.long	1069863047
-	.long	2412165062
-	.long	1019693004
-	.long	507429472
-	.long	1069926785
-	.long	1397750723
-	.long	1018412717
-	.long	2307470272
-	.long	1069990356
-	.long	1796470904
-	.long	1019796181
-	.long	1271814912
-	.long	1070053755
-	.long	189761565
-	.long	1016149115
-	.long	3800538144
-	.long	1070116974
-	.long	2524871582
-	.long	1018263353
-	.long	3916203552
-	.long	1070180008
-	.long	127848658
-	.long	1017672664
-	.long	457192032
-	.long	1070242851
-	.long	4020400938
-	.long	1019823010
-	.long	1385324704
-	.long	1070305495
-	.long	564511179
-	.long	1016079094
-	.long	2322869856
-	.long	1070367935
-	.long	2347103319
-	.long	1018927760
-	.long	3743438624
-	.long	1070430165
-	.long	877973862
-	.long	1019638162
-	.long	2392255552
-	.long	1070492180
-	.long	2432782267
-	.long	1018872629
-	.long	4180443328
-	.long	1070553973
-	.long	3102990015
-	.long	1020093101
-	.long	2547540832
-	.long	1070636485
-	.long	3877738253
-	.long	1017300424
-	.long	2735468912
-	.long	1070697461
-	.long	2446470256
-	.long	1019235378
-	.long	542633792
-	.long	1070757943
-	.long	583606328
-	.long	1018624131
-	.long	923265984
-	.long	1070817911
-	.long	1793926708
-	.long	1019714161
-	.long	918728448
-	.long	1070877348
-	.long	3726463586
-	.long	1019433296
-	.long	2572275008
-	.long	1070936237
-	.long	1845354238
-	.long	1019459238
-	.long	50974688
-	.long	1070994564
-	.long	983808064
-	.long	1016685418
-	.long	1105518320
-	.long	1071052313
-	.long	2357496692
-	.long	1015139882
-	.long	1264825328
-	.long	1071109472
-	.long	2244129354
-	.long	1019046344
-	.long	961157920
-	.long	1071166029
-	.long	3124185339
-	.long	1018541776
-	.long	1162701584
-	.long	1071221973
-	.long	1279780948
-	.long	1019268918
-	.long	3284935664
-	.long	1071277294
-	.long	2670033472
-	.long	1019833744
-	.long	497441888
-	.long	1071331985
-	.long	1032737410
-	.long	1019795212
-	.long	3377383904
-	.long	1071386036
-	.long	2356897182
-	.long	1020205553
-	.long	1126962000
-	.long	1071439443
-	.long	3723724586
-	.long	1015212418
-	.long	90291008
-	.long	1071492199
-	.long	4178672431
-	.long	1020186971
-	.long	190059536
-	.long	1071595741
-	.long	1763589807
-	.long	1019162163
-	.long	2497392840
-	.long	1071670654
-	.long	3036997041
-	.long	1020204325
-	.long	2616971944
-	.long	1071719773
-	.long	300151069
-	.long	1017041957
-	.long	2883518128
-	.long	1071767563
-	.long	2203981414
-	.long	1019190108
-	.long	1496354352
-	.long	1071814030
-	.long	332287966
-	.long	1016846435
-	.long	483276728
-	.long	1071859184
-	.long	653845024
-	.long	1018830914
-	.long	3097401072
-	.long	1071903039
-	.long	1514746408
-	.long	1019278972
-	.long	2737217248
-	.long	1071945615
-	.long	1358845067
-	.long	1017268275
-	.long	2072577560
-	.long	1071986933
-	.long	3041024735
-	.long	1019929672
-	.long	2266405656
-	.long	1072027017
-	.long	1271261130
-	.long	1012925070
-	.long	958652544
-	.long	1072065894
-	.long	2158017058
-	.long	1019955372
-	.long	3312993840
-	.long	1072103591
-	.long	765809169
-	.long	1019114443
-	.long	3177001304
-	.long	1072140139
-	.long	144180084
-	.long	1019822186
-	.long	3071642184
-	.long	1072175568
-	.long	4004602424
-	.long	1019420740
-	.long	4283953648
-	.long	1072209909
-	.long	1511950430
-	.long	1020176966
-	.long	1413754136
-	.long	1072243195
-	.long	856972295
-	.long	1015129638
-	.long	4073202944
-	.long	1072306725
-	.long	4068194804
-	.long	1019714860
-	.long	946117760
-	.long	1072366415
-	.long	694980733
-	.long	1020150135
-	.long	3980632032
-	.long	1072422512
-	.long	1313251280
-	.long	1019948709
-	.long	1468297112
-	.long	1072475260
-	.long	330111143
-	.long	1019809198
-	.long	3478063816
-	.long	1072524887
-	.long	2930067044
-	.long	1017784081
-	.long	1153979856
-	.long	1072571613
-	.long	2225786102
-	.long	1017634481
-	.long	2089828808
-	.long	1072615641
-	.long	474621367
-	.long	1017043414
-	.long	3531732632
-	.long	1072657163
-	.long	2276396220
-	.long	1018757240
-	.long	775214612
-	.long	1072694803
-	.long	3209744818
-	.long	1019963015
-	.long	662307284
-	.long	1072713319
-	.long	1381696763
-	.long	1019763781
-	.long	1192776652
-	.long	1072730830
-	.long	3017932994
-	.long	1015179769
-	.long	744202396
-	.long	1072747407
-	.long	2073854034
-	.long	1019512292
-	.long	8337908
-	.long	1072763115
-	.long	16004448
-	.long	1019599514
-	.long	3589868768
-	.long	1072778013
-	.long	1374369804
-	.long	1018019237
-	.long	121647320
-	.long	1072792159
-	.long	128481634
-	.long	1018115438
-	.long	2464923204
-	.long	1072805601
-	.long	1787331214
-	.long	1016798022
-	.long	4093304372
-	.long	1072830562
-	.long	3306868969
-	.long	1019384078
-	.long	1436891684
-	.long	1072853231
-	.long	676347266
-	.long	1017302183
-	.long	1104571840
-	.long	1072873890
-	.long	2870400285
-	.long	1019938149
-	.long	2037009832
-	.long	1072892781
-	.long	2956702105
-	.long	1016472908
-	.long	3139037960
-	.long	1072910111
-	.long	916057147
-	.long	1018364335
-	.long	1826698064
-	.long	1072926058
-	.long	2171961098
-	.long	1019669816
-	.long	1353941060
-	.long	1072940774
-	.long	1722928782
-	.long	1019926215
-	.long	1803191644
-	.long	1072954391
-	.long	1547878639
-	.long	1020259262
-	.long	1092591296
-	.long	1072967024
-	.long	3070107923
-	.long	1018320401
-	.long	2205372832
-	.long	1072978772
-	.long	787328196
-	.long	1014621351
-	.long	1291577100
-	.long	1072989723
-	.long	2964757301
-	.long	1020242528
-	.long	4234512804
-	.long	1072999952
-	.long	3136030038
-	.long	1017522144
-	.long	3248069132
-	.long	1073009528
-	.long	1506192355
-	.long	1018050472
-	.long	3932628500
-	.long	1073018509
-	.long	1045823554
-	.long	1019946655
-	.long	4195697848
-	.long	1073026948
-	.long	233443322
-	.long	1018917447
-	.long	2501811452
-	.long	1073034892
-	.long	901427976
-	.long	1017333852
-	.long	866379428
-	.long	1073049455
-	.long	2437443742
-	.long	1019678792
-	.long	1376865888
-	.long	1073062480
-	.long	3365790232
-	.long	1014547152
-	.long	3290094268
-	.long	1073074195
-	.long	3898947415
-	.long	1018683566
-	.long	354764884
-	.long	1073084787
-	.long	3854322404
-	.long	1019662058
-	.long	3332975496
-	.long	1073094406
-	.long	3171701655
-	.long	1017830922
-	.long	1141460088
-	.long	1073103181
-	.long	3946082701
-	.long	1020032019
-	.long	745761284
-	.long	1073111216
-	.long	1347210591
-	.long	1019106121
-	.long	1673304508
-	.long	1073118600
-	.long	1760606642
-	.long	1017324577
-	.long	983388240
-	.long	1073125409
-	.long	3740651204
-	.long	1019514104
-	.long	3895509100
-	.long	1073131706
-	.long	2409629983
-	.long	1020069322
-	.long	2128523668
-	.long	1073137548
-	.long	3045605368
-	.long	1018579174
-	.long	2075485692
-	.long	1073142981
-	.long	3720571789
-	.long	1017557436
-	.long	121855976
-	.long	1073148047
-	.long	2391744767
-	.long	1020160645
-	.long	4181733780
-	.long	1073152780
-	.long	995028816
-	.long	1019681295
-	.long	2887813280
-	.long	1073157214
-	.long	218733247
-	.long	1020003509
-	.long	2862180896
-	.long	1073161375
-	.long	2043806490
-	.long	1018602288
-	.long	3909375184
-	.long	1073168973
-	.long	1559903412
-	.long	1020103444
-	.long	3533966292
-	.long	1073175738
-	.long	734884149
-	.long	1018462962
-	.long	3815044608
-	.long	1073181799
-	.long	3630523428
-	.long	1017250093
-	.long	739639376
-	.long	1073187261
-	.long	4167476661
-	.long	1020008277
-	.long	1068309648
-	.long	1073192207
-	.long	2110061437
-	.long	1019295858
-	.long	2350566352
-	.long	1073196707
-	.long	582596516
-	.long	1018568821
-	.long	2529520024
-	.long	1073200819
-	.long	745552787
-	.long	1019053165
-	.long	1841667508
-	.long	1073204591
-	.long	3982568700
-	.long	1016503327
-	.long	2242261080
-	.long	1073208063
-	.long	3433582258
-	.long	1016196763
-	.long	715134328
-	.long	1073211270
-	.long	355901358
-	.long	1020087916
-	.long	2700735876
-	.long	1073214240
-	.long	3640957736
-	.long	1019780205
-	.long	141607580
-	.long	1073217000
-	.long	2488245051
-	.long	1020262395
-	.long	287934404
-	.long	1073219570
-	.long	2392691085
-	.long	1019883292
-	.long	2363373988
-	.long	1073221969
-	.long	4194561737
-	.long	1019237447
-	.long	3829340424
-	.long	1073224214
-	.long	429455526
-	.long	1019490975
-	.long	1988805928
-	.long	1073226320
-	.long	3029848706
-	.long	1018104889
-	.long	1647572320
-	.long	1073230161
-	.long	10289938
-	.long	1017394880
-	.long	3988000624
-	.long	1073233576
-	.long	1957559169
-	.long	1019434816
-	.long	4263843944
-	.long	1073236633
-	.long	204710264
-	.long	1019908761
-	.long	663197724
-	.long	1073239386
-	.long	1921757578
-	.long	1019778948
-	.long	3560800700
-	.long	1073241876
-	.long	3994348896
-	.long	1019230192
-	.long	2441785656
-	.long	1073244141
-	.long	871468611
-	.long	1014800505
-	.long	3277400272
-	.long	1073246209
-	.long	4092218139
-	.long	1020040842
-	.long	3951990120
-	.long	1073248105
-	.long	4276546478
-	.long	1019763677
-	.long	2737338540
-	.long	1073249850
-	.long	252776012
-	.long	1018794951
-	.long	1511361316
-	.long	1073251461
-	.long	3119653999
-	.long	1018514803
-	.long	3969162516
-	.long	1073252952
-	.long	1037069016
-	.long	1016792900
-	.long	413985240
-	.long	1073254338
-	.long	4110171432
-	.long	1020001345
-	.long	3681283576
-	.long	1073255627
-	.long	1463092818
-	.long	1020260354
-	.long	3146455488
-	.long	1073256831
-	.long	1031209123
-	.long	1016554799
-	.long	95214512
-	.long	1073257958
-	.long	1373808632
-	.long	1019493031
-	.long	4250240828
-	.long	1073259013
-	.long	3891047882
-	.long	1020108730
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.type	ATAN_TBL,@object
-	.size	ATAN_TBL,2624
-	.align 16
-P_TBL2:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	856972295
-	.long	1017226790
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	3164710438
-	.long	1413754136
-	.long	3221823995
-	.type	P_TBL2,@object
-	.size	P_TBL2,64
-	.align 16
-SELECT_B:
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.long	4294967295
-	.long	4294967295
-	.long	0
-	.long	0
-	.type	SELECT_B,@object
-	.size	SELECT_B,64
-	.align 16
-SGNMASK:
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.type	SGNMASK,@object
-	.size	SGNMASK,16
-	.align 16
-pi_table:
-	.long	1413754136
-	.long	1074340347
-	.long	856972295
-	.long	1017226790
-	.type	pi_table,@object
-	.size	pi_table,16
-	.align 16
-pi2_table:
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.type	pi2_table,@object
-	.size	pi2_table,16
-	.align 16
-pi4_table:
-	.long	1413754136
-	.long	1072243195
-	.long	856972295
-	.long	1015129638
-	.type	pi4_table,@object
-	.size	pi4_table,16
-	.align 4
-POW55:
-	.long	0
-	.long	1130364928
-	.type	POW55,@object
-	.size	POW55,8
-	.align 4
-INVEXPMASK:
-	.long	4294967295
-	.long	2148532223
-	.type	INVEXPMASK,@object
-	.size	INVEXPMASK,8
-	.align 4
-EXPMASK:
-	.long	0
-	.long	1072693248
-	.type	EXPMASK,@object
-	.size	EXPMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_atan2.1-.
-	.4byte ..___tag_value_atan2.5-..___tag_value_atan2.1
-	.2byte 0x0400
-	.4byte ..___tag_value_atan2.3-..___tag_value_atan2.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_atan2.4-..___tag_value_atan2.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/e_cosh.S b/libm/x86_64/e_cosh.S
deleted file mode 100644
index 97cb389..0000000
--- a/libm/x86_64/e_cosh.S
+++ /dev/null
@@ -1,1372 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  cosh(x)=(exp(x)+exp(-x))/2
-//
-//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//          L2EH+L2EL (upper 26, lower 53 bits)
-//
-//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
-//                              f=0.b1 b2 ... b7, k integer
-//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
-//  Tp stores higher 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
-//
-//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
-//                       for |x| in [1/8,3*2^8)
-//  e^{-|x|}=2^{-k-f}*2^{-r}
-//
-//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
-//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
-//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)
-//
-//  For |x| in [1/8, 3*2^7), cosh(x) is formed as
-//   RN(2^k*Tp+2^{-k}*Tn)+2^k*Tp*P15+2^{-k}*Tn*P`15+2^{-k}*TnL+2^{-k}*Dn+2^k*Dp
-//
-//  For |x| in [3*2^7, 3*2^8), (e^|x|)/2 is returned, and
-//  the result is checked for overflow.
-//
-//  For |x|<1/8, a Taylor polynomial expansion is used (degree 10)
-//  (error bound for polynomial expansion is below 0.501 ulp)
-//
-// Special cases:
-//  cosh(NaN) = quiet NaN, and raise invalid exception
-//  cosh(INF) = that INF
-//  cosh(0)=1
-//  for finite argument, only cosh(0)=1 is exact
-//  For IEEE double
-//  cosh(x) overflows
-//  for x > 710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-
-# -- Begin  cosh
-ENTRY(cosh)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_cosh.1:
-        pushq     %rsi
-..___tag_value_cosh.3:
-..B1.2:
-        movsd     HALFMASK(%rip), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     L2E(%rip), %xmm1
-        movsd     8+L2E(%rip), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     Shifter(%rip), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        andl      $32767, %ecx
-        subl      $16320, %ecx
-        cmpl      $200, %ecx
-        jae       .L_2TAG_PACKET_0.0.2
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        movq      %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        xorpd     %xmm5, %xmm5
-        subsd     %xmm6, %xmm3
-        movapd    cv(%rip), %xmm4
-        addsd     %xmm1, %xmm2
-        movapd    16+cv(%rip), %xmm6
-        subsd     %xmm3, %xmm7
-        movl      $32704, %edx
-        pinsrw    $3, %edx, %xmm5
-        movapd    32+cv(%rip), %xmm1
-        addsd     %xmm7, %xmm2
-        movl      $127, %edx
-        andl      %eax, %edx
-        addl      %edx, %edx
-        shrl      $3, %eax
-        andl      $65520, %eax
-        addl      $16352, %eax
-        xorpd     %xmm0, %xmm0
-        cmpl      $184, %ecx
-        jae       .L_2TAG_PACKET_1.0.2
-        pshufd    $68, %xmm5, %xmm5
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        psubw     %xmm0, %xmm5
-        lea       T2f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm0
-        lea       T2_neg_f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm5
-        pshufd    $68, %xmm2, %xmm3
-        movapd    48+cv(%rip), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        mulpd     %xmm3, %xmm3
-        mulpd     %xmm2, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulpd     64+cv(%rip), %xmm2
-        mulpd     %xmm3, %xmm1
-        mulpd     %xmm3, %xmm7
-        mulpd     %xmm3, %xmm4
-        mulpd     %xmm3, %xmm1
-        addpd     %xmm7, %xmm6
-        movq      %xmm0, %xmm7
-        addpd     %xmm1, %xmm4
-        shufpd    $0, %xmm5, %xmm7
-        addpd     %xmm5, %xmm0
-        mulpd     %xmm7, %xmm2
-        addpd     %xmm6, %xmm4
-        subsd     %xmm0, %xmm7
-        mulpd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm5, %xmm7
-        addpd     %xmm2, %xmm4
-        addsd     %xmm6, %xmm7
-        pshufd    $238, %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        addl      $16320, %ecx
-        cmpl      $16320, %ecx
-        ja        .L_2TAG_PACKET_2.0.2
-        cmpl      $15952, %ecx
-        jae       .L_2TAG_PACKET_3.0.2
-        addsd     %xmm2, %xmm6
-        movq      ONEMASK(%rip), %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_1.0.2:
-        subl      $16352, %eax
-        movl      %eax, %ecx
-        andl      $32752, %eax
-        shrl      $1, %eax
-        andl      $65520, %eax
-        subl      %eax, %ecx
-        addl      $16352, %eax
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        lea       T2f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm0
-        pshufd    $68, %xmm2, %xmm3
-        movsd     48+cv(%rip), %xmm7
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm2, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     64+cv(%rip), %xmm2
-        mulsd     %xmm3, %xmm1
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm3, %xmm4
-        addl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm5
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm4
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm6, %xmm4
-        mulsd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm6, %xmm4
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm5, %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_4.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_3.0.2:
-        movapd    pv(%rip), %xmm1
-        mulpd     %xmm5, %xmm5
-        movapd    16+pv(%rip), %xmm2
-        xorpd     %xmm3, %xmm3
-        movq      %xmm5, %xmm0
-        mulpd     %xmm5, %xmm1
-        movsd     ONEMASK(%rip), %xmm6
-        mulpd     %xmm5, %xmm5
-        movl      $16352, %eax
-        pinsrw    $3, %eax, %xmm3
-        addpd     %xmm2, %xmm1
-        mulpd     %xmm5, %xmm1
-        pshufd    $238, %xmm1, %xmm2
-        mulsd     %xmm1, %xmm5
-        mulsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm2
-        addsd     %xmm2, %xmm0
-        addsd     %xmm6, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_2.0.2:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_5.0.2
-        xorpd     %xmm0, %xmm0
-        movl      $32736, %eax
-        pinsrw    $3, %eax, %xmm0
-        mulsd     %xmm0, %xmm0
-        jmp       .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_5.0.2:
-        mulsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        movq      %xmm0, (%rsp)
-..B1.3:
-        movq      (%rsp), %xmm0
-.L_2TAG_PACKET_6.0.2:
-..B1.5:
-        popq      %rcx
-..___tag_value_cosh.4:
-        ret       
-..___tag_value_cosh.5:
-END(cosh)
-# -- End  cosh
-	.section .rodata, "a"
-	.align 16
-	.align 16
-L2E:
-	.long	1610612736
-	.long	1080497479
-	.long	4166901572
-	.long	1053077003
-	.type	L2E,@object
-	.size	L2E,16
-	.align 16
-Shifter:
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.type	Shifter,@object
-	.size	Shifter,16
-	.align 16
-cv:
-	.long	3607404736
-	.long	1044146952
-	.long	3607404736
-	.long	3191630600
-	.long	4277811695
-	.long	1063661122
-	.long	4277811695
-	.long	3211144770
-	.long	2140175755
-	.long	1033864261
-	.long	2140175755
-	.long	1033864261
-	.long	4289495988
-	.long	1054113747
-	.long	4289495988
-	.long	1054113747
-	.long	4277811695
-	.long	1064709698
-	.long	4277811695
-	.long	3212193346
-	.type	cv,@object
-	.size	cv,80
-	.align 16
-T2f:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	2851812149
-	.long	1072698941
-	.long	2595802551
-	.long	1016815913
-	.long	1048019041
-	.long	1072704666
-	.long	1398474845
-	.long	3161559171
-	.long	3899555717
-	.long	1072710421
-	.long	427280750
-	.long	3163595548
-	.long	3541402996
-	.long	1072716208
-	.long	2759177317
-	.long	1015903202
-	.long	702412510
-	.long	1072722027
-	.long	3803266087
-	.long	3163328991
-	.long	410360776
-	.long	1072727877
-	.long	1269990655
-	.long	1013024446
-	.long	3402036099
-	.long	1072733758
-	.long	405889334
-	.long	1016154232
-	.long	1828292879
-	.long	1072739672
-	.long	1255956747
-	.long	1016636974
-	.long	728909815
-	.long	1072745618
-	.long	383930225
-	.long	1016078044
-	.long	852742562
-	.long	1072751596
-	.long	667253586
-	.long	1010842135
-	.long	2952712987
-	.long	1072757606
-	.long	3293494651
-	.long	3161168877
-	.long	3490863953
-	.long	1072763649
-	.long	960797498
-	.long	3163997456
-	.long	3228316108
-	.long	1072769725
-	.long	3010241991
-	.long	3159471380
-	.long	2930322912
-	.long	1072775834
-	.long	2599499422
-	.long	3163762623
-	.long	3366293073
-	.long	1072781976
-	.long	3119426314
-	.long	1015169130
-	.long	1014845819
-	.long	1072788152
-	.long	3117910646
-	.long	3162607681
-	.long	948735466
-	.long	1072794361
-	.long	3516338028
-	.long	3163623459
-	.long	3949972341
-	.long	1072800603
-	.long	2068408548
-	.long	1015962444
-	.long	2214878420
-	.long	1072806880
-	.long	892270087
-	.long	3164164998
-	.long	828946858
-	.long	1072813191
-	.long	10642492
-	.long	1016988014
-	.long	586995997
-	.long	1072819536
-	.long	41662348
-	.long	3163676568
-	.long	2288159958
-	.long	1072825915
-	.long	2169144469
-	.long	1015924597
-	.long	2440944790
-	.long	1072832329
-	.long	2492769774
-	.long	1015196030
-	.long	1853186616
-	.long	1072838778
-	.long	3066496371
-	.long	1016705150
-	.long	1337108031
-	.long	1072845262
-	.long	3203724452
-	.long	1015726421
-	.long	1709341917
-	.long	1072851781
-	.long	2571168217
-	.long	1015201075
-	.long	3790955393
-	.long	1072858335
-	.long	2352942462
-	.long	3164228666
-	.long	4112506593
-	.long	1072864925
-	.long	2947355221
-	.long	1015419624
-	.long	3504003472
-	.long	1072871551
-	.long	3594001060
-	.long	3158379228
-	.long	2799960843
-	.long	1072878213
-	.long	1423655381
-	.long	1016070727
-	.long	2839424854
-	.long	1072884911
-	.long	1171596163
-	.long	1014090255
-	.long	171030293
-	.long	1072891646
-	.long	3526460132
-	.long	1015477354
-	.long	4232894513
-	.long	1072898416
-	.long	2383938684
-	.long	1015717095
-	.long	2992903935
-	.long	1072905224
-	.long	2218154406
-	.long	1016276769
-	.long	1603444721
-	.long	1072912069
-	.long	1548633640
-	.long	3163249902
-	.long	926591435
-	.long	1072918951
-	.long	3208833762
-	.long	3163962090
-	.long	1829099622
-	.long	1072925870
-	.long	1016661181
-	.long	3164509581
-	.long	887463927
-	.long	1072932827
-	.long	3596744163
-	.long	3161842742
-	.long	3272845541
-	.long	1072939821
-	.long	928852419
-	.long	3164536824
-	.long	1276261410
-	.long	1072946854
-	.long	300981948
-	.long	1015732745
-	.long	78413852
-	.long	1072953925
-	.long	4183226867
-	.long	3164065827
-	.long	569847338
-	.long	1072961034
-	.long	472945272
-	.long	3160339305
-	.long	3645941911
-	.long	1072968181
-	.long	3814685081
-	.long	3162621917
-	.long	1617004845
-	.long	1072975368
-	.long	82804944
-	.long	1011391354
-	.long	3978100823
-	.long	1072982593
-	.long	3513027190
-	.long	1016894539
-	.long	3049340112
-	.long	1072989858
-	.long	3062915824
-	.long	1014219171
-	.long	4040676318
-	.long	1072997162
-	.long	4090609238
-	.long	1016712034
-	.long	3577096743
-	.long	1073004506
-	.long	2951496418
-	.long	1014842263
-	.long	2583551245
-	.long	1073011890
-	.long	3161094195
-	.long	1016655067
-	.long	1990012071
-	.long	1073019314
-	.long	3529070563
-	.long	3163861769
-	.long	2731501122
-	.long	1073026778
-	.long	1774031855
-	.long	3163518597
-	.long	1453150082
-	.long	1073034283
-	.long	498154669
-	.long	3162536638
-	.long	3395129871
-	.long	1073041828
-	.long	4025345435
-	.long	3163383964
-	.long	917841882
-	.long	1073049415
-	.long	18715565
-	.long	1016707884
-	.long	3566716925
-	.long	1073057042
-	.long	1536826856
-	.long	1015191009
-	.long	3712504873
-	.long	1073064711
-	.long	88491949
-	.long	1016476236
-	.long	2321106615
-	.long	1073072422
-	.long	2171176610
-	.long	1010584347
-	.long	363667784
-	.long	1073080175
-	.long	813753950
-	.long	1016833785
-	.long	3111574537
-	.long	1073087969
-	.long	2606161479
-	.long	3163808322
-	.long	2956612997
-	.long	1073095806
-	.long	2118169751
-	.long	3163784129
-	.long	885834528
-	.long	1073103686
-	.long	1973258547
-	.long	3163310140
-	.long	2186617381
-	.long	1073111608
-	.long	2270764084
-	.long	3164321289
-	.long	3561793907
-	.long	1073119573
-	.long	1157054053
-	.long	1012938926
-	.long	1719614413
-	.long	1073127582
-	.long	330458198
-	.long	3164331316
-	.long	1963711167
-	.long	1073135634
-	.long	1744767757
-	.long	3161622870
-	.long	1013258799
-	.long	1073143730
-	.long	1748797611
-	.long	3161177658
-	.long	4182873220
-	.long	1073151869
-	.long	629542646
-	.long	3163044879
-	.long	3907805044
-	.long	1073160053
-	.long	2257091225
-	.long	3162598983
-	.long	1218806132
-	.long	1073168282
-	.long	1818613052
-	.long	3163597017
-	.long	1447192521
-	.long	1073176555
-	.long	1462857171
-	.long	3163563097
-	.long	1339972927
-	.long	1073184873
-	.long	167908909
-	.long	1016620728
-	.long	1944781191
-	.long	1073193236
-	.long	3993278767
-	.long	3162772855
-	.long	19972402
-	.long	1073201645
-	.long	3507899862
-	.long	1017057868
-	.long	919555682
-	.long	1073210099
-	.long	3121969534
-	.long	1013996802
-	.long	1413356050
-	.long	1073218599
-	.long	1651349291
-	.long	3163716742
-	.long	2571947539
-	.long	1073227145
-	.long	3558159064
-	.long	3164425245
-	.long	1176749997
-	.long	1073235738
-	.long	2738998779
-	.long	3163084420
-	.long	2604962541
-	.long	1073244377
-	.long	2614425274
-	.long	3164587768
-	.long	3649726105
-	.long	1073253063
-	.long	4085036346
-	.long	1016698050
-	.long	1110089947
-	.long	1073261797
-	.long	1451641639
-	.long	1016523249
-	.long	380978316
-	.long	1073270578
-	.long	854188970
-	.long	3161511262
-	.long	2568320822
-	.long	1073279406
-	.long	2732824428
-	.long	1015401491
-	.long	194117574
-	.long	1073288283
-	.long	777528612
-	.long	3164460665
-	.long	2966275557
-	.long	1073297207
-	.long	2176155324
-	.long	3160891335
-	.long	3418903055
-	.long	1073306180
-	.long	2527457337
-	.long	3161869180
-	.long	2682146384
-	.long	1073315202
-	.long	2082178513
-	.long	3164411995
-	.long	1892288442
-	.long	1073324273
-	.long	2446255666
-	.long	3163648957
-	.long	2191782032
-	.long	1073333393
-	.long	2960257726
-	.long	1014791238
-	.long	434316067
-	.long	1073342563
-	.long	2028358766
-	.long	1014506698
-	.long	2069751141
-	.long	1073351782
-	.long	1562170675
-	.long	3163773257
-	.long	3964284211
-	.long	1073361051
-	.long	2111583915
-	.long	1016475740
-	.long	2990417245
-	.long	1073370371
-	.long	3683467745
-	.long	3164417902
-	.long	321958744
-	.long	1073379742
-	.long	3401933767
-	.long	1016843134
-	.long	1434058175
-	.long	1073389163
-	.long	251133233
-	.long	1016134345
-	.long	3218338682
-	.long	1073398635
-	.long	3404164304
-	.long	3163525684
-	.long	2572866477
-	.long	1073408159
-	.long	878562433
-	.long	1016570317
-	.long	697153126
-	.long	1073417735
-	.long	1283515429
-	.long	3164331765
-	.long	3092190715
-	.long	1073427362
-	.long	814012168
-	.long	3160571998
-	.long	2380618042
-	.long	1073437042
-	.long	3149557219
-	.long	3164369375
-	.long	4076559943
-	.long	1073446774
-	.long	2119478331
-	.long	3161806927
-	.long	815859274
-	.long	1073456560
-	.long	240396590
-	.long	3164536019
-	.long	2420883922
-	.long	1073466398
-	.long	2049810052
-	.long	1015168464
-	.long	1540824585
-	.long	1073476290
-	.long	1064017011
-	.long	3164536266
-	.long	3716502172
-	.long	1073486235
-	.long	2303740125
-	.long	1015091301
-	.long	1610600570
-	.long	1073496235
-	.long	3766732298
-	.long	1016808759
-	.long	777507147
-	.long	1073506289
-	.long	4282924205
-	.long	1016236109
-	.long	2483480501
-	.long	1073516397
-	.long	1216371780
-	.long	1014082748
-	.long	3706687593
-	.long	1073526560
-	.long	3521726940
-	.long	1014301643
-	.long	1432208378
-	.long	1073536779
-	.long	1401068914
-	.long	3163412539
-	.long	1242007932
-	.long	1073547053
-	.long	1132034716
-	.long	3164388407
-	.long	135105010
-	.long	1073557383
-	.long	1906148728
-	.long	3164424315
-	.long	3707479175
-	.long	1073567768
-	.long	3613079303
-	.long	1015213314
-	.long	382305176
-	.long	1073578211
-	.long	2347622376
-	.long	3163627201
-	.long	64696965
-	.long	1073588710
-	.long	1768797490
-	.long	1016865536
-	.long	4076975200
-	.long	1073599265
-	.long	2029000899
-	.long	1016257111
-	.long	863738719
-	.long	1073609879
-	.long	1326992220
-	.long	3163661773
-	.long	351641897
-	.long	1073620550
-	.long	2172261526
-	.long	3164059175
-	.long	3884662774
-	.long	1073631278
-	.long	2158611599
-	.long	1015258761
-	.long	4224142467
-	.long	1073642065
-	.long	3389820386
-	.long	1016255778
-	.long	2728693978
-	.long	1073652911
-	.long	396109971
-	.long	3164511267
-	.long	764307441
-	.long	1073663816
-	.long	3021057420
-	.long	3164378099
-	.long	3999357479
-	.long	1073674779
-	.long	2258941616
-	.long	1016973300
-	.long	929806999
-	.long	1073685803
-	.long	3205336643
-	.long	1016308133
-	.long	1533953344
-	.long	1073696886
-	.long	769171851
-	.long	1016714209
-	.long	2912730644
-	.long	1073708029
-	.long	3490067722
-	.long	3164453650
-	.long	2174652632
-	.long	1073719233
-	.long	4087714590
-	.long	1015498835
-	.long	730821105
-	.long	1073730498
-	.long	2523232743
-	.long	1013115764
-	.type	T2f,@object
-	.size	T2f,2048
-	.align 16
-T2_neg_f:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.type	T2_neg_f,@object
-	.size	T2_neg_f,2048
-	.align 16
-pv:
-	.long	3078135644
-	.long	1049787983
-	.long	381774870
-	.long	1062650220
-	.long	436314137
-	.long	1056571808
-	.long	1431655765
-	.long	1067799893
-	.type	pv,@object
-	.size	pv,32
-	.align 4
-HALFMASK:
-	.long	4160749568
-	.long	2147483647
-	.type	HALFMASK,@object
-	.size	HALFMASK,8
-	.align 4
-ONEMASK:
-	.long	0
-	.long	1072693248
-	.type	ONEMASK,@object
-	.size	ONEMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_cosh.1-.
-	.4byte ..___tag_value_cosh.5-..___tag_value_cosh.1
-	.2byte 0x0400
-	.4byte ..___tag_value_cosh.3-..___tag_value_cosh.1
-	.2byte 0x100e
-	.byte 0x04
-	.4byte ..___tag_value_cosh.4-..___tag_value_cosh.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/e_hypot.S b/libm/x86_64/e_hypot.S
deleted file mode 100644
index e46669f..0000000
--- a/libm/x86_64/e_hypot.S
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// X87 version:
-// Use 80-bit FPU precision fmul, fsqrt to compute square and sqrt.
-//
-// SSE version:
-// Swap x, y if |x|<|y|
-// For x=2^k*x, get y=y*2^(-k)
-// Get S ~ sqrt(x^2+y^2)  (leading 1 + leading 25 mantissa bits)
-//
-// Get D = ( RN(x^2+y^2) - S^2 ) + ( x^2 - RN(x^2) ) +
-//                               + ( y^2 - ((RN(x^2+y^2)-RN(x^2)) )
-//
-// Result is 2^k*(S + Se),  where Se = S*e
-//        S*e is approximated as (D/2S)*( 1 - (D/2S)^2*1.0/S )
-//
-// Return 2^k*(S+Se)
-//
-// For |y/x|<2^(-64), return x
-//
-// For cases where maximum biased exponent is either greater than 7fdh or
-// below 32, take a special path to check for special cases (0, NaN, Inf),
-// possible overflow, and more accurate computation for denormal results
-//
-// Special cases:
-//  hypot(x,y), hypot(y,x), and hypot(x,-y) are equivalent
-//  hypot(x,+-0) is equivalent to fabs(x)
-//  hypot(x,y) = y if (x==NaN or x==INF) and y==INF
-//  hypot(x,y) = x if (x==NaN or x==INF) and y!=INF (even if y==NaN!)
-//  hypot(x,y) = y if (x!=NaN and x!=INF) and (y==NaN or y==INF)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  hypot
-ENTRY(hypot)
-# parameter 1: %xmm0
-# parameter 2: %xmm1
-..B1.1:
-..___tag_value_hypot.1:
-..___tag_value_hypot.3:
-..B1.2:
-        subq      $64, %rsp
-        movapd    static_const_table(%rip), %xmm3
-        movsd     %xmm0, 48(%rsp)
-        movsd     %xmm1, 56(%rsp)
-        andpd     %xmm3, %xmm0
-        andpd     %xmm3, %xmm1
-        pextrw    $3, %xmm0, %eax
-        pextrw    $3, %xmm1, %edx
-        cmpl      $24528, %eax
-        ja        .L_2TAG_PACKET_0.0.1
-        cmpl      $24528, %edx
-        ja        .L_2TAG_PACKET_0.0.1
-.L_2TAG_PACKET_1.0.1:
-        fldl      48(%rsp)
-        fldl      56(%rsp)
-        fxch      %st(1)
-        fmul      %st(0), %st
-        fxch      %st(1)
-        nop       
-        fmul      %st(0), %st
-        faddp     %st, %st(1)
-        fsqrt     
-        jmp       .L_2TAG_PACKET_2.0.1
-.L_2TAG_PACKET_0.0.1:
-        cmpl      $32752, %eax
-        movl      %eax, %ecx
-        jae       .L_2TAG_PACKET_3.0.1
-        subl      %edx, %ecx
-        cmpl      $32752, %edx
-        jae       .L_2TAG_PACKET_3.0.1
-        addl      $928, %ecx
-        addl      %edx, %eax
-        cmpl      $1856, %ecx
-        ja        .L_2TAG_PACKET_4.0.1
-        cmpl      $49056, %eax
-        jb        .L_2TAG_PACKET_1.0.1
-        fldl      48(%rsp)
-        fldl      56(%rsp)
-        fxch      %st(1)
-        fmul      %st(0), %st
-        fxch      %st(1)
-        nop       
-        fmul      %st(0), %st
-        faddp     %st, %st(1)
-        fsqrt     
-.L_2TAG_PACKET_5.0.1:
-        fstl      (%rsp)
-        fstpt     16(%rsp)
-        xorl      %eax, %eax
-        movw      24(%rsp), %ax
-        cmpl      $17407, %eax
-        jae       .L_2TAG_PACKET_6.0.1
-        fldl      (%rsp)
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_4.0.1:
-        movsd     %xmm0, 32(%rsp)
-        movsd     %xmm1, 40(%rsp)
-        fldl      32(%rsp)
-        faddl     40(%rsp)
-        jmp       .L_2TAG_PACKET_5.0.1
-.L_2TAG_PACKET_6.0.1:
-        fldl      (%rsp)
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_3.0.1:
-        shufpd    $0, %xmm1, %xmm0
-        movdqa    %xmm0, %xmm2
-        movdqa    16+static_const_table(%rip), %xmm3
-        movsd     %xmm0, 32(%rsp)
-        movsd     %xmm1, 40(%rsp)
-        cmppd     $3, %xmm0, %xmm2
-        cmppd     $0, %xmm0, %xmm3
-        movmskpd  %xmm2, %edx
-        movmskpd  %xmm3, %rax
-        testl     %edx, %edx
-        je        .L_2TAG_PACKET_8.0.1
-        fldl      32(%rsp)
-        fmull     40(%rsp)
-        testq     $1, %rax
-        jne       .L_2TAG_PACKET_9.0.1
-        testq     $2, %rax
-        jne       .L_2TAG_PACKET_10.0.1
-        jmp       .L_2TAG_PACKET_2.0.1
-.L_2TAG_PACKET_8.0.1:
-        fldl      32(%rsp)
-        faddl     40(%rsp)
-        jmp       .L_2TAG_PACKET_2.0.1
-.L_2TAG_PACKET_9.0.1:
-        fstpl     40(%rsp)
-        fldl      32(%rsp)
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_10.0.1:
-        fstpl     32(%rsp)
-        fldl      40(%rsp)
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_2.0.1:
-.L_2TAG_PACKET_7.0.1:
-        fstpl     16(%rsp)
-        movq      16(%rsp), %xmm0
-        addq      $64, %rsp
-        ret       
-..B1.3:
-..___tag_value_hypot.4:
-END(hypot)
-# -- End  hypot
-	.section .rodata, "a"
-	.align 16
-	.align 16
-static_const_table:
-	.long	4294967295
-	.long	2147483647
-	.long	4294967295
-	.long	2147483647
-	.long	0
-	.long	2146435072
-	.long	0
-	.long	2146435072
-	.type	static_const_table,@object
-	.size	static_const_table,32
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x00000014
-	.4byte 0x0000001c
-	.4byte ..___tag_value_hypot.1-.
-	.4byte ..___tag_value_hypot.4-..___tag_value_hypot.1
-	.2byte 0x0400
-	.4byte ..___tag_value_hypot.3-..___tag_value_hypot.1
-	.2byte 0x100e
-# End
diff --git a/libm/x86_64/e_log10.S b/libm/x86_64/e_log10.S
deleted file mode 100644
index 86f86ce..0000000
--- a/libm/x86_64/e_log10.S
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//    Let x=2^k * mx, mx in [1,2)
-//
-//    Get B~1/mx based on the output of rcpss instruction (B0)
-//    B = int((B0*LH*2^7+0.5))/2^7
-//    LH is a short approximation for log10(e)
-//
-//    Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
-//
-//    Result:  k*log10(2) - log(B) + p(r)
-//             p(r) is a degree 7 polynomial
-//             -log(B) read from data table (high, low parts)
-//             Result is formed from high and low parts
-//
-// Special cases:
-//  log10(0) = -INF with divide-by-zero exception raised                                           
-//  log10(1) = +0
-//  log10(x) = NaN with invalid exception raised if x < -0, including -INF
-//  log10(+INF) = +INF
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  log10
-ENTRY(log10)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_log10.1:
-        subq      $24, %rsp
-..___tag_value_log10.3:
-        movsd     %xmm0, (%rsp)
-..B1.2:
-        xorpd     %xmm2, %xmm2
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm2
-        movl      $1054736384, %ecx
-        movd      %ecx, %xmm7
-        xorpd     %xmm3, %xmm3
-        movl      $30704, %edx
-        pinsrw    $3, %edx, %xmm3
-        movq      %xmm0, %xmm1
-        movl      $32768, %edx
-        movd      %edx, %xmm4
-        movapd    HIGHSIGMASK(%rip), %xmm5
-        pextrw    $3, %xmm0, %eax
-        orpd      %xmm2, %xmm0
-        movl      $16352, %ecx
-        psrlq     $27, %xmm0
-        movq      LOG10_E(%rip), %xmm2
-        psrld     $2, %xmm0
-        rcpps     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $78, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        subl      $16, %eax
-        cmpl      $32736, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-.L_2TAG_PACKET_1.0.2:
-        mulss     %xmm7, %xmm0
-        orpd      %xmm3, %xmm1
-        lea       L_tbl(%rip), %r11
-        andpd     %xmm1, %xmm5
-        paddd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm1
-        movd      %xmm0, %edx
-        psllq     $29, %xmm0
-        andpd     %xmm6, %xmm0
-        andl      $32752, %eax
-        subl      %ecx, %eax
-        cvtsi2sd  %eax, %xmm7
-        mulpd     %xmm0, %xmm5
-        mulsd     %xmm0, %xmm1
-        movq      log2(%rip), %xmm6
-        movapd    coeff(%rip), %xmm3
-        subsd     %xmm2, %xmm5
-        andl      $16711680, %edx
-        shrl      $12, %edx
-        movapd    -1504(%r11,%rdx), %xmm0
-        movapd    16+coeff(%rip), %xmm4
-        addsd     %xmm5, %xmm1
-        movapd    32+coeff(%rip), %xmm2
-        mulsd     %xmm7, %xmm6
-        pshufd    $68, %xmm1, %xmm5
-        mulsd     8+log2(%rip), %xmm7
-        mulsd     %xmm1, %xmm3
-        addsd     %xmm6, %xmm0
-        mulpd     %xmm5, %xmm4
-        movq      8+LOG10_E(%rip), %xmm6
-        mulpd     %xmm5, %xmm5
-        addpd     %xmm2, %xmm4
-        mulpd     %xmm5, %xmm3
-        pshufd    $228, %xmm0, %xmm2
-        addsd     %xmm1, %xmm0
-        mulsd     %xmm1, %xmm4
-        subsd     %xmm0, %xmm2
-        mulsd     %xmm1, %xmm6
-        addsd     %xmm2, %xmm1
-        pshufd    $238, %xmm0, %xmm2
-        mulsd     %xmm5, %xmm5
-        addsd     %xmm2, %xmm7
-        addsd     %xmm6, %xmm1
-        addpd     %xmm3, %xmm4
-        addsd     %xmm7, %xmm1
-        mulpd     %xmm5, %xmm4
-        addsd     %xmm4, %xmm1
-        pshufd    $238, %xmm4, %xmm5
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        movq      (%rsp), %xmm0
-        movq      (%rsp), %xmm1
-        addl      $16, %eax
-        cmpl      $32768, %eax
-        jae       .L_2TAG_PACKET_2.0.2
-        cmpl      $16, %eax
-        jb        .L_2TAG_PACKET_3.0.2
-.L_2TAG_PACKET_4.0.2:
-        addsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_5.0.2:
-        ja        .L_2TAG_PACKET_4.0.2
-        cmpl      $0, %edx
-        ja        .L_2TAG_PACKET_4.0.2
-        jmp       .L_2TAG_PACKET_6.0.2
-.L_2TAG_PACKET_3.0.2:
-        xorpd     %xmm1, %xmm1
-        addsd     %xmm0, %xmm1
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_7.0.2
-        xorpd     %xmm1, %xmm1
-        movl      $18416, %eax
-        pinsrw    $3, %eax, %xmm1
-        mulsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm2
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm2
-        movq      %xmm0, %xmm1
-        pextrw    $3, %xmm0, %eax
-        orpd      %xmm2, %xmm0
-        movl      $18416, %ecx
-        psrlq     $27, %xmm0
-        movq      LOG10_E(%rip), %xmm2
-        psrld     $2, %xmm0
-        rcpps     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $78, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        jmp       .L_2TAG_PACKET_1.0.2
-.L_2TAG_PACKET_2.0.2:
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        addl      %ecx, %ecx
-        cmpl      $-2097152, %ecx
-        jae       .L_2TAG_PACKET_5.0.2
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %eax
-        pinsrw    $3, %eax, %xmm1
-        mulsd     %xmm1, %xmm0
-        movl      $9, 16(%rsp)
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_7.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        divsd     %xmm1, %xmm0
-        movl      $8, 16(%rsp)
-.L_2TAG_PACKET_8.0.2:
-        movq      %xmm0, 8(%rsp)
-..B1.3:
-        movq      8(%rsp), %xmm0
-.L_2TAG_PACKET_9.0.2:
-..B1.5:
-        addq      $24, %rsp
-..___tag_value_log10.4:
-        ret       
-..___tag_value_log10.5:
-END(log10)
-# -- End  log10
-	.section .rodata, "a"
-	.align 16
-	.align 16
-HIGHSIGMASK:
-	.long	4160749568
-	.long	4294967295
-	.long	0
-	.long	4294959104
-	.type	HIGHSIGMASK,@object
-	.size	HIGHSIGMASK,16
-	.align 16
-LOG10_E:
-	.long	0
-	.long	1071366144
-	.long	3207479560
-	.long	1062894188
-	.type	LOG10_E,@object
-	.size	LOG10_E,16
-	.align 16
-L_tbl:
-	.long	1352628224
-	.long	1070810131
-	.long	521319256
-	.long	1025503025
-	.long	2150839296
-	.long	1070801944
-	.long	3329350096
-	.long	3170190015
-	.long	1360613376
-	.long	1070793794
-	.long	2024059075
-	.long	1024991594
-	.long	1875350528
-	.long	1070785680
-	.long	2163882141
-	.long	3163564137
-	.long	2312126464
-	.long	1070777602
-	.long	1975711076
-	.long	1023674196
-	.long	1306336256
-	.long	1070769560
-	.long	3524899523
-	.long	3170508164
-	.long	1806334976
-	.long	1070761553
-	.long	4254777025
-	.long	1025238739
-	.long	2483193856
-	.long	1070753581
-	.long	3800671317
-	.long	3172916830
-	.long	2025350144
-	.long	1070745644
-	.long	1731514745
-	.long	1025501083
-	.long	3433285632
-	.long	1070737741
-	.long	2551857336
-	.long	3169662186
-	.long	1134317568
-	.long	1070729873
-	.long	3426297655
-	.long	3172637891
-	.long	2457152512
-	.long	1070722038
-	.long	63549415
-	.long	1025415416
-	.long	1861803008
-	.long	1070714237
-	.long	1910171636
-	.long	1023977580
-	.long	2414140416
-	.long	1070706469
-	.long	4002514337
-	.long	3170841618
-	.long	2900726784
-	.long	1070698734
-	.long	3268064083
-	.long	1022459609
-	.long	2123517952
-	.long	1070691032
-	.long	1767031218
-	.long	1022448156
-	.long	3194569728
-	.long	1070683362
-	.long	3402332618
-	.long	3171671160
-	.long	650882048
-	.long	1070675725
-	.long	4146023905
-	.long	3171023038
-	.long	1928988672
-	.long	1070668119
-	.long	1438617867
-	.long	1016360491
-	.long	1594908672
-	.long	1070660545
-	.long	971389377
-	.long	1024763979
-	.long	2818746368
-	.long	1070653002
-	.long	3555925341
-	.long	3172434821
-	.long	194584576
-	.long	1070645491
-	.long	943919215
-	.long	3172950063
-	.long	1215096832
-	.long	1070638010
-	.long	2283358588
-	.long	1022335098
-	.long	501519360
-	.long	1070630560
-	.long	480904295
-	.long	1024437959
-	.long	1278266368
-	.long	1070623140
-	.long	2755806066
-	.long	3172342012
-	.long	2487812096
-	.long	1070615750
-	.long	2489653202
-	.long	3172481099
-	.long	3085451264
-	.long	1070608390
-	.long	3759184951
-	.long	3172574892
-	.long	2039090176
-	.long	1070601060
-	.long	1361176676
-	.long	3172355319
-	.long	953057280
-	.long	1070591423
-	.long	1176587546
-	.long	3166422018
-	.long	3370524672
-	.long	1070576879
-	.long	3669570051
-	.long	1025376630
-	.long	749742080
-	.long	1070562394
-	.long	707700964
-	.long	3170814058
-	.long	4008353792
-	.long	1070547965
-	.long	3247327652
-	.long	1022431400
-	.long	2612455424
-	.long	1070533594
-	.long	2453457344
-	.long	3172322969
-	.long	3230920704
-	.long	1070519279
-	.long	1296781801
-	.long	1025115335
-	.long	3965253632
-	.long	1070505020
-	.long	373075289
-	.long	1017938528
-	.long	2593157120
-	.long	1070476669
-	.long	1068054086
-	.long	1021616576
-	.long	925962240
-	.long	1070448537
-	.long	850121213
-	.long	1023928989
-	.long	1732556800
-	.long	1070420620
-	.long	1305206740
-	.long	3172665570
-	.long	3815630848
-	.long	1070392915
-	.long	192642943
-	.long	3172699907
-	.long	2001758208
-	.long	1070365420
-	.long	2820786683
-	.long	1024704867
-	.long	16746496
-	.long	1070338131
-	.long	1399573110
-	.long	3171372773
-	.long	1886492672
-	.long	1070311044
-	.long	3621428075
-	.long	3172974358
-	.long	3338196992
-	.long	1070284157
-	.long	3793882035
-	.long	1025124701
-	.long	381769728
-	.long	1070257468
-	.long	3877933342
-	.long	3170195490
-	.long	2186491904
-	.long	1070230972
-	.long	1838687089
-	.long	1017927292
-	.long	1008330752
-	.long	1070204668
-	.long	2228321664
-	.long	1025352196
-	.long	2247065600
-	.long	1070178552
-	.long	1413900906
-	.long	3170902532
-	.long	2964070400
-	.long	1070152622
-	.long	3590454629
-	.long	1025016844
-	.long	465154048
-	.long	1070126876
-	.long	2079688550
-	.long	3172268183
-	.long	883615744
-	.long	1070101310
-	.long	989244452
-	.long	3171900485
-	.long	1993768960
-	.long	1070075922
-	.long	1124327841
-	.long	3172964992
-	.long	1794471936
-	.long	1070050710
-	.long	1140575046
-	.long	1022673726
-	.long	2797932544
-	.long	1070025671
-	.long	1894836933
-	.long	3172544059
-	.long	3433797632
-	.long	1070000803
-	.long	3221831166
-	.long	3171921685
-	.long	2338371584
-	.long	1069976104
-	.long	3732461053
-	.long	3164513518
-	.long	2644013056
-	.long	1069951571
-	.long	2519460462
-	.long	3172548740
-	.long	3383814144
-	.long	1069927202
-	.long	2290997657
-	.long	1025499649
-	.long	3781380096
-	.long	1069902995
-	.long	380479405
-	.long	1025184136
-	.long	3245785088
-	.long	1069878948
-	.long	1096398261
-	.long	3169885192
-	.long	1366712320
-	.long	1069855059
-	.long	2218343715
-	.long	3170281628
-	.long	2204717056
-	.long	1069831325
-	.long	2668334011
-	.long	1025264524
-	.long	1401772032
-	.long	1069807745
-	.long	4103993159
-	.long	1022925721
-	.long	3356721152
-	.long	1069784316
-	.long	3573790772
-	.long	3172186527
-	.long	4041148416
-	.long	1069761037
-	.long	4027691910
-	.long	3171276990
-	.long	3880151040
-	.long	1069737906
-	.long	4087118786
-	.long	3172710734
-	.long	3453364224
-	.long	1069714921
-	.long	99014299
-	.long	3172003077
-	.long	3491092480
-	.long	1069692080
-	.long	3801836701
-	.long	3172989287
-	.long	575580160
-	.long	1069669382
-	.long	1920406012
-	.long	3170874125
-	.long	22282240
-	.long	1069646824
-	.long	964193370
-	.long	1019363159
-	.long	2991429632
-	.long	1069624404
-	.long	3372589890
-	.long	1023425053
-	.long	2189645824
-	.long	1069602122
-	.long	2610503872
-	.long	1023652442
-	.long	3341467648
-	.long	1069579975
-	.long	1190292004
-	.long	1022425665
-	.long	3711293440
-	.long	1069557962
-	.long	1104795356
-	.long	1023625829
-	.long	1380401152
-	.long	1069524644
-	.long	1156998217
-	.long	1025100499
-	.long	765710336
-	.long	1069481144
-	.long	1736649113
-	.long	1024999439
-	.long	849412096
-	.long	1069437902
-	.long	2618178330
-	.long	3170853629
-	.long	1433104384
-	.long	1069394915
-	.long	43477267
-	.long	3170378811
-	.long	2548596736
-	.long	1069352180
-	.long	3967367063
-	.long	1025246584
-	.long	157577216
-	.long	1069309695
-	.long	100402533
-	.long	3172825502
-	.long	3326238720
-	.long	1069267455
-	.long	1176892909
-	.long	1025464099
-	.long	4155494400
-	.long	1069225459
-	.long	3713707617
-	.long	3172630046
-	.long	3545804800
-	.long	1069183704
-	.long	857007315
-	.long	1024965777
-	.long	2602520576
-	.long	1069142187
-	.long	2588758347
-	.long	1022463131
-	.long	2631196672
-	.long	1069100905
-	.long	2118424235
-	.long	1022490989
-	.long	838135808
-	.long	1069059856
-	.long	4117002727
-	.long	1024874520
-	.long	3210903552
-	.long	1069019036
-	.long	650070125
-	.long	3172012966
-	.long	3039211520
-	.long	1068978444
-	.long	438055812
-	.long	1017743757
-	.long	2385633280
-	.long	1068938077
-	.long	3011990369
-	.long	3171312044
-	.long	3491618816
-	.long	1068897932
-	.long	712813818
-	.long	3172720400
-	.long	183644160
-	.long	1068858008
-	.long	4287006742
-	.long	1022379728
-	.long	3639214080
-	.long	1068818300
-	.long	353762279
-	.long	3172980009
-	.long	3728416768
-	.long	1068778808
-	.long	1851367730
-	.long	1025486574
-	.long	3370094592
-	.long	1068739529
-	.long	4046594913
-	.long	3172567047
-	.long	1348407296
-	.long	1068700461
-	.long	143189675
-	.long	1025397632
-	.long	899403776
-	.long	1068661601
-	.long	3753687842
-	.long	3170772772
-	.long	1117708288
-	.long	1068622947
-	.long	1857340812
-	.long	3170782678
-	.long	1248276480
-	.long	1068584497
-	.long	1289858203
-	.long	1025222289
-	.long	683237376
-	.long	1068546249
-	.long	2356679608
-	.long	3171629170
-	.long	3253764096
-	.long	1068508200
-	.long	3267136556
-	.long	1018554987
-	.long	94478336
-	.long	1068441756
-	.long	1927868814
-	.long	3169378180
-	.long	3233144832
-	.long	1068366445
-	.long	2682188854
-	.long	1023964004
-	.long	2940297216
-	.long	1068291522
-	.long	275301289
-	.long	1023944679
-	.long	3677708288
-	.long	1068216982
-	.long	302658771
-	.long	1024465567
-	.long	1576968192
-	.long	1068142822
-	.long	3672035940
-	.long	3172254610
-	.long	1614069760
-	.long	1068069037
-	.long	480052905
-	.long	3172692062
-	.long	424435712
-	.long	1067995624
-	.long	2207869657
-	.long	3170965436
-	.long	3477782528
-	.long	1067922578
-	.long	2980661858
-	.long	3164990018
-	.long	3598401536
-	.long	1067849897
-	.long	1974393034
-	.long	3171357083
-	.long	2435235840
-	.long	1067777577
-	.long	1385289011
-	.long	1024615823
-	.long	1867333632
-	.long	1067705614
-	.long	3442236633
-	.long	1025334384
-	.long	3999301632
-	.long	1067634004
-	.long	3506472073
-	.long	1025132546
-	.long	2566971392
-	.long	1067562745
-	.long	1425757592
-	.long	3172358463
-	.long	112943104
-	.long	1067491833
-	.long	1693407156
-	.long	3172426603
-	.long	3079929856
-	.long	1067392159
-	.long	3999942455
-	.long	1018549369
-	.long	2443837440
-	.long	1067251701
-	.long	974534460
-	.long	1023963412
-	.long	359366656
-	.long	1067111917
-	.long	2204915018
-	.long	1013514416
-	.long	3564519424
-	.long	1066972799
-	.long	3977441659
-	.long	3170879860
-	.long	2011086848
-	.long	1066834343
-	.long	590145514
-	.long	1025390011
-	.long	3216982016
-	.long	1066696541
-	.long	3629120110
-	.long	1024330313
-	.long	2194128896
-	.long	1066559388
-	.long	2367098512
-	.long	3172260338
-	.long	2916220928
-	.long	1066422877
-	.long	2262431886
-	.long	1021229446
-	.long	2263941120
-	.long	1066172214
-	.long	3118507287
-	.long	1021484970
-	.long	3076292608
-	.long	1065901726
-	.long	1411737803
-	.long	3172957147
-	.long	1186136064
-	.long	1065632488
-	.long	3109349337
-	.long	1025397383
-	.long	3085303808
-	.long	1065364487
-	.long	584715031
-	.long	3172596519
-	.long	1821048832
-	.long	1064842211
-	.long	2182246895
-	.long	3172536214
-	.long	697368576
-	.long	1064311094
-	.long	3157561765
-	.long	3172716357
-	.long	894042112
-	.long	1063260131
-	.long	3237958154
-	.long	3172587292
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.type	L_tbl,@object
-	.size	L_tbl,2064
-	.align 16
-log2:
-	.long	1352628224
-	.long	1066615827
-	.long	521319256
-	.long	1021308721
-	.type	log2,@object
-	.size	log2,16
-	.align 16
-coeff:
-	.long	3248877870
-	.long	1077250164
-	.long	1691676429
-	.long	3221787401
-	.long	945132465
-	.long	3223701783
-	.long	3700831335
-	.long	1073506818
-	.long	2141010593
-	.long	1075227551
-	.long	3698831637
-	.long	3220339442
-	.type	coeff,@object
-	.size	coeff,48
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_log10.1-.
-	.4byte ..___tag_value_log10.5-..___tag_value_log10.1
-	.2byte 0x0400
-	.4byte ..___tag_value_log10.3-..___tag_value_log10.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_log10.4-..___tag_value_log10.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/e_sinh.S b/libm/x86_64/e_sinh.S
deleted file mode 100644
index d5f7b16..0000000
--- a/libm/x86_64/e_sinh.S
+++ /dev/null
@@ -1,1430 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//  sinh(x)=(exp(x)-exp(-x))/2
-//
-//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//          L2EH+L2EL (upper 26, lower 53 bits)
-//
-//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
-//                              f=0.b1 b2 ... b7, k integer
-//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
-//  Tp stores the high 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
-//
-//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
-//                       for |x| in [23/64,3*2^7)
-//  e^{-|x|}=2^{-k-f}*2^{-r}
-//
-//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
-//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
-//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)+2^{-k}*Dn
-//
-//  For |x| in [1/8, 3*2^7), sinh(x) is formed as
-//      RN(2^k*Tp-2^{-k}*Tn)+2^k*Tp*P15-2^{-k}*Tn*P`15-2^{-k}*TnL-2^{-k}*Dn+2^k*Dp
-//
-//  For x in (3*2^7, 3*2^8), sign(x)*(e^|x|)/2 is returned, and
-//  the result is checked for overflow.
-//
-//  For |x|<23/64, a Taylor polynomial expansion is used (degree 13)
-//  To reduce rounding errors, the p3*x^3 term is computed as
-//     (p3*xh^3)_high+[(p3*xl*(3*x*xh+xl^2))+(p3*xh^3)_low],
-//  where x=xh+xl, (xh are the leading 17 bits of x), and
-//     (p3*xh^3)_high=RN(x+p3*xh^3)-x
-//  (error bound for polynomial expansion is below 0.51 ulp)
-//
-// Special cases:
-//  sinh(NaN) = quiet NaN, and raise invalid exception
-//  sinh(+/-INF) = +/-INF
-//  sinh(x) = x for subnormals
-//  for finite argument, only sinh(0)=0 is exact
-//  For IEEE double
-//    sinh(x) overflows  for x > 
-//    710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  sinh
-ENTRY(sinh)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_sinh.1:
-        pushq     %rsi
-..___tag_value_sinh.3:
-..B1.2:
-        movsd     HALFMASK(%rip), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     L2E(%rip), %xmm1
-        movsd     8+L2E(%rip), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     Shifter(%rip), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        movl      $32768, %edx
-        andl      %ecx, %edx
-        andl      $32767, %ecx
-        subl      $16343, %ecx
-        cmpl      $177, %ecx
-        jae       .L_2TAG_PACKET_0.0.2
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        shll      $3, %edx
-        orl       %edx, %eax
-        movq      %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        xorpd     %xmm5, %xmm5
-        subsd     %xmm6, %xmm3
-        movapd    cv(%rip), %xmm4
-        addsd     %xmm1, %xmm2
-        movapd    16+cv(%rip), %xmm6
-        subsd     %xmm3, %xmm7
-        movl      $32704, %edx
-        pinsrw    $3, %edx, %xmm5
-        movapd    32+cv(%rip), %xmm1
-        addsd     %xmm7, %xmm2
-        movl      $127, %edx
-        andl      %eax, %edx
-        addl      %edx, %edx
-        shrl      $3, %eax
-        andl      $65520, %eax
-        addl      $16352, %eax
-        xorpd     %xmm0, %xmm0
-        cmpl      $161, %ecx
-        jae       .L_2TAG_PACKET_1.0.2
-        pshufd    $68, %xmm5, %xmm5
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        psubw     %xmm0, %xmm5
-        lea       T2f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm0
-        lea       T2_neg_f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm5
-        pshufd    $68, %xmm2, %xmm3
-        movapd    48+cv(%rip), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        mulpd     %xmm3, %xmm3
-        mulpd     %xmm2, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulpd     64+cv(%rip), %xmm2
-        mulpd     %xmm3, %xmm1
-        mulpd     %xmm3, %xmm7
-        mulpd     %xmm3, %xmm4
-        mulpd     %xmm3, %xmm1
-        addpd     %xmm7, %xmm6
-        movq      %xmm0, %xmm7
-        addpd     %xmm1, %xmm4
-        shufpd    $0, %xmm5, %xmm7
-        subpd     %xmm5, %xmm0
-        mulpd     %xmm7, %xmm2
-        addpd     %xmm6, %xmm4
-        subsd     %xmm0, %xmm7
-        mulpd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        subsd     %xmm5, %xmm7
-        addpd     %xmm2, %xmm4
-        addsd     %xmm6, %xmm7
-        pshufd    $238, %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_1.0.2:
-        subl      $16352, %eax
-        movl      %eax, %ecx
-        andl      $32752, %eax
-        shrl      $1, %eax
-        andl      $65520, %eax
-        subl      %eax, %ecx
-        addl      $16352, %eax
-        pinsrw    $3, %eax, %xmm0
-        pshufd    $68, %xmm0, %xmm0
-        lea       T2f(%rip), %r8
-        mulpd     (%r8,%rdx,8), %xmm0
-        pshufd    $68, %xmm2, %xmm3
-        movsd     48+cv(%rip), %xmm7
-        mulsd     %xmm3, %xmm3
-        mulsd     %xmm2, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     64+cv(%rip), %xmm2
-        mulsd     %xmm3, %xmm1
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm3, %xmm4
-        addl      $16368, %ecx
-        pinsrw    $3, %ecx, %xmm5
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm7, %xmm6
-        addsd     %xmm1, %xmm4
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm6, %xmm4
-        mulsd     %xmm2, %xmm4
-        pshufd    $238, %xmm0, %xmm6
-        addsd     %xmm6, %xmm4
-        addsd     %xmm4, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm5, %xmm0
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        movl      $127, %edx
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_2.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        addl      $16343, %ecx
-        cmpl      $16343, %ecx
-        ja        .L_2TAG_PACKET_3.0.2
-        cmpl      $15856, %ecx
-        jb        .L_2TAG_PACKET_4.0.2
-        movapd    pv(%rip), %xmm1
-        pshufd    $68, %xmm0, %xmm6
-        mulpd     %xmm5, %xmm5
-        movapd    16+pv(%rip), %xmm2
-        pshufd    $68, %xmm0, %xmm7
-        movapd    32+pv(%rip), %xmm3
-        pshufd    $68, %xmm0, %xmm4
-        andpd     MASK3(%rip), %xmm6
-        mulpd     %xmm5, %xmm1
-        mulsd     %xmm5, %xmm2
-        subpd     %xmm6, %xmm4
-        mulpd     %xmm5, %xmm7
-        addpd     %xmm3, %xmm1
-        pshufd    $68, %xmm6, %xmm3
-        mulpd     %xmm5, %xmm5
-        mulsd     %xmm7, %xmm2
-        mulpd     %xmm7, %xmm1
-        pshufd    $68, %xmm0, %xmm7
-        mulsd     %xmm6, %xmm6
-        addsd     %xmm7, %xmm7
-        mulsd     %xmm4, %xmm4
-        mulpd     %xmm5, %xmm1
-        addsd     %xmm0, %xmm7
-        mulsd     %xmm3, %xmm6
-        mulsd     %xmm3, %xmm7
-        pshufd    $238, %xmm1, %xmm3
-        mulsd     %xmm5, %xmm1
-        pshufd    $238, %xmm4, %xmm5
-        addsd     %xmm2, %xmm3
-        pshufd    $238, %xmm2, %xmm2
-        addsd     %xmm4, %xmm7
-        movq      %xmm0, %xmm4
-        mulsd     %xmm2, %xmm6
-        mulsd     %xmm5, %xmm7
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm2, %xmm7
-        subsd     %xmm0, %xmm4
-        addsd     %xmm7, %xmm1
-        addsd     %xmm4, %xmm6
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        cmpl      $16, %ecx
-        jae       .L_2TAG_PACKET_5.0.2
-        movq      %xmm0, %xmm1
-        mulsd     %xmm1, %xmm1
-        jmp       ..B1.5
-.L_2TAG_PACKET_5.0.2:
-        xorpd     %xmm2, %xmm2
-        movl      $17392, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        xorpd     %xmm3, %xmm3
-        movl      $15344, %edx
-        pinsrw    $3, %edx, %xmm3
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm0
-        mulsd     %xmm3, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_3.0.2:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        xorpd     %xmm0, %xmm0
-        movl      $32736, %eax
-        pinsrw    $3, %eax, %xmm0
-        orl       %edx, %eax
-        pinsrw    $3, %eax, %xmm1
-        mulsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_2.0.2
-.L_2TAG_PACKET_6.0.2:
-        xorpd     %xmm1, %xmm1
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm1
-        andnpd    %xmm0, %xmm1
-        mulsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_2.0.2:
-        movq      %xmm0, (%rsp)
-..B1.3:
-        movq      (%rsp), %xmm0
-.L_2TAG_PACKET_7.0.2:
-..B1.5:
-        popq      %rcx
-..___tag_value_sinh.4:
-        ret       
-..___tag_value_sinh.5:
-END(sinh)
-# -- End  sinh
-	.section .rodata, "a"
-	.align 16
-	.align 16
-L2E:
-	.long	1610612736
-	.long	1080497479
-	.long	4166901572
-	.long	1053077003
-	.type	L2E,@object
-	.size	L2E,16
-	.align 16
-Shifter:
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.type	Shifter,@object
-	.size	Shifter,16
-	.align 16
-cv:
-	.long	3607404736
-	.long	1044146952
-	.long	3607404736
-	.long	3191630600
-	.long	4277811695
-	.long	1063661122
-	.long	4277811695
-	.long	3211144770
-	.long	2140175755
-	.long	1033864261
-	.long	2140175755
-	.long	1033864261
-	.long	4289495988
-	.long	1054113747
-	.long	4289495988
-	.long	1054113747
-	.long	4277811695
-	.long	1064709698
-	.long	4277811695
-	.long	1064709698
-	.type	cv,@object
-	.size	cv,80
-	.align 16
-T2f:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	2851812149
-	.long	1072698941
-	.long	2595802551
-	.long	1016815913
-	.long	1048019041
-	.long	1072704666
-	.long	1398474845
-	.long	3161559171
-	.long	3899555717
-	.long	1072710421
-	.long	427280750
-	.long	3163595548
-	.long	3541402996
-	.long	1072716208
-	.long	2759177317
-	.long	1015903202
-	.long	702412510
-	.long	1072722027
-	.long	3803266087
-	.long	3163328991
-	.long	410360776
-	.long	1072727877
-	.long	1269990655
-	.long	1013024446
-	.long	3402036099
-	.long	1072733758
-	.long	405889334
-	.long	1016154232
-	.long	1828292879
-	.long	1072739672
-	.long	1255956747
-	.long	1016636974
-	.long	728909815
-	.long	1072745618
-	.long	383930225
-	.long	1016078044
-	.long	852742562
-	.long	1072751596
-	.long	667253586
-	.long	1010842135
-	.long	2952712987
-	.long	1072757606
-	.long	3293494651
-	.long	3161168877
-	.long	3490863953
-	.long	1072763649
-	.long	960797498
-	.long	3163997456
-	.long	3228316108
-	.long	1072769725
-	.long	3010241991
-	.long	3159471380
-	.long	2930322912
-	.long	1072775834
-	.long	2599499422
-	.long	3163762623
-	.long	3366293073
-	.long	1072781976
-	.long	3119426314
-	.long	1015169130
-	.long	1014845819
-	.long	1072788152
-	.long	3117910646
-	.long	3162607681
-	.long	948735466
-	.long	1072794361
-	.long	3516338028
-	.long	3163623459
-	.long	3949972341
-	.long	1072800603
-	.long	2068408548
-	.long	1015962444
-	.long	2214878420
-	.long	1072806880
-	.long	892270087
-	.long	3164164998
-	.long	828946858
-	.long	1072813191
-	.long	10642492
-	.long	1016988014
-	.long	586995997
-	.long	1072819536
-	.long	41662348
-	.long	3163676568
-	.long	2288159958
-	.long	1072825915
-	.long	2169144469
-	.long	1015924597
-	.long	2440944790
-	.long	1072832329
-	.long	2492769774
-	.long	1015196030
-	.long	1853186616
-	.long	1072838778
-	.long	3066496371
-	.long	1016705150
-	.long	1337108031
-	.long	1072845262
-	.long	3203724452
-	.long	1015726421
-	.long	1709341917
-	.long	1072851781
-	.long	2571168217
-	.long	1015201075
-	.long	3790955393
-	.long	1072858335
-	.long	2352942462
-	.long	3164228666
-	.long	4112506593
-	.long	1072864925
-	.long	2947355221
-	.long	1015419624
-	.long	3504003472
-	.long	1072871551
-	.long	3594001060
-	.long	3158379228
-	.long	2799960843
-	.long	1072878213
-	.long	1423655381
-	.long	1016070727
-	.long	2839424854
-	.long	1072884911
-	.long	1171596163
-	.long	1014090255
-	.long	171030293
-	.long	1072891646
-	.long	3526460132
-	.long	1015477354
-	.long	4232894513
-	.long	1072898416
-	.long	2383938684
-	.long	1015717095
-	.long	2992903935
-	.long	1072905224
-	.long	2218154406
-	.long	1016276769
-	.long	1603444721
-	.long	1072912069
-	.long	1548633640
-	.long	3163249902
-	.long	926591435
-	.long	1072918951
-	.long	3208833762
-	.long	3163962090
-	.long	1829099622
-	.long	1072925870
-	.long	1016661181
-	.long	3164509581
-	.long	887463927
-	.long	1072932827
-	.long	3596744163
-	.long	3161842742
-	.long	3272845541
-	.long	1072939821
-	.long	928852419
-	.long	3164536824
-	.long	1276261410
-	.long	1072946854
-	.long	300981948
-	.long	1015732745
-	.long	78413852
-	.long	1072953925
-	.long	4183226867
-	.long	3164065827
-	.long	569847338
-	.long	1072961034
-	.long	472945272
-	.long	3160339305
-	.long	3645941911
-	.long	1072968181
-	.long	3814685081
-	.long	3162621917
-	.long	1617004845
-	.long	1072975368
-	.long	82804944
-	.long	1011391354
-	.long	3978100823
-	.long	1072982593
-	.long	3513027190
-	.long	1016894539
-	.long	3049340112
-	.long	1072989858
-	.long	3062915824
-	.long	1014219171
-	.long	4040676318
-	.long	1072997162
-	.long	4090609238
-	.long	1016712034
-	.long	3577096743
-	.long	1073004506
-	.long	2951496418
-	.long	1014842263
-	.long	2583551245
-	.long	1073011890
-	.long	3161094195
-	.long	1016655067
-	.long	1990012071
-	.long	1073019314
-	.long	3529070563
-	.long	3163861769
-	.long	2731501122
-	.long	1073026778
-	.long	1774031855
-	.long	3163518597
-	.long	1453150082
-	.long	1073034283
-	.long	498154669
-	.long	3162536638
-	.long	3395129871
-	.long	1073041828
-	.long	4025345435
-	.long	3163383964
-	.long	917841882
-	.long	1073049415
-	.long	18715565
-	.long	1016707884
-	.long	3566716925
-	.long	1073057042
-	.long	1536826856
-	.long	1015191009
-	.long	3712504873
-	.long	1073064711
-	.long	88491949
-	.long	1016476236
-	.long	2321106615
-	.long	1073072422
-	.long	2171176610
-	.long	1010584347
-	.long	363667784
-	.long	1073080175
-	.long	813753950
-	.long	1016833785
-	.long	3111574537
-	.long	1073087969
-	.long	2606161479
-	.long	3163808322
-	.long	2956612997
-	.long	1073095806
-	.long	2118169751
-	.long	3163784129
-	.long	885834528
-	.long	1073103686
-	.long	1973258547
-	.long	3163310140
-	.long	2186617381
-	.long	1073111608
-	.long	2270764084
-	.long	3164321289
-	.long	3561793907
-	.long	1073119573
-	.long	1157054053
-	.long	1012938926
-	.long	1719614413
-	.long	1073127582
-	.long	330458198
-	.long	3164331316
-	.long	1963711167
-	.long	1073135634
-	.long	1744767757
-	.long	3161622870
-	.long	1013258799
-	.long	1073143730
-	.long	1748797611
-	.long	3161177658
-	.long	4182873220
-	.long	1073151869
-	.long	629542646
-	.long	3163044879
-	.long	3907805044
-	.long	1073160053
-	.long	2257091225
-	.long	3162598983
-	.long	1218806132
-	.long	1073168282
-	.long	1818613052
-	.long	3163597017
-	.long	1447192521
-	.long	1073176555
-	.long	1462857171
-	.long	3163563097
-	.long	1339972927
-	.long	1073184873
-	.long	167908909
-	.long	1016620728
-	.long	1944781191
-	.long	1073193236
-	.long	3993278767
-	.long	3162772855
-	.long	19972402
-	.long	1073201645
-	.long	3507899862
-	.long	1017057868
-	.long	919555682
-	.long	1073210099
-	.long	3121969534
-	.long	1013996802
-	.long	1413356050
-	.long	1073218599
-	.long	1651349291
-	.long	3163716742
-	.long	2571947539
-	.long	1073227145
-	.long	3558159064
-	.long	3164425245
-	.long	1176749997
-	.long	1073235738
-	.long	2738998779
-	.long	3163084420
-	.long	2604962541
-	.long	1073244377
-	.long	2614425274
-	.long	3164587768
-	.long	3649726105
-	.long	1073253063
-	.long	4085036346
-	.long	1016698050
-	.long	1110089947
-	.long	1073261797
-	.long	1451641639
-	.long	1016523249
-	.long	380978316
-	.long	1073270578
-	.long	854188970
-	.long	3161511262
-	.long	2568320822
-	.long	1073279406
-	.long	2732824428
-	.long	1015401491
-	.long	194117574
-	.long	1073288283
-	.long	777528612
-	.long	3164460665
-	.long	2966275557
-	.long	1073297207
-	.long	2176155324
-	.long	3160891335
-	.long	3418903055
-	.long	1073306180
-	.long	2527457337
-	.long	3161869180
-	.long	2682146384
-	.long	1073315202
-	.long	2082178513
-	.long	3164411995
-	.long	1892288442
-	.long	1073324273
-	.long	2446255666
-	.long	3163648957
-	.long	2191782032
-	.long	1073333393
-	.long	2960257726
-	.long	1014791238
-	.long	434316067
-	.long	1073342563
-	.long	2028358766
-	.long	1014506698
-	.long	2069751141
-	.long	1073351782
-	.long	1562170675
-	.long	3163773257
-	.long	3964284211
-	.long	1073361051
-	.long	2111583915
-	.long	1016475740
-	.long	2990417245
-	.long	1073370371
-	.long	3683467745
-	.long	3164417902
-	.long	321958744
-	.long	1073379742
-	.long	3401933767
-	.long	1016843134
-	.long	1434058175
-	.long	1073389163
-	.long	251133233
-	.long	1016134345
-	.long	3218338682
-	.long	1073398635
-	.long	3404164304
-	.long	3163525684
-	.long	2572866477
-	.long	1073408159
-	.long	878562433
-	.long	1016570317
-	.long	697153126
-	.long	1073417735
-	.long	1283515429
-	.long	3164331765
-	.long	3092190715
-	.long	1073427362
-	.long	814012168
-	.long	3160571998
-	.long	2380618042
-	.long	1073437042
-	.long	3149557219
-	.long	3164369375
-	.long	4076559943
-	.long	1073446774
-	.long	2119478331
-	.long	3161806927
-	.long	815859274
-	.long	1073456560
-	.long	240396590
-	.long	3164536019
-	.long	2420883922
-	.long	1073466398
-	.long	2049810052
-	.long	1015168464
-	.long	1540824585
-	.long	1073476290
-	.long	1064017011
-	.long	3164536266
-	.long	3716502172
-	.long	1073486235
-	.long	2303740125
-	.long	1015091301
-	.long	1610600570
-	.long	1073496235
-	.long	3766732298
-	.long	1016808759
-	.long	777507147
-	.long	1073506289
-	.long	4282924205
-	.long	1016236109
-	.long	2483480501
-	.long	1073516397
-	.long	1216371780
-	.long	1014082748
-	.long	3706687593
-	.long	1073526560
-	.long	3521726940
-	.long	1014301643
-	.long	1432208378
-	.long	1073536779
-	.long	1401068914
-	.long	3163412539
-	.long	1242007932
-	.long	1073547053
-	.long	1132034716
-	.long	3164388407
-	.long	135105010
-	.long	1073557383
-	.long	1906148728
-	.long	3164424315
-	.long	3707479175
-	.long	1073567768
-	.long	3613079303
-	.long	1015213314
-	.long	382305176
-	.long	1073578211
-	.long	2347622376
-	.long	3163627201
-	.long	64696965
-	.long	1073588710
-	.long	1768797490
-	.long	1016865536
-	.long	4076975200
-	.long	1073599265
-	.long	2029000899
-	.long	1016257111
-	.long	863738719
-	.long	1073609879
-	.long	1326992220
-	.long	3163661773
-	.long	351641897
-	.long	1073620550
-	.long	2172261526
-	.long	3164059175
-	.long	3884662774
-	.long	1073631278
-	.long	2158611599
-	.long	1015258761
-	.long	4224142467
-	.long	1073642065
-	.long	3389820386
-	.long	1016255778
-	.long	2728693978
-	.long	1073652911
-	.long	396109971
-	.long	3164511267
-	.long	764307441
-	.long	1073663816
-	.long	3021057420
-	.long	3164378099
-	.long	3999357479
-	.long	1073674779
-	.long	2258941616
-	.long	1016973300
-	.long	929806999
-	.long	1073685803
-	.long	3205336643
-	.long	1016308133
-	.long	1533953344
-	.long	1073696886
-	.long	769171851
-	.long	1016714209
-	.long	2912730644
-	.long	1073708029
-	.long	3490067722
-	.long	3164453650
-	.long	2174652632
-	.long	1073719233
-	.long	4087714590
-	.long	1015498835
-	.long	730821105
-	.long	1073730498
-	.long	2523232743
-	.long	1013115764
-	.type	T2f,@object
-	.size	T2f,2048
-	.align 16
-T2_neg_f:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.type	T2_neg_f,@object
-	.size	T2_neg_f,2048
-	.align 16
-pv:
-	.long	329805064
-	.long	1038488134
-	.long	2773927730
-	.long	1053236707
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1069897045
-	.long	1744127201
-	.long	1046144581
-	.long	436314137
-	.long	1059717536
-	.type	pv,@object
-	.size	pv,48
-	.align 16
-MASK3:
-	.long	0
-	.long	4294967280
-	.long	0
-	.long	4294967280
-	.type	MASK3,@object
-	.size	MASK3,16
-	.align 8
-HALFMASK:
-	.long	4160749568
-	.long	2147483647
-	.type	HALFMASK,@object
-	.size	HALFMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_sinh.1-.
-	.4byte ..___tag_value_sinh.5-..___tag_value_sinh.1
-	.2byte 0x0400
-	.4byte ..___tag_value_sinh.3-..___tag_value_sinh.1
-	.2byte 0x100e
-	.byte 0x04
-	.4byte ..___tag_value_sinh.4-..___tag_value_sinh.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/floor.S b/libm/x86_64/floor.S
deleted file mode 100644
index dc80e88..0000000
--- a/libm/x86_64/floor.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(floor)
-roundsd $0x1,%xmm0,%xmm0
-retq
-END(floor)
diff --git a/libm/x86_64/floorf.S b/libm/x86_64/floorf.S
deleted file mode 100644
index 832f9c5..0000000
--- a/libm/x86_64/floorf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(floorf)
-roundss $0x1,%xmm0,%xmm0
-retq
-END(floorf)
diff --git a/libm/x86_64/rint.S b/libm/x86_64/rint.S
deleted file mode 100644
index 9731daa..0000000
--- a/libm/x86_64/rint.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(rint)
-  roundsd $0x4,%xmm0,%xmm0
-  retq
-END(rint)
diff --git a/libm/x86_64/rintf.S b/libm/x86_64/rintf.S
deleted file mode 100644
index c3e98bf..0000000
--- a/libm/x86_64/rintf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(rintf)
-  roundss $0x4,%xmm0,%xmm0
-  retq
-END(rintf)
diff --git a/libm/x86_64/s_atan.S b/libm/x86_64/s_atan.S
deleted file mode 100644
index d0e5d72..0000000
--- a/libm/x86_64/s_atan.S
+++ /dev/null
@@ -1,927 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// This implementation uses the main path for |x| in [2^{-5},2^65).
-// For |x| in [2^{-64},2^{-5}), a secondary path is used.
-// For the biased exponent of X within 3FFH-64 and 3FF+64, we use one branch.
-// We use the following definition of B and X` so that the formula
-// atan(X) = Tau + atan( (X`-B) / (One + BX) ) is correct
-//
-// X = (-1)^s * 2^k * 1. x1 x2 ... x52
-//
-// Define X`  = 0 if k >= 5; and X`  = |X| otherwise
-// Define One = 0 if k >= 5; and One = 1 otherwise
-// Define B  = 0 if k <= -6; B =  2^k * 1.x1 x2 x3 x4 1  if -5 <= k <= 4
-// Define B  =  2^5 * 1.0 0 ... 0   if  k >= 5
-//
-// Tau is 0 if k <= -6;
-// Tau is atan( B )  if -5 <= k <= 4
-// Tau is pi/2 if k >= 5
-//
-// Special cases:
-//  atan(NaN) = quiet NaN
-//  atan(+/-INF) = +/-Pi/2
-//  atan(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  atan
-ENTRY(atan)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_atan.1:
-        pushq     %rsi
-..___tag_value_atan.3:
-        movsd     %xmm0, (%rsp)
-..B1.2:
-        movq      $0xffff000000000000, %r8
-        movd      %r8, %xmm3
-        movq      ONEMASK(%rip), %xmm5
-        movq      $0x800000000000, %r9
-        movd      %r9, %xmm4
-        pextrw    $3, %xmm0, %edx
-        andpd     %xmm0, %xmm3
-        pshufd    $68, %xmm0, %xmm1
-        orpd      %xmm4, %xmm3
-        movl      %edx, %eax
-        andl      $32767, %edx
-        subl      $16288, %edx
-        cmpl      $159, %edx
-        ja        .L_2TAG_PACKET_0.0.1
-        mulsd     %xmm3, %xmm1
-        subsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm1
-        divsd     %xmm1, %xmm0
-        addl      $1, %edx
-        movq      a2(%rip), %xmm2
-        movq      b2(%rip), %xmm4
-        andl      $32768, %eax
-        xorpd     %xmm7, %xmm7
-        pinsrw    $3, %eax, %xmm7
-        addl      %edx, %edx
-        lea       atan_tbl(%rip), %r8
-        movq      (%r8,%rdx,8), %xmm6
-        movq      8(%r8,%rdx,8), %xmm5
-        xorpd     %xmm7, %xmm5
-        xorpd     %xmm7, %xmm6
-        movq      8+a2(%rip), %xmm7
-        movddup   %xmm0, %xmm1
-        mulsd     %xmm0, %xmm0
-        movddup   %xmm1, %xmm3
-        addsd     %xmm6, %xmm1
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm4
-        subsd     %xmm1, %xmm6
-        mulsd     %xmm0, %xmm4
-        addsd     %xmm7, %xmm2
-        mulsd     %xmm3, %xmm0
-        addsd     %xmm3, %xmm6
-        mulsd     %xmm2, %xmm0
-        addsd     8+b2(%rip), %xmm4
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm6, %xmm0
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.1
-.L_2TAG_PACKET_0.0.1:
-        addl      $944, %edx
-        cmpl      $1103, %edx
-        ja        .L_2TAG_PACKET_2.0.1
-        movq      a2(%rip), %xmm4
-        movq      b2(%rip), %xmm7
-        movq      (%rsp), %xmm0
-        mulsd     %xmm1, %xmm1
-        movq      8+a2(%rip), %xmm2
-        movq      8+b2(%rip), %xmm5
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm1, %xmm7
-        movq      %xmm1, %xmm6
-        mulsd     %xmm0, %xmm1
-        addsd     %xmm4, %xmm2
-        mulsd     %xmm6, %xmm7
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm5, %xmm7
-        mulsd     %xmm7, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.1
-.L_2TAG_PACKET_2.0.1:
-        addl      $15344, %edx
-        cmpl      $16368, %edx
-        ja        .L_2TAG_PACKET_3.0.1
-        movq      (%rsp), %xmm0
-        movq      (%rsp), %xmm1
-        cmpl      $16, %edx
-        jae       .L_2TAG_PACKET_1.0.1
-        mulsd     %xmm0, %xmm1
-        jmp       .L_2TAG_PACKET_1.0.1
-.L_2TAG_PACKET_3.0.1:
-        cmpl      $17392, %edx
-        jae       .L_2TAG_PACKET_4.0.1
-        movq      $0xbff0000000000000, %r8
-        movd      %r8, %xmm1
-        divsd     %xmm0, %xmm1
-        movq      a2(%rip), %xmm2
-        movq      b2(%rip), %xmm4
-        andl      $32768, %eax
-        xorpd     %xmm7, %xmm7
-        pinsrw    $3, %eax, %xmm7
-        addl      %edx, %edx
-        movq      pi_table(%rip), %xmm6
-        movq      8+pi_table(%rip), %xmm5
-        xorpd     %xmm7, %xmm5
-        xorpd     %xmm7, %xmm6
-        movq      8+a2(%rip), %xmm7
-        movddup   %xmm1, %xmm0
-        mulsd     %xmm1, %xmm1
-        movddup   %xmm0, %xmm3
-        addsd     %xmm6, %xmm0
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm1, %xmm4
-        subsd     %xmm0, %xmm6
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm7, %xmm2
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm3, %xmm6
-        mulsd     %xmm2, %xmm1
-        addsd     8+b2(%rip), %xmm4
-        addsd     %xmm5, %xmm6
-        mulsd     %xmm4, %xmm1
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.1
-.L_2TAG_PACKET_4.0.1:
-        movq      (%rsp), %xmm4
-        movq      SGNMASK(%rip), %xmm0
-        movq      pi_table(%rip), %xmm2
-        movq      8+pi_table(%rip), %xmm3
-        movd      %xmm1, %eax
-        psrlq     $32, %xmm1
-        movd      %xmm1, %edx
-        andl      $2147483647, %edx
-        cmpl      $2146435072, %edx
-        jae       .L_2TAG_PACKET_5.0.1
-.L_2TAG_PACKET_6.0.1:
-        andnpd    %xmm4, %xmm0
-        orpd      %xmm0, %xmm2
-        orpd      %xmm3, %xmm0
-        addsd     %xmm2, %xmm0
-        jmp       .L_2TAG_PACKET_1.0.1
-.L_2TAG_PACKET_5.0.1:
-        subl      $2146435072, %edx
-        orl       %edx, %eax
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_6.0.1
-        movq      %xmm4, %xmm0
-        addsd     %xmm0, %xmm0
-.L_2TAG_PACKET_1.0.1:
-..B1.3:
-        popq      %rcx
-..___tag_value_atan.4:
-        ret       
-..___tag_value_atan.5:
-END(atan)
-# -- End  atan
-	.section .rodata, "a"
-	.align 4
-	.align 4
-ONEMASK:
-	.long	0
-	.long	1072693248
-	.type	ONEMASK,@object
-	.size	ONEMASK,8
-	.align 4
-a2:
-	.long	2006262985
-	.long	1069310863
-	.long	2358449471
-	.long	3217342131
-	.type	a2,@object
-	.size	a2,16
-	.align 4
-b2:
-	.long	3845454352
-	.long	1069952297
-	.long	2829679149
-	.long	1073771565
-	.type	b2,@object
-	.size	b2,16
-	.align 4
-atan_tbl:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3819695742
-	.long	1067482761
-	.long	2398680355
-	.long	3155462074
-	.long	2998791009
-	.long	1067548225
-	.long	3868465248
-	.long	3157182472
-	.long	3339424991
-	.long	1067613680
-	.long	3296670360
-	.long	1010752543
-	.long	2710002256
-	.long	1067679126
-	.long	3403896007
-	.long	1010910768
-	.long	3275701428
-	.long	1067744562
-	.long	119959933
-	.long	1011482843
-	.long	2908636881
-	.long	1067809988
-	.long	2464489612
-	.long	1011545526
-	.long	3777889398
-	.long	1067875403
-	.long	3262682165
-	.long	1009703919
-	.long	3759667419
-	.long	1067940807
-	.long	1838130851
-	.long	3157373556
-	.long	732369940
-	.long	1068006200
-	.long	1203428313
-	.long	1010055371
-	.long	1166616461
-	.long	1068071580
-	.long	2901274051
-	.long	3158549977
-	.long	2945472892
-	.long	1068136947
-	.long	3726120658
-	.long	1009762715
-	.long	3954480976
-	.long	1068202301
-	.long	1289173457
-	.long	1009429861
-	.long	2081752829
-	.long	1068267642
-	.long	1836909874
-	.long	1006212095
-	.long	3807999788
-	.long	1068332968
-	.long	2172459940
-	.long	3156162078
-	.long	2731789884
-	.long	1068398280
-	.long	3450718392
-	.long	3159216547
-	.long	1044477961
-	.long	1068463577
-	.long	2230553229
-	.long	1011424339
-	.long	1486930287
-	.long	1068530218
-	.long	2861547474
-	.long	1012041376
-	.long	2293016881
-	.long	1068595466
-	.long	136843272
-	.long	1012684797
-	.long	201518157
-	.long	1068660680
-	.long	63231984
-	.long	1012427198
-	.long	4054234584
-	.long	1068725856
-	.long	3927006960
-	.long	1011878955
-	.long	1246477213
-	.long	1068790995
-	.long	1494265652
-	.long	3155219350
-	.long	678186699
-	.long	1068856093
-	.long	1264361424
-	.long	3159256693
-	.long	2690594995
-	.long	1068921148
-	.long	3906996379
-	.long	1009288267
-	.long	3362611517
-	.long	1068986159
-	.long	1650970041
-	.long	3158331771
-	.long	3102162111
-	.long	1069051124
-	.long	365917035
-	.long	3160264153
-	.long	2352611067
-	.long	1069116041
-	.long	4008970190
-	.long	3159478182
-	.long	1594134794
-	.long	1069180908
-	.long	466690178
-	.long	1012526501
-	.long	1345079306
-	.long	1069245723
-	.long	2268273568
-	.long	3160164092
-	.long	2163300970
-	.long	1069310484
-	.long	2750834800
-	.long	3158113482
-	.long	352522716
-	.long	1069375190
-	.long	1750411372
-	.long	1011790845
-	.long	848541647
-	.long	1069439838
-	.long	2164207573
-	.long	1011698350
-	.long	40647312
-	.long	1069504427
-	.long	2949165434
-	.long	3159107267
-	.long	2216766270
-	.long	1069574357
-	.long	2197920765
-	.long	3161055954
-	.long	1090914384
-	.long	1069638757
-	.long	2330454674
-	.long	1013365998
-	.long	387601244
-	.long	1069703022
-	.long	3185681168
-	.long	1013434071
-	.long	3991640484
-	.long	1069767144
-	.long	1313211590
-	.long	3161087959
-	.long	3322489502
-	.long	1069831118
-	.long	3013977995
-	.long	1013053011
-	.long	3121698570
-	.long	1069894936
-	.long	4069015667
-	.long	1013023362
-	.long	4289964660
-	.long	1069958591
-	.long	1736191156
-	.long	3158266731
-	.long	3903312386
-	.long	1070022077
-	.long	1833592413
-	.long	3159731471
-	.long	3818449864
-	.long	1070085387
-	.long	851036429
-	.long	3159730451
-	.long	2097480306
-	.long	1070148515
-	.long	3506390884
-	.long	3160462302
-	.long	1611694502
-	.long	1070211454
-	.long	2785735540
-	.long	3160465144
-	.long	1464694796
-	.long	1070274198
-	.long	4229277299
-	.long	3159907000
-	.long	1299612775
-	.long	1070336741
-	.long	4116653788
-	.long	3160427739
-	.long	1310544789
-	.long	1070399077
-	.long	1064430331
-	.long	1013218202
-	.long	2253168030
-	.long	1070461200
-	.long	1405044609
-	.long	3157623179
-	.long	1159567373
-	.long	1070523105
-	.long	2353445521
-	.long	3159992176
-	.long	1359373750
-	.long	1070605818
-	.long	1748171336
-	.long	3161879263
-	.long	908341706
-	.long	1070667034
-	.long	3372710815
-	.long	3161775245
-	.long	1743027350
-	.long	1070727765
-	.long	687089934
-	.long	3160507171
-	.long	2055355646
-	.long	1070787992
-	.long	2392855242
-	.long	1013682469
-	.long	690426164
-	.long	1070847697
-	.long	1103926666
-	.long	1014052810
-	.long	1483247847
-	.long	1070906862
-	.long	2082645847
-	.long	3161345479
-	.long	392040270
-	.long	1070965472
-	.long	2407720023
-	.long	1014053754
-	.long	2673846014
-	.long	1071023511
-	.long	1293605532
-	.long	3158464385
-	.long	1384215810
-	.long	1071080967
-	.long	2446095872
-	.long	3159216407
-	.long	3101660631
-	.long	1071137826
-	.long	698040758
-	.long	1014855328
-	.long	2094057058
-	.long	1071194078
-	.long	2282048339
-	.long	1014040385
-	.long	1712750594
-	.long	1071249712
-	.long	1204372378
-	.long	3162276464
-	.long	1411515787
-	.long	1071304719
-	.long	949080808
-	.long	1015006403
-	.long	931538085
-	.long	1071359091
-	.long	3027127039
-	.long	1014307233
-	.long	179139065
-	.long	1071412821
-	.long	4285547492
-	.long	3161934731
-	.long	3387721259
-	.long	1071465902
-	.long	373225773
-	.long	1013486625
-	.long	2132236852
-	.long	1071544299
-	.long	3250533429
-	.long	1014031677
-	.long	1942070284
-	.long	1071645596
-	.long	1237964179
-	.long	3163239113
-	.long	1532707802
-	.long	1071695380
-	.long	330645583
-	.long	1012495610
-	.long	2294184979
-	.long	1071743834
-	.long	3959472897
-	.long	1015833116
-	.long	3805060714
-	.long	1071790961
-	.long	2671256142
-	.long	1013727772
-	.long	2215037898
-	.long	1071836770
-	.long	2683359117
-	.long	1015831902
-	.long	483661594
-	.long	1071881273
-	.long	836288326
-	.long	3162648643
-	.long	1534679894
-	.long	1071924486
-	.long	373258696
-	.long	3162470096
-	.long	1538714628
-	.long	1071966430
-	.long	3199433068
-	.long	1015325501
-	.long	527642555
-	.long	1072007128
-	.long	3636832592
-	.long	3161843145
-	.long	291339150
-	.long	1072046605
-	.long	890169537
-	.long	3160586117
-	.long	2450210201
-	.long	1072084888
-	.long	1636353294
-	.long	3163193400
-	.long	2411367951
-	.long	1072122007
-	.long	374899873
-	.long	1011331750
-	.long	681549971
-	.long	1072157992
-	.long	506411689
-	.long	1015373954
-	.long	1466745541
-	.long	1072192873
-	.long	2143860931
-	.long	1013364334
-	.long	2845622366
-	.long	1072226682
-	.long	2869178209
-	.long	3162423682
-	.long	2838871438
-	.long	1072275456
-	.long	3742223599
-	.long	1014338577
-	.long	4200275274
-	.long	1072337034
-	.long	1566539915
-	.long	3161839550
-	.long	3034733530
-	.long	1072394897
-	.long	652621408
-	.long	3162261964
-	.long	3207412993
-	.long	1072449290
-	.long	3206124665
-	.long	1014408733
-	.long	624461478
-	.long	1072500450
-	.long	932437485
-	.long	1015204343
-	.long	767665908
-	.long	1072548600
-	.long	1037911952
-	.long	3163527627
-	.long	1110773639
-	.long	1072593952
-	.long	2371517912
-	.long	3160465741
-	.long	1940828530
-	.long	1072636704
-	.long	2731408428
-	.long	3162895795
-	.long	1911329388
-	.long	1072677041
-	.long	1773089615
-	.long	3159569267
-	.long	1764715788
-	.long	1072704191
-	.long	691346949
-	.long	3164069946
-	.long	3332979233
-	.long	1072722195
-	.long	3550733983
-	.long	1014770628
-	.long	1321870254
-	.long	1072739231
-	.long	1415315820
-	.long	1016224052
-	.long	3657429030
-	.long	1072755365
-	.long	3910539033
-	.long	1015966402
-	.long	4197624557
-	.long	1072770661
-	.long	2333399254
-	.long	3164546480
-	.long	1512059493
-	.long	1072785177
-	.long	2701510318
-	.long	1016178092
-	.long	453379037
-	.long	1072798965
-	.long	4046344253
-	.long	3162814364
-	.long	1942345162
-	.long	1072818388
-	.long	621134147
-	.long	1016335195
-	.long	4210176273
-	.long	1072842164
-	.long	2701013387
-	.long	3164326619
-	.long	4185644010
-	.long	1072863795
-	.long	4163699341
-	.long	1016203112
-	.long	679688788
-	.long	1072883543
-	.long	4147276762
-	.long	1014066750
-	.long	29432865
-	.long	1072901630
-	.long	970415797
-	.long	1016902063
-	.long	4070721092
-	.long	1072918247
-	.long	2539004411
-	.long	3163736096
-	.long	2252468843
-	.long	1072933561
-	.long	3424082887
-	.long	3163407177
-	.long	2929724825
-	.long	1072947712
-	.long	3661482235
-	.long	3163846989
-	.long	1377513368
-	.long	1072960824
-	.long	3987926680
-	.long	1013647908
-	.long	1031632908
-	.long	1072973003
-	.long	3672217151
-	.long	1016614619
-	.long	2516508130
-	.long	1072984342
-	.long	545855020
-	.long	3162728930
-	.long	3792452178
-	.long	1072994923
-	.long	3420119467
-	.long	1016471430
-	.long	3147791459
-	.long	1073004818
-	.long	1342204979
-	.long	1013937254
-	.long	999189752
-	.long	1073014090
-	.long	1006335472
-	.long	3162850919
-	.long	711011011
-	.long	1073022794
-	.long	4633488
-	.long	3162966895
-	.long	15640363
-	.long	1073030980
-	.long	1686389560
-	.long	3164376226
-	.long	1218463589
-	.long	1073042382
-	.long	1526837110
-	.long	3163533985
-	.long	2538470555
-	.long	1073056144
-	.long	2273304406
-	.long	3163784996
-	.long	1229720947
-	.long	1073068489
-	.long	2971628206
-	.long	3162356540
-	.long	3115427016
-	.long	1073079621
-	.long	4215132957
-	.long	3164282762
-	.long	4030612557
-	.long	1073089709
-	.long	1913251691
-	.long	3163671292
-	.long	2728521257
-	.long	1073098892
-	.long	2861089500
-	.long	1015454459
-	.long	1118696283
-	.long	1073107285
-	.long	1628948053
-	.long	1016179658
-	.long	2682711255
-	.long	1073114984
-	.long	2906306266
-	.long	1014142643
-	.long	2073898081
-	.long	1073122072
-	.long	1322740454
-	.long	3164497217
-	.long	1403700297
-	.long	1073128618
-	.long	416137895
-	.long	3162781466
-	.long	2502685617
-	.long	1073134681
-	.long	3242008732
-	.long	1014593495
-	.long	1531926851
-	.long	1073140313
-	.long	1362708094
-	.long	1016517604
-	.long	3572814411
-	.long	1073145557
-	.long	3709790527
-	.long	1012646874
-	.long	1695536111
-	.long	1073150453
-	.long	3980346340
-	.long	1016705136
-	.long	2363057203
-	.long	1073155033
-	.long	2551194792
-	.long	1012569695
-	.long	2873365682
-	.long	1073159327
-	.long	3181154748
-	.long	1017041450
-	.long	1053384691
-	.long	1073165288
-	.long	3074536879
-	.long	1016965660
-	.long	3270542712
-	.long	1073172451
-	.long	2535319415
-	.long	3163051778
-	.long	1353631484
-	.long	1073178850
-	.long	1173833755
-	.long	1015534537
-	.long	3511218460
-	.long	1073184599
-	.long	1243608109
-	.long	3161592122
-	.long	4121259284
-	.long	1073189793
-	.long	398584912
-	.long	3163829923
-	.long	1193862106
-	.long	1073194509
-	.long	1873745539
-	.long	3163802819
-	.long	3861949790
-	.long	1073198808
-	.long	3841261147
-	.long	1015587248
-	.long	1486904578
-	.long	1073202745
-	.long	1634726776
-	.long	3163847886
-	.long	2879153715
-	.long	1073206362
-	.long	200456242
-	.long	3164138657
-	.long	385353253
-	.long	1073209698
-	.long	1186355517
-	.long	1014887155
-	.long	1125865839
-	.long	1073212783
-	.long	203561262
-	.long	3161244927
-	.long	1221361475
-	.long	1073215645
-	.long	3382476563
-	.long	1014936138
-	.long	2077323573
-	.long	1073218307
-	.long	1005121005
-	.long	3164430752
-	.long	215611373
-	.long	1073220790
-	.long	353198764
-	.long	3164485137
-	.long	2347419265
-	.long	1073223110
-	.long	1103143360
-	.long	1016542137
-	.long	1379112765
-	.long	1073225284
-	.long	381583533
-	.long	3162870833
-	.long	3891198463
-	.long	1073228298
-	.long	1771275754
-	.long	1014654681
-	.long	3395914051
-	.long	1073231917
-	.long	2350900914
-	.long	3164013978
-	.long	2799919478
-	.long	1073235146
-	.long	2893950164
-	.long	3163260901
-	.long	1138673476
-	.long	1073238045
-	.long	2622204785
-	.long	3164174388
-	.long	3408855940
-	.long	1073240661
-	.long	2800881650
-	.long	1016008624
-	.long	2044858738
-	.long	1073243035
-	.long	604544785
-	.long	1017022901
-	.long	2578795176
-	.long	1073245198
-	.long	2557332925
-	.long	1016135165
-	.long	4196285314
-	.long	1073247177
-	.long	2032365307
-	.long	1016194735
-	.long	224877747
-	.long	1073248996
-	.long	497926916
-	.long	1016947111
-	.long	3271386490
-	.long	1073250671
-	.long	2689994846
-	.long	1016631513
-	.long	813635989
-	.long	1073252221
-	.long	747035277
-	.long	3164530136
-	.long	369829519
-	.long	1073253658
-	.long	2182033858
-	.long	3163190340
-	.long	1187679052
-	.long	1073254994
-	.long	673954443
-	.long	1016149821
-	.long	4232586098
-	.long	1073256239
-	.long	497775200
-	.long	3162179015
-	.long	426690558
-	.long	1073257404
-	.long	3063343247
-	.long	1016865578
-	.long	1624065902
-	.long	1073258494
-	.long	1354224996
-	.long	3163503778
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.type	atan_tbl,@object
-	.size	atan_tbl,2592
-	.align 4
-pi_table:
-	.long	1413754136
-	.long	1073291771
-	.long	856972295
-	.long	1016178214
-	.type	pi_table,@object
-	.size	pi_table,16
-	.align 4
-SGNMASK:
-	.long	4294967295
-	.long	2147483647
-	.type	SGNMASK,@object
-	.size	SGNMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_atan.1-.
-	.4byte ..___tag_value_atan.5-..___tag_value_atan.1
-	.2byte 0x0400
-	.4byte ..___tag_value_atan.3-..___tag_value_atan.1
-	.2byte 0x100e
-	.byte 0x04
-	.4byte ..___tag_value_atan.4-..___tag_value_atan.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/s_cbrt.S b/libm/x86_64/s_cbrt.S
deleted file mode 100644
index 6b00f56..0000000
--- a/libm/x86_64/s_cbrt.S
+++ /dev/null
@@ -1,754 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//   Assume x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52, where j = 0,1,2.
-//   Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
-//   where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in double precision
-//   cbrt(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
-//   (T stores the high 53 bits, D stores the low order bits)
-//   Result=2^k*T+(2^k*T*r)*P+2^k*D
-//   where P=p1+p2*r+..+p8*r^7
-//
-// Special cases:
-//  cbrt(NaN) = quiet NaN, and raise invalid exception
-//  cbrt(INF) = that INF
-//  cbrt(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  cbrt
-ENTRY(cbrt)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_cbrt.1:
-        subq      $24, %rsp
-..___tag_value_cbrt.3:
-        movsd     %xmm0, (%rsp)
-..B1.2:
-        movq      %xmm0, %xmm7
-        movl      $524032, %edx
-        movsd     EXP_MSK3(%rip), %xmm5
-        movsd     EXP_MSK2(%rip), %xmm3
-        psrlq     $44, %xmm7
-        pextrw    $0, %xmm7, %ecx
-        movd      %xmm7, %eax
-        movsd     EXP_MASK(%rip), %xmm1
-        movsd     SIG_MASK(%rip), %xmm2
-        andl      $248, %ecx
-        lea       rcp_table(%rip), %r8
-        movsd     (%rcx,%r8), %xmm4
-        movq      %rax, %r9
-        andl      %eax, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_0.0.1
-        cmpl      $524032, %edx
-        je        .L_2TAG_PACKET_1.0.1
-        shrl      $8, %edx
-        shrq      $8, %r9
-        andpd     %xmm0, %xmm2
-        andpd     %xmm5, %xmm0
-        orpd      %xmm2, %xmm3
-        orpd      %xmm0, %xmm1
-        movapd    coeff_table(%rip), %xmm5
-        movl      $5462, %eax
-        movapd    16+coeff_table(%rip), %xmm6
-        mull      %edx
-        movq      %r9, %rdx
-        andq      $2047, %r9
-        shrl      $14, %eax
-        andl      $2048, %edx
-        subq      %rax, %r9
-        subq      %rax, %r9
-        subq      %rax, %r9
-        shlq      $8, %r9
-        addl      $682, %eax
-        orl       %edx, %eax
-        movd      %eax, %xmm7
-        addq      %r9, %rcx
-        psllq     $52, %xmm7
-.L_2TAG_PACKET_2.0.1:
-        movapd    32+coeff_table(%rip), %xmm2
-        movapd    48+coeff_table(%rip), %xmm0
-        subsd     %xmm3, %xmm1
-        movq      %xmm7, %xmm3
-        lea       cbrt_table(%rip), %r8
-        mulsd     (%rcx,%r8), %xmm7
-        mulsd     %xmm4, %xmm1
-        lea       D_table(%rip), %r8
-        mulsd     (%rcx,%r8), %xmm3
-        movapd    %xmm1, %xmm4
-        unpcklpd  %xmm1, %xmm1
-        mulpd     %xmm1, %xmm5
-        mulpd     %xmm1, %xmm6
-        mulpd     %xmm1, %xmm1
-        addpd     %xmm5, %xmm2
-        addpd     %xmm6, %xmm0
-        mulpd     %xmm1, %xmm2
-        mulpd     %xmm1, %xmm1
-        mulsd     %xmm7, %xmm4
-        addpd     %xmm2, %xmm0
-        mulsd     %xmm0, %xmm1
-        unpckhpd  %xmm0, %xmm0
-        addsd     %xmm1, %xmm0
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm3, %xmm0
-        addsd     %xmm7, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_0.0.1:
-        mulsd     SCALE63(%rip), %xmm0
-        movq      %xmm0, %xmm7
-        movl      $524032, %edx
-        psrlq     $44, %xmm7
-        pextrw    $0, %xmm7, %ecx
-        movd      %xmm7, %eax
-        andl      $248, %ecx
-        lea       rcp_table(%rip), %r8
-        movsd     (%rcx,%r8), %xmm4
-        movq      %rax, %r9
-        andl      %eax, %edx
-        shrl      $8, %edx
-        shrq      $8, %r9
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_3.0.1
-        andpd     %xmm0, %xmm2
-        andpd     %xmm5, %xmm0
-        orpd      %xmm2, %xmm3
-        orpd      %xmm0, %xmm1
-        movapd    coeff_table(%rip), %xmm5
-        movl      $5462, %eax
-        movapd    16+coeff_table(%rip), %xmm6
-        mull      %edx
-        movq      %r9, %rdx
-        andq      $2047, %r9
-        shrl      $14, %eax
-        andl      $2048, %edx
-        subq      %rax, %r9
-        subq      %rax, %r9
-        subq      %rax, %r9
-        shlq      $8, %r9
-        addl      $661, %eax
-        orl       %edx, %eax
-        movd      %eax, %xmm7
-        addq      %r9, %rcx
-        psllq     $52, %xmm7
-        jmp       .L_2TAG_PACKET_2.0.1
-.L_2TAG_PACKET_3.0.1:
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_4.0.1
-        xorpd     %xmm0, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_4.0.1:
-        movsd     ZERON(%rip), %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_1.0.1:
-        movl      4(%rsp), %eax
-        movl      (%rsp), %edx
-        movl      %eax, %ecx
-        andl      $2147483647, %ecx
-        cmpl      $2146435072, %ecx
-        ja        .L_2TAG_PACKET_5.0.1
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_5.0.1
-        cmpl      $2146435072, %eax
-        jne       .L_2TAG_PACKET_6.0.1
-        movsd     INF(%rip), %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_6.0.1:
-        movsd     NEG_INF(%rip), %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_5.0.1:
-        movsd     (%rsp), %xmm0
-        addsd     %xmm0, %xmm0
-        movq      %xmm0, 8(%rsp)
-.L_2TAG_PACKET_7.0.1:
-..B1.4:
-        addq      $24, %rsp
-..___tag_value_cbrt.4:
-        ret       
-..___tag_value_cbrt.5:
-END(cbrt)
-# -- End  cbrt
-	.section .rodata, "a"
-	.align 16
-	.align 16
-coeff_table:
-	.long	1553778919
-	.long	3213899486
-	.long	3534952507
-	.long	3215266280
-	.long	1646371399
-	.long	3214412045
-	.long	477218588
-	.long	3216798151
-	.long	3582521621
-	.long	1066628362
-	.long	1007461464
-	.long	1068473053
-	.long	889629714
-	.long	1067378449
-	.long	1431655765
-	.long	1070945621
-	.type	coeff_table,@object
-	.size	coeff_table,64
-	.align 4
-EXP_MSK3:
-	.long	4294967295
-	.long	1048575
-	.type	EXP_MSK3,@object
-	.size	EXP_MSK3,8
-	.align 4
-EXP_MSK2:
-	.long	0
-	.long	3220193280
-	.type	EXP_MSK2,@object
-	.size	EXP_MSK2,8
-	.align 4
-EXP_MASK:
-	.long	0
-	.long	3220176896
-	.type	EXP_MASK,@object
-	.size	EXP_MASK,8
-	.align 4
-SIG_MASK:
-	.long	0
-	.long	1032192
-	.type	SIG_MASK,@object
-	.size	SIG_MASK,8
-	.align 4
-rcp_table:
-	.long	528611360
-	.long	3220144632
-	.long	2884679527
-	.long	3220082993
-	.long	1991868891
-	.long	3220024928
-	.long	2298714891
-	.long	3219970134
-	.long	58835168
-	.long	3219918343
-	.long	3035110223
-	.long	3219869313
-	.long	1617585086
-	.long	3219822831
-	.long	2500867033
-	.long	3219778702
-	.long	4241943008
-	.long	3219736752
-	.long	258732970
-	.long	3219696825
-	.long	404232216
-	.long	3219658776
-	.long	2172167368
-	.long	3219622476
-	.long	1544257904
-	.long	3219587808
-	.long	377579543
-	.long	3219554664
-	.long	1616385542
-	.long	3219522945
-	.long	813783277
-	.long	3219492562
-	.long	3940743189
-	.long	3219463431
-	.long	2689777499
-	.long	3219435478
-	.long	1700977147
-	.long	3219408632
-	.long	3169102082
-	.long	3219382828
-	.long	327235604
-	.long	3219358008
-	.long	1244336319
-	.long	3219334115
-	.long	1300311200
-	.long	3219311099
-	.long	3095471925
-	.long	3219288912
-	.long	2166487928
-	.long	3219267511
-	.long	2913108253
-	.long	3219246854
-	.long	293672978
-	.long	3219226904
-	.long	288737297
-	.long	3219207624
-	.long	1810275472
-	.long	3219188981
-	.long	174592167
-	.long	3219170945
-	.long	3539053052
-	.long	3219153485
-	.long	2164392968
-	.long	3219136576
-	.type	rcp_table,@object
-	.size	rcp_table,256
-	.align 4
-cbrt_table:
-	.long	572345495
-	.long	1072698681
-	.long	1998204467
-	.long	1072709382
-	.long	3861501553
-	.long	1072719872
-	.long	2268192434
-	.long	1072730162
-	.long	2981979308
-	.long	1072740260
-	.long	270859143
-	.long	1072750176
-	.long	2958651392
-	.long	1072759916
-	.long	313113243
-	.long	1072769490
-	.long	919449400
-	.long	1072778903
-	.long	2809328903
-	.long	1072788162
-	.long	2222981587
-	.long	1072797274
-	.long	2352530781
-	.long	1072806244
-	.long	594152517
-	.long	1072815078
-	.long	1555767199
-	.long	1072823780
-	.long	4282421314
-	.long	1072832355
-	.long	2355578597
-	.long	1072840809
-	.long	1162590619
-	.long	1072849145
-	.long	797864051
-	.long	1072857367
-	.long	431273680
-	.long	1072865479
-	.long	2669831148
-	.long	1072873484
-	.long	733477752
-	.long	1072881387
-	.long	4280220604
-	.long	1072889189
-	.long	801961634
-	.long	1072896896
-	.long	2915370760
-	.long	1072904508
-	.long	1159613482
-	.long	1072912030
-	.long	2689944798
-	.long	1072919463
-	.long	1248687822
-	.long	1072926811
-	.long	2967951030
-	.long	1072934075
-	.long	630170432
-	.long	1072941259
-	.long	3760898254
-	.long	1072948363
-	.long	0
-	.long	1072955392
-	.long	2370273294
-	.long	1072962345
-	.long	1261754802
-	.long	1072972640
-	.long	546334065
-	.long	1072986123
-	.long	1054893830
-	.long	1072999340
-	.long	1571187597
-	.long	1073012304
-	.long	1107975175
-	.long	1073025027
-	.long	3606909377
-	.long	1073037519
-	.long	1113616747
-	.long	1073049792
-	.long	4154744632
-	.long	1073061853
-	.long	3358931423
-	.long	1073073713
-	.long	4060702372
-	.long	1073085379
-	.long	747576176
-	.long	1073096860
-	.long	3023138255
-	.long	1073108161
-	.long	1419988548
-	.long	1073119291
-	.long	1914185305
-	.long	1073130255
-	.long	294389948
-	.long	1073141060
-	.long	3761802570
-	.long	1073151710
-	.long	978281566
-	.long	1073162213
-	.long	823148820
-	.long	1073172572
-	.long	2420954441
-	.long	1073182792
-	.long	3815449908
-	.long	1073192878
-	.long	2046058587
-	.long	1073202835
-	.long	1807524753
-	.long	1073212666
-	.long	2628681401
-	.long	1073222375
-	.long	3225667357
-	.long	1073231966
-	.long	1555307421
-	.long	1073241443
-	.long	3454043099
-	.long	1073250808
-	.long	1208137896
-	.long	1073260066
-	.long	3659916772
-	.long	1073269218
-	.long	1886261264
-	.long	1073278269
-	.long	3593647839
-	.long	1073287220
-	.long	3086012205
-	.long	1073296075
-	.long	2769796922
-	.long	1073304836
-	.long	888716057
-	.long	1073317807
-	.long	2201465623
-	.long	1073334794
-	.long	164369365
-	.long	1073351447
-	.long	3462666733
-	.long	1073367780
-	.long	2773905457
-	.long	1073383810
-	.long	1342879088
-	.long	1073399550
-	.long	2543933975
-	.long	1073415012
-	.long	1684477781
-	.long	1073430209
-	.long	3532178543
-	.long	1073445151
-	.long	1147747300
-	.long	1073459850
-	.long	1928031793
-	.long	1073474314
-	.long	2079717015
-	.long	1073488553
-	.long	4016765315
-	.long	1073502575
-	.long	3670431139
-	.long	1073516389
-	.long	3549227225
-	.long	1073530002
-	.long	11637607
-	.long	1073543422
-	.long	588220169
-	.long	1073556654
-	.long	2635407503
-	.long	1073569705
-	.long	2042029317
-	.long	1073582582
-	.long	1925128962
-	.long	1073595290
-	.long	4136375664
-	.long	1073607834
-	.long	759964600
-	.long	1073620221
-	.long	4257606771
-	.long	1073632453
-	.long	297278907
-	.long	1073644538
-	.long	3655053093
-	.long	1073656477
-	.long	2442253172
-	.long	1073668277
-	.long	1111876799
-	.long	1073679941
-	.long	3330973139
-	.long	1073691472
-	.long	3438879452
-	.long	1073702875
-	.long	3671565478
-	.long	1073714153
-	.long	1317849547
-	.long	1073725310
-	.long	1642364115
-	.long	1073736348
-	.type	cbrt_table,@object
-	.size	cbrt_table,768
-	.align 4
-D_table:
-	.long	4050900474
-	.long	1014427190
-	.long	1157977860
-	.long	1016444461
-	.long	1374568199
-	.long	1017271387
-	.long	2809163288
-	.long	1016882676
-	.long	3742377377
-	.long	1013168191
-	.long	3101606597
-	.long	1017541672
-	.long	65224358
-	.long	1017217597
-	.long	2691591250
-	.long	1017266643
-	.long	4020758549
-	.long	1017689313
-	.long	1316310992
-	.long	1018030788
-	.long	1031537856
-	.long	1014090882
-	.long	3261395239
-	.long	1016413641
-	.long	886424999
-	.long	1016313335
-	.long	3114776834
-	.long	1014195875
-	.long	1681120620
-	.long	1017825416
-	.long	1329600273
-	.long	1016625740
-	.long	465474623
-	.long	1017097119
-	.long	4251633980
-	.long	1017169077
-	.long	1986990133
-	.long	1017710645
-	.long	752958613
-	.long	1017159641
-	.long	2216216792
-	.long	1018020163
-	.long	4282860129
-	.long	1015924861
-	.long	1557627859
-	.long	1016039538
-	.long	3889219754
-	.long	1018086237
-	.long	3684996408
-	.long	1017353275
-	.long	723532103
-	.long	1017717141
-	.long	2951149676
-	.long	1012528470
-	.long	831890937
-	.long	1017830553
-	.long	1031212645
-	.long	1017387331
-	.long	2741737450
-	.long	1017604974
-	.long	2863311531
-	.long	1003776682
-	.long	4276736099
-	.long	1013153088
-	.long	4111778382
-	.long	1015673686
-	.long	1728065769
-	.long	1016413986
-	.long	2708718031
-	.long	1018078833
-	.long	1069335005
-	.long	1015291224
-	.long	700037144
-	.long	1016482032
-	.long	2904566452
-	.long	1017226861
-	.long	4074156649
-	.long	1017622651
-	.long	25019565
-	.long	1015245366
-	.long	3601952608
-	.long	1015771755
-	.long	3267129373
-	.long	1017904664
-	.long	503203103
-	.long	1014921629
-	.long	2122011730
-	.long	1018027866
-	.long	3927295461
-	.long	1014189456
-	.long	2790625147
-	.long	1016024251
-	.long	1330460186
-	.long	1016940346
-	.long	4033568463
-	.long	1015538390
-	.long	3695818227
-	.long	1017509621
-	.long	257573361
-	.long	1017208868
-	.long	3227697852
-	.long	1017337964
-	.long	234118548
-	.long	1017169577
-	.long	4009025803
-	.long	1017278524
-	.long	1948343394
-	.long	1017749310
-	.long	678398162
-	.long	1018144239
-	.long	3083864863
-	.long	1016669086
-	.long	2415453452
-	.long	1017890370
-	.long	175467344
-	.long	1017330033
-	.long	3197359580
-	.long	1010339928
-	.long	2071276951
-	.long	1015941358
-	.long	268372543
-	.long	1016737773
-	.long	938132959
-	.long	1017389108
-	.long	1816750559
-	.long	1017337448
-	.long	4119203749
-	.long	1017152174
-	.long	2578653878
-	.long	1013108497
-	.long	2470331096
-	.long	1014678606
-	.long	123855735
-	.long	1016553320
-	.long	1265650889
-	.long	1014782687
-	.long	3414398172
-	.long	1017182638
-	.long	1040773369
-	.long	1016158401
-	.long	3483628886
-	.long	1016886550
-	.long	4140499405
-	.long	1016191425
-	.long	3893477850
-	.long	1016964495
-	.long	3935319771
-	.long	1009634717
-	.long	2978982660
-	.long	1015027112
-	.long	2452709923
-	.long	1017990229
-	.long	3190365712
-	.long	1015835149
-	.long	4237588139
-	.long	1015832925
-	.long	2610678389
-	.long	1017962711
-	.long	2127316774
-	.long	1017405770
-	.long	824267502
-	.long	1017959463
-	.long	2165924042
-	.long	1017912225
-	.long	2774007076
-	.long	1013257418
-	.long	4123916326
-	.long	1017582284
-	.long	1976417958
-	.long	1016959909
-	.long	4092806412
-	.long	1017711279
-	.long	119251817
-	.long	1015363631
-	.long	3475418768
-	.long	1017675415
-	.long	1972580503
-	.long	1015470684
-	.long	815541017
-	.long	1017517969
-	.long	2429917451
-	.long	1017397776
-	.long	4062888482
-	.long	1016749897
-	.long	68284153
-	.long	1017925678
-	.long	2207779246
-	.long	1016320298
-	.long	1183466520
-	.long	1017408657
-	.long	143326427
-	.long	1017060403
-	.type	D_table,@object
-	.size	D_table,768
-	.align 4
-SCALE63:
-	.long	0
-	.long	1138753536
-	.type	SCALE63,@object
-	.size	SCALE63,8
-	.align 4
-ZERON:
-	.long	0
-	.long	2147483648
-	.type	ZERON,@object
-	.size	ZERON,8
-	.align 4
-INF:
-	.long	0
-	.long	2146435072
-	.type	INF,@object
-	.size	INF,8
-	.align 4
-NEG_INF:
-	.long	0
-	.long	4293918720
-	.type	NEG_INF,@object
-	.size	NEG_INF,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_cbrt.1-.
-	.4byte ..___tag_value_cbrt.5-..___tag_value_cbrt.1
-	.2byte 0x0400
-	.4byte ..___tag_value_cbrt.3-..___tag_value_cbrt.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_cbrt.4-..___tag_value_cbrt.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/s_cos.S b/libm/x86_64/s_cos.S
deleted file mode 100644
index 3d9e402..0000000
--- a/libm/x86_64/s_cos.S
+++ /dev/null
@@ -1,1275 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//     1. RANGE REDUCTION
-//
-//     We perform an initial range reduction from X to r with
-//
-//          X =~= N * pi/32 + r
-//
-//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
-//     where |N| <= 932560. Beyond this, the range reduction is
-//     insufficiently accurate. For extremely small inputs, 
-//     denormalization can occur internally, impacting performance.
-//     This means that the main path is actually only taken for
-//     2^-252 <= |X| < 90112.
-//
-//     To avoid branches, we perform the range reduction to full
-//     accuracy each time.
-//
-//          X - N * (P_1 + P_2 + P_3)
-//
-//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
-//     is exact) and P_3 is a 53-bit number. Together, these
-//     approximate pi well enough for all cases in the restricted
-//     range.
-//
-//     The main reduction sequence is:
-//
-//             y = 32/pi * x
-//             N = integer(y)
-//     (computed by adding and subtracting off SHIFTER)
-//
-//             m_1 = N * P_1
-//             m_2 = N * P_2
-//             r_1 = x - m_1
-//             r = r_1 - m_2
-//     (this r can be used for most of the calculation)
-//
-//             c_1 = r_1 - r
-//             m_3 = N * P_3
-//             c_2 = c_1 - m_2
-//             c = c_2 - m_3
-//
-//     2. MAIN ALGORITHM
-//
-//     The algorithm uses a table lookup based on B = M * pi / 32
-//     where M = N mod 64. The stored values are:
-//       sigma             closest power of 2 to cos(B)
-//       C_hl              53-bit cos(B) - sigma
-//       S_hi + S_lo       2 * 53-bit sin(B)
-//
-//     The computation is organized as follows:
-//
-//          sin(B + r + c) = [sin(B) + sigma * r] +
-//                           r * (cos(B) - sigma) +
-//                           sin(B) * [cos(r + c) - 1] +
-//                           cos(B) * [sin(r + c) - r]
-//
-//     which is approximately:
-//
-//          [S_hi + sigma * r] +
-//          C_hl * r +
-//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
-//          (C_hl + sigma) * [(sin(r) - r) + c]
-//
-//     and this is what is actually computed. We separate this sum
-//     into four parts:
-//
-//          hi + med + pols + corr
-//
-//     where
-//
-//          hi       = S_hi + sigma r
-//          med      = C_hl * r
-//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-//     3. POLYNOMIAL
-//
-//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-//     (sin(r) - r) can be rearranged freely, since it is quite
-//     small, so we exploit parallelism to the fullest.
-//
-//          psc4       =   SC_4 * r_1
-//          msc4       =   psc4 * r
-//          r2         =   r * r
-//          msc2       =   SC_2 * r2
-//          r4         =   r2 * r2
-//          psc3       =   SC_3 + msc4
-//          psc1       =   SC_1 + msc2
-//          msc3       =   r4 * psc3
-//          sincospols =   psc1 + msc3
-//          pols       =   sincospols *
-//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-//     4. CORRECTION TERM
-//
-//     This is where the "c" component of the range reduction is
-//     taken into account; recall that just "r" is used for most of
-//     the calculation.
-//
-//          -c   = m_3 - c_2
-//          -d   = S_hi * r - (C_hl + sigma)
-//          corr = -c * -d + S_lo
-//
-//     5. COMPENSATED SUMMATIONS
-//
-//     The two successive compensated summations add up the high
-//     and medium parts, leaving just the low parts to add up at
-//     the end.
-//
-//          rs        =  sigma * r
-//          res_int   =  S_hi + rs
-//          k_0       =  S_hi - res_int
-//          k_2       =  k_0 + rs
-//          med       =  C_hl * r
-//          res_hi    =  res_int + med
-//          k_1       =  res_int - res_hi
-//          k_3       =  k_1 + med
-//
-//     6. FINAL SUMMATION
-//
-//     We now add up all the small parts:
-//
-//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-//     Now the overall result is just:
-//
-//          res_hi + res_lo
-//
-//     7. SMALL ARGUMENTS
-//
-//     Inputs with |X| < 2^-252 are treated specially as
-//     1 - |x|.
-//
-// Special cases:
-//  cos(NaN) = quiet NaN, and raise invalid exception
-//  cos(INF) = NaN and raise invalid exception
-//  cos(0) = 1
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  cos
-ENTRY(cos)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_cos.1:
-        pushq     %rbx
-..___tag_value_cos.3:
-        subq      $16, %rsp
-..___tag_value_cos.5:
-        movsd     %xmm0, 8(%rsp)
-..B1.2:
-        movl      12(%rsp), %eax
-        movq      PI32INV(%rip), %xmm1
-        andl      $2147418112, %eax
-        subl      $808452096, %eax
-        cmpl      $281346048, %eax
-        ja        .L_2TAG_PACKET_0.0.1
-        mulsd     %xmm0, %xmm1
-        movapd    ONEHALF(%rip), %xmm5
-        movq      SIGN_MASK(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %edx
-        cvtsi2sd  %edx, %xmm1
-        movapd    P_2(%rip), %xmm2
-        movq      P_1(%rip), %xmm3
-        mulsd     %xmm1, %xmm3
-        unpcklpd  %xmm1, %xmm1
-        addq      $1865232, %rdx
-        movq      %xmm0, %xmm4
-        andq      $63, %rdx
-        movapd    SC_4(%rip), %xmm5
-        lea       Ctable(%rip), %rax
-        shlq      $5, %rdx
-        addq      %rdx, %rax
-        mulpd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm0
-        mulsd     P_3(%rip), %xmm1
-        subsd     %xmm3, %xmm4
-        movq      8(%rax), %xmm7
-        unpcklpd  %xmm0, %xmm0
-        movq      %xmm4, %xmm3
-        subsd     %xmm2, %xmm4
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm2, %xmm0
-        movapd    SC_2(%rip), %xmm6
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm2, %xmm3
-        movapd    (%rax), %xmm2
-        subsd     %xmm3, %xmm1
-        movq      24(%rax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     SC_3(%rip), %xmm5
-        mulsd     (%rax), %xmm4
-        addpd     SC_1(%rip), %xmm6
-        mulpd     %xmm0, %xmm5
-        movq      %xmm3, %xmm0
-        addsd     8(%rax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movq      %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movq      8(%rax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%rax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm5, %xmm0
-        addsd     %xmm7, %xmm3
-        addsd     %xmm1, %xmm0
-        addsd     %xmm3, %xmm0
-        addsd     %xmm6, %xmm0
-        unpckhpd  %xmm6, %xmm6
-        addsd     %xmm6, %xmm0
-        addsd     %xmm4, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_0.0.1:
-        jg        .L_2TAG_PACKET_1.0.1
-        pextrw    $3, %xmm0, %eax
-        andw      $32767, %ax
-        pinsrw    $3, %eax, %xmm0
-        movq      ONE(%rip), %xmm1
-        subsd     %xmm0, %xmm1
-        movq      %xmm1, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_1.0.1:
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_2.0.1
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        subl      $16224, %ecx
-        shrl      $7, %ecx
-        andl      $65532, %ecx
-        lea       PI_INV_TABLE(%rip), %r11
-        addq      %r11, %rcx
-        movd      %xmm0, %rax
-        movl      20(%rcx), %r10d
-        movl      24(%rcx), %r8d
-        movl      %eax, %edx
-        shrq      $21, %rax
-        orl       $-2147483648, %eax
-        shrl      $11, %eax
-        movl      %r10d, %r9d
-        imulq     %rdx, %r10
-        imulq     %rax, %r9
-        imulq     %rax, %r8
-        movl      16(%rcx), %esi
-        movl      12(%rcx), %edi
-        movl      %r10d, %r11d
-        shrq      $32, %r10
-        addq      %r10, %r9
-        addq      %r8, %r11
-        movl      %r11d, %r8d
-        shrq      $32, %r11
-        addq      %r11, %r9
-        movl      %esi, %r10d
-        imulq     %rdx, %rsi
-        imulq     %rax, %r10
-        movl      %edi, %r11d
-        imulq     %rdx, %rdi
-        movl      %esi, %ebx
-        shrq      $32, %rsi
-        addq      %rbx, %r9
-        movl      %r9d, %ebx
-        shrq      $32, %r9
-        addq      %rsi, %r10
-        addq      %r9, %r10
-        shlq      $32, %rbx
-        orq       %rbx, %r8
-        imulq     %rax, %r11
-        movl      8(%rcx), %r9d
-        movl      4(%rcx), %esi
-        movl      %edi, %ebx
-        shrq      $32, %rdi
-        addq      %rbx, %r10
-        movl      %r10d, %ebx
-        shrq      $32, %r10
-        addq      %rdi, %r11
-        addq      %r10, %r11
-        movq      %r9, %rdi
-        imulq     %rdx, %r9
-        imulq     %rax, %rdi
-        movl      %r9d, %r10d
-        shrq      $32, %r9
-        addq      %r10, %r11
-        movl      %r11d, %r10d
-        shrq      $32, %r11
-        addq      %r9, %rdi
-        addq      %r11, %rdi
-        movq      %rsi, %r9
-        imulq     %rdx, %rsi
-        imulq     %rax, %r9
-        shlq      $32, %r10
-        orq       %rbx, %r10
-        movl      (%rcx), %eax
-        movl      %esi, %r11d
-        shrq      $32, %rsi
-        addq      %r11, %rdi
-        movl      %edi, %r11d
-        shrq      $32, %rdi
-        addq      %rsi, %r9
-        addq      %rdi, %r9
-        imulq     %rax, %rdx
-        pextrw    $3, %xmm0, %ebx
-        lea       PI_INV_TABLE(%rip), %rdi
-        subq      %rdi, %rcx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      $19, %ecx
-        movl      $32768, %esi
-        andl      %ebx, %esi
-        shrl      $4, %ebx
-        andl      $2047, %ebx
-        subl      $1023, %ebx
-        subl      %ebx, %ecx
-        addq      %rdx, %r9
-        movl      %ecx, %edx
-        addl      $32, %edx
-        cmpl      $1, %ecx
-        jl        .L_2TAG_PACKET_3.0.1
-        negl      %ecx
-        addl      $29, %ecx
-        shll      %cl, %r9d
-        movl      %r9d, %edi
-        andl      $536870911, %r9d
-        testl     $268435456, %r9d
-        jne       .L_2TAG_PACKET_4.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-.L_2TAG_PACKET_5.0.1:
-.L_2TAG_PACKET_6.0.1:
-        cmpq      $0, %r9
-        je        .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_8.0.1:
-        bsr       %r9, %r11
-        movl      $29, %ecx
-        subl      %r11d, %ecx
-        jle       .L_2TAG_PACKET_9.0.1
-        shlq      %cl, %r9
-        movq      %r10, %rax
-        shlq      %cl, %r10
-        addl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shrq      %cl, %rax
-        shrq      %cl, %r8
-        orq       %rax, %r9
-        orq       %r8, %r10
-.L_2TAG_PACKET_10.0.1:
-        cvtsi2sdq %r9, %xmm0
-        shrq      $1, %r10
-        cvtsi2sdq %r10, %xmm3
-        xorpd     %xmm4, %xmm4
-        shll      $4, %edx
-        negl      %edx
-        addl      $16368, %edx
-        orl       %esi, %edx
-        xorl      %ebx, %edx
-        pinsrw    $3, %edx, %xmm4
-        movq      PI_4(%rip), %xmm2
-        movq      8+PI_4(%rip), %xmm6
-        xorpd     %xmm5, %xmm5
-        subl      $1008, %edx
-        pinsrw    $3, %edx, %xmm5
-        mulsd     %xmm4, %xmm0
-        shll      $16, %esi
-        sarl      $31, %esi
-        mulsd     %xmm5, %xmm3
-        movq      %xmm0, %xmm1
-        mulsd     %xmm2, %xmm0
-        shrl      $29, %edi
-        addsd     %xmm3, %xmm1
-        mulsd     %xmm2, %xmm3
-        addl      %esi, %edi
-        xorl      %esi, %edi
-        mulsd     %xmm1, %xmm6
-        movl      %edi, %eax
-        addsd     %xmm3, %xmm6
-        movq      %xmm0, %xmm2
-        addsd     %xmm6, %xmm0
-        subsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm6
-.L_2TAG_PACKET_11.0.1:
-        movq      PI32INV(%rip), %xmm1
-        mulsd     %xmm0, %xmm1
-        movq      ONEHALF(%rip), %xmm5
-        movq      SIGN_MASK(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %rdx
-        cvtsi2sdq %rdx, %xmm1
-        movq      P_1(%rip), %xmm3
-        movapd    P_2(%rip), %xmm2
-        mulsd     %xmm1, %xmm3
-        unpcklpd  %xmm1, %xmm1
-        shll      $3, %eax
-        addl      $1865232, %edx
-        movq      %xmm0, %xmm4
-        addl      %eax, %edx
-        andl      $63, %edx
-        movapd    SC_4(%rip), %xmm5
-        lea       Ctable(%rip), %rax
-        shll      $5, %edx
-        addq      %rdx, %rax
-        mulpd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm0
-        mulsd     P_3(%rip), %xmm1
-        subsd     %xmm3, %xmm4
-        movq      8(%rax), %xmm7
-        unpcklpd  %xmm0, %xmm0
-        movq      %xmm4, %xmm3
-        subsd     %xmm2, %xmm4
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm2, %xmm0
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm2, %xmm3
-        movapd    (%rax), %xmm2
-        subsd     %xmm3, %xmm1
-        movq      24(%rax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        subsd     %xmm6, %xmm1
-        movapd    SC_2(%rip), %xmm6
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     SC_3(%rip), %xmm5
-        mulsd     (%rax), %xmm4
-        addpd     SC_1(%rip), %xmm6
-        mulpd     %xmm0, %xmm5
-        movq      %xmm3, %xmm0
-        addsd     8(%rax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movq      %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movq      8(%rax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%rax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm0, %xmm5
-        addsd     %xmm7, %xmm3
-        addsd     %xmm5, %xmm1
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        unpckhpd  %xmm6, %xmm6
-        movq      %xmm4, %xmm0
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_7.0.1:
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        movq      $0, %r8
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_8.0.1
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_8.0.1
-        xorpd     %xmm0, %xmm0
-        xorpd     %xmm6, %xmm6
-        jmp       .L_2TAG_PACKET_11.0.1
-.L_2TAG_PACKET_9.0.1:
-        je        .L_2TAG_PACKET_10.0.1
-        negl      %ecx
-        shrq      %cl, %r10
-        movq      %r9, %rax
-        shrq      %cl, %r9
-        subl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shlq      %cl, %rax
-        orq       %rax, %r10
-        jmp       .L_2TAG_PACKET_10.0.1
-.L_2TAG_PACKET_3.0.1:
-        negl      %ecx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      %cl, %r9
-        movq      %r9, %rdi
-        testl     $-2147483648, %r9d
-        jne       .L_2TAG_PACKET_12.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shrq      $3, %rdi
-        jmp       .L_2TAG_PACKET_6.0.1
-.L_2TAG_PACKET_4.0.1:
-        shrl      %cl, %r9d
-        movl      $536870912, %ebx
-        shrl      %cl, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      $32, %rbx
-        addl      $536870912, %edi
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        jmp       .L_2TAG_PACKET_5.0.1
-.L_2TAG_PACKET_12.0.1:
-        shrl      %cl, %r9d
-        movq      $0x100000000, %rbx
-        shrq      %cl, %rbx
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        shrq      $3, %rdi
-        addl      $536870912, %edi
-        jmp       .L_2TAG_PACKET_6.0.1
-.L_2TAG_PACKET_2.0.1:
-        movsd     8(%rsp), %xmm0
-        mulsd     NEG_ZERO(%rip), %xmm0
-        movq      %xmm0, (%rsp)
-.L_2TAG_PACKET_13.0.1:
-..B1.4:
-        addq      $16, %rsp
-..___tag_value_cos.6:
-        popq      %rbx
-..___tag_value_cos.8:
-        ret       
-..___tag_value_cos.9:
-END(cos)
-# -- End  cos
-	.section .rodata, "a"
-	.align 16
-	.align 16
-ONEHALF:
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.type	ONEHALF,@object
-	.size	ONEHALF,16
-	.align 16
-P_2:
-	.long	442499072
-	.long	1032893537
-	.long	442499072
-	.long	1032893537
-	.type	P_2,@object
-	.size	P_2,16
-	.align 16
-SC_4:
-	.long	2773927732
-	.long	1053236707
-	.long	436314138
-	.long	1056571808
-	.type	SC_4,@object
-	.size	SC_4,16
-	.align 16
-Ctable:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	1072693248
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	1072693248
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	1071644672
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	1071644672
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	1070596096
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	1070596096
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	1069547520
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	3217031168
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	3218079744
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	3218079744
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	3219128320
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	3219128320
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	3220176896
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	3220176896
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	3219128320
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	3219128320
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	3218079744
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	3218079744
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	3217031168
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	1069547520
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	1070596096
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	1070596096
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	1071644672
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	1071644672
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	1072693248
-	.type	Ctable,@object
-	.size	Ctable,2048
-	.align 16
-SC_2:
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1067799893
-	.type	SC_2,@object
-	.size	SC_2,16
-	.align 16
-SC_3:
-	.long	436314138
-	.long	3207201184
-	.long	381774871
-	.long	3210133868
-	.type	SC_3,@object
-	.size	SC_3,16
-	.align 16
-SC_1:
-	.long	1431655765
-	.long	3217380693
-	.long	0
-	.long	3219128320
-	.type	SC_1,@object
-	.size	SC_1,16
-	.align 16
-PI_INV_TABLE:
-	.long	0
-	.long	0
-	.long	2734261102
-	.long	1313084713
-	.long	4230436817
-	.long	4113882560
-	.long	3680671129
-	.long	1011060801
-	.long	4266746795
-	.long	3736847713
-	.long	3072618042
-	.long	1112396512
-	.long	105459434
-	.long	164729372
-	.long	4263373596
-	.long	2972297022
-	.long	3900847605
-	.long	784024708
-	.long	3919343654
-	.long	3026157121
-	.long	965858873
-	.long	2203269620
-	.long	2625920907
-	.long	3187222587
-	.long	536385535
-	.long	3724908559
-	.long	4012839307
-	.long	1510632735
-	.long	1832287951
-	.long	667617719
-	.long	1330003814
-	.long	2657085997
-	.long	1965537991
-	.long	3957715323
-	.long	1023883767
-	.long	2320667370
-	.long	1811636145
-	.long	529358088
-	.long	1443049542
-	.long	4235946923
-	.long	4040145953
-	.type	PI_INV_TABLE,@object
-	.size	PI_INV_TABLE,164
-	.space 12, 0x00 	# pad
-	.align 16
-PI_4:
-	.long	1073741824
-	.long	1072243195
-	.long	407279769
-	.long	1046758445
-	.type	PI_4,@object
-	.size	PI_4,16
-	.align 8
-PI32INV:
-	.long	1841940611
-	.long	1076125488
-	.type	PI32INV,@object
-	.size	PI32INV,8
-	.align 8
-SIGN_MASK:
-	.long	0
-	.long	2147483648
-	.type	SIGN_MASK,@object
-	.size	SIGN_MASK,8
-	.align 8
-P_1:
-	.long	1413480448
-	.long	1069097467
-	.type	P_1,@object
-	.size	P_1,8
-	.align 8
-P_3:
-	.long	771977331
-	.long	996350346
-	.type	P_3,@object
-	.size	P_3,8
-	.align 8
-ONE:
-	.long	0
-	.long	1072693248
-	.type	ONE,@object
-	.size	ONE,8
-	.align 8
-NEG_ZERO:
-	.long	0
-	.long	2147483648
-	.type	NEG_ZERO,@object
-	.size	NEG_ZERO,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000002c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_cos.1-.
-	.4byte ..___tag_value_cos.9-..___tag_value_cos.1
-	.2byte 0x0400
-	.4byte ..___tag_value_cos.3-..___tag_value_cos.1
-	.4byte 0x0283100e
-	.byte 0x04
-	.4byte ..___tag_value_cos.5-..___tag_value_cos.3
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_cos.6-..___tag_value_cos.5
-	.4byte 0x04c3100e
-	.4byte ..___tag_value_cos.8-..___tag_value_cos.6
-	.2byte 0x080e
-# End
diff --git a/libm/x86_64/s_expm1.S b/libm/x86_64/s_expm1.S
deleted file mode 100644
index 4b22f5a..0000000
--- a/libm/x86_64/s_expm1.S
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// Description:
-//  Let K = 64 (table size).
-//
-//  Four sub-domains:
-//    1. |x| < 1/(2*K)
-//      expm1(x) ~ P(x)
-//    2. 1/(2*K) <= |x| <= 56*log(2)
-//       x       x/log(2)    n
-//      e - 1 = 2         = 2 * T[j] * (1 + P(y)) - 1
-//    3. 56*log(2) < x < MAX_LOG
-//       x       x   x/log(2)    n
-//      e - 1 ~ e = 2         = 2 * T[j] * (1 + P(y))
-//    4. x < -56*log(2)
-//       x            x
-//      e - 1 = -1 + e ~ -1
-//    where
-//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
-//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
-//                  j/K
-//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
-//
-//       P(y) is a minimax polynomial approximation of exp(x)-1
-//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
-//
-//    In case 3, to avoid problems with arithmetic overflow and underflow,
-//              n                        n1  n2
-//    value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
-//    and BIAS is a value of exponent bias.
-//
-// Special cases:
-//  expm1(NaN) is NaN
-//  expm1(+INF) is +INF
-//  expm1(-INF) is -1
-//  expm1(x) is x for subnormals
-//  for finite argument, only expm1(0)=0 is exact.
-//  For IEEE double
-//    if x > 709.782712893383973096 then expm1(x) overflow
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  expm1
-ENTRY(expm1)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_expm1.1:
-        subq      $56, %rsp
-..___tag_value_expm1.3:
-        movsd     %xmm0, 32(%rsp)
-..B1.2:
-        unpcklpd  %xmm0, %xmm0
-        movapd    cv(%rip), %xmm1
-        movapd    Shifter(%rip), %xmm6
-        movapd    16+cv(%rip), %xmm2
-        movapd    32+cv(%rip), %xmm3
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        movl      $16527, %edx
-        subl      %eax, %edx
-        subl      $16304, %eax
-        orl       %eax, %edx
-        cmpl      $-2147483648, %edx
-        jae       .L_2TAG_PACKET_0.0.2
-        mulpd     %xmm0, %xmm1
-        addpd     %xmm6, %xmm1
-        movapd    %xmm1, %xmm7
-        subpd     %xmm6, %xmm1
-        mulpd     %xmm1, %xmm2
-        movapd    48+cv(%rip), %xmm4
-        mulpd     %xmm1, %xmm3
-        movapd    64+cv(%rip), %xmm5
-        subpd     %xmm2, %xmm0
-        movd      %xmm7, %eax
-        movl      %eax, %ecx
-        andl      $63, %ecx
-        shll      $4, %ecx
-        sarl      $6, %eax
-        movl      %eax, %edx
-        subpd     %xmm3, %xmm0
-        lea       Tbl_addr(%rip), %r11
-        movapd    (%rcx,%r11), %xmm2
-        movq      80+cv(%rip), %xmm3
-        mulpd     %xmm0, %xmm4
-        movapd    %xmm0, %xmm1
-        mulpd     %xmm0, %xmm0
-        mulsd     %xmm0, %xmm3
-        addpd     %xmm4, %xmm5
-        mulsd     %xmm0, %xmm0
-        movq      %xmm2, %xmm4
-        unpckhpd  %xmm2, %xmm2
-        movdqa    mmask(%rip), %xmm6
-        pand      %xmm6, %xmm7
-        movdqa    bias(%rip), %xmm6
-        paddq     %xmm6, %xmm7
-        psllq     $46, %xmm7
-        mulsd     %xmm0, %xmm3
-        mulpd     %xmm5, %xmm0
-        addl      $894, %edx
-        cmpl      $1916, %edx
-        ja        .L_2TAG_PACKET_1.0.2
-        addsd     %xmm3, %xmm0
-        xorpd     %xmm3, %xmm3
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm3
-        orpd      %xmm7, %xmm2
-        mulsd     %xmm4, %xmm7
-        movq      %xmm3, %xmm6
-        addsd     %xmm1, %xmm3
-        pextrw    $3, %xmm2, %edx
-        pshufd    $238, %xmm0, %xmm5
-        psrlq     $38, %xmm3
-        psllq     $38, %xmm3
-        movq      %xmm2, %xmm4
-        subsd     %xmm3, %xmm6
-        addsd     %xmm5, %xmm0
-        addsd     %xmm6, %xmm1
-        addsd     %xmm7, %xmm4
-        mulsd     %xmm3, %xmm7
-        mulsd     %xmm2, %xmm3
-        xorpd     %xmm5, %xmm5
-        movl      $16368, %eax
-        pinsrw    $3, %eax, %xmm5
-        addsd     %xmm1, %xmm0
-        movl      $17184, %ecx
-        subl      %edx, %ecx
-        subl      $16256, %edx
-        orl       %edx, %ecx
-        jl        .L_2TAG_PACKET_2.0.2
-        mulsd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm3
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-.L_2TAG_PACKET_3.0.2:
-        jmp       ..B1.5
-.L_2TAG_PACKET_2.0.2:
-        cmpl      $0, %edx
-        jl        .L_2TAG_PACKET_4.0.2
-        mulsd     %xmm4, %xmm0
-        subsd     %xmm5, %xmm7
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_4.0.2:
-        mulsd     %xmm4, %xmm0
-        addsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        subsd     %xmm5, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_1.0.2:
-        movl      36(%rsp), %ecx
-        addsd     %xmm0, %xmm1
-        unpckhpd  %xmm0, %xmm0
-        addsd     %xmm1, %xmm0
-        cmpl      $0, %ecx
-        jl        .L_2TAG_PACKET_5.0.2
-        fstcw     (%rsp)
-        movw      (%rsp), %dx
-        orw       $768, %dx
-        movw      %dx, 4(%rsp)
-        fldcw     4(%rsp)
-        movl      %eax, %edx
-        sarl      $1, %eax
-        subl      %eax, %edx
-        movdqa    emask(%rip), %xmm6
-        pandn     %xmm2, %xmm6
-        addl      $1023, %eax
-        movd      %eax, %xmm3
-        psllq     $52, %xmm3
-        orpd      %xmm3, %xmm6
-        mulsd     %xmm3, %xmm4
-        movsd     %xmm0, 16(%rsp)
-        fldl      16(%rsp)
-        movsd     %xmm6, 24(%rsp)
-        fldl      24(%rsp)
-        movsd     %xmm4, 16(%rsp)
-        fldl      16(%rsp)
-        addl      $1023, %edx
-        movd      %edx, %xmm4
-        psllq     $52, %xmm4
-        faddp     %st, %st(1)
-        fmul      %st, %st(1)
-        faddp     %st, %st(1)
-        movsd     %xmm4, 24(%rsp)
-        fldl      24(%rsp)
-        fmulp     %st, %st(1)
-        fstpl     16(%rsp)
-        movsd     16(%rsp), %xmm0
-        fldcw     (%rsp)
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        jmp       ..B1.5
-        cmpl      $-2147483648, %ecx
-        jb        .L_2TAG_PACKET_6.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_6.0.2:
-        movl      $41, 8(%rsp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_8.0.2:
-        cmpl      $2146435072, %eax
-        jae       .L_2TAG_PACKET_9.0.2
-        movsd     XMAX(%rip), %xmm0
-        mulsd     %xmm0, %xmm0
-        movl      $41, 8(%rsp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_9.0.2:
-        movl      36(%rsp), %eax
-        movl      32(%rsp), %edx
-        movl      %eax, %ecx
-        andl      $2147483647, %eax
-        cmpl      $2146435072, %eax
-        ja        .L_2TAG_PACKET_10.0.2
-        cmpl      $0, %edx
-        jne       .L_2TAG_PACKET_10.0.2
-        cmpl      $0, %ecx
-        jl        .L_2TAG_PACKET_11.0.2
-        movq      INF(%rip), %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_11.0.2:
-        jmp       .L_2TAG_PACKET_5.0.2
-.L_2TAG_PACKET_10.0.2:
-        movsd     32(%rsp), %xmm0
-        addsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_12.0.2:
-        addl      $16304, %eax
-        cmpl      $15504, %eax
-        jb        .L_2TAG_PACKET_13.0.2
-        movapd    cvl(%rip), %xmm2
-        pshufd    $68, %xmm0, %xmm1
-        movapd    16+cvl(%rip), %xmm3
-        movapd    32+cvl(%rip), %xmm4
-        movq      48+cvl(%rip), %xmm5
-        mulsd     %xmm1, %xmm1
-        xorpd     %xmm6, %xmm6
-        movl      $16352, %eax
-        pinsrw    $3, %eax, %xmm6
-        mulpd     %xmm0, %xmm2
-        xorpd     %xmm7, %xmm7
-        movl      $16368, %edx
-        pinsrw    $3, %edx, %xmm7
-        addpd     %xmm3, %xmm2
-        mulsd     %xmm1, %xmm5
-        pshufd    $228, %xmm1, %xmm3
-        mulpd     %xmm1, %xmm1
-        mulsd     %xmm0, %xmm6
-        mulpd     %xmm0, %xmm2
-        addpd     %xmm4, %xmm2
-        movq      %xmm7, %xmm4
-        addsd     %xmm6, %xmm7
-        mulpd     %xmm3, %xmm1
-        psrlq     $27, %xmm7
-        psllq     $27, %xmm7
-        movq      HIGHMASK(%rip), %xmm3
-        subsd     %xmm7, %xmm4
-        mulpd     %xmm1, %xmm2
-        addsd     %xmm4, %xmm6
-        pshufd    $238, %xmm2, %xmm1
-        addsd     %xmm2, %xmm6
-        andpd     %xmm0, %xmm3
-        movq      %xmm0, %xmm4
-        addsd     %xmm6, %xmm1
-        subsd     %xmm3, %xmm0
-        addsd     %xmm5, %xmm1
-        mulsd     %xmm7, %xmm3
-        mulsd     %xmm7, %xmm0
-        mulsd     %xmm1, %xmm4
-        addsd     %xmm4, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_13.0.2:
-        cmpl      $16, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        movq      %xmm0, %xmm2
-        movd      %xmm0, %eax
-        psrlq     $31, %xmm2
-        movd      %xmm2, %ecx
-        orl       %ecx, %eax
-        je        .L_2TAG_PACKET_3.0.2
-        movl      $16, %edx
-        xorpd     %xmm1, %xmm1
-        pinsrw    $3, %edx, %xmm1
-        mulsd     %xmm1, %xmm1
-        movl      $42, 8(%rsp)
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_0.0.2:
-        cmpl      $0, %eax
-        jl        .L_2TAG_PACKET_12.0.2
-        movl      36(%rsp), %eax
-        cmpl      $1083179008, %eax
-        jge       .L_2TAG_PACKET_8.0.2
-        cmpl      $-1048576, %eax
-        jae       .L_2TAG_PACKET_9.0.2
-.L_2TAG_PACKET_5.0.2:
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_7.0.2:
-        movq      %xmm0, 40(%rsp)
-..B1.3:
-        movq      40(%rsp), %xmm0
-.L_2TAG_PACKET_14.0.2:
-..B1.5:
-        addq      $56, %rsp
-..___tag_value_expm1.4:
-        ret       
-..___tag_value_expm1.5:
-END(expm1)
-# -- End  expm1
-	.section .rodata, "a"
-	.align 16
-	.align 16
-cv:
-	.long	1697350398
-	.long	1079448903
-	.long	1697350398
-	.long	1079448903
-	.long	4277796864
-	.long	1065758274
-	.long	4277796864
-	.long	1065758274
-	.long	3164486458
-	.long	1025308570
-	.long	3164486458
-	.long	1025308570
-	.long	1963358694
-	.long	1065423121
-	.long	1431655765
-	.long	1069897045
-	.long	1431655765
-	.long	1067799893
-	.long	0
-	.long	1071644672
-	.long	381774871
-	.long	1062650220
-	.long	381774871
-	.long	1062650220
-	.type	cv,@object
-	.size	cv,96
-	.align 16
-Shifter:
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	1127743488
-	.type	Shifter,@object
-	.size	Shifter,16
-	.align 16
-Tbl_addr:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1000070955
-	.long	1042145304
-	.long	1040187392
-	.long	11418
-	.long	988267849
-	.long	1039500660
-	.long	3539992576
-	.long	22960
-	.long	36755401
-	.long	1042114290
-	.long	402653184
-	.long	34629
-	.long	3634769483
-	.long	1042178627
-	.long	1820327936
-	.long	46424
-	.long	2155991225
-	.long	1041560680
-	.long	847249408
-	.long	58348
-	.long	2766913307
-	.long	1039293264
-	.long	3489660928
-	.long	70401
-	.long	3651174602
-	.long	1040488175
-	.long	2927624192
-	.long	82586
-	.long	3073892131
-	.long	1042240606
-	.long	1006632960
-	.long	94904
-	.long	1328391742
-	.long	1042019037
-	.long	3942645760
-	.long	107355
-	.long	2650893825
-	.long	1041903210
-	.long	822083584
-	.long	119943
-	.long	2397289153
-	.long	1041802037
-	.long	2281701376
-	.long	132667
-	.long	430997175
-	.long	1042110606
-	.long	1845493760
-	.long	145530
-	.long	1230936525
-	.long	1041801015
-	.long	1702887424
-	.long	158533
-	.long	740675935
-	.long	1040178913
-	.long	4110417920
-	.long	171677
-	.long	3489810261
-	.long	1041825986
-	.long	2793406464
-	.long	184965
-	.long	2532600530
-	.long	1040767882
-	.long	167772160
-	.long	198398
-	.long	3542557060
-	.long	1041827263
-	.long	2986344448
-	.long	211976
-	.long	1401563777
-	.long	1041061093
-	.long	922746880
-	.long	225703
-	.long	3129406026
-	.long	1041852413
-	.long	880803840
-	.long	239579
-	.long	900993572
-	.long	1039283234
-	.long	1275068416
-	.long	253606
-	.long	2115029358
-	.long	1042140042
-	.long	562036736
-	.long	267786
-	.long	1086643152
-	.long	1041785419
-	.long	1610612736
-	.long	282120
-	.long	82864366
-	.long	1041256244
-	.long	3045064704
-	.long	296610
-	.long	2392968152
-	.long	1040913683
-	.long	3573547008
-	.long	311258
-	.long	2905856183
-	.long	1040002214
-	.long	1988100096
-	.long	326066
-	.long	3742008261
-	.long	1040011137
-	.long	1451229184
-	.long	341035
-	.long	863393794
-	.long	1040880621
-	.long	914358272
-	.long	356167
-	.long	1446136837
-	.long	1041372426
-	.long	3707764736
-	.long	371463
-	.long	927855201
-	.long	1040617636
-	.long	360710144
-	.long	386927
-	.long	1492679939
-	.long	1041050306
-	.long	2952790016
-	.long	402558
-	.long	608827001
-	.long	1041582217
-	.long	2181038080
-	.long	418360
-	.long	606260204
-	.long	1042271987
-	.long	1711276032
-	.long	434334
-	.long	3163044019
-	.long	1041843851
-	.long	1006632960
-	.long	450482
-	.long	4148747325
-	.long	1041962972
-	.long	3900702720
-	.long	466805
-	.long	802924201
-	.long	1041275378
-	.long	1442840576
-	.long	483307
-	.long	3052749833
-	.long	1041940577
-	.long	1937768448
-	.long	499988
-	.long	2216116399
-	.long	1041486744
-	.long	914358272
-	.long	516851
-	.long	2729697836
-	.long	1041445764
-	.long	2566914048
-	.long	533897
-	.long	540608356
-	.long	1041310907
-	.long	2600468480
-	.long	551129
-	.long	2916344493
-	.long	1040535661
-	.long	1107296256
-	.long	568549
-	.long	731391814
-	.long	1039497014
-	.long	2566914048
-	.long	586158
-	.long	1024722704
-	.long	1041461625
-	.long	2961178624
-	.long	603959
-	.long	3806831748
-	.long	1041732499
-	.long	2675965952
-	.long	621954
-	.long	238953304
-	.long	1040316488
-	.long	2189426688
-	.long	640145
-	.long	749123235
-	.long	1041725785
-	.long	2063597568
-	.long	658534
-	.long	1168187977
-	.long	1041175214
-	.long	2986344448
-	.long	677123
-	.long	3506096399
-	.long	1042186095
-	.long	1426063360
-	.long	695915
-	.long	1470221620
-	.long	1041675499
-	.long	2566914048
-	.long	714911
-	.long	3182425146
-	.long	1041483134
-	.long	3087007744
-	.long	734114
-	.long	3131698208
-	.long	1042208657
-	.long	4068474880
-	.long	753526
-	.long	2300504125
-	.long	1041428596
-	.long	2415919104
-	.long	773150
-	.long	2290297931
-	.long	1037388400
-	.long	3716153344
-	.long	792987
-	.long	3532148223
-	.long	1041626194
-	.long	771751936
-	.long	813041
-	.long	1161884404
-	.long	1042015258
-	.long	3699376128
-	.long	833312
-	.long	876383176
-	.long	1037968878
-	.long	1241513984
-	.long	853805
-	.long	3379986796
-	.long	1042213153
-	.long	3699376128
-	.long	874520
-	.long	1545797737
-	.long	1041681569
-	.long	58720256
-	.long	895462
-	.long	2925146801
-	.long	1042212567
-	.long	855638016
-	.long	916631
-	.long	1316627971
-	.long	1038516204
-	.long	3883925504
-	.long	938030
-	.long	3267869137
-	.long	1040337004
-	.long	2726297600
-	.long	959663
-	.long	3720868999
-	.long	1041782409
-	.long	3992977408
-	.long	981531
-	.long	433316142
-	.long	1041994064
-	.long	1526726656
-	.long	1003638
-	.long	781232103
-	.long	1040093400
-	.long	2172649472
-	.long	1025985
-	.type	Tbl_addr,@object
-	.size	Tbl_addr,1024
-	.align 16
-mmask:
-	.long	4294967232
-	.long	0
-	.long	4294967232
-	.long	0
-	.type	mmask,@object
-	.size	mmask,16
-	.align 16
-bias:
-	.long	65472
-	.long	0
-	.long	65472
-	.long	0
-	.type	bias,@object
-	.size	bias,16
-	.align 16
-emask:
-	.long	0
-	.long	4293918720
-	.long	0
-	.long	4293918720
-	.type	emask,@object
-	.size	emask,16
-	.align 16
-cvl:
-	.long	2773927732
-	.long	1053236707
-	.long	381774871
-	.long	1062650220
-	.long	379653899
-	.long	1056571845
-	.long	286331153
-	.long	1065423121
-	.long	436314138
-	.long	1059717536
-	.long	1431655765
-	.long	1067799893
-	.long	1431655765
-	.long	1069897045
-	.long	0
-	.long	1071644672
-	.type	cvl,@object
-	.size	cvl,64
-	.align 8
-XMAX:
-	.long	4294967295
-	.long	2146435071
-	.type	XMAX,@object
-	.size	XMAX,8
-	.align 8
-INF:
-	.long	0
-	.long	2146435072
-	.type	INF,@object
-	.size	INF,8
-	.align 8
-HIGHMASK:
-	.long	4227858432
-	.long	4294967295
-	.type	HIGHMASK,@object
-	.size	HIGHMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_expm1.1-.
-	.4byte ..___tag_value_expm1.5-..___tag_value_expm1.1
-	.2byte 0x0400
-	.4byte ..___tag_value_expm1.3-..___tag_value_expm1.1
-	.2byte 0x400e
-	.byte 0x04
-	.4byte ..___tag_value_expm1.4-..___tag_value_expm1.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/s_log1p.S b/libm/x86_64/s_log1p.S
deleted file mode 100644
index 27fab74..0000000
--- a/libm/x86_64/s_log1p.S
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//    Let x=2^k * mx, mx in [1,2)
-//
-//    Get B~1/mx based on the output of rcpps instruction (B0)
-//    B = int((B0*2^7+0.5))/2^7
-//
-//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
-//
-//    Result:  k*log(2) - log(B) + p(r)
-//             p(r) is a degree 7 polynomial
-//             -log(B) read from data table (high, low parts)
-//             Result is formed from high and low parts
-//
-// Special cases:
-//   log1p(NaN) = quiet NaN, and raise invalid exception
-//   log1p(+INF) = that INF
-//   log1p(x) = NaN if x < -1 or x = -INF, and raises invalid exception
-//   log1p(-1) = -INF, and raises divide-by-zero exception
-//   log1p(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  log1p
-ENTRY(log1p)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_log1p.1:
-        subq      $24, %rsp
-..___tag_value_log1p.3:
-        movsd     %xmm0, 8(%rsp)
-..B1.2:
-        movq      $0x3ff0000000000000, %rax
-        movd      %rax, %xmm2
-        xorpd     %xmm3, %xmm3
-        movl      $32768, %ecx
-        movd      %rcx, %xmm4
-        movq      $0xffffe00000000000, %r8
-        movd      %r8, %xmm5
-        movddup   %xmm0, %xmm7
-        pshufd    $68, %xmm2, %xmm6
-        pextrw    $3, %xmm0, %ecx
-        addsd     %xmm2, %xmm0
-        movq      %xmm0, %xmm1
-        pextrw    $3, %xmm0, %eax
-        subsd     %xmm0, %xmm6
-        orpd      %xmm2, %xmm0
-        psrlq     $27, %xmm0
-        lea       L_tbl(%rip), %r11
-        psrld     $2, %xmm0
-        subl      $16, %eax
-        cmpl      $32736, %eax
-        jae       .L_2TAG_PACKET_0.0.2
-        addsd     %xmm6, %xmm7
-        rcpps     %xmm0, %xmm0
-        psllq     $12, %xmm1
-        pshufd    $228, %xmm5, %xmm6
-        psrlq     $12, %xmm1
-        andl      $32752, %ecx
-        cmpl      $16256, %ecx
-        jb        .L_2TAG_PACKET_1.0.2
-        andl      $32752, %eax
-        movl      $32720, %ecx
-        subl      %eax, %ecx
-        pinsrw    $3, %ecx, %xmm3
-.L_2TAG_PACKET_2.0.2:
-        mulsd     %xmm3, %xmm7
-        paddd     %xmm4, %xmm0
-        movq      $0x3800000000000000, %rcx
-        movd      %rcx, %xmm4
-        orpd      %xmm2, %xmm1
-        movd      %xmm0, %edx
-        psllq     $29, %xmm0
-        andpd     %xmm1, %xmm5
-        andpd     %xmm6, %xmm0
-        subsd     %xmm5, %xmm1
-        paddd     %xmm4, %xmm0
-        mulsd     %xmm0, %xmm5
-        movl      $16352, %ecx
-        subl      %ecx, %eax
-        cvtsi2sd  %eax, %xmm4
-        mulsd     %xmm0, %xmm7
-        mulsd     %xmm0, %xmm1
-        movq      log2(%rip), %xmm6
-        movapd    coeff(%rip), %xmm3
-        subsd     %xmm2, %xmm5
-        andl      $16711680, %edx
-        shrl      $12, %edx
-        movapd    (%r11,%rdx), %xmm0
-        movapd    16+coeff(%rip), %xmm2
-        addsd     %xmm5, %xmm1
-        movq      %xmm1, %xmm5
-        addsd     %xmm7, %xmm1
-        subsd     %xmm1, %xmm5
-        addsd     %xmm5, %xmm7
-        mulsd     %xmm4, %xmm6
-        mulsd     8+log2(%rip), %xmm4
-        mulsd     %xmm1, %xmm3
-        movddup   %xmm1, %xmm5
-        addsd     %xmm6, %xmm0
-        mulpd     %xmm5, %xmm2
-        mulpd     %xmm5, %xmm5
-        movddup   %xmm0, %xmm6
-        addsd     %xmm1, %xmm0
-        addpd     32+coeff(%rip), %xmm2
-        mulpd     %xmm5, %xmm3
-        subsd     %xmm0, %xmm6
-        mulsd     %xmm1, %xmm2
-        addsd     %xmm7, %xmm4
-        mulsd     %xmm1, %xmm7
-        addsd     %xmm6, %xmm1
-        pshufd    $238, %xmm0, %xmm6
-        mulsd     %xmm5, %xmm5
-        addsd     %xmm6, %xmm4
-        subsd     %xmm7, %xmm1
-        addpd     %xmm3, %xmm2
-        addsd     %xmm4, %xmm1
-        mulpd     %xmm5, %xmm2
-        addsd     %xmm2, %xmm1
-        pshufd    $238, %xmm2, %xmm5
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_0.0.2:
-        movq      8(%rsp), %xmm0
-        movq      8(%rsp), %xmm1
-        addl      $16, %eax
-        cmpl      $32768, %eax
-        jae       .L_2TAG_PACKET_3.0.2
-        cmpl      $0, %eax
-        je        .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_5.0.2:
-        addsd     %xmm0, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_6.0.2:
-        ja        .L_2TAG_PACKET_5.0.2
-        cmpl      $0, %edx
-        ja        .L_2TAG_PACKET_5.0.2
-        jmp       .L_2TAG_PACKET_7.0.2
-.L_2TAG_PACKET_3.0.2:
-        movd      %xmm1, %edx
-        psrlq     $32, %xmm1
-        movd      %xmm1, %ecx
-        addl      %ecx, %ecx
-        cmpl      $-2097152, %ecx
-        jae       .L_2TAG_PACKET_6.0.2
-        orl       %ecx, %edx
-        cmpl      $0, %edx
-        je        .L_2TAG_PACKET_4.0.2
-.L_2TAG_PACKET_7.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $32752, %eax
-        pinsrw    $3, %eax, %xmm1
-        movl      $141, (%rsp)
-        mulsd     %xmm1, %xmm0
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_4.0.2:
-        xorpd     %xmm1, %xmm1
-        xorpd     %xmm0, %xmm0
-        movl      $49136, %eax
-        pinsrw    $3, %eax, %xmm0
-        divsd     %xmm1, %xmm0
-        movl      $140, (%rsp)
-        jmp       .L_2TAG_PACKET_8.0.2
-.L_2TAG_PACKET_1.0.2:
-        movq      8(%rsp), %xmm0
-        cmpl      $15504, %ecx
-        jb        .L_2TAG_PACKET_9.0.2
-        movapd    coeff2(%rip), %xmm1
-        pshufd    $68, %xmm0, %xmm0
-        movapd    16+coeff2(%rip), %xmm2
-        pshufd    $68, %xmm0, %xmm4
-        movapd    32+coeff2(%rip), %xmm3
-        mulpd     %xmm0, %xmm1
-        xorpd     %xmm6, %xmm6
-        mulpd     %xmm4, %xmm4
-        addpd     %xmm2, %xmm1
-        pshufd    $68, %xmm4, %xmm5
-        mulpd     %xmm0, %xmm4
-        movl      $49120, %eax
-        pinsrw    $3, %eax, %xmm6
-        mulpd     %xmm0, %xmm1
-        mulsd     %xmm4, %xmm4
-        addpd     %xmm3, %xmm1
-        mulsd     %xmm6, %xmm5
-        mulpd     %xmm4, %xmm1
-        pshufd    $238, %xmm1, %xmm7
-        addsd     %xmm7, %xmm1
-        addsd     %xmm5, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.5
-.L_2TAG_PACKET_9.0.2:
-        cmpl      $16, %ecx
-        jb        .L_2TAG_PACKET_10.0.2
-        jmp       ..B1.5
-.L_2TAG_PACKET_10.0.2:
-        movq      %xmm0, %xmm1
-        mulsd     %xmm1, %xmm1
-        jmp       ..B1.5
-.L_2TAG_PACKET_8.0.2:
-        movq      %xmm0, 16(%rsp)
-..B1.3:
-        movq      16(%rsp), %xmm0
-.L_2TAG_PACKET_11.0.2:
-..B1.5:
-        addq      $24, %rsp
-..___tag_value_log1p.4:
-        ret       
-..___tag_value_log1p.5:
-END(log1p)
-# -- End  log1p
-	.section .rodata, "a"
-	.align 16
-	.align 16
-L_tbl:
-	.long	4277811200
-	.long	1072049730
-	.long	2479318832
-	.long	1026487127
-	.long	2854492160
-	.long	1072033410
-	.long	215631550
-	.long	1025638968
-	.long	1547061248
-	.long	1072017216
-	.long	2886781435
-	.long	1026423395
-	.long	649825280
-	.long	1072001146
-	.long	4281533405
-	.long	1024038923
-	.long	646346752
-	.long	1071985198
-	.long	1562735921
-	.long	1023790276
-	.long	2203734016
-	.long	1071969370
-	.long	1838397691
-	.long	3173936209
-	.long	1872169984
-	.long	1071953661
-	.long	3981202460
-	.long	1022325013
-	.long	669557760
-	.long	1071938069
-	.long	4182597802
-	.long	3173174122
-	.long	4076413952
-	.long	1071922591
-	.long	1209029111
-	.long	3170736207
-	.long	556125184
-	.long	1071907228
-	.long	821086028
-	.long	3173437049
-	.long	204914688
-	.long	1071891976
-	.long	2097025986
-	.long	3171071798
-	.long	387545088
-	.long	1071876834
-	.long	3142936996
-	.long	3173092218
-	.long	2912783360
-	.long	1071861800
-	.long	2502420140
-	.long	1024505919
-	.long	1144260608
-	.long	1071846874
-	.long	3315658140
-	.long	3173469843
-	.long	1471209472
-	.long	1071832053
-	.long	129621009
-	.long	3172443877
-	.long	1829683200
-	.long	1071817336
-	.long	3885467693
-	.long	1025535275
-	.long	288676864
-	.long	1071802722
-	.long	86139472
-	.long	3171639793
-	.long	3636378624
-	.long	1071788208
-	.long	1850238587
-	.long	1024654342
-	.long	1606817792
-	.long	1071773795
-	.long	3388899795
-	.long	3173675586
-	.long	1236164608
-	.long	1071759480
-	.long	3983599207
-	.long	1020046558
-	.long	1089616896
-	.long	1071745262
-	.long	4171974224
-	.long	1024773198
-	.long	4143093760
-	.long	1071731139
-	.long	2727587401
-	.long	3173965207
-	.long	600267776
-	.long	1071717112
-	.long	3147685042
-	.long	3173353031
-	.long	2249313280
-	.long	1071703177
-	.long	125835074
-	.long	1025255832
-	.long	3805303808
-	.long	1071689334
-	.long	2289991207
-	.long	1025460331
-	.long	87278592
-	.long	1071675583
-	.long	1106114045
-	.long	1025933602
-	.long	3195405312
-	.long	1071661920
-	.long	3885316576
-	.long	3171206239
-	.long	3853649920
-	.long	1071648346
-	.long	2977069852
-	.long	3171236771
-	.long	2944026624
-	.long	1071625048
-	.long	1008093493
-	.long	1023444474
-	.long	3993180160
-	.long	1071598247
-	.long	1862355595
-	.long	1024642533
-	.long	1454641152
-	.long	1071571617
-	.long	1514603089
-	.long	1026500596
-	.long	3286085632
-	.long	1071545154
-	.long	1400028424
-	.long	3173279056
-	.long	438773760
-	.long	1071518858
-	.long	120727864
-	.long	3172148914
-	.long	1212979200
-	.long	1071492725
-	.long	1625055594
-	.long	3172901933
-	.long	1189017600
-	.long	1071466754
-	.long	3920062376
-	.long	1025727407
-	.long	403064832
-	.long	1071440943
-	.long	1053271728
-	.long	3171391427
-	.long	3343210496
-	.long	1071415289
-	.long	3243395502
-	.long	3173627613
-	.long	1765777408
-	.long	1071389792
-	.long	2145968512
-	.long	1026354304
-	.long	461430784
-	.long	1071364449
-	.long	4094322285
-	.long	1026021467
-	.long	71706624
-	.long	1071339258
-	.long	763632021
-	.long	1024496933
-	.long	1380503552
-	.long	1071314217
-	.long	1383547992
-	.long	3173088453
-	.long	1015732224
-	.long	1071289325
-	.long	3198646877
-	.long	1025390322
-	.long	35977216
-	.long	1071264580
-	.long	2141026805
-	.long	1025754693
-	.long	3927306240
-	.long	1071239979
-	.long	282116272
-	.long	3173394334
-	.long	1125341184
-	.long	1071215523
-	.long	2768427504
-	.long	3172279059
-	.long	1666971648
-	.long	1071191208
-	.long	786837629
-	.long	3172427445
-	.long	2827694080
-	.long	1071167033
-	.long	3857122416
-	.long	3173014241
-	.long	2003683328
-	.long	1071142997
-	.long	859010954
-	.long	1026545007
-	.long	1004017664
-	.long	1071119098
-	.long	3356644970
-	.long	3173458064
-	.long	1753020416
-	.long	1071095334
-	.long	788338552
-	.long	1026157693
-	.long	1992718336
-	.long	1071071704
-	.long	1239179443
-	.long	1026394889
-	.long	3870234624
-	.long	1071048206
-	.long	2082614663
-	.long	1024926053
-	.long	1050437632
-	.long	1071024840
-	.long	660007840
-	.long	1025548499
-	.long	188395520
-	.long	1071001603
-	.long	3878792704
-	.long	3173889571
-	.long	3747176448
-	.long	1070978493
-	.long	144991708
-	.long	3171552042
-	.long	1405669376
-	.long	1070955511
-	.long	3999088879
-	.long	1025486317
-	.long	121151488
-	.long	1070932654
-	.long	2170865497
-	.long	1026473584
-	.long	2652319744
-	.long	1070909920
-	.long	453695652
-	.long	3173916809
-	.long	3262236672
-	.long	1070887309
-	.long	157800053
-	.long	3173984206
-	.long	601221120
-	.long	1070864820
-	.long	3968917661
-	.long	1023992886
-	.long	1999843328
-	.long	1070842450
-	.long	3053895004
-	.long	1024998228
-	.long	1992167424
-	.long	1070820199
-	.long	2968614856
-	.long	1024552653
-	.long	3788726272
-	.long	1070798065
-	.long	3542170808
-	.long	3173573242
-	.long	2094829568
-	.long	1070776048
-	.long	1246758132
-	.long	1026202874
-	.long	288675840
-	.long	1070754146
-	.long	3747328950
-	.long	1026331585
-	.long	1829681152
-	.long	1070732357
-	.long	3125197546
-	.long	1024100318
-	.long	1666869248
-	.long	1070710681
-	.long	1363656119
-	.long	1026336493
-	.long	3417110528
-	.long	1070689116
-	.long	4154791553
-	.long	1026267853
-	.long	2183653376
-	.long	1070667662
-	.long	1671819292
-	.long	3173785870
-	.long	1734434816
-	.long	1070646317
-	.long	373091049
-	.long	1025972363
-	.long	1615681536
-	.long	1070625080
-	.long	384650897
-	.long	1022926043
-	.long	1445382144
-	.long	1070603950
-	.long	344320330
-	.long	3172397196
-	.long	1823715328
-	.long	1070569756
-	.long	3389841200
-	.long	1025231852
-	.long	3839688704
-	.long	1070527917
-	.long	1706790417
-	.long	3167363349
-	.long	4293332992
-	.long	1070486286
-	.long	1614935088
-	.long	1019351591
-	.long	2966720512
-	.long	1070444861
-	.long	4145393717
-	.long	3173711658
-	.long	4066729984
-	.long	1070403639
-	.long	1974925028
-	.long	3171437182
-	.long	3337621504
-	.long	1070362619
-	.long	3314953170
-	.long	3169971314
-	.long	943448064
-	.long	1070321799
-	.long	1498682038
-	.long	3173862340
-	.long	1465634816
-	.long	1070281176
-	.long	1319952810
-	.long	3171693965
-	.long	1015734272
-	.long	1070240749
-	.long	1347821929
-	.long	3173544515
-	.long	118001664
-	.long	1070200516
-	.long	1751482746
-	.long	1026134093
-	.long	3707174912
-	.long	1070160474
-	.long	1486946159
-	.long	1023930920
-	.long	3946381312
-	.long	1070120623
-	.long	2867408081
-	.long	3171368276
-	.long	1699848192
-	.long	1070080961
-	.long	2590187139
-	.long	1025379803
-	.long	2235846656
-	.long	1070041485
-	.long	1888568069
-	.long	3172754960
-	.long	2339729408
-	.long	1070002194
-	.long	3852214753
-	.long	3173323149
-	.long	3196850176
-	.long	1069963086
-	.long	742141560
-	.long	1025101707
-	.long	1800683520
-	.long	1069924160
-	.long	3949500444
-	.long	3172102179
-	.long	3835801600
-	.long	1069885413
-	.long	3848895943
-	.long	1025913832
-	.long	2201202688
-	.long	1069846845
-	.long	1425913464
-	.long	1025868665
-	.long	2778279936
-	.long	1069808453
-	.long	2120889677
-	.long	3173831128
-	.long	2954203136
-	.long	1069770236
-	.long	592147081
-	.long	1019621288
-	.long	210141184
-	.long	1069732193
-	.long	3414275233
-	.long	1023647084
-	.long	709476352
-	.long	1069694321
-	.long	2413027164
-	.long	1024462115
-	.long	2116284416
-	.long	1069656619
-	.long	1144559924
-	.long	1026336654
-	.long	2183651328
-	.long	1069619086
-	.long	3459057650
-	.long	1025634168
-	.long	3047047168
-	.long	1069581720
-	.long	1879674924
-	.long	3173508573
-	.long	970711040
-	.long	1069541521
-	.long	1335954173
-	.long	3173332182
-	.long	2198478848
-	.long	1069467449
-	.long	2951103968
-	.long	3173892200
-	.long	1669611520
-	.long	1069393703
-	.long	531044147
-	.long	1025149248
-	.long	29114368
-	.long	1069320280
-	.long	3327831251
-	.long	1025918673
-	.long	2376949760
-	.long	1069247176
-	.long	737634533
-	.long	3172176000
-	.long	1085390848
-	.long	1069174390
-	.long	3108243400
-	.long	3171828406
-	.long	1566130176
-	.long	1069101918
-	.long	985483226
-	.long	1025708380
-	.long	792780800
-	.long	1069029758
-	.long	4184866295
-	.long	1024426204
-	.long	183156736
-	.long	1068957907
-	.long	2845699378
-	.long	1022107277
-	.long	1301782528
-	.long	1068886362
-	.long	1012735262
-	.long	3173804294
-	.long	1562411008
-	.long	1068815121
-	.long	2197086703
-	.long	3170187813
-	.long	2815549440
-	.long	1068744181
-	.long	2782613207
-	.long	1026345054
-	.long	2756124672
-	.long	1068673540
-	.long	2929486205
-	.long	3173037800
-	.long	3511050240
-	.long	1068603195
-	.long	1443733147
-	.long	3173331549
-	.long	3047047168
-	.long	1068533144
-	.long	1879674924
-	.long	3172459997
-	.long	3221667840
-	.long	1068427825
-	.long	1338588027
-	.long	3171815742
-	.long	3453861888
-	.long	1068288883
-	.long	1205348359
-	.long	3172624626
-	.long	3506110464
-	.long	1068150514
-	.long	893105198
-	.long	1025571866
-	.long	346013696
-	.long	1068012714
-	.long	3495569021
-	.long	3172563349
-	.long	4074029056
-	.long	1067875476
-	.long	3961106338
-	.long	3171065595
-	.long	3559784448
-	.long	1067738798
-	.long	1975385384
-	.long	3173783155
-	.long	797769728
-	.long	1067602675
-	.long	3760305787
-	.long	1026047642
-	.long	2313633792
-	.long	1067467101
-	.long	1559353171
-	.long	1023480256
-	.long	3960766464
-	.long	1067213778
-	.long	1067365107
-	.long	1025865926
-	.long	684261376
-	.long	1066944805
-	.long	844762164
-	.long	3173687482
-	.long	630718464
-	.long	1066676905
-	.long	2458269694
-	.long	1024033081
-	.long	1486061568
-	.long	1066410070
-	.long	115537874
-	.long	3173243995
-	.long	2743664640
-	.long	1065886792
-	.long	3665098304
-	.long	3173471607
-	.long	1971912704
-	.long	1065357333
-	.long	2577214440
-	.long	3171993451
-	.long	1498939392
-	.long	1064306693
-	.long	3409036923
-	.long	1025599151
-	.long	0
-	.long	0
-	.long	0
-	.long	2147483648
-	.type	L_tbl,@object
-	.size	L_tbl,2064
-	.align 16
-log2:
-	.long	4277811200
-	.long	1067855426
-	.long	2479318832
-	.long	1022292823
-	.type	log2,@object
-	.size	log2,16
-	.align 16
-coeff:
-	.long	2454267026
-	.long	1069697316
-	.long	0
-	.long	3218079744
-	.long	1030730101
-	.long	3217380702
-	.long	1431655765
-	.long	1070945621
-	.long	2576980378
-	.long	1070176665
-	.long	0
-	.long	3219128320
-	.type	coeff,@object
-	.size	coeff,48
-	.align 16
-coeff2:
-	.long	0
-	.long	3217031168
-	.long	2576980378
-	.long	1070176665
-	.long	2454267026
-	.long	1069697316
-	.long	0
-	.long	3218079744
-	.long	1431655765
-	.long	3217380693
-	.long	1431655765
-	.long	1070945621
-	.type	coeff2,@object
-	.size	coeff2,48
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_log1p.1-.
-	.4byte ..___tag_value_log1p.5-..___tag_value_log1p.1
-	.2byte 0x0400
-	.4byte ..___tag_value_log1p.3-..___tag_value_log1p.1
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_log1p.4-..___tag_value_log1p.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/s_sin.S b/libm/x86_64/s_sin.S
deleted file mode 100644
index fb54a2a..0000000
--- a/libm/x86_64/s_sin.S
+++ /dev/null
@@ -1,1300 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-//     1. RANGE REDUCTION
-//
-//     We perform an initial range reduction from X to r with
-//
-//          X =~= N * pi/32 + r
-//
-//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
-//     where |N| <= 932560. Beyond this, the range reduction is
-//     insufficiently accurate. For extremely small inputs, 
-//     denormalization can occur internally, impacting performance.
-//     This means that the main path is actually only taken for
-//     2^-252 <= |X| < 90112.
-//
-//     To avoid branches, we perform the range reduction to full
-//     accuracy each time.
-//
-//          X - N * (P_1 + P_2 + P_3)
-//
-//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
-//     is exact) and P_3 is a 53-bit number. Together, these
-//     approximate pi well enough for all cases in the restricted
-//     range.
-//
-//     The main reduction sequence is:
-//
-//             y = 32/pi * x
-//             N = integer(y)
-//     (computed by adding and subtracting off SHIFTER)
-//
-//             m_1 = N * P_1
-//             m_2 = N * P_2
-//             r_1 = x - m_1
-//             r = r_1 - m_2
-//     (this r can be used for most of the calculation)
-//
-//             c_1 = r_1 - r
-//             m_3 = N * P_3
-//             c_2 = c_1 - m_2
-//             c = c_2 - m_3
-//
-//     2. MAIN ALGORITHM
-//
-//     The algorithm uses a table lookup based on B = M * pi / 32
-//     where M = N mod 64. The stored values are:
-//       sigma             closest power of 2 to cos(B)
-//       C_hl              53-bit cos(B) - sigma
-//       S_hi + S_lo       2 * 53-bit sin(B)
-//
-//     The computation is organized as follows:
-//
-//          sin(B + r + c) = [sin(B) + sigma * r] +
-//                           r * (cos(B) - sigma) +
-//                           sin(B) * [cos(r + c) - 1] +
-//                           cos(B) * [sin(r + c) - r]
-//
-//     which is approximately:
-//
-//          [S_hi + sigma * r] +
-//          C_hl * r +
-//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
-//          (C_hl + sigma) * [(sin(r) - r) + c]
-//
-//     and this is what is actually computed. We separate this sum
-//     into four parts:
-//
-//          hi + med + pols + corr
-//
-//     where
-//
-//          hi       = S_hi + sigma r
-//          med      = C_hl * r
-//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-//     3. POLYNOMIAL
-//
-//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-//     (sin(r) - r) can be rearranged freely, since it is quite
-//     small, so we exploit parallelism to the fullest.
-//
-//          psc4       =   SC_4 * r_1
-//          msc4       =   psc4 * r
-//          r2         =   r * r
-//          msc2       =   SC_2 * r2
-//          r4         =   r2 * r2
-//          psc3       =   SC_3 + msc4
-//          psc1       =   SC_1 + msc2
-//          msc3       =   r4 * psc3
-//          sincospols =   psc1 + msc3
-//          pols       =   sincospols *
-//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-//     4. CORRECTION TERM
-//
-//     This is where the "c" component of the range reduction is
-//     taken into account; recall that just "r" is used for most of
-//     the calculation.
-//
-//          -c   = m_3 - c_2
-//          -d   = S_hi * r - (C_hl + sigma)
-//          corr = -c * -d + S_lo
-//
-//     5. COMPENSATED SUMMATIONS
-//
-//     The two successive compensated summations add up the high
-//     and medium parts, leaving just the low parts to add up at
-//     the end.
-//
-//          rs        =  sigma * r
-//          res_int   =  S_hi + rs
-//          k_0       =  S_hi - res_int
-//          k_2       =  k_0 + rs
-//          med       =  C_hl * r
-//          res_hi    =  res_int + med
-//          k_1       =  res_int - res_hi
-//          k_3       =  k_1 + med
-//
-//     6. FINAL SUMMATION
-//
-//     We now add up all the small parts:
-//
-//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-//     Now the overall result is just:
-//
-//          res_hi + res_lo
-//
-//     7. SMALL ARGUMENTS
-//
-//     If |x| < SNN (SNN meaning the smallest normal number), we
-//     simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
-//     do 2^-55 * (2^55 * x - x).
-//
-// Special cases:
-//  sin(NaN) = quiet NaN, and raise invalid exception
-//  sin(INF) = NaN and raise invalid exception
-//  sin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  sin
-ENTRY(sin)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_sin.1:
-        pushq     %rbx
-..___tag_value_sin.3:
-        subq      $16, %rsp
-..___tag_value_sin.5:
-        movsd     %xmm0, 8(%rsp)
-..B1.2:
-        movl      12(%rsp), %eax
-        movq      PI32INV(%rip), %xmm1
-        movq      SHIFTER(%rip), %xmm2
-        andl      $2147418112, %eax
-        subl      $808452096, %eax
-        cmpl      $281346048, %eax
-        ja        .L_2TAG_PACKET_0.0.1
-        mulsd     %xmm0, %xmm1
-        movapd    ONEHALF(%rip), %xmm5
-        movq      SIGN_MASK(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %edx
-        cvtsi2sd  %edx, %xmm1
-        movapd    P_2(%rip), %xmm6
-        movq      $0x3fb921fb54400000, %r8
-        movd      %r8, %xmm3
-        movapd    SC_4(%rip), %xmm5
-        pshufd    $68, %xmm0, %xmm4
-        mulsd     %xmm1, %xmm3
-        movddup   %xmm1, %xmm1
-        andl      $63, %edx
-        shll      $5, %edx
-        lea       Ctable(%rip), %rax
-        addq      %rdx, %rax
-        mulpd     %xmm1, %xmm6
-        mulsd     P_3(%rip), %xmm1
-        subsd     %xmm3, %xmm4
-        movq      8(%rax), %xmm7
-        subsd     %xmm3, %xmm0
-        movddup   %xmm4, %xmm3
-        subsd     %xmm6, %xmm4
-        pshufd    $68, %xmm0, %xmm0
-        movapd    (%rax), %xmm2
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm6, %xmm0
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm6, %xmm3
-        movapd    SC_2(%rip), %xmm6
-        subsd     %xmm3, %xmm1
-        movq      24(%rax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     SC_3(%rip), %xmm5
-        mulsd     (%rax), %xmm4
-        addpd     SC_1(%rip), %xmm6
-        mulpd     %xmm0, %xmm5
-        movq      %xmm3, %xmm0
-        addsd     8(%rax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movq      %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movq      8(%rax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%rax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm0, %xmm5
-        addsd     %xmm7, %xmm3
-        addsd     %xmm5, %xmm1
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        unpckhpd  %xmm6, %xmm6
-        movq      %xmm4, %xmm0
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_0.0.1:
-        jg        .L_2TAG_PACKET_1.0.1
-        shrl      $20, %eax
-        cmpw      $3325, %ax
-        jne       .L_2TAG_PACKET_2.0.1
-        mulsd     ALL_ONES(%rip), %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_2.0.1:
-        movq      TWO_POW_55(%rip), %xmm3
-        mulsd     %xmm0, %xmm3
-        subsd     %xmm0, %xmm3
-        mulsd     TWO_POW_M55(%rip), %xmm3
-        jmp       ..B1.4
-.L_2TAG_PACKET_1.0.1:
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_3.0.1
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        subl      $16224, %ecx
-        shrl      $7, %ecx
-        andl      $65532, %ecx
-        lea       PI_INV_TABLE(%rip), %r11
-        addq      %r11, %rcx
-        movd      %xmm0, %rax
-        movl      20(%rcx), %r10d
-        movl      24(%rcx), %r8d
-        movl      %eax, %edx
-        shrq      $21, %rax
-        orl       $-2147483648, %eax
-        shrl      $11, %eax
-        movl      %r10d, %r9d
-        imulq     %rdx, %r10
-        imulq     %rax, %r9
-        imulq     %rax, %r8
-        movl      16(%rcx), %esi
-        movl      12(%rcx), %edi
-        movl      %r10d, %r11d
-        shrq      $32, %r10
-        addq      %r10, %r9
-        addq      %r8, %r11
-        movl      %r11d, %r8d
-        shrq      $32, %r11
-        addq      %r11, %r9
-        movl      %esi, %r10d
-        imulq     %rdx, %rsi
-        imulq     %rax, %r10
-        movl      %edi, %r11d
-        imulq     %rdx, %rdi
-        movl      %esi, %ebx
-        shrq      $32, %rsi
-        addq      %rbx, %r9
-        movl      %r9d, %ebx
-        shrq      $32, %r9
-        addq      %rsi, %r10
-        addq      %r9, %r10
-        shlq      $32, %rbx
-        orq       %rbx, %r8
-        imulq     %rax, %r11
-        movl      8(%rcx), %r9d
-        movl      4(%rcx), %esi
-        movl      %edi, %ebx
-        shrq      $32, %rdi
-        addq      %rbx, %r10
-        movl      %r10d, %ebx
-        shrq      $32, %r10
-        addq      %rdi, %r11
-        addq      %r10, %r11
-        movq      %r9, %rdi
-        imulq     %rdx, %r9
-        imulq     %rax, %rdi
-        movl      %r9d, %r10d
-        shrq      $32, %r9
-        addq      %r10, %r11
-        movl      %r11d, %r10d
-        shrq      $32, %r11
-        addq      %r9, %rdi
-        addq      %r11, %rdi
-        movq      %rsi, %r9
-        imulq     %rdx, %rsi
-        imulq     %rax, %r9
-        shlq      $32, %r10
-        orq       %rbx, %r10
-        movl      (%rcx), %eax
-        movl      %esi, %r11d
-        shrq      $32, %rsi
-        addq      %r11, %rdi
-        movl      %edi, %r11d
-        shrq      $32, %rdi
-        addq      %rsi, %r9
-        addq      %rdi, %r9
-        imulq     %rax, %rdx
-        pextrw    $3, %xmm0, %ebx
-        lea       PI_INV_TABLE(%rip), %rdi
-        subq      %rdi, %rcx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      $19, %ecx
-        movl      $32768, %esi
-        andl      %ebx, %esi
-        shrl      $4, %ebx
-        andl      $2047, %ebx
-        subl      $1023, %ebx
-        subl      %ebx, %ecx
-        addq      %rdx, %r9
-        movl      %ecx, %edx
-        addl      $32, %edx
-        cmpl      $1, %ecx
-        jl        .L_2TAG_PACKET_4.0.1
-        negl      %ecx
-        addl      $29, %ecx
-        shll      %cl, %r9d
-        movl      %r9d, %edi
-        andl      $536870911, %r9d
-        testl     $268435456, %r9d
-        jne       .L_2TAG_PACKET_5.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-.L_2TAG_PACKET_6.0.1:
-.L_2TAG_PACKET_7.0.1:
-        cmpq      $0, %r9
-        je        .L_2TAG_PACKET_8.0.1
-.L_2TAG_PACKET_9.0.1:
-        bsr       %r9, %r11
-        movl      $29, %ecx
-        subl      %r11d, %ecx
-        jle       .L_2TAG_PACKET_10.0.1
-        shlq      %cl, %r9
-        movq      %r10, %rax
-        shlq      %cl, %r10
-        addl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shrq      %cl, %rax
-        shrq      %cl, %r8
-        orq       %rax, %r9
-        orq       %r8, %r10
-.L_2TAG_PACKET_11.0.1:
-        cvtsi2sdq %r9, %xmm0
-        shrq      $1, %r10
-        cvtsi2sdq %r10, %xmm3
-        xorpd     %xmm4, %xmm4
-        shll      $4, %edx
-        negl      %edx
-        addl      $16368, %edx
-        orl       %esi, %edx
-        xorl      %ebx, %edx
-        pinsrw    $3, %edx, %xmm4
-        movq      PI_4(%rip), %xmm2
-        movq      8+PI_4(%rip), %xmm6
-        xorpd     %xmm5, %xmm5
-        subl      $1008, %edx
-        pinsrw    $3, %edx, %xmm5
-        mulsd     %xmm4, %xmm0
-        shll      $16, %esi
-        sarl      $31, %esi
-        mulsd     %xmm5, %xmm3
-        movq      %xmm0, %xmm1
-        mulsd     %xmm2, %xmm0
-        shrl      $29, %edi
-        addsd     %xmm3, %xmm1
-        mulsd     %xmm2, %xmm3
-        addl      %esi, %edi
-        xorl      %esi, %edi
-        mulsd     %xmm1, %xmm6
-        movl      %edi, %eax
-        addsd     %xmm3, %xmm6
-        movq      %xmm0, %xmm2
-        addsd     %xmm6, %xmm0
-        subsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm6
-.L_2TAG_PACKET_12.0.1:
-        movq      PI32INV(%rip), %xmm1
-        mulsd     %xmm0, %xmm1
-        movq      ONEHALF(%rip), %xmm5
-        movq      SIGN_MASK(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        cvttsd2si %xmm1, %edx
-        cvtsi2sd  %edx, %xmm1
-        movq      P_1(%rip), %xmm3
-        movapd    P_2(%rip), %xmm2
-        mulsd     %xmm1, %xmm3
-        unpcklpd  %xmm1, %xmm1
-        shll      $3, %eax
-        addl      $1865216, %edx
-        movq      %xmm0, %xmm4
-        addl      %eax, %edx
-        andl      $63, %edx
-        movapd    SC_4(%rip), %xmm5
-        lea       Ctable(%rip), %rax
-        shll      $5, %edx
-        addq      %rdx, %rax
-        mulpd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm0
-        mulsd     P_3(%rip), %xmm1
-        subsd     %xmm3, %xmm4
-        movq      8(%rax), %xmm7
-        unpcklpd  %xmm0, %xmm0
-        movq      %xmm4, %xmm3
-        subsd     %xmm2, %xmm4
-        mulpd     %xmm0, %xmm5
-        subpd     %xmm2, %xmm0
-        mulsd     %xmm4, %xmm7
-        subsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm5
-        mulpd     %xmm0, %xmm0
-        subsd     %xmm2, %xmm3
-        movapd    (%rax), %xmm2
-        subsd     %xmm3, %xmm1
-        movq      24(%rax), %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm7
-        subsd     %xmm6, %xmm1
-        movapd    SC_2(%rip), %xmm6
-        mulsd     %xmm4, %xmm2
-        mulpd     %xmm0, %xmm6
-        mulsd     %xmm4, %xmm3
-        mulpd     %xmm0, %xmm2
-        mulpd     %xmm0, %xmm0
-        addpd     SC_3(%rip), %xmm5
-        mulsd     (%rax), %xmm4
-        addpd     SC_1(%rip), %xmm6
-        mulpd     %xmm0, %xmm5
-        movq      %xmm3, %xmm0
-        addsd     8(%rax), %xmm3
-        mulpd     %xmm7, %xmm1
-        movq      %xmm4, %xmm7
-        addsd     %xmm3, %xmm4
-        addpd     %xmm5, %xmm6
-        movq      8(%rax), %xmm5
-        subsd     %xmm3, %xmm5
-        subsd     %xmm4, %xmm3
-        addsd     16(%rax), %xmm1
-        mulpd     %xmm2, %xmm6
-        addsd     %xmm0, %xmm5
-        addsd     %xmm7, %xmm3
-        addsd     %xmm5, %xmm1
-        addsd     %xmm3, %xmm1
-        addsd     %xmm6, %xmm1
-        unpckhpd  %xmm6, %xmm6
-        movq      %xmm4, %xmm0
-        addsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_8.0.1:
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        movq      $0, %r8
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_9.0.1
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_9.0.1
-        xorpd     %xmm0, %xmm0
-        xorpd     %xmm6, %xmm6
-        jmp       .L_2TAG_PACKET_12.0.1
-.L_2TAG_PACKET_10.0.1:
-        je        .L_2TAG_PACKET_11.0.1
-        negl      %ecx
-        shrq      %cl, %r10
-        movq      %r9, %rax
-        shrq      %cl, %r9
-        subl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shlq      %cl, %rax
-        orq       %rax, %r10
-        jmp       .L_2TAG_PACKET_11.0.1
-.L_2TAG_PACKET_4.0.1:
-        negl      %ecx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      %cl, %r9
-        movq      %r9, %rdi
-        testl     $-2147483648, %r9d
-        jne       .L_2TAG_PACKET_13.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shrq      $3, %rdi
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_5.0.1:
-        shrl      %cl, %r9d
-        movl      $536870912, %ebx
-        shrl      %cl, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      $32, %rbx
-        addl      $536870912, %edi
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        jmp       .L_2TAG_PACKET_6.0.1
-.L_2TAG_PACKET_13.0.1:
-        shrl      %cl, %r9d
-        movq      $0x100000000, %rbx
-        shrq      %cl, %rbx
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        shrq      $3, %rdi
-        addl      $536870912, %edi
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_3.0.1:
-        movq      8(%rsp), %xmm0
-        mulsd     NEG_ZERO(%rip), %xmm0
-        movq      %xmm0, (%rsp)
-.L_2TAG_PACKET_14.0.1:
-..B1.4:
-        addq      $16, %rsp
-..___tag_value_sin.6:
-        popq      %rbx
-..___tag_value_sin.8:
-        ret       
-..___tag_value_sin.9:
-END(sin)
-# -- End  sin
-	.section .rodata, "a"
-	.align 16
-	.align 16
-ONEHALF:
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.type	ONEHALF,@object
-	.size	ONEHALF,16
-	.align 16
-P_2:
-	.long	442499072
-	.long	1032893537
-	.long	442499072
-	.long	1032893537
-	.type	P_2,@object
-	.size	P_2,16
-	.align 16
-SC_4:
-	.long	2773927732
-	.long	1053236707
-	.long	436314138
-	.long	1056571808
-	.type	SC_4,@object
-	.size	SC_4,16
-	.align 16
-Ctable:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	1072693248
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	1072693248
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	1071644672
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	1071644672
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	1070596096
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	1070596096
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	1069547520
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	1072683149
-	.long	1073741824
-	.long	3163061750
-	.long	0
-	.long	3217031168
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	1072652951
-	.long	536870912
-	.long	1014325783
-	.long	0
-	.long	3218079744
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	1072602945
-	.long	3758096384
-	.long	1015505073
-	.long	0
-	.long	3218079744
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	1072533611
-	.long	536870912
-	.long	1014257638
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	1072445618
-	.long	2147483648
-	.long	3161907377
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	1072339814
-	.long	3758096384
-	.long	1010431536
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	1072217216
-	.long	536870912
-	.long	3162686945
-	.long	0
-	.long	3219128320
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	1072079006
-	.long	536870912
-	.long	3163282740
-	.long	0
-	.long	3219128320
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	1071926515
-	.long	536870912
-	.long	1013450602
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	1071761211
-	.long	536870912
-	.long	1015752157
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	1071524701
-	.long	536870912
-	.long	1012796809
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	1071152610
-	.long	3758096384
-	.long	3160878317
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	1070765062
-	.long	2684354560
-	.long	3161838221
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	1070135480
-	.long	3221225472
-	.long	3160567065
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	1069094822
-	.long	3758096384
-	.long	3158189848
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	393047345
-	.long	1064548654
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	3220176896
-	.long	18115067
-	.long	1066642694
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	3220176896
-	.long	2476548698
-	.long	1067846634
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	3220176896
-	.long	2255197647
-	.long	1068727457
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	3220176896
-	.long	1945768569
-	.long	1069431400
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	3220176896
-	.long	1539668340
-	.long	1069912679
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	3220176896
-	.long	1403757309
-	.long	1070403070
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	3220176896
-	.long	2583490354
-	.long	3217719929
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	3219128320
-	.long	2485417816
-	.long	3217109964
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	3219128320
-	.long	2598800519
-	.long	3215750067
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	3219128320
-	.long	2140183630
-	.long	1067272748
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	3219128320
-	.long	1699043957
-	.long	1069418613
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	3219128320
-	.long	1991047213
-	.long	3215237169
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	3218079744
-	.long	240740309
-	.long	1068244255
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	3218079744
-	.long	257503056
-	.long	1067164005
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	3217031168
-	.long	0
-	.long	0
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	257503056
-	.long	3214647653
-	.long	2748392742
-	.long	3220166797
-	.long	1073741824
-	.long	1015578102
-	.long	0
-	.long	1069547520
-	.long	240740309
-	.long	3215727903
-	.long	3489094832
-	.long	3220136599
-	.long	536870912
-	.long	3161809431
-	.long	0
-	.long	1070596096
-	.long	1991047213
-	.long	1067753521
-	.long	1455828442
-	.long	3220086593
-	.long	3758096384
-	.long	3162988721
-	.long	0
-	.long	1070596096
-	.long	1699043957
-	.long	3216902261
-	.long	3476196678
-	.long	3220017259
-	.long	536870912
-	.long	3161741286
-	.long	0
-	.long	1071644672
-	.long	2140183630
-	.long	3214756396
-	.long	4051746225
-	.long	3219929266
-	.long	2147483648
-	.long	1014423729
-	.long	0
-	.long	1071644672
-	.long	2598800519
-	.long	1068266419
-	.long	688824739
-	.long	3219823462
-	.long	3758096384
-	.long	3157915184
-	.long	0
-	.long	1071644672
-	.long	2485417816
-	.long	1069626316
-	.long	1796544321
-	.long	3219700864
-	.long	536870912
-	.long	1015203297
-	.long	0
-	.long	1071644672
-	.long	2583490354
-	.long	1070236281
-	.long	1719614413
-	.long	3219562654
-	.long	536870912
-	.long	1015799092
-	.long	0
-	.long	1071644672
-	.long	1403757309
-	.long	3217886718
-	.long	621354454
-	.long	3219410163
-	.long	536870912
-	.long	3160934250
-	.long	0
-	.long	1072693248
-	.long	1539668340
-	.long	3217396327
-	.long	967731400
-	.long	3219244859
-	.long	536870912
-	.long	3163235805
-	.long	0
-	.long	1072693248
-	.long	1945768569
-	.long	3216915048
-	.long	939980347
-	.long	3219008349
-	.long	536870912
-	.long	3160280457
-	.long	0
-	.long	1072693248
-	.long	2255197647
-	.long	3216211105
-	.long	2796464483
-	.long	3218636258
-	.long	3758096384
-	.long	1013394669
-	.long	0
-	.long	1072693248
-	.long	2476548698
-	.long	3215330282
-	.long	785751814
-	.long	3218248710
-	.long	2684354560
-	.long	1014354573
-	.long	0
-	.long	1072693248
-	.long	18115067
-	.long	3214126342
-	.long	1013556747
-	.long	3217619128
-	.long	3221225472
-	.long	1013083417
-	.long	0
-	.long	1072693248
-	.long	393047345
-	.long	3212032302
-	.long	3156849708
-	.long	3216578470
-	.long	3758096384
-	.long	1010706200
-	.long	0
-	.long	1072693248
-	.type	Ctable,@object
-	.size	Ctable,2048
-	.align 16
-SC_2:
-	.long	286331153
-	.long	1065423121
-	.long	1431655765
-	.long	1067799893
-	.type	SC_2,@object
-	.size	SC_2,16
-	.align 16
-SC_3:
-	.long	436314138
-	.long	3207201184
-	.long	381774871
-	.long	3210133868
-	.type	SC_3,@object
-	.size	SC_3,16
-	.align 16
-SC_1:
-	.long	1431655765
-	.long	3217380693
-	.long	0
-	.long	3219128320
-	.type	SC_1,@object
-	.size	SC_1,16
-	.align 16
-PI_INV_TABLE:
-	.long	0
-	.long	0
-	.long	2734261102
-	.long	1313084713
-	.long	4230436817
-	.long	4113882560
-	.long	3680671129
-	.long	1011060801
-	.long	4266746795
-	.long	3736847713
-	.long	3072618042
-	.long	1112396512
-	.long	105459434
-	.long	164729372
-	.long	4263373596
-	.long	2972297022
-	.long	3900847605
-	.long	784024708
-	.long	3919343654
-	.long	3026157121
-	.long	965858873
-	.long	2203269620
-	.long	2625920907
-	.long	3187222587
-	.long	536385535
-	.long	3724908559
-	.long	4012839307
-	.long	1510632735
-	.long	1832287951
-	.long	667617719
-	.long	1330003814
-	.long	2657085997
-	.long	1965537991
-	.long	3957715323
-	.long	1023883767
-	.long	2320667370
-	.long	1811636145
-	.long	529358088
-	.long	1443049542
-	.long	4235946923
-	.long	4040145953
-	.type	PI_INV_TABLE,@object
-	.size	PI_INV_TABLE,164
-	.space 12, 0x00 	# pad
-	.align 16
-PI_4:
-	.long	1073741824
-	.long	1072243195
-	.long	407279769
-	.long	1046758445
-	.type	PI_4,@object
-	.size	PI_4,16
-	.align 8
-PI32INV:
-	.long	1841940611
-	.long	1076125488
-	.type	PI32INV,@object
-	.size	PI32INV,8
-	.align 8
-SHIFTER:
-	.long	0
-	.long	1127743488
-	.type	SHIFTER,@object
-	.size	SHIFTER,8
-	.align 8
-SIGN_MASK:
-	.long	0
-	.long	2147483648
-	.type	SIGN_MASK,@object
-	.size	SIGN_MASK,8
-	.align 8
-P_3:
-	.long	771977331
-	.long	996350346
-	.type	P_3,@object
-	.size	P_3,8
-	.align 8
-ALL_ONES:
-	.long	4294967295
-	.long	1072693247
-	.type	ALL_ONES,@object
-	.size	ALL_ONES,8
-	.align 8
-TWO_POW_55:
-	.long	0
-	.long	1130364928
-	.type	TWO_POW_55,@object
-	.size	TWO_POW_55,8
-	.align 8
-TWO_POW_M55:
-	.long	0
-	.long	1015021568
-	.type	TWO_POW_M55,@object
-	.size	TWO_POW_M55,8
-	.align 8
-P_1:
-	.long	1413480448
-	.long	1069097467
-	.type	P_1,@object
-	.size	P_1,8
-	.align 8
-NEG_ZERO:
-	.long	0
-	.long	2147483648
-	.type	NEG_ZERO,@object
-	.size	NEG_ZERO,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000002c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_sin.1-.
-	.4byte ..___tag_value_sin.9-..___tag_value_sin.1
-	.2byte 0x0400
-	.4byte ..___tag_value_sin.3-..___tag_value_sin.1
-	.4byte 0x0283100e
-	.byte 0x04
-	.4byte ..___tag_value_sin.5-..___tag_value_sin.3
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_sin.6-..___tag_value_sin.5
-	.4byte 0x04c3100e
-	.4byte ..___tag_value_sin.8-..___tag_value_sin.6
-	.2byte 0x080e
-# End
diff --git a/libm/x86_64/s_tan.S b/libm/x86_64/s_tan.S
deleted file mode 100644
index 4fa12e3..0000000
--- a/libm/x86_64/s_tan.S
+++ /dev/null
@@ -1,2239 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// Polynomials coefficients and other constants.
-//
-// Note that in this algorithm, there is a different polynomial for
-// each breakpoint, so there are 32 sets of polynomial coefficients
-// as well as 32 instances of the other constants.
-//
-// The polynomial coefficients and constants are offset from the start
-// of the main block as follows:
-//
-//   0:  c8 | c0
-//  16:  c9 | c1
-//  32: c10 | c2
-//  48: c11 | c3
-//  64: c12 | c4
-//  80: c13 | c5
-//  96: c14 | c6
-// 112: c15 | c7
-// 128: T_hi
-// 136: T_lo
-// 144: Sigma
-// 152: T_hl
-// 160: Tau
-// 168: Mask
-// 176: (end of block)
-//
-// The total table size is therefore 5632 bytes.
-//
-// Note that c0 and c1 are always zero. We could try storing
-// other constants here, and just loading the low part of the
-// SIMD register in these cases, after ensuring the high part
-// is zero.
-//
-// The higher terms of the polynomial are computed in the *low*
-// part of the SIMD register. This is so we can overlap the
-// multiplication by r^8 and the unpacking of the other part.
-//
-// The constants are:
-// T_hi + T_lo = accurate constant term in power series
-// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
-// Tau = multiplier for the reciprocal, always -1 or 0
-//
-// The basic reconstruction formula using these constants is:
-//
-// High = tau * recip_hi + t_hi
-// Med = (sgn * r + t_hl * r)_hi
-// Low = (sgn * r + t_hl * r)_lo +
-//       tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
-//
-// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
-//
-// (c0 = c1 = 0, but using them keeps SIMD regularity)
-//
-// We then do a compensated sum High + Med, add the low parts together
-// and then do the final sum.
-//
-// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
-// modulo pi/2
-//
-// Special cases:
-//  tan(NaN) = quiet NaN, and raise invalid exception
-//  tan(INF) = NaN and raise invalid exception
-//  tan(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  tan
-ENTRY(tan)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_tan.1:
-        pushq     %rbx
-..___tag_value_tan.3:
-        subq      $16, %rsp
-..___tag_value_tan.5:
-        movsd     %xmm0, 8(%rsp)
-..B1.2:
-        pextrw    $3, %xmm0, %eax
-        andl      $32767, %eax
-        subl      $16314, %eax
-        cmpl      $270, %eax
-        ja        .L_2TAG_PACKET_0.0.1
-        movapd    ONEHALF(%rip), %xmm5
-        movapd    MUL16(%rip), %xmm6
-        unpcklpd  %xmm0, %xmm0
-        movapd    sign_mask(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        movapd    PI32INV(%rip), %xmm1
-        mulpd     %xmm0, %xmm1
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        movapd    %xmm1, %xmm7
-        unpckhpd  %xmm7, %xmm7
-        cvttsd2si %xmm7, %edx
-        cvttpd2dq %xmm1, %xmm1
-        cvtdq2pd  %xmm1, %xmm1
-        mulpd     %xmm6, %xmm1
-        movapd    P_1(%rip), %xmm3
-        movq      QQ_2(%rip), %xmm5
-        addq      $469248, %rdx
-        movapd    P_2(%rip), %xmm4
-        mulpd     %xmm1, %xmm3
-        andq      $31, %rdx
-        mulsd     %xmm1, %xmm5
-        movq      %rdx, %rcx
-        mulpd     %xmm1, %xmm4
-        shlq      $1, %rcx
-        subpd     %xmm3, %xmm0
-        mulpd     P_3(%rip), %xmm1
-        addq      %rcx, %rdx
-        shlq      $2, %rcx
-        addq      %rcx, %rdx
-        addsd     %xmm0, %xmm5
-        movapd    %xmm0, %xmm2
-        subpd     %xmm4, %xmm0
-        movq      ONE(%rip), %xmm6
-        shlq      $4, %rdx
-        lea       Ctable(%rip), %rax
-        andpd     MASK_35(%rip), %xmm5
-        movapd    %xmm0, %xmm3
-        addq      %rdx, %rax
-        subpd     %xmm0, %xmm2
-        unpckhpd  %xmm0, %xmm0
-        divsd     %xmm5, %xmm6
-        subpd     %xmm4, %xmm2
-        movapd    16(%rax), %xmm7
-        subsd     %xmm5, %xmm3
-        mulpd     %xmm0, %xmm7
-        subpd     %xmm1, %xmm2
-        movapd    48(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        movapd    96(%rax), %xmm4
-        mulpd     %xmm0, %xmm4
-        addsd     %xmm3, %xmm2
-        movapd    %xmm0, %xmm3
-        mulpd     %xmm0, %xmm0
-        addpd     (%rax), %xmm7
-        addpd     32(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     80(%rax), %xmm4
-        addpd     %xmm1, %xmm7
-        movapd    112(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm0
-        addpd     %xmm1, %xmm4
-        movapd    64(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     %xmm1, %xmm7
-        movapd    %xmm3, %xmm1
-        mulpd     %xmm0, %xmm3
-        mulsd     %xmm0, %xmm0
-        mulpd     144(%rax), %xmm1
-        mulpd     %xmm3, %xmm4
-        movq      %xmm1, %xmm3
-        addpd     %xmm4, %xmm7
-        movq      %xmm1, %xmm4
-        mulsd     %xmm7, %xmm0
-        unpckhpd  %xmm7, %xmm7
-        addsd     %xmm7, %xmm0
-        unpckhpd  %xmm1, %xmm1
-        addsd     %xmm1, %xmm3
-        subsd     %xmm3, %xmm4
-        addsd     %xmm4, %xmm1
-        movq      %xmm2, %xmm4
-        movq      144(%rax), %xmm7
-        unpckhpd  %xmm2, %xmm2
-        addsd     152(%rax), %xmm7
-        mulsd     %xmm2, %xmm7
-        addsd     136(%rax), %xmm7
-        addsd     %xmm1, %xmm7
-        addsd     %xmm7, %xmm0
-        movq      ONE(%rip), %xmm7
-        mulsd     %xmm6, %xmm4
-        movq      168(%rax), %xmm2
-        andpd     %xmm6, %xmm2
-        mulsd     %xmm2, %xmm5
-        mulsd     160(%rax), %xmm6
-        subsd     %xmm5, %xmm7
-        subsd     128(%rax), %xmm2
-        subsd     %xmm4, %xmm7
-        mulsd     %xmm6, %xmm7
-        movq      %xmm3, %xmm4
-        subsd     %xmm2, %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm4
-        addsd     %xmm4, %xmm0
-        subsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_0.0.1:
-        jg        .L_2TAG_PACKET_1.0.1
-        pextrw    $3, %xmm0, %eax
-        movl      %eax, %edx
-        andl      $32752, %eax
-        je        .L_2TAG_PACKET_2.0.1
-        andl      $32767, %edx
-        cmpl      $15904, %edx
-        jb        .L_2TAG_PACKET_3.0.1
-        movq      %xmm0, %xmm2
-        movq      %xmm0, %xmm3
-        movq      Q_11(%rip), %xmm1
-        mulsd     %xmm0, %xmm2
-        mulsd     %xmm2, %xmm3
-        mulsd     %xmm2, %xmm1
-        addsd     Q_9(%rip), %xmm1
-        mulsd     %xmm2, %xmm1
-        addsd     Q_7(%rip), %xmm1
-        mulsd     %xmm2, %xmm1
-        addsd     Q_5(%rip), %xmm1
-        mulsd     %xmm2, %xmm1
-        addsd     Q_3(%rip), %xmm1
-        mulsd     %xmm3, %xmm1
-        addsd     %xmm1, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_3.0.1:
-        movq      TWO_POW_55(%rip), %xmm3
-        mulsd     %xmm0, %xmm3
-        addsd     %xmm3, %xmm0
-        mulsd     TWO_POW_M55(%rip), %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_2.0.1:
-        movq      %xmm0, %xmm1
-        mulsd     %xmm1, %xmm1
-        jmp       ..B1.4
-.L_2TAG_PACKET_1.0.1:
-        pextrw    $3, %xmm0, %eax
-        andl      $32752, %eax
-        cmpl      $32752, %eax
-        je        .L_2TAG_PACKET_4.0.1
-        pextrw    $3, %xmm0, %ecx
-        andl      $32752, %ecx
-        subl      $16224, %ecx
-        shrl      $7, %ecx
-        andl      $65532, %ecx
-        lea       PI_INV_TABLE(%rip), %r11
-        addq      %r11, %rcx
-        movd      %xmm0, %rax
-        movl      20(%rcx), %r10d
-        movl      24(%rcx), %r8d
-        movl      %eax, %edx
-        shrq      $21, %rax
-        orl       $-2147483648, %eax
-        shrl      $11, %eax
-        movl      %r10d, %r9d
-        imulq     %rdx, %r10
-        imulq     %rax, %r9
-        imulq     %rax, %r8
-        movl      16(%rcx), %esi
-        movl      12(%rcx), %edi
-        movl      %r10d, %r11d
-        shrq      $32, %r10
-        addq      %r10, %r9
-        addq      %r8, %r11
-        movl      %r11d, %r8d
-        shrq      $32, %r11
-        addq      %r11, %r9
-        movl      %esi, %r10d
-        imulq     %rdx, %rsi
-        imulq     %rax, %r10
-        movl      %edi, %r11d
-        imulq     %rdx, %rdi
-        movl      %esi, %ebx
-        shrq      $32, %rsi
-        addq      %rbx, %r9
-        movl      %r9d, %ebx
-        shrq      $32, %r9
-        addq      %rsi, %r10
-        addq      %r9, %r10
-        shlq      $32, %rbx
-        orq       %rbx, %r8
-        imulq     %rax, %r11
-        movl      8(%rcx), %r9d
-        movl      4(%rcx), %esi
-        movl      %edi, %ebx
-        shrq      $32, %rdi
-        addq      %rbx, %r10
-        movl      %r10d, %ebx
-        shrq      $32, %r10
-        addq      %rdi, %r11
-        addq      %r10, %r11
-        movq      %r9, %rdi
-        imulq     %rdx, %r9
-        imulq     %rax, %rdi
-        movl      %r9d, %r10d
-        shrq      $32, %r9
-        addq      %r10, %r11
-        movl      %r11d, %r10d
-        shrq      $32, %r11
-        addq      %r9, %rdi
-        addq      %r11, %rdi
-        movq      %rsi, %r9
-        imulq     %rdx, %rsi
-        imulq     %rax, %r9
-        shlq      $32, %r10
-        orq       %rbx, %r10
-        movl      (%rcx), %eax
-        movl      %esi, %r11d
-        shrq      $32, %rsi
-        addq      %r11, %rdi
-        movl      %edi, %r11d
-        shrq      $32, %rdi
-        addq      %rsi, %r9
-        addq      %rdi, %r9
-        imulq     %rax, %rdx
-        pextrw    $3, %xmm0, %ebx
-        lea       PI_INV_TABLE(%rip), %rdi
-        subq      %rdi, %rcx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      %ecx, %ecx
-        addl      $19, %ecx
-        movl      $32768, %esi
-        andl      %ebx, %esi
-        shrl      $4, %ebx
-        andl      $2047, %ebx
-        subl      $1023, %ebx
-        subl      %ebx, %ecx
-        addq      %rdx, %r9
-        movl      %ecx, %edx
-        addl      $32, %edx
-        cmpl      $0, %ecx
-        jl        .L_2TAG_PACKET_5.0.1
-        negl      %ecx
-        addl      $29, %ecx
-        shll      %cl, %r9d
-        movl      %r9d, %edi
-        andl      $1073741823, %r9d
-        testl     $536870912, %r9d
-        jne       .L_2TAG_PACKET_6.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-.L_2TAG_PACKET_7.0.1:
-.L_2TAG_PACKET_8.0.1:
-        cmpq      $0, %r9
-        je        .L_2TAG_PACKET_9.0.1
-.L_2TAG_PACKET_10.0.1:
-        bsr       %r9, %r11
-        movl      $29, %ecx
-        subl      %r11d, %ecx
-        jle       .L_2TAG_PACKET_11.0.1
-        shlq      %cl, %r9
-        movq      %r10, %rax
-        shlq      %cl, %r10
-        addl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shrq      %cl, %rax
-        shrq      %cl, %r8
-        orq       %rax, %r9
-        orq       %r8, %r10
-.L_2TAG_PACKET_12.0.1:
-        cvtsi2sdq %r9, %xmm0
-        shrq      $1, %r10
-        cvtsi2sdq %r10, %xmm3
-        xorpd     %xmm4, %xmm4
-        shll      $4, %edx
-        negl      %edx
-        addl      $16368, %edx
-        orl       %esi, %edx
-        xorl      %ebx, %edx
-        pinsrw    $3, %edx, %xmm4
-        movq      PI_4(%rip), %xmm2
-        movq      8+PI_4(%rip), %xmm7
-        xorpd     %xmm5, %xmm5
-        subl      $1008, %edx
-        pinsrw    $3, %edx, %xmm5
-        mulsd     %xmm4, %xmm0
-        shll      $16, %esi
-        sarl      $31, %esi
-        mulsd     %xmm5, %xmm3
-        movq      %xmm0, %xmm1
-        mulsd     %xmm2, %xmm0
-        shrl      $30, %edi
-        addsd     %xmm3, %xmm1
-        mulsd     %xmm2, %xmm3
-        addl      %esi, %edi
-        xorl      %esi, %edi
-        mulsd     %xmm1, %xmm7
-        movl      %edi, %eax
-        addsd     %xmm3, %xmm7
-        movq      %xmm0, %xmm2
-        addsd     %xmm7, %xmm0
-        subsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm7
-        movapd    PI32INV(%rip), %xmm1
-        movddup   %xmm0, %xmm0
-        movapd    sign_mask(%rip), %xmm4
-        andpd     %xmm0, %xmm4
-        mulpd     %xmm0, %xmm1
-        movddup   %xmm7, %xmm7
-        movapd    ONEHALF(%rip), %xmm5
-        movapd    MUL16(%rip), %xmm6
-        orps      %xmm4, %xmm5
-        addpd     %xmm5, %xmm1
-        movapd    %xmm1, %xmm5
-        unpckhpd  %xmm5, %xmm5
-        cvttsd2si %xmm5, %edx
-        cvttpd2dq %xmm1, %xmm1
-        cvtdq2pd  %xmm1, %xmm1
-        mulpd     %xmm6, %xmm1
-        movapd    P_1(%rip), %xmm3
-        movq      QQ_2(%rip), %xmm5
-        shll      $4, %eax
-        addl      $469248, %edx
-        movapd    P_2(%rip), %xmm4
-        mulpd     %xmm1, %xmm3
-        addl      %eax, %edx
-        andl      $31, %edx
-        mulsd     %xmm1, %xmm5
-        movl      %edx, %ecx
-        mulpd     %xmm1, %xmm4
-        shll      $1, %ecx
-        subpd     %xmm3, %xmm0
-        mulpd     P_3(%rip), %xmm1
-        addl      %ecx, %edx
-        shll      $2, %ecx
-        addl      %ecx, %edx
-        addsd     %xmm0, %xmm5
-        movapd    %xmm0, %xmm2
-        subpd     %xmm4, %xmm0
-        movq      ONE(%rip), %xmm6
-        shll      $4, %edx
-        lea       Ctable(%rip), %rax
-        andpd     MASK_35(%rip), %xmm5
-        movapd    %xmm0, %xmm3
-        addq      %rdx, %rax
-        subpd     %xmm0, %xmm2
-        unpckhpd  %xmm0, %xmm0
-        divsd     %xmm5, %xmm6
-        subpd     %xmm4, %xmm2
-        subsd     %xmm5, %xmm3
-        subpd     %xmm1, %xmm2
-        movapd    48(%rax), %xmm1
-        addpd     %xmm7, %xmm2
-        movapd    16(%rax), %xmm7
-        mulpd     %xmm0, %xmm7
-        movapd    96(%rax), %xmm4
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm4
-        addsd     %xmm3, %xmm2
-        movapd    %xmm0, %xmm3
-        mulpd     %xmm0, %xmm0
-        addpd     (%rax), %xmm7
-        addpd     32(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     80(%rax), %xmm4
-        addpd     %xmm1, %xmm7
-        movapd    112(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        mulpd     %xmm0, %xmm0
-        addpd     %xmm1, %xmm4
-        movapd    64(%rax), %xmm1
-        mulpd     %xmm0, %xmm1
-        addpd     %xmm1, %xmm7
-        movapd    %xmm3, %xmm1
-        mulpd     %xmm0, %xmm3
-        mulsd     %xmm0, %xmm0
-        mulpd     144(%rax), %xmm1
-        mulpd     %xmm3, %xmm4
-        movq      %xmm1, %xmm3
-        addpd     %xmm4, %xmm7
-        movq      %xmm1, %xmm4
-        mulsd     %xmm7, %xmm0
-        unpckhpd  %xmm7, %xmm7
-        addsd     %xmm7, %xmm0
-        unpckhpd  %xmm1, %xmm1
-        addsd     %xmm1, %xmm3
-        subsd     %xmm3, %xmm4
-        addsd     %xmm4, %xmm1
-        movq      %xmm2, %xmm4
-        movq      144(%rax), %xmm7
-        unpckhpd  %xmm2, %xmm2
-        addsd     152(%rax), %xmm7
-        mulsd     %xmm2, %xmm7
-        addsd     136(%rax), %xmm7
-        addsd     %xmm1, %xmm7
-        addsd     %xmm7, %xmm0
-        movq      ONE(%rip), %xmm7
-        mulsd     %xmm6, %xmm4
-        movq      168(%rax), %xmm2
-        andpd     %xmm6, %xmm2
-        mulsd     %xmm2, %xmm5
-        mulsd     160(%rax), %xmm6
-        subsd     %xmm5, %xmm7
-        subsd     128(%rax), %xmm2
-        subsd     %xmm4, %xmm7
-        mulsd     %xmm6, %xmm7
-        movq      %xmm3, %xmm4
-        subsd     %xmm2, %xmm3
-        addsd     %xmm3, %xmm2
-        subsd     %xmm2, %xmm4
-        addsd     %xmm4, %xmm0
-        subsd     %xmm7, %xmm0
-        addsd     %xmm3, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_9.0.1:
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        movq      $0, %r8
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_10.0.1
-        addl      $64, %edx
-        movq      %r10, %r9
-        movq      %r8, %r10
-        cmpq      $0, %r9
-        jne       .L_2TAG_PACKET_10.0.1
-        jmp       .L_2TAG_PACKET_12.0.1
-.L_2TAG_PACKET_11.0.1:
-        je        .L_2TAG_PACKET_12.0.1
-        negl      %ecx
-        shrq      %cl, %r10
-        movq      %r9, %rax
-        shrq      %cl, %r9
-        subl      %ecx, %edx
-        negl      %ecx
-        addl      $64, %ecx
-        shlq      %cl, %rax
-        orq       %rax, %r10
-        jmp       .L_2TAG_PACKET_12.0.1
-.L_2TAG_PACKET_5.0.1:
-        notl      %ecx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      %cl, %r9
-        movq      %r9, %rdi
-        testl     $-2147483648, %r9d
-        jne       .L_2TAG_PACKET_13.0.1
-        shrl      %cl, %r9d
-        movl      $0, %ebx
-        shrq      $2, %rdi
-        jmp       .L_2TAG_PACKET_8.0.1
-.L_2TAG_PACKET_6.0.1:
-        shrl      %cl, %r9d
-        movl      $1073741824, %ebx
-        shrl      %cl, %ebx
-        shlq      $32, %r9
-        orq       %r11, %r9
-        shlq      $32, %rbx
-        addl      $1073741824, %edi
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        jmp       .L_2TAG_PACKET_7.0.1
-.L_2TAG_PACKET_13.0.1:
-        shrl      %cl, %r9d
-        movq      $0x100000000, %rbx
-        shrq      %cl, %rbx
-        movq      $0, %rcx
-        movq      $0, %r11
-        subq      %r8, %rcx
-        sbbq      %r10, %r11
-        sbbq      %r9, %rbx
-        movq      %rcx, %r8
-        movq      %r11, %r10
-        movq      %rbx, %r9
-        movl      $32768, %ebx
-        shrq      $2, %rdi
-        addl      $1073741824, %edi
-        jmp       .L_2TAG_PACKET_8.0.1
-.L_2TAG_PACKET_4.0.1:
-        movq      8(%rsp), %xmm0
-        mulsd     NEG_ZERO(%rip), %xmm0
-        movq      %xmm0, (%rsp)
-.L_2TAG_PACKET_14.0.1:
-..B1.4:
-        addq      $16, %rsp
-..___tag_value_tan.6:
-        popq      %rbx
-..___tag_value_tan.8:
-        ret       
-..___tag_value_tan.9:
-END(tan)
-# -- End  tan
-	.section .rodata, "a"
-	.align 16
-	.align 16
-ONEHALF:
-	.long	0
-	.long	1071644672
-	.long	0
-	.long	1071644672
-	.type	ONEHALF,@object
-	.size	ONEHALF,16
-	.align 16
-MUL16:
-	.long	0
-	.long	1076887552
-	.long	0
-	.long	1072693248
-	.type	MUL16,@object
-	.size	MUL16,16
-	.align 16
-sign_mask:
-	.long	0
-	.long	2147483648
-	.long	0
-	.long	2147483648
-	.type	sign_mask,@object
-	.size	sign_mask,16
-	.align 16
-PI32INV:
-	.long	1841940611
-	.long	1071931184
-	.long	1841940611
-	.long	1076125488
-	.type	PI32INV,@object
-	.size	PI32INV,16
-	.align 16
-P_1:
-	.long	1413758976
-	.long	1069097467
-	.long	1413742592
-	.long	1069097467
-	.type	P_1,@object
-	.size	P_1,16
-	.align 16
-P_2:
-	.long	1734819840
-	.long	3174229945
-	.long	1280049152
-	.long	1028033571
-	.type	P_2,@object
-	.size	P_2,16
-	.align 16
-P_3:
-	.long	923219018
-	.long	984130272
-	.long	57701189
-	.long	988383790
-	.type	P_3,@object
-	.size	P_3,16
-	.align 16
-Ctable:
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1066820852
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1441186365
-	.long	1065494243
-	.long	1431655765
-	.long	1070945621
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	236289504
-	.long	1064135997
-	.long	286331153
-	.long	1069617425
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1160476131
-	.long	1062722102
-	.long	463583772
-	.long	1068212666
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1313038235
-	.long	1066745731
-	.long	0
-	.long	0
-	.long	1013878342
-	.long	1067152618
-	.long	0
-	.long	0
-	.long	3663426833
-	.long	1065725283
-	.long	3693284251
-	.long	1069118808
-	.long	650852232
-	.long	1065882376
-	.long	1996245381
-	.long	1071000265
-	.long	2008746170
-	.long	1064664197
-	.long	3055842593
-	.long	1068578846
-	.long	1495406348
-	.long	1064652437
-	.long	2269530157
-	.long	1069711235
-	.long	285563696
-	.long	1063576465
-	.long	1046897440
-	.long	1067705865
-	.long	233429731
-	.long	1063453151
-	.long	522045958
-	.long	1068476590
-	.long	2354785698
-	.long	1069102779
-	.long	1317599141
-	.long	1012432133
-	.long	0
-	.long	1072693248
-	.long	2828230105
-	.long	1065606626
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1512545955
-	.long	1068119047
-	.long	0
-	.long	0
-	.long	1127048698
-	.long	1067909459
-	.long	0
-	.long	0
-	.long	2300200450
-	.long	1067254767
-	.long	3593250296
-	.long	1070233561
-	.long	3009365544
-	.long	1066902117
-	.long	1127373050
-	.long	1071173457
-	.long	3046103305
-	.long	1066371299
-	.long	24583402
-	.long	1069723988
-	.long	4082511758
-	.long	1065914199
-	.long	3223889699
-	.long	1070020367
-	.long	548927984
-	.long	1065415756
-	.long	558065897
-	.long	1068949418
-	.long	680073315
-	.long	1064940726
-	.long	388873200
-	.long	1068944270
-	.long	3763679576
-	.long	1070167541
-	.long	1497360404
-	.long	1009710547
-	.long	0
-	.long	1072693248
-	.long	64931152
-	.long	1067729411
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2467582782
-	.long	1069256389
-	.long	0
-	.long	0
-	.long	162150096
-	.long	1068946420
-	.long	0
-	.long	0
-	.long	3702794237
-	.long	1068579152
-	.long	3631919291
-	.long	1070936926
-	.long	3456821413
-	.long	1068217218
-	.long	2031366438
-	.long	1071495745
-	.long	1596664020
-	.long	1067799281
-	.long	1509038701
-	.long	1070601643
-	.long	583171477
-	.long	1067510148
-	.long	3785344682
-	.long	1070618476
-	.long	2402036048
-	.long	1067075736
-	.long	3233018412
-	.long	1069913186
-	.long	411280568
-	.long	1066710556
-	.long	1065584192
-	.long	1069747896
-	.long	895247324
-	.long	1070819848
-	.long	500078909
-	.long	3161288781
-	.long	0
-	.long	1072693248
-	.long	729983843
-	.long	1068994194
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1458794562
-	.long	1070398550
-	.long	0
-	.long	0
-	.long	2857777489
-	.long	1070137637
-	.long	0
-	.long	0
-	.long	1024359517
-	.long	1069876531
-	.long	2616040238
-	.long	1071582937
-	.long	1609024636
-	.long	1069675088
-	.long	2529240549
-	.long	1071836633
-	.long	1510128600
-	.long	1069440113
-	.long	2251697184
-	.long	1071253687
-	.long	1262761453
-	.long	1069142850
-	.long	1263091857
-	.long	1071190461
-	.long	3043383486
-	.long	1068885191
-	.long	2476932470
-	.long	1070842002
-	.long	3659995028
-	.long	1068669200
-	.long	855891755
-	.long	1070696894
-	.long	2583490354
-	.long	1071284857
-	.long	3062633575
-	.long	1014008623
-	.long	0
-	.long	1072693248
-	.long	2550940471
-	.long	1069938201
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3422807297
-	.long	1071640847
-	.long	0
-	.long	0
-	.long	1151658053
-	.long	1071494715
-	.long	0
-	.long	0
-	.long	929607071
-	.long	1071346340
-	.long	1037049034
-	.long	1072037305
-	.long	2786928657
-	.long	1071215282
-	.long	1447406859
-	.long	1072265209
-	.long	3490952107
-	.long	1071090851
-	.long	3205232916
-	.long	1071968658
-	.long	1297344304
-	.long	1070977120
-	.long	1066110976
-	.long	1071946035
-	.long	3803721480
-	.long	1070871082
-	.long	1496754229
-	.long	1071807201
-	.long	2982550683
-	.long	1070773243
-	.long	4014441989
-	.long	1071736222
-	.long	419968236
-	.long	1071717047
-	.long	3451266538
-	.long	3163444811
-	.long	0
-	.long	1072693248
-	.long	2960267235
-	.long	1070745841
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	724322768
-	.long	1072881308
-	.long	0
-	.long	0
-	.long	643153048
-	.long	1072905816
-	.long	0
-	.long	0
-	.long	4285079458
-	.long	1072928558
-	.long	3912524733
-	.long	1072622983
-	.long	118362272
-	.long	1072952754
-	.long	4107767972
-	.long	1072827408
-	.long	2689502883
-	.long	1072976922
-	.long	946523347
-	.long	1072772766
-	.long	573204189
-	.long	1073001761
-	.long	581531518
-	.long	1072826391
-	.long	1386236526
-	.long	1073026959
-	.long	3718905905
-	.long	1072832823
-	.long	1145558140
-	.long	1073052673
-	.long	513572637
-	.long	1072861969
-	.long	716700048
-	.long	1071997368
-	.long	547126769
-	.long	1015523525
-	.long	0
-	.long	1072693248
-	.long	1097907398
-	.long	1071420120
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3349892442
-	.long	1074290212
-	.long	0
-	.long	0
-	.long	3913197405
-	.long	1074501181
-	.long	0
-	.long	0
-	.long	2494034522
-	.long	1074739170
-	.long	1264738763
-	.long	1073084804
-	.long	1520293906
-	.long	1074899632
-	.long	1958936600
-	.long	1073411493
-	.long	2133649635
-	.long	1075052171
-	.long	4270740730
-	.long	1073574708
-	.long	1728930189
-	.long	1075224844
-	.long	1303998552
-	.long	1073799186
-	.long	618611933
-	.long	1075420255
-	.long	1769828046
-	.long	1073938542
-	.long	2200537986
-	.long	1075641421
-	.long	433361110
-	.long	1074105369
-	.long	719595600
-	.long	1072317184
-	.long	294527206
-	.long	3162140088
-	.long	0
-	.long	1073741824
-	.long	3811788216
-	.long	3218400550
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1704352102
-	.long	1075943001
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1076258036
-	.long	0
-	.long	0
-	.long	2211264291
-	.long	1076659010
-	.long	0
-	.long	1073741824
-	.long	1441186365
-	.long	1077028579
-	.long	1431655765
-	.long	1074091349
-	.long	876943673
-	.long	1077353622
-	.long	2863311531
-	.long	1074440874
-	.long	236289504
-	.long	1077767485
-	.long	286331153
-	.long	1074860305
-	.long	2805473311
-	.long	1078115278
-	.long	95443718
-	.long	1075163227
-	.long	1160476131
-	.long	1078450742
-	.long	463583772
-	.long	1075552698
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	0
-	.long	1073741824
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1330165971
-	.long	3207850745
-	.long	0
-	.long	0
-	.long	217536623
-	.long	1059109098
-	.long	0
-	.long	0
-	.long	3492120849
-	.long	3205151475
-	.long	602185705
-	.long	3215678092
-	.long	760422958
-	.long	1056312597
-	.long	555127889
-	.long	1067545266
-	.long	3139784124
-	.long	3202470837
-	.long	3690544014
-	.long	3213150171
-	.long	95707915
-	.long	1053635428
-	.long	4003114407
-	.long	1064581412
-	.long	2034926231
-	.long	3199711161
-	.long	3759536023
-	.long	3210559989
-	.long	3826928214
-	.long	1050893819
-	.long	3837960785
-	.long	1061790379
-	.long	1526325248
-	.long	3217967566
-	.long	2356426521
-	.long	1025423456
-	.long	0
-	.long	0
-	.long	457728975
-	.long	1071088276
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1398462608
-	.long	3207303968
-	.long	0
-	.long	0
-	.long	26205983
-	.long	1058461213
-	.long	0
-	.long	0
-	.long	56226238
-	.long	3204528612
-	.long	2754706541
-	.long	3215359511
-	.long	2187799823
-	.long	1055634437
-	.long	790323742
-	.long	1067402587
-	.long	1372385848
-	.long	3201651479
-	.long	4097292716
-	.long	3212856302
-	.long	3348210357
-	.long	1052830099
-	.long	2442796466
-	.long	1064337602
-	.long	862608142
-	.long	3198830754
-	.long	170296152
-	.long	3210060867
-	.long	3755571428
-	.long	1049933343
-	.long	3614866008
-	.long	1061361670
-	.long	719978496
-	.long	3217669096
-	.long	1998842465
-	.long	3174703977
-	.long	0
-	.long	0
-	.long	3749156607
-	.long	1071048258
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3120498638
-	.long	3206749304
-	.long	0
-	.long	0
-	.long	2773578114
-	.long	1058009312
-	.long	0
-	.long	0
-	.long	2030783676
-	.long	3203817873
-	.long	2223654598
-	.long	3215071936
-	.long	2976134650
-	.long	1054987244
-	.long	706390066
-	.long	1067217386
-	.long	4258437615
-	.long	3200900378
-	.long	1066252975
-	.long	3212391267
-	.long	815777514
-	.long	1051989462
-	.long	3202745457
-	.long	1064010682
-	.long	2493556375
-	.long	3198004753
-	.long	1046243251
-	.long	3209678971
-	.long	2593078846
-	.long	1049017717
-	.long	2763962276
-	.long	1060970161
-	.long	701480960
-	.long	3217377742
-	.long	3205862232
-	.long	3174660915
-	.long	0
-	.long	0
-	.long	2267016812
-	.long	1071015664
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	2107155798
-	.long	3206166872
-	.long	0
-	.long	0
-	.long	2642992129
-	.long	1057424578
-	.long	0
-	.long	0
-	.long	1936992811
-	.long	3203204426
-	.long	1485063559
-	.long	3214682643
-	.long	1432914553
-	.long	1054319398
-	.long	3996381654
-	.long	1067075828
-	.long	2833029256
-	.long	3200223545
-	.long	2866066872
-	.long	3211982662
-	.long	2432888737
-	.long	1051234178
-	.long	3669764559
-	.long	1063748136
-	.long	2458496952
-	.long	3197170774
-	.long	1948234989
-	.long	3209098147
-	.long	2843698787
-	.long	1048163519
-	.long	3398041407
-	.long	1060559728
-	.long	2829230080
-	.long	3217092115
-	.long	1034046433
-	.long	3174271903
-	.long	0
-	.long	0
-	.long	298675305
-	.long	1070989821
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	437603223
-	.long	3205589761
-	.long	0
-	.long	0
-	.long	759330352
-	.long	1057048511
-	.long	0
-	.long	0
-	.long	3107463368
-	.long	3202507988
-	.long	3144465176
-	.long	3214191500
-	.long	2290961810
-	.long	1053841035
-	.long	1618153340
-	.long	1066971547
-	.long	3836869393
-	.long	3199400272
-	.long	584032116
-	.long	3211469261
-	.long	1245704358
-	.long	1050626462
-	.long	4247487438
-	.long	1063561943
-	.long	1669034927
-	.long	3196274812
-	.long	3844233498
-	.long	3208626322
-	.long	2706958524
-	.long	1047411374
-	.long	3857199098
-	.long	1060281647
-	.long	3593904128
-	.long	3216590719
-	.long	3267547836
-	.long	3172163321
-	.long	0
-	.long	0
-	.long	4076712227
-	.long	1070970214
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3290090340
-	.long	3204793485
-	.long	0
-	.long	0
-	.long	3685760367
-	.long	1056668370
-	.long	0
-	.long	0
-	.long	2655163949
-	.long	3201674917
-	.long	628750575
-	.long	3213566872
-	.long	680140505
-	.long	1053299777
-	.long	2954464709
-	.long	1066900026
-	.long	803201619
-	.long	3198516435
-	.long	1466315631
-	.long	3210837162
-	.long	1611220163
-	.long	1049972438
-	.long	2766187256
-	.long	1063437894
-	.long	1804579484
-	.long	3195331491
-	.long	3695969289
-	.long	3207854418
-	.long	2617238373
-	.long	1046675948
-	.long	3095830084
-	.long	1060095334
-	.long	3789570048
-	.long	3216034914
-	.long	23826559
-	.long	3172048060
-	.long	0
-	.long	0
-	.long	3870939386
-	.long	1070956467
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1571758758
-	.long	3203672535
-	.long	0
-	.long	0
-	.long	113026373
-	.long	1056416381
-	.long	0
-	.long	0
-	.long	1913766298
-	.long	3200523326
-	.long	2507068734
-	.long	3212502004
-	.long	4000648818
-	.long	1053003803
-	.long	2446607349
-	.long	1066858259
-	.long	912662124
-	.long	3197333001
-	.long	1349489537
-	.long	3209765608
-	.long	3412972607
-	.long	1049641401
-	.long	1721283327
-	.long	1063366855
-	.long	1466691883
-	.long	3194116746
-	.long	3852528092
-	.long	3206760861
-	.long	285443293
-	.long	1046158380
-	.long	1758739894
-	.long	1059895449
-	.long	1858781184
-	.long	3214984212
-	.long	3447575948
-	.long	1024675855
-	.long	0
-	.long	0
-	.long	2242038011
-	.long	1070948320
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	737611454
-	.long	1056336527
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3594790527
-	.long	1052911621
-	.long	381774871
-	.long	1066844524
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3303051618
-	.long	1049456050
-	.long	3154187623
-	.long	1063343722
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	528061788
-	.long	1045944910
-	.long	2469719819
-	.long	1059831159
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1431655765
-	.long	1070945621
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1571758758
-	.long	1056188887
-	.long	0
-	.long	0
-	.long	113026373
-	.long	1056416381
-	.long	0
-	.long	0
-	.long	1913766298
-	.long	1053039678
-	.long	2507068734
-	.long	1065018356
-	.long	4000648818
-	.long	1053003803
-	.long	2446607349
-	.long	1066858259
-	.long	912662124
-	.long	1049849353
-	.long	1349489537
-	.long	1062281960
-	.long	3412972607
-	.long	1049641401
-	.long	1721283327
-	.long	1063366855
-	.long	1466691883
-	.long	1046633098
-	.long	3852528092
-	.long	1059277213
-	.long	285443293
-	.long	1046158380
-	.long	1758739894
-	.long	1059895449
-	.long	1858781184
-	.long	1067500564
-	.long	3447575948
-	.long	3172159503
-	.long	0
-	.long	0
-	.long	2242038011
-	.long	1070948320
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3290090340
-	.long	1057309837
-	.long	0
-	.long	0
-	.long	3685760367
-	.long	1056668370
-	.long	0
-	.long	0
-	.long	2655163949
-	.long	1054191269
-	.long	628750575
-	.long	1066083224
-	.long	680140505
-	.long	1053299777
-	.long	2954464709
-	.long	1066900026
-	.long	803201619
-	.long	1051032787
-	.long	1466315631
-	.long	1063353514
-	.long	1611220163
-	.long	1049972438
-	.long	2766187256
-	.long	1063437894
-	.long	1804579484
-	.long	1047847843
-	.long	3695969289
-	.long	1060370770
-	.long	2617238373
-	.long	1046675948
-	.long	3095830084
-	.long	1060095334
-	.long	3789570048
-	.long	1068551266
-	.long	23826559
-	.long	1024564412
-	.long	0
-	.long	0
-	.long	3870939386
-	.long	1070956467
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	437603223
-	.long	1058106113
-	.long	0
-	.long	0
-	.long	759330352
-	.long	1057048511
-	.long	0
-	.long	0
-	.long	3107463368
-	.long	1055024340
-	.long	3144465176
-	.long	1066707852
-	.long	2290961810
-	.long	1053841035
-	.long	1618153340
-	.long	1066971547
-	.long	3836869393
-	.long	1051916624
-	.long	584032116
-	.long	1063985613
-	.long	1245704358
-	.long	1050626462
-	.long	4247487438
-	.long	1063561943
-	.long	1669034927
-	.long	1048791164
-	.long	3844233498
-	.long	1061142674
-	.long	2706958524
-	.long	1047411374
-	.long	3857199098
-	.long	1060281647
-	.long	3593904128
-	.long	1069107071
-	.long	3267547836
-	.long	1024679673
-	.long	0
-	.long	0
-	.long	4076712227
-	.long	1070970214
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	2107155798
-	.long	1058683224
-	.long	0
-	.long	0
-	.long	2642992129
-	.long	1057424578
-	.long	0
-	.long	0
-	.long	1936992811
-	.long	1055720778
-	.long	1485063559
-	.long	1067198995
-	.long	1432914553
-	.long	1054319398
-	.long	3996381654
-	.long	1067075828
-	.long	2833029256
-	.long	1052739897
-	.long	2866066872
-	.long	1064499014
-	.long	2432888737
-	.long	1051234178
-	.long	3669764559
-	.long	1063748136
-	.long	2458496952
-	.long	1049687126
-	.long	1948234989
-	.long	1061614499
-	.long	2843698787
-	.long	1048163519
-	.long	3398041407
-	.long	1060559728
-	.long	2829230080
-	.long	1069608467
-	.long	1034046433
-	.long	1026788255
-	.long	0
-	.long	0
-	.long	298675305
-	.long	1070989821
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	3120498638
-	.long	1059265656
-	.long	0
-	.long	0
-	.long	2773578114
-	.long	1058009312
-	.long	0
-	.long	0
-	.long	2030783676
-	.long	1056334225
-	.long	2223654598
-	.long	1067588288
-	.long	2976134650
-	.long	1054987244
-	.long	706390066
-	.long	1067217386
-	.long	4258437615
-	.long	1053416730
-	.long	1066252975
-	.long	1064907619
-	.long	815777514
-	.long	1051989462
-	.long	3202745457
-	.long	1064010682
-	.long	2493556375
-	.long	1050521105
-	.long	1046243251
-	.long	1062195323
-	.long	2593078846
-	.long	1049017717
-	.long	2763962276
-	.long	1060970161
-	.long	701480960
-	.long	1069894094
-	.long	3205862232
-	.long	1027177267
-	.long	0
-	.long	0
-	.long	2267016812
-	.long	1071015664
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1398462608
-	.long	1059820320
-	.long	0
-	.long	0
-	.long	26205983
-	.long	1058461213
-	.long	0
-	.long	0
-	.long	56226238
-	.long	1057044964
-	.long	2754706541
-	.long	1067875863
-	.long	2187799823
-	.long	1055634437
-	.long	790323742
-	.long	1067402587
-	.long	1372385848
-	.long	1054167831
-	.long	4097292716
-	.long	1065372654
-	.long	3348210357
-	.long	1052830099
-	.long	2442796466
-	.long	1064337602
-	.long	862608142
-	.long	1051347106
-	.long	170296152
-	.long	1062577219
-	.long	3755571428
-	.long	1049933343
-	.long	3614866008
-	.long	1061361670
-	.long	719978496
-	.long	1070185448
-	.long	1998842465
-	.long	1027220329
-	.long	0
-	.long	0
-	.long	3749156607
-	.long	1071048258
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1330165971
-	.long	1060367097
-	.long	0
-	.long	0
-	.long	217536623
-	.long	1059109098
-	.long	0
-	.long	0
-	.long	3492120849
-	.long	1057667827
-	.long	602185705
-	.long	1068194444
-	.long	760422958
-	.long	1056312597
-	.long	555127889
-	.long	1067545266
-	.long	3139784124
-	.long	1054987189
-	.long	3690544014
-	.long	1065666523
-	.long	95707915
-	.long	1053635428
-	.long	4003114407
-	.long	1064581412
-	.long	2034926231
-	.long	1052227513
-	.long	3759536023
-	.long	1063076341
-	.long	3826928214
-	.long	1050893819
-	.long	3837960785
-	.long	1061790379
-	.long	1526325248
-	.long	1070483918
-	.long	2356426521
-	.long	3172907104
-	.long	0
-	.long	0
-	.long	457728975
-	.long	1071088276
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	4294967288
-	.long	1704352102
-	.long	3223426649
-	.long	0
-	.long	0
-	.long	2284589306
-	.long	1076258036
-	.long	0
-	.long	0
-	.long	2211264291
-	.long	3224142658
-	.long	0
-	.long	3221225472
-	.long	1441186365
-	.long	1077028579
-	.long	1431655765
-	.long	1074091349
-	.long	876943673
-	.long	3224837270
-	.long	2863311531
-	.long	3221924522
-	.long	236289504
-	.long	1077767485
-	.long	286331153
-	.long	1074860305
-	.long	2805473311
-	.long	3225598926
-	.long	95443718
-	.long	3222646875
-	.long	1160476131
-	.long	1078450742
-	.long	463583772
-	.long	1075552698
-	.long	0
-	.long	3220176896
-	.long	0
-	.long	0
-	.long	0
-	.long	1073741824
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3349892442
-	.long	3221773860
-	.long	0
-	.long	0
-	.long	3913197405
-	.long	1074501181
-	.long	0
-	.long	0
-	.long	2494034522
-	.long	3222222818
-	.long	1264738763
-	.long	3220568452
-	.long	1520293906
-	.long	1074899632
-	.long	1958936600
-	.long	1073411493
-	.long	2133649635
-	.long	3222535819
-	.long	4270740730
-	.long	3221058356
-	.long	1728930189
-	.long	1075224844
-	.long	1303998552
-	.long	1073799186
-	.long	618611933
-	.long	3222903903
-	.long	1769828046
-	.long	3221422190
-	.long	2200537986
-	.long	1075641421
-	.long	433361110
-	.long	1074105369
-	.long	719595600
-	.long	3219800832
-	.long	294527206
-	.long	1014656440
-	.long	0
-	.long	1073741824
-	.long	3811788216
-	.long	3218400550
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	724322768
-	.long	3220364956
-	.long	0
-	.long	0
-	.long	643153048
-	.long	1072905816
-	.long	0
-	.long	0
-	.long	4285079458
-	.long	3220412206
-	.long	3912524733
-	.long	3220106631
-	.long	118362272
-	.long	1072952754
-	.long	4107767972
-	.long	1072827408
-	.long	2689502883
-	.long	3220460570
-	.long	946523347
-	.long	3220256414
-	.long	573204189
-	.long	1073001761
-	.long	581531518
-	.long	1072826391
-	.long	1386236526
-	.long	3220510607
-	.long	3718905905
-	.long	3220316471
-	.long	1145558140
-	.long	1073052673
-	.long	513572637
-	.long	1072861969
-	.long	716700048
-	.long	3219481016
-	.long	547126769
-	.long	3163007173
-	.long	0
-	.long	1072693248
-	.long	1097907398
-	.long	1071420120
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	3422807297
-	.long	3219124495
-	.long	0
-	.long	0
-	.long	1151658053
-	.long	1071494715
-	.long	0
-	.long	0
-	.long	929607071
-	.long	3218829988
-	.long	1037049034
-	.long	3219520953
-	.long	2786928657
-	.long	1071215282
-	.long	1447406859
-	.long	1072265209
-	.long	3490952107
-	.long	3218574499
-	.long	3205232916
-	.long	3219452306
-	.long	1297344304
-	.long	1070977120
-	.long	1066110976
-	.long	1071946035
-	.long	3803721480
-	.long	3218354730
-	.long	1496754229
-	.long	3219290849
-	.long	2982550683
-	.long	1070773243
-	.long	4014441989
-	.long	1071736222
-	.long	419968236
-	.long	3219200695
-	.long	3451266538
-	.long	1015961163
-	.long	0
-	.long	1072693248
-	.long	2960267235
-	.long	1070745841
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1458794562
-	.long	3217882198
-	.long	0
-	.long	0
-	.long	2857777489
-	.long	1070137637
-	.long	0
-	.long	0
-	.long	1024359517
-	.long	3217360179
-	.long	2616040238
-	.long	3219066585
-	.long	1609024636
-	.long	1069675088
-	.long	2529240549
-	.long	1071836633
-	.long	1510128600
-	.long	3216923761
-	.long	2251697184
-	.long	3218737335
-	.long	1262761453
-	.long	1069142850
-	.long	1263091857
-	.long	1071190461
-	.long	3043383486
-	.long	3216368839
-	.long	2476932470
-	.long	3218325650
-	.long	3659995028
-	.long	1068669200
-	.long	855891755
-	.long	1070696894
-	.long	2583490354
-	.long	3218768505
-	.long	3062633575
-	.long	3161492271
-	.long	0
-	.long	1072693248
-	.long	2550940471
-	.long	1069938201
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	2467582782
-	.long	3216740037
-	.long	0
-	.long	0
-	.long	162150096
-	.long	1068946420
-	.long	0
-	.long	0
-	.long	3702794237
-	.long	3216062800
-	.long	3631919291
-	.long	3218420574
-	.long	3456821413
-	.long	1068217218
-	.long	2031366438
-	.long	1071495745
-	.long	1596664020
-	.long	3215282929
-	.long	1509038701
-	.long	3218085291
-	.long	583171477
-	.long	1067510148
-	.long	3785344682
-	.long	1070618476
-	.long	2402036048
-	.long	3214559384
-	.long	3233018412
-	.long	3217396834
-	.long	411280568
-	.long	1066710556
-	.long	1065584192
-	.long	1069747896
-	.long	895247324
-	.long	3218303496
-	.long	500078909
-	.long	1013805133
-	.long	0
-	.long	1072693248
-	.long	729983843
-	.long	1068994194
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1512545955
-	.long	3215602695
-	.long	0
-	.long	0
-	.long	1127048698
-	.long	1067909459
-	.long	0
-	.long	0
-	.long	2300200450
-	.long	3214738415
-	.long	3593250296
-	.long	3217717209
-	.long	3009365544
-	.long	1066902117
-	.long	1127373050
-	.long	1071173457
-	.long	3046103305
-	.long	3213854947
-	.long	24583402
-	.long	3217207636
-	.long	4082511758
-	.long	1065914199
-	.long	3223889699
-	.long	1070020367
-	.long	548927984
-	.long	3212899404
-	.long	558065897
-	.long	3216433066
-	.long	680073315
-	.long	1064940726
-	.long	388873200
-	.long	1068944270
-	.long	3763679576
-	.long	3217651189
-	.long	1497360404
-	.long	3157194195
-	.long	0
-	.long	1072693248
-	.long	64931152
-	.long	1067729411
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.long	1313038235
-	.long	3214229379
-	.long	0
-	.long	0
-	.long	1013878342
-	.long	1067152618
-	.long	0
-	.long	0
-	.long	3663426833
-	.long	3213208931
-	.long	3693284251
-	.long	3216602456
-	.long	650852232
-	.long	1065882376
-	.long	1996245381
-	.long	1071000265
-	.long	2008746170
-	.long	3212147845
-	.long	3055842593
-	.long	3216062494
-	.long	1495406348
-	.long	1064652437
-	.long	2269530157
-	.long	1069711235
-	.long	285563696
-	.long	3211060113
-	.long	1046897440
-	.long	3215189513
-	.long	233429731
-	.long	1063453151
-	.long	522045958
-	.long	1068476590
-	.long	2354785698
-	.long	3216586427
-	.long	1317599141
-	.long	3159915781
-	.long	0
-	.long	1072693248
-	.long	2828230105
-	.long	1065606626
-	.long	0
-	.long	0
-	.long	0
-	.long	0
-	.type	Ctable,@object
-	.size	Ctable,5632
-	.align 16
-MASK_35:
-	.long	4294705152
-	.long	4294967295
-	.long	0
-	.long	0
-	.type	MASK_35,@object
-	.size	MASK_35,16
-	.align 16
-Q_11:
-	.long	3103673719
-	.long	1065509018
-	.type	Q_11,@object
-	.size	Q_11,8
-	.space 8, 0x00 	# pad
-	.align 16
-Q_9:
-	.long	3213130307
-	.long	1066820768
-	.type	Q_9,@object
-	.size	Q_9,8
-	.space 8, 0x00 	# pad
-	.align 16
-Q_7:
-	.long	1388628139
-	.long	1068212666
-	.type	Q_7,@object
-	.size	Q_7,8
-	.space 8, 0x00 	# pad
-	.align 16
-Q_5:
-	.long	285812550
-	.long	1069617425
-	.type	Q_5,@object
-	.size	Q_5,8
-	.space 8, 0x00 	# pad
-	.align 16
-Q_3:
-	.long	1431655954
-	.long	1070945621
-	.type	Q_3,@object
-	.size	Q_3,8
-	.space 8, 0x00 	# pad
-	.align 16
-PI_INV_TABLE:
-	.long	0
-	.long	0
-	.long	2734261102
-	.long	1313084713
-	.long	4230436817
-	.long	4113882560
-	.long	3680671129
-	.long	1011060801
-	.long	4266746795
-	.long	3736847713
-	.long	3072618042
-	.long	1112396512
-	.long	105459434
-	.long	164729372
-	.long	4263373596
-	.long	2972297022
-	.long	3900847605
-	.long	784024708
-	.long	3919343654
-	.long	3026157121
-	.long	965858873
-	.long	2203269620
-	.long	2625920907
-	.long	3187222587
-	.long	536385535
-	.long	3724908559
-	.long	4012839307
-	.long	1510632735
-	.long	1832287951
-	.long	667617719
-	.long	1330003814
-	.long	2657085997
-	.long	1965537991
-	.long	3957715323
-	.long	1023883767
-	.long	2320667370
-	.long	1811636145
-	.long	529358088
-	.long	1443049542
-	.long	4235946923
-	.long	4040145953
-	.type	PI_INV_TABLE,@object
-	.size	PI_INV_TABLE,164
-	.space 12, 0x00 	# pad
-	.align 16
-PI_4:
-	.long	0
-	.long	1072243195
-	.long	1175561766
-	.long	1048908043
-	.type	PI_4,@object
-	.size	PI_4,16
-	.align 8
-QQ_2:
-	.long	1734816687
-	.long	1026746297
-	.type	QQ_2,@object
-	.size	QQ_2,8
-	.align 8
-ONE:
-	.long	0
-	.long	1072693248
-	.type	ONE,@object
-	.size	ONE,8
-	.align 8
-TWO_POW_55:
-	.long	0
-	.long	1130364928
-	.type	TWO_POW_55,@object
-	.size	TWO_POW_55,8
-	.align 8
-TWO_POW_M55:
-	.long	0
-	.long	1015021568
-	.type	TWO_POW_M55,@object
-	.size	TWO_POW_M55,8
-	.align 4
-NEG_ZERO:
-	.long	0
-	.long	2147483648
-	.type	NEG_ZERO,@object
-	.size	NEG_ZERO,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000002c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_tan.1-.
-	.4byte ..___tag_value_tan.9-..___tag_value_tan.1
-	.2byte 0x0400
-	.4byte ..___tag_value_tan.3-..___tag_value_tan.1
-	.4byte 0x0283100e
-	.byte 0x04
-	.4byte ..___tag_value_tan.5-..___tag_value_tan.3
-	.2byte 0x200e
-	.byte 0x04
-	.4byte ..___tag_value_tan.6-..___tag_value_tan.5
-	.4byte 0x04c3100e
-	.4byte ..___tag_value_tan.8-..___tag_value_tan.6
-	.2byte 0x080e
-# End
diff --git a/libm/x86_64/s_tanh.S b/libm/x86_64/s_tanh.S
deleted file mode 100644
index a76a5c2..0000000
--- a/libm/x86_64/s_tanh.S
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/******************************************************************************/
-//                     ALGORITHM DESCRIPTION
-//                     ---------------------
-//
-// tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))=(1-exp(-2*x))/(1+exp(-2*x))
-//
-// Let |x|=xH+xL (upper 26 bits, lower 27 bits)
-// log2(e) rounded to 26 bits (high part) plus a double precision low part is
-//         L2EH+L2EL (upper 26, lower 53 bits)
-//
-// Let xH*L2EH=k+f+r`, where (k+f)*2^8*2=int(xH*L2EH*2^9),
-//                             f=0.b1 b2 ... b8, k integer
-// 2^{-f} is approximated as Tn[f]+Dn[f]
-// Tn stores the high 53 bits, Dn stores (2^{-f}-Tn[f]) rounded to double precision
-//
-//  r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-9}+2^{-14},
-//                      for |x| in [23/64,3*2^7)
-// e^{-2*|x|}=2^{-k-f}*2^{-r} ~ 2^{-k}*(Tn+Dn)*(1+p)=(T0+D0)*(1+p)
-//
-// For |x| in [2^{-4},2^5):
-//         2^{-r}-1 ~ p=c1*r+c2*r^2+..+c5*r^5
-//      Let R=1/(1+T0+p*T0), truncated to 35 significant bits
-//  R=1/(1+T0+D0+p*(T0+D0))*(1+eps), |eps|<2^{-33}
-//  1+T0+D0+p*(T0+D0)=KH+KL, where
-//       KH=(1+T0+c1*r*T0)_high (leading 17 bits)
-//       KL=T0_low+D0+(c1*r*T0)_low+c1*r*D0+(c2*r^2+..c5*r^5)*T0
-//  eps ~ (R*KH-1)+R*KL
-//  1/(1+T0+D0+p*(T0+D0)) ~ R-R*eps
-//  The result is approximated as (1-T0-D0-(T0+D0)*p)*(R-R*eps)
-//  1-T0-D0-(T0+D0)*p=-((KH-2)+KL)
-//    The result is formed as
-//    (KH-2)*R+(-(KH-2)*R*eps+(KL*R-KL*R*eps)), with the correct sign
-//                                                  set at the end
-//
-// For |x| in [2^{-64},2^{-4}):
-//  A Taylor series expansion is used  (x+p3*x^3+..+p13*x^{13})
-//
-// For |x|<2^{-64}:  x is returned
-//
-// For |x|>=2^32: return +/-1
-//
-// Special cases:
-//  tanh(NaN) = quiet NaN, and raise invalid exception
-//  tanh(INF) = that INF
-//  tanh(+/-0) = +/-0
-//
-/******************************************************************************/
-
-#include <private/bionic_asm.h>
-# -- Begin  tanh
-ENTRY(tanh)
-# parameter 1: %xmm0
-..B1.1:
-..___tag_value_tanh.1:
-        pushq     %rsi
-..___tag_value_tanh.3:
-..B1.2:
-        movsd     HALFMASK(%rip), %xmm3
-        xorpd     %xmm4, %xmm4
-        movsd     L2E(%rip), %xmm1
-        movsd     8+L2E(%rip), %xmm2
-        movl      $32768, %eax
-        pinsrw    $3, %eax, %xmm4
-        movsd     Shifter(%rip), %xmm6
-        pextrw    $3, %xmm0, %ecx
-        andpd     %xmm0, %xmm3
-        andnpd    %xmm0, %xmm4
-        pshufd    $68, %xmm4, %xmm5
-        movl      $32768, %edx
-        andl      %ecx, %edx
-        andl      $32767, %ecx
-        subl      $16304, %ecx
-        cmpl      $144, %ecx
-        jae       .L_2TAG_PACKET_0.0.1
-        subsd     %xmm3, %xmm4
-        mulsd     %xmm1, %xmm3
-        mulsd     %xmm5, %xmm2
-        cvtsd2si  %xmm3, %eax
-        movq      %xmm3, %xmm7
-        addsd     %xmm6, %xmm3
-        mulsd     %xmm4, %xmm1
-        movsd     ONEMASK(%rip), %xmm4
-        subsd     %xmm6, %xmm3
-        xorpd     %xmm0, %xmm0
-        addsd     %xmm1, %xmm2
-        subsd     %xmm3, %xmm7
-        movapd    cv(%rip), %xmm6
-        addsd     %xmm7, %xmm2
-        movl      $255, %ecx
-        andl      %eax, %ecx
-        addl      %ecx, %ecx
-        lea       T2_neg_f(%rip), %r8
-        movapd    (%r8,%rcx,8), %xmm5
-        shrl      $4, %eax
-        andl      $65520, %eax
-        subl      $16368, %eax
-        negl      %eax
-        pinsrw    $3, %eax, %xmm0
-        movapd    16+cv(%rip), %xmm1
-        pshufd    $68, %xmm0, %xmm0
-        mulpd     %xmm5, %xmm0
-        movsd     32+cv(%rip), %xmm7
-        pshufd    $68, %xmm2, %xmm2
-        movq      %xmm4, %xmm5
-        addsd     %xmm0, %xmm4
-        mulpd     %xmm2, %xmm6
-        mulsd     %xmm2, %xmm7
-        mulpd     %xmm2, %xmm2
-        addpd     %xmm6, %xmm1
-        mulsd     %xmm2, %xmm2
-        movsd     ONEMASK(%rip), %xmm3
-        mulpd     %xmm2, %xmm1
-        pshufd    $78, %xmm1, %xmm6
-        addsd     %xmm6, %xmm1
-        movq      %xmm1, %xmm6
-        addsd     %xmm7, %xmm1
-        mulsd     %xmm0, %xmm1
-        addsd     %xmm4, %xmm1
-        andpd     MASK3(%rip), %xmm4
-        divsd     %xmm1, %xmm5
-        subsd     %xmm4, %xmm3
-        pshufd    $238, %xmm0, %xmm1
-        addsd     %xmm0, %xmm3
-        movq      %xmm4, %xmm2
-        addsd     %xmm1, %xmm3
-        mulsd     %xmm7, %xmm1
-        mulsd     %xmm0, %xmm7
-        addsd     %xmm1, %xmm3
-        addsd     %xmm7, %xmm4
-        movsd     RMASK(%rip), %xmm1
-        mulsd     %xmm0, %xmm6
-        andpd     MASK3(%rip), %xmm4
-        addsd     %xmm6, %xmm3
-        movq      %xmm4, %xmm6
-        subsd     %xmm4, %xmm2
-        addsd     %xmm7, %xmm2
-        movsd     ONEMASK(%rip), %xmm7
-        andpd     %xmm1, %xmm5
-        addsd     %xmm2, %xmm3
-        mulsd     %xmm5, %xmm4
-        xorpd     %xmm2, %xmm2
-        mulsd     %xmm5, %xmm3
-        subsd     TWOMASK(%rip), %xmm6
-        subsd     %xmm7, %xmm4
-        xorl      $32768, %edx
-        pinsrw    $3, %edx, %xmm2
-        addsd     %xmm3, %xmm4
-        mulsd     %xmm5, %xmm6
-        movq      %xmm3, %xmm1
-        mulsd     %xmm4, %xmm3
-        movq      %xmm6, %xmm0
-        mulsd     %xmm4, %xmm6
-        subsd     %xmm3, %xmm1
-        subsd     %xmm6, %xmm1
-        addsd     %xmm1, %xmm0
-        xorpd     %xmm2, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_0.0.1:
-        addl      $960, %ecx
-        cmpl      $1104, %ecx
-        jae       .L_2TAG_PACKET_1.0.1
-        movapd    pv(%rip), %xmm2
-        pshufd    $68, %xmm0, %xmm1
-        movapd    16+pv(%rip), %xmm3
-        mulpd     %xmm1, %xmm1
-        movapd    32+pv(%rip), %xmm4
-        mulpd     %xmm1, %xmm2
-        pshufd    $68, %xmm1, %xmm5
-        addpd     %xmm3, %xmm2
-        mulsd     %xmm5, %xmm5
-        mulpd     %xmm1, %xmm2
-        mulsd     %xmm5, %xmm5
-        addpd     %xmm4, %xmm2
-        mulpd     %xmm5, %xmm2
-        pshufd    $238, %xmm2, %xmm5
-        addsd     %xmm5, %xmm2
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm2, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_1.0.1:
-        addl      $15344, %ecx
-        cmpl      $16448, %ecx
-        jae       .L_2TAG_PACKET_2.0.1
-        cmpl      $16, %ecx
-        jb        .L_2TAG_PACKET_3.0.1
-        xorpd     %xmm2, %xmm2
-        movl      $17392, %eax
-        pinsrw    $3, %eax, %xmm2
-        mulsd     %xmm0, %xmm2
-        addsd     %xmm0, %xmm2
-        jmp       ..B1.4
-.L_2TAG_PACKET_3.0.1:
-        movq      %xmm0, %xmm2
-        mulsd     %xmm2, %xmm2
-        jmp       ..B1.4
-.L_2TAG_PACKET_2.0.1:
-        cmpl      $32752, %ecx
-        jae       .L_2TAG_PACKET_4.0.1
-        xorpd     %xmm2, %xmm2
-        movl      $15344, %ecx
-        pinsrw    $3, %ecx, %xmm2
-        movq      %xmm2, %xmm3
-        mulsd     %xmm2, %xmm2
-        addsd     %xmm3, %xmm2
-.L_2TAG_PACKET_5.0.1:
-        xorpd     %xmm0, %xmm0
-        orl       $16368, %edx
-        pinsrw    $3, %edx, %xmm0
-        jmp       ..B1.4
-.L_2TAG_PACKET_4.0.1:
-        movq      %xmm0, %xmm2
-        movd      %xmm0, %eax
-        psrlq     $20, %xmm2
-        movd      %xmm2, %ecx
-        orl       %eax, %ecx
-        cmpl      $0, %ecx
-        je        .L_2TAG_PACKET_5.0.1
-        addsd     %xmm0, %xmm0
-        movq      %xmm0, (%rsp)
-.L_2TAG_PACKET_6.0.1:
-..B1.4:
-        popq      %rcx
-..___tag_value_tanh.4:
-        ret       
-..___tag_value_tanh.5:
-END(tanh)
-# -- End  tanh
-	.section .rodata, "a"
-	.align 16
-	.align 16
-L2E:
-	.long	1610612736
-	.long	1082594631
-	.long	4166901572
-	.long	1055174155
-	.type	L2E,@object
-	.size	L2E,16
-	.align 16
-Shifter:
-	.long	0
-	.long	1127743488
-	.long	0
-	.long	3275227136
-	.type	Shifter,@object
-	.size	Shifter,16
-	.align 16
-cv:
-	.long	3884607281
-	.long	3168131199
-	.long	3607404735
-	.long	3190582024
-	.long	1874480759
-	.long	1032041131
-	.long	4286760334
-	.long	1053736893
-	.long	4277811695
-	.long	3211144770
-	.long	0
-	.long	0
-	.type	cv,@object
-	.size	cv,48
-	.align 16
-T2_neg_f:
-	.long	0
-	.long	1072693248
-	.long	0
-	.long	0
-	.long	1797923801
-	.long	1072687577
-	.long	1950547427
-	.long	1013229059
-	.long	730821105
-	.long	1072681922
-	.long	2523232743
-	.long	1012067188
-	.long	915592468
-	.long	1072676282
-	.long	352947894
-	.long	3161024371
-	.long	2174652632
-	.long	1072670657
-	.long	4087714590
-	.long	1014450259
-	.long	35929225
-	.long	1072665048
-	.long	2809788041
-	.long	3159436968
-	.long	2912730644
-	.long	1072659453
-	.long	3490067722
-	.long	3163405074
-	.long	2038973688
-	.long	1072653874
-	.long	892941374
-	.long	1016046459
-	.long	1533953344
-	.long	1072648310
-	.long	769171851
-	.long	1015665633
-	.long	1222472308
-	.long	1072642761
-	.long	1054357470
-	.long	3161021018
-	.long	929806999
-	.long	1072637227
-	.long	3205336643
-	.long	1015259557
-	.long	481706282
-	.long	1072631708
-	.long	1696079173
-	.long	3162710528
-	.long	3999357479
-	.long	1072626203
-	.long	2258941616
-	.long	1015924724
-	.long	2719515920
-	.long	1072620714
-	.long	2760332941
-	.long	1015137933
-	.long	764307441
-	.long	1072615240
-	.long	3021057420
-	.long	3163329523
-	.long	2256325230
-	.long	1072609780
-	.long	580117746
-	.long	1015317295
-	.long	2728693978
-	.long	1072604335
-	.long	396109971
-	.long	3163462691
-	.long	2009970496
-	.long	1072598905
-	.long	2159039665
-	.long	3162572948
-	.long	4224142467
-	.long	1072593489
-	.long	3389820386
-	.long	1015207202
-	.long	610758006
-	.long	1072588089
-	.long	1965209397
-	.long	3161866232
-	.long	3884662774
-	.long	1072582702
-	.long	2158611599
-	.long	1014210185
-	.long	991358482
-	.long	1072577331
-	.long	838715019
-	.long	3163157668
-	.long	351641897
-	.long	1072571974
-	.long	2172261526
-	.long	3163010599
-	.long	1796832535
-	.long	1072566631
-	.long	3176955716
-	.long	3160585513
-	.long	863738719
-	.long	1072561303
-	.long	1326992220
-	.long	3162613197
-	.long	1679558232
-	.long	1072555989
-	.long	2390342287
-	.long	3163333970
-	.long	4076975200
-	.long	1072550689
-	.long	2029000899
-	.long	1015208535
-	.long	3594158869
-	.long	1072545404
-	.long	2456521700
-	.long	3163256561
-	.long	64696965
-	.long	1072540134
-	.long	1768797490
-	.long	1015816960
-	.long	1912561781
-	.long	1072534877
-	.long	3147495102
-	.long	1015678253
-	.long	382305176
-	.long	1072529635
-	.long	2347622376
-	.long	3162578625
-	.long	3898795731
-	.long	1072524406
-	.long	1249994144
-	.long	1011869818
-	.long	3707479175
-	.long	1072519192
-	.long	3613079303
-	.long	1014164738
-	.long	3939148246
-	.long	1072513992
-	.long	3210352148
-	.long	1015274323
-	.long	135105010
-	.long	1072508807
-	.long	1906148728
-	.long	3163375739
-	.long	721996136
-	.long	1072503635
-	.long	563754734
-	.long	1015371318
-	.long	1242007932
-	.long	1072498477
-	.long	1132034716
-	.long	3163339831
-	.long	1532734324
-	.long	1072493333
-	.long	3094216535
-	.long	3163162857
-	.long	1432208378
-	.long	1072488203
-	.long	1401068914
-	.long	3162363963
-	.long	778901109
-	.long	1072483087
-	.long	2248183955
-	.long	3161268751
-	.long	3706687593
-	.long	1072477984
-	.long	3521726940
-	.long	1013253067
-	.long	1464976603
-	.long	1072472896
-	.long	3507292405
-	.long	3161977534
-	.long	2483480501
-	.long	1072467821
-	.long	1216371780
-	.long	1013034172
-	.long	2307442995
-	.long	1072462760
-	.long	3190117721
-	.long	3162404539
-	.long	777507147
-	.long	1072457713
-	.long	4282924205
-	.long	1015187533
-	.long	2029714210
-	.long	1072452679
-	.long	613660079
-	.long	1015099143
-	.long	1610600570
-	.long	1072447659
-	.long	3766732298
-	.long	1015760183
-	.long	3657065772
-	.long	1072442652
-	.long	399025623
-	.long	3162957078
-	.long	3716502172
-	.long	1072437659
-	.long	2303740125
-	.long	1014042725
-	.long	1631695677
-	.long	1072432680
-	.long	2717633076
-	.long	3162344026
-	.long	1540824585
-	.long	1072427714
-	.long	1064017011
-	.long	3163487690
-	.long	3287523847
-	.long	1072422761
-	.long	1625971539
-	.long	3157009955
-	.long	2420883922
-	.long	1072417822
-	.long	2049810052
-	.long	1014119888
-	.long	3080351519
-	.long	1072412896
-	.long	3379126788
-	.long	3157218001
-	.long	815859274
-	.long	1072407984
-	.long	240396590
-	.long	3163487443
-	.long	4062661092
-	.long	1072403084
-	.long	1422616006
-	.long	3163255318
-	.long	4076559943
-	.long	1072398198
-	.long	2119478331
-	.long	3160758351
-	.long	703710506
-	.long	1072393326
-	.long	1384660846
-	.long	1015195891
-	.long	2380618042
-	.long	1072388466
-	.long	3149557219
-	.long	3163320799
-	.long	364333489
-	.long	1072383620
-	.long	3923737744
-	.long	3161421373
-	.long	3092190715
-	.long	1072378786
-	.long	814012168
-	.long	3159523422
-	.long	1822067026
-	.long	1072373966
-	.long	1241994956
-	.long	1015340290
-	.long	697153126
-	.long	1072369159
-	.long	1283515429
-	.long	3163283189
-	.long	3861050111
-	.long	1072364364
-	.long	254893773
-	.long	3162813180
-	.long	2572866477
-	.long	1072359583
-	.long	878562433
-	.long	1015521741
-	.long	977020788
-	.long	1072354815
-	.long	3065100517
-	.long	1015541563
-	.long	3218338682
-	.long	1072350059
-	.long	3404164304
-	.long	3162477108
-	.long	557149882
-	.long	1072345317
-	.long	3672720709
-	.long	1014537265
-	.long	1434058175
-	.long	1072340587
-	.long	251133233
-	.long	1015085769
-	.long	1405169241
-	.long	1072335870
-	.long	2998539689
-	.long	3162830951
-	.long	321958744
-	.long	1072331166
-	.long	3401933767
-	.long	1015794558
-	.long	2331271250
-	.long	1072326474
-	.long	812057446
-	.long	1012207446
-	.long	2990417245
-	.long	1072321795
-	.long	3683467745
-	.long	3163369326
-	.long	2152073944
-	.long	1072317129
-	.long	1486860576
-	.long	3163203456
-	.long	3964284211
-	.long	1072312475
-	.long	2111583915
-	.long	1015427164
-	.long	3985553595
-	.long	1072307834
-	.long	4002146062
-	.long	1015834136
-	.long	2069751141
-	.long	1072303206
-	.long	1562170675
-	.long	3162724681
-	.long	2366108318
-	.long	1072298590
-	.long	2867985102
-	.long	3161762254
-	.long	434316067
-	.long	1072293987
-	.long	2028358766
-	.long	1013458122
-	.long	424392917
-	.long	1072289396
-	.long	2749202995
-	.long	3162838718
-	.long	2191782032
-	.long	1072284817
-	.long	2960257726
-	.long	1013742662
-	.long	1297350157
-	.long	1072280251
-	.long	1308022040
-	.long	3163412558
-	.long	1892288442
-	.long	1072275697
-	.long	2446255666
-	.long	3162600381
-	.long	3833209506
-	.long	1072271155
-	.long	2722920684
-	.long	1013754842
-	.long	2682146384
-	.long	1072266626
-	.long	2082178513
-	.long	3163363419
-	.long	2591453363
-	.long	1072262109
-	.long	2132396182
-	.long	3159074198
-	.long	3418903055
-	.long	1072257604
-	.long	2527457337
-	.long	3160820604
-	.long	727685349
-	.long	1072253112
-	.long	2038246809
-	.long	3162358742
-	.long	2966275557
-	.long	1072248631
-	.long	2176155324
-	.long	3159842759
-	.long	1403662306
-	.long	1072244163
-	.long	2788809599
-	.long	3161671007
-	.long	194117574
-	.long	1072239707
-	.long	777528612
-	.long	3163412089
-	.long	3492293770
-	.long	1072235262
-	.long	2248032210
-	.long	1015386826
-	.long	2568320822
-	.long	1072230830
-	.long	2732824428
-	.long	1014352915
-	.long	1577608921
-	.long	1072226410
-	.long	1875489510
-	.long	3162968394
-	.long	380978316
-	.long	1072222002
-	.long	854188970
-	.long	3160462686
-	.long	3134592888
-	.long	1072217605
-	.long	4232266862
-	.long	1015991134
-	.long	1110089947
-	.long	1072213221
-	.long	1451641639
-	.long	1015474673
-	.long	2759350287
-	.long	1072208848
-	.long	1148526634
-	.long	1015894933
-	.long	3649726105
-	.long	1072204487
-	.long	4085036346
-	.long	1015649474
-	.long	3643909174
-	.long	1072200138
-	.long	3537586109
-	.long	1014354647
-	.long	2604962541
-	.long	1072195801
-	.long	2614425274
-	.long	3163539192
-	.long	396319521
-	.long	1072191476
-	.long	4172420816
-	.long	3159074632
-	.long	1176749997
-	.long	1072187162
-	.long	2738998779
-	.long	3162035844
-	.long	515457527
-	.long	1072182860
-	.long	836709333
-	.long	1015651226
-	.long	2571947539
-	.long	1072178569
-	.long	3558159064
-	.long	3163376669
-	.long	2916157145
-	.long	1072174290
-	.long	219487565
-	.long	1015309367
-	.long	1413356050
-	.long	1072170023
-	.long	1651349291
-	.long	3162668166
-	.long	2224145553
-	.long	1072165767
-	.long	3482522030
-	.long	3161489169
-	.long	919555682
-	.long	1072161523
-	.long	3121969534
-	.long	1012948226
-	.long	1660913392
-	.long	1072157290
-	.long	4218599604
-	.long	1015135707
-	.long	19972402
-	.long	1072153069
-	.long	3507899862
-	.long	1016009292
-	.long	158781403
-	.long	1072148859
-	.long	2221464712
-	.long	3163286453
-	.long	1944781191
-	.long	1072144660
-	.long	3993278767
-	.long	3161724279
-	.long	950803702
-	.long	1072140473
-	.long	1655364926
-	.long	1015237032
-	.long	1339972927
-	.long	1072136297
-	.long	167908909
-	.long	1015572152
-	.long	2980802057
-	.long	1072132132
-	.long	378619896
-	.long	1015773303
-	.long	1447192521
-	.long	1072127979
-	.long	1462857171
-	.long	3162514521
-	.long	903334909
-	.long	1072123837
-	.long	1636462108
-	.long	1015039997
-	.long	1218806132
-	.long	1072119706
-	.long	1818613052
-	.long	3162548441
-	.long	2263535754
-	.long	1072115586
-	.long	752233586
-	.long	3162639008
-	.long	3907805044
-	.long	1072111477
-	.long	2257091225
-	.long	3161550407
-	.long	1727278727
-	.long	1072107380
-	.long	3562710623
-	.long	1011471940
-	.long	4182873220
-	.long	1072103293
-	.long	629542646
-	.long	3161996303
-	.long	2555984613
-	.long	1072099218
-	.long	2652555442
-	.long	3162552692
-	.long	1013258799
-	.long	1072095154
-	.long	1748797611
-	.long	3160129082
-	.long	3721688645
-	.long	1072091100
-	.long	3069276937
-	.long	1015839401
-	.long	1963711167
-	.long	1072087058
-	.long	1744767757
-	.long	3160574294
-	.long	4201977662
-	.long	1072083026
-	.long	748330254
-	.long	1013594357
-	.long	1719614413
-	.long	1072079006
-	.long	330458198
-	.long	3163282740
-	.long	2979960120
-	.long	1072074996
-	.long	2599109725
-	.long	1014498493
-	.long	3561793907
-	.long	1072070997
-	.long	1157054053
-	.long	1011890350
-	.long	3339203574
-	.long	1072067009
-	.long	1483497780
-	.long	3162408754
-	.long	2186617381
-	.long	1072063032
-	.long	2270764084
-	.long	3163272713
-	.long	4273770423
-	.long	1072059065
-	.long	3383180809
-	.long	3163218901
-	.long	885834528
-	.long	1072055110
-	.long	1973258547
-	.long	3162261564
-	.long	488188413
-	.long	1072051165
-	.long	3199821029
-	.long	1015564048
-	.long	2956612997
-	.long	1072047230
-	.long	2118169751
-	.long	3162735553
-	.long	3872257780
-	.long	1072043306
-	.long	1253592103
-	.long	1015958334
-	.long	3111574537
-	.long	1072039393
-	.long	2606161479
-	.long	3162759746
-	.long	551349105
-	.long	1072035491
-	.long	3821916050
-	.long	3162106589
-	.long	363667784
-	.long	1072031599
-	.long	813753950
-	.long	1015785209
-	.long	2425981843
-	.long	1072027717
-	.long	2830390851
-	.long	3163346599
-	.long	2321106615
-	.long	1072023846
-	.long	2171176610
-	.long	1009535771
-	.long	4222122499
-	.long	1072019985
-	.long	1277378074
-	.long	3163256737
-	.long	3712504873
-	.long	1072016135
-	.long	88491949
-	.long	1015427660
-	.long	671025100
-	.long	1072012296
-	.long	3832014351
-	.long	3163022030
-	.long	3566716925
-	.long	1072008466
-	.long	1536826856
-	.long	1014142433
-	.long	3689071823
-	.long	1072004647
-	.long	2321004996
-	.long	3162552716
-	.long	917841882
-	.long	1072000839
-	.long	18715565
-	.long	1015659308
-	.long	3723038930
-	.long	1071997040
-	.long	378465264
-	.long	3162569582
-	.long	3395129871
-	.long	1071993252
-	.long	4025345435
-	.long	3162335388
-	.long	4109806887
-	.long	1071989474
-	.long	422403966
-	.long	1014469229
-	.long	1453150082
-	.long	1071985707
-	.long	498154669
-	.long	3161488062
-	.long	3896463087
-	.long	1071981949
-	.long	1139797873
-	.long	3161233805
-	.long	2731501122
-	.long	1071978202
-	.long	1774031855
-	.long	3162470021
-	.long	2135241198
-	.long	1071974465
-	.long	1236747871
-	.long	1013589147
-	.long	1990012071
-	.long	1071970738
-	.long	3529070563
-	.long	3162813193
-	.long	2178460671
-	.long	1071967021
-	.long	777878098
-	.long	3162842493
-	.long	2583551245
-	.long	1071963314
-	.long	3161094195
-	.long	1015606491
-	.long	3088564500
-	.long	1071959617
-	.long	1762311517
-	.long	1015045673
-	.long	3577096743
-	.long	1071955930
-	.long	2951496418
-	.long	1013793687
-	.long	3933059031
-	.long	1071952253
-	.long	2133366768
-	.long	3161531832
-	.long	4040676318
-	.long	1071948586
-	.long	4090609238
-	.long	1015663458
-	.long	3784486610
-	.long	1071944929
-	.long	1581883040
-	.long	3161698953
-	.long	3049340112
-	.long	1071941282
-	.long	3062915824
-	.long	1013170595
-	.long	1720398391
-	.long	1071937645
-	.long	3980678963
-	.long	3163300080
-	.long	3978100823
-	.long	1071934017
-	.long	3513027190
-	.long	1015845963
-	.long	1118294578
-	.long	1071930400
-	.long	2197495694
-	.long	3159909401
-	.long	1617004845
-	.long	1071926792
-	.long	82804944
-	.long	1010342778
-	.long	1065662932
-	.long	1071923194
-	.long	2533670915
-	.long	1014530238
-	.long	3645941911
-	.long	1071919605
-	.long	3814685081
-	.long	3161573341
-	.long	654919306
-	.long	1071916027
-	.long	3232961757
-	.long	3163047469
-	.long	569847338
-	.long	1071912458
-	.long	472945272
-	.long	3159290729
-	.long	3278348324
-	.long	1071908898
-	.long	3069497416
-	.long	1014750712
-	.long	78413852
-	.long	1071905349
-	.long	4183226867
-	.long	3163017251
-	.long	3743175029
-	.long	1071901808
-	.long	2072812490
-	.long	3162175075
-	.long	1276261410
-	.long	1071898278
-	.long	300981948
-	.long	1014684169
-	.long	1156440435
-	.long	1071894757
-	.long	2351451249
-	.long	1013967056
-	.long	3272845541
-	.long	1071891245
-	.long	928852419
-	.long	3163488248
-	.long	3219942644
-	.long	1071887743
-	.long	3798990616
-	.long	1015368806
-	.long	887463927
-	.long	1071884251
-	.long	3596744163
-	.long	3160794166
-	.long	460407023
-	.long	1071880768
-	.long	4237175092
-	.long	3163138469
-	.long	1829099622
-	.long	1071877294
-	.long	1016661181
-	.long	3163461005
-	.long	589198666
-	.long	1071873830
-	.long	2664346172
-	.long	3163157962
-	.long	926591435
-	.long	1071870375
-	.long	3208833762
-	.long	3162913514
-	.long	2732492859
-	.long	1071866929
-	.long	2691479646
-	.long	3162255684
-	.long	1603444721
-	.long	1071863493
-	.long	1548633640
-	.long	3162201326
-	.long	1726216749
-	.long	1071860066
-	.long	2466808228
-	.long	3161676405
-	.long	2992903935
-	.long	1071856648
-	.long	2218154406
-	.long	1015228193
-	.long	1000925746
-	.long	1071853240
-	.long	1018491672
-	.long	3163309544
-	.long	4232894513
-	.long	1071849840
-	.long	2383938684
-	.long	1014668519
-	.long	3991843581
-	.long	1071846450
-	.long	4092853457
-	.long	1014585763
-	.long	171030293
-	.long	1071843070
-	.long	3526460132
-	.long	1014428778
-	.long	1253935211
-	.long	1071839698
-	.long	1395382931
-	.long	3159702613
-	.long	2839424854
-	.long	1071836335
-	.long	1171596163
-	.long	1013041679
-	.long	526652809
-	.long	1071832982
-	.long	4223459736
-	.long	1015879375
-	.long	2799960843
-	.long	1071829637
-	.long	1423655381
-	.long	1015022151
-	.long	964107055
-	.long	1071826302
-	.long	2800439588
-	.long	3162833221
-	.long	3504003472
-	.long	1071822975
-	.long	3594001060
-	.long	3157330652
-	.long	1724976915
-	.long	1071819658
-	.long	420909223
-	.long	3163117379
-	.long	4112506593
-	.long	1071816349
-	.long	2947355221
-	.long	1014371048
-	.long	1972484976
-	.long	1071813050
-	.long	675290301
-	.long	3161640050
-	.long	3790955393
-	.long	1071809759
-	.long	2352942462
-	.long	3163180090
-	.long	874372905
-	.long	1071806478
-	.long	100263788
-	.long	1015940732
-	.long	1709341917
-	.long	1071803205
-	.long	2571168217
-	.long	1014152499
-	.long	1897844341
-	.long	1071799941
-	.long	1254300460
-	.long	1015275938
-	.long	1337108031
-	.long	1071796686
-	.long	3203724452
-	.long	1014677845
-	.long	4219606026
-	.long	1071793439
-	.long	2434574742
-	.long	1014681548
-	.long	1853186616
-	.long	1071790202
-	.long	3066496371
-	.long	1015656574
-	.long	2725843665
-	.long	1071786973
-	.long	1433917087
-	.long	1014838523
-	.long	2440944790
-	.long	1071783753
-	.long	2492769774
-	.long	1014147454
-	.long	897099801
-	.long	1071780542
-	.long	754756297
-	.long	1015241005
-	.long	2288159958
-	.long	1071777339
-	.long	2169144469
-	.long	1014876021
-	.long	2218315341
-	.long	1071774145
-	.long	2694295388
-	.long	3163288868
-	.long	586995997
-	.long	1071770960
-	.long	41662348
-	.long	3162627992
-	.long	1588871207
-	.long	1071767783
-	.long	143439582
-	.long	3162963416
-	.long	828946858
-	.long	1071764615
-	.long	10642492
-	.long	1015939438
-	.long	2502433899
-	.long	1071761455
-	.long	2148595913
-	.long	1015023991
-	.long	2214878420
-	.long	1071758304
-	.long	892270087
-	.long	3163116422
-	.long	4162030108
-	.long	1071755161
-	.long	2763428480
-	.long	1015529349
-	.long	3949972341
-	.long	1071752027
-	.long	2068408548
-	.long	1014913868
-	.long	1480023343
-	.long	1071748902
-	.long	2247196168
-	.long	1015327453
-	.long	948735466
-	.long	1071745785
-	.long	3516338028
-	.long	3162574883
-	.long	2257959872
-	.long	1071742676
-	.long	3802946148
-	.long	1012964927
-	.long	1014845819
-	.long	1071739576
-	.long	3117910646
-	.long	3161559105
-	.long	1416741826
-	.long	1071736484
-	.long	2196380210
-	.long	1011413563
-	.long	3366293073
-	.long	1071733400
-	.long	3119426314
-	.long	1014120554
-	.long	2471440686
-	.long	1071730325
-	.long	968836267
-	.long	3162214888
-	.long	2930322912
-	.long	1071727258
-	.long	2599499422
-	.long	3162714047
-	.long	351405227
-	.long	1071724200
-	.long	3125337328
-	.long	3159822479
-	.long	3228316108
-	.long	1071721149
-	.long	3010241991
-	.long	3158422804
-	.long	2875075254
-	.long	1071718107
-	.long	4144233330
-	.long	3163333716
-	.long	3490863953
-	.long	1071715073
-	.long	960797498
-	.long	3162948880
-	.long	685187902
-	.long	1071712048
-	.long	378731989
-	.long	1014843115
-	.long	2952712987
-	.long	1071709030
-	.long	3293494651
-	.long	3160120301
-	.long	1608493509
-	.long	1071706021
-	.long	3159622171
-	.long	3162807737
-	.long	852742562
-	.long	1071703020
-	.long	667253586
-	.long	1009793559
-	.long	590962156
-	.long	1071700027
-	.long	3829346666
-	.long	3163275597
-	.long	728909815
-	.long	1071697042
-	.long	383930225
-	.long	1015029468
-	.long	1172597893
-	.long	1071694065
-	.long	114433263
-	.long	1015347593
-	.long	1828292879
-	.long	1071691096
-	.long	1255956747
-	.long	1015588398
-	.long	2602514713
-	.long	1071688135
-	.long	2268929336
-	.long	1014354284
-	.long	3402036099
-	.long	1071685182
-	.long	405889334
-	.long	1015105656
-	.long	4133881824
-	.long	1071682237
-	.long	2148155345
-	.long	3162931299
-	.long	410360776
-	.long	1071679301
-	.long	1269990655
-	.long	1011975870
-	.long	728934454
-	.long	1071676372
-	.long	1413842688
-	.long	1014178612
-	.long	702412510
-	.long	1071673451
-	.long	3803266087
-	.long	3162280415
-	.long	238821257
-	.long	1071670538
-	.long	1469694871
-	.long	3162884987
-	.long	3541402996
-	.long	1071667632
-	.long	2759177317
-	.long	1014854626
-	.long	1928746161
-	.long	1071664735
-	.long	983617676
-	.long	1014285177
-	.long	3899555717
-	.long	1071661845
-	.long	427280750
-	.long	3162546972
-	.long	772914124
-	.long	1071658964
-	.long	4004372762
-	.long	1012230161
-	.long	1048019041
-	.long	1071656090
-	.long	1398474845
-	.long	3160510595
-	.long	339411585
-	.long	1071653224
-	.long	264588982
-	.long	3161636657
-	.long	2851812149
-	.long	1071650365
-	.long	2595802551
-	.long	1015767337
-	.long	4200250559
-	.long	1071647514
-	.long	2808127345
-	.long	3161781938
-	.type	T2_neg_f,@object
-	.size	T2_neg_f,4096
-	.space 512, 0x00 	# pad
-	.align 16
-MASK3:
-	.long	0
-	.long	4294967280
-	.long	0
-	.long	4294967280
-	.type	MASK3,@object
-	.size	MASK3,16
-	.align 16
-RMASK:
-	.long	4294705152
-	.long	4294967295
-	.long	4294705152
-	.long	4294967295
-	.type	RMASK,@object
-	.size	RMASK,16
-	.align 16
-pv:
-	.long	236289503
-	.long	1064135997
-	.long	463583772
-	.long	3215696314
-	.long	1441186365
-	.long	3212977891
-	.long	286331153
-	.long	1069617425
-	.long	2284589306
-	.long	1066820852
-	.long	1431655765
-	.long	3218429269
-	.type	pv,@object
-	.size	pv,48
-	.align 4
-HALFMASK:
-	.long	4160749568
-	.long	2147483647
-	.type	HALFMASK,@object
-	.size	HALFMASK,8
-	.align 4
-ONEMASK:
-	.long	0
-	.long	1072693248
-	.type	ONEMASK,@object
-	.size	ONEMASK,8
-	.align 4
-TWOMASK:
-	.long	0
-	.long	1073741824
-	.type	TWOMASK,@object
-	.size	TWOMASK,8
-	.data
-	.section .note.GNU-stack, "",@progbits
-// -- Begin DWARF2 SEGMENT .eh_frame
-	.section .eh_frame,"a",@progbits
-.eh_frame_seg:
-	.align 1
-	.4byte 0x00000014
-	.8byte 0x00527a0100000000
-	.8byte 0x08070c1b01107801
-	.4byte 0x00000190
-	.4byte 0x0000001c
-	.4byte 0x0000001c
-	.4byte ..___tag_value_tanh.1-.
-	.4byte ..___tag_value_tanh.5-..___tag_value_tanh.1
-	.2byte 0x0400
-	.4byte ..___tag_value_tanh.3-..___tag_value_tanh.1
-	.2byte 0x100e
-	.byte 0x04
-	.4byte ..___tag_value_tanh.4-..___tag_value_tanh.3
-	.2byte 0x080e
-	.byte 0x00
-# End
diff --git a/libm/x86_64/sqrt.S b/libm/x86_64/sqrt.S
deleted file mode 100644
index ee97026..0000000
--- a/libm/x86_64/sqrt.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrt)
-sqrtsd %xmm0,%xmm0
-retq
-END(sqrt)
diff --git a/libm/x86_64/sqrtf.S b/libm/x86_64/sqrtf.S
deleted file mode 100644
index 910407f..0000000
--- a/libm/x86_64/sqrtf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrtf)
-sqrtss %xmm0,%xmm0
-retq
-END(sqrtf)
diff --git a/libm/x86_64/trunc.S b/libm/x86_64/trunc.S
deleted file mode 100644
index fe18b40..0000000
--- a/libm/x86_64/trunc.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(trunc)
-roundsd $0x3,%xmm0,%xmm0
-retq
-END(trunc)
diff --git a/libm/x86_64/truncf.S b/libm/x86_64/truncf.S
deleted file mode 100644
index eeee1d7..0000000
--- a/libm/x86_64/truncf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright (c) 2014, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    * this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-    * this list of conditions and the following disclaimer in the documentation
-    * and/or other materials provided with the distribution.
-
-    * Neither the name of Intel Corporation nor the names of its contributors
-    * may be used to endorse or promote products derived from this software
-    * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <private/bionic_asm.h>
-
-ENTRY(truncf)
-roundss $0x3,%xmm0,%xmm0
-retq
-END(truncf)
diff --git a/linker/Android.bp b/linker/Android.bp
index 57420a9..020bd7d 100644
--- a/linker/Android.bp
+++ b/linker/Android.bp
@@ -52,6 +52,9 @@
         arm64: {
             srcs: ["arch/arm64/linker_wrapper_begin.S"],
         },
+        riscv64: {
+            srcs: ["arch/riscv64/linker_wrapper_begin.S"],
+        },
         x86_64: {
             srcs: ["arch/x86_64/linker_wrapper_begin.S"],
         },
@@ -208,6 +211,13 @@
 }
 
 filegroup {
+    name: "linker_sources_riscv64",
+    srcs: [
+        "arch/riscv64/begin.S",
+    ],
+}
+
+filegroup {
     name: "linker_sources_x86",
     srcs: [
         "arch/x86/begin.S",
@@ -224,10 +234,11 @@
 cc_defaults {
     name: "linker_version_script_overlay",
     arch: {
-        arm:    { version_script: "linker.arm.map"      },
-        arm64:  { version_script: "linker.generic.map"  },
-        x86:    { version_script: "linker.generic.map"  },
-        x86_64: { version_script: "linker.generic.map"  },
+        arm:     { version_script: "linker.arm.map"      },
+        arm64:   { version_script: "linker.generic.map"  },
+        riscv64: { version_script: "linker.generic.map"  },
+        x86:     { version_script: "linker.generic.map"  },
+        x86_64:  { version_script: "linker.generic.map"  },
     },
 }
 
@@ -259,6 +270,15 @@
                 keep_symbols: true,
             },
         },
+        riscv64: {
+            srcs: [":linker_sources_riscv64"],
+
+            // Leave the symbols in the shared library so that stack unwinders can produce
+            // meaningful name resolution.
+            strip: {
+                keep_symbols: true,
+            },
+        },
         x86: {
             srcs: [":linker_sources_x86"],
 
@@ -354,6 +374,11 @@
     ],
 
     symlinks: ["linker_asan"],
+    arch: {
+        arm64: {
+            symlinks: ["linker_hwasan"],
+        },
+    },
     multilib: {
         lib64: {
             suffix: "64",
@@ -426,6 +451,7 @@
         "-Wl,--exclude-libs=libgcc_stripped.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
+        "-Wl,--exclude-libs=libclang_rt.builtins-riscv64-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
         "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
     ],
diff --git a/linker/NOTICE b/linker/NOTICE
index 8f70d87..d61a193 100644
--- a/linker/NOTICE
+++ b/linker/NOTICE
@@ -334,3 +334,31 @@
 
 -------------------------------------------------------------------
 
+Copyright (C) 2022 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
diff --git a/linker/arch/arm/begin.S b/linker/arch/arm/begin.S
index 80d9fe1..3b673f0 100644
--- a/linker/arch/arm/begin.S
+++ b/linker/arch/arm/begin.S
@@ -35,6 +35,6 @@
   mov r0, sp
   bl __linker_init
 
-  /* linker init returns the _entry address in the main image */
+  // __linker_init returns the address of the entry point in the main image.
   bx r0
 END(_start)
diff --git a/linker/arch/arm64/begin.S b/linker/arch/arm64/begin.S
index a947475..14999cd 100644
--- a/linker/arch/arm64/begin.S
+++ b/linker/arch/arm64/begin.S
@@ -35,6 +35,6 @@
   mov x0, sp
   bl __linker_init
 
-  /* linker init returns the _entry address in the main image */
+  // __linker_init returns the address of the entry point in the main image.
   br x0
 END(_start)
diff --git a/linker/arch/arm64/tlsdesc_resolver.S b/linker/arch/arm64/tlsdesc_resolver.S
index 96eff8e..ad155e2 100644
--- a/linker/arch/arm64/tlsdesc_resolver.S
+++ b/linker/arch/arm64/tlsdesc_resolver.S
@@ -58,9 +58,9 @@
   cmp x21, x22
   b.lo .fallback
 
-  ldr x21, [x0, #8]             // TlsIndex::module
+  ldr x21, [x0, #8]             // TlsIndex::module_id
   ldr x22, [x0, #16]            // TlsIndex::offset
-  ldr x21, [x20, x21, lsl #3]   // TlsDtv::modules[module]
+  ldr x21, [x20, x21, lsl #3]   // TlsDtv::modules[module_id]
   cbz x21, .fallback
   add x0, x21, x22
   sub x0, x0, x19
diff --git a/libc/arch-arm64/generic/bionic/memcpy.S b/linker/arch/riscv64/begin.S
similarity index 83%
rename from libc/arch-arm64/generic/bionic/memcpy.S
rename to linker/arch/riscv64/begin.S
index bc1945c..f7509c6 100644
--- a/libc/arch-arm64/generic/bionic/memcpy.S
+++ b/linker/arch/riscv64/begin.S
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,12 +26,15 @@
  * SUCH DAMAGE.
  */
 
-// Prototype: void *memcpy (void *dst, const void *src, size_t count).
-
 #include <private/bionic_asm.h>
 
-ENTRY(__memcpy)
-  #include "memcpy_base.S"
-END(__memcpy)
+ENTRY(_start)
+  // Force unwinds to end in this function.
+  .cfi_undefined ra
 
-NOTE_GNU_PROPERTY()
+  mv a0, sp
+  jal __linker_init
+
+  // __linker_init returns the address of the entry point in the main image.
+  jr a0
+END(_start)
diff --git a/linker/arch/x86/begin.S b/linker/arch/x86/begin.S
index 3812646..81e2740 100644
--- a/linker/arch/x86/begin.S
+++ b/linker/arch/x86/begin.S
@@ -38,6 +38,6 @@
   call __linker_init      // %esp is aligned to 16 before the call.
   addl $16, %esp
 
-  /* linker init returns (%eax) the _entry address in the main image */
+  // __linker_init returns the address of the entry point in the main image.
   jmp *%eax
 END(_start)
diff --git a/linker/arch/x86_64/begin.S b/linker/arch/x86_64/begin.S
index 4722301..baba0db 100644
--- a/linker/arch/x86_64/begin.S
+++ b/linker/arch/x86_64/begin.S
@@ -35,6 +35,6 @@
   mov %rsp, %rdi
   call __linker_init
 
-  /* linker init returns (%rax) the _entry address in the main image */
+  // __linker_init returns the address of the entry point in the main image.
   jmp *%rax
 END(_start)
diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp
index af05027..a3f5246 100644
--- a/linker/dlfcn.cpp
+++ b/linker/dlfcn.cpp
@@ -28,8 +28,9 @@
 
 #include "linker.h"
 #include "linker_cfi.h"
-#include "linker_globals.h"
+#include "linker_debuggerd.h"
 #include "linker_dlwarning.h"
+#include "linker_globals.h"
 
 #include <link.h>
 #include <pthread.h>
@@ -92,6 +93,8 @@
 #if defined(__arm__)
 _Unwind_Ptr __loader_dl_unwind_find_exidx(_Unwind_Ptr pc, int* pcount) __LINKER_PUBLIC__;
 #endif
+bool __loader_android_handle_signal(int signal_number, siginfo_t* info,
+                                    void* context) __LINKER_PUBLIC__;
 }
 
 static pthread_mutex_t g_dl_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
@@ -302,6 +305,10 @@
   return __libc_shared_globals();
 }
 
+bool __loader_android_handle_signal(int signal_number, siginfo_t* info, void* context) {
+  return debuggerd_handle_signal(signal_number, info, context);
+}
+
 static uint8_t __libdl_info_buf[sizeof(soinfo)] __attribute__((aligned(8)));
 static soinfo* __libdl_info = nullptr;
 
diff --git a/linker/ld_android.cpp b/linker/ld_android.cpp
index 0239c30..1c03106 100644
--- a/linker/ld_android.cpp
+++ b/linker/ld_android.cpp
@@ -44,6 +44,7 @@
 __strong_alias(__loader_android_set_application_target_sdk_version, __internal_linker_error);
 __strong_alias(__loader_android_update_LD_LIBRARY_PATH, __internal_linker_error);
 __strong_alias(__loader_cfi_fail, __internal_linker_error);
+__strong_alias(__loader_android_handle_signal, __internal_linker_error);
 __strong_alias(__loader_dl_iterate_phdr, __internal_linker_error);
 __strong_alias(__loader_dladdr, __internal_linker_error);
 __strong_alias(__loader_dlclose, __internal_linker_error);
diff --git a/linker/linker.arm.map b/linker/linker.arm.map
index be438ca..b805cd6 100644
--- a/linker/linker.arm.map
+++ b/linker/linker.arm.map
@@ -24,6 +24,7 @@
     __loader_remove_thread_local_dtor;
     __loader_shared_globals;
     rtld_db_dlactivity;
+    __loader_android_handle_signal;
   local:
     *;
 };
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 7f38ecd..ac6d7c5 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -34,11 +34,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/auxv.h>
 #include <sys/mman.h>
 #include <sys/param.h>
 #include <sys/vfs.h>
 #include <unistd.h>
 
+#include <iterator>
 #include <new>
 #include <string>
 #include <unordered_map>
@@ -135,6 +137,36 @@
   nullptr
 };
 
+#if defined(__aarch64__)
+static const char* const kHwasanSystemLibDir  = "/system/lib64/hwasan";
+static const char* const kHwasanOdmLibDir     = "/odm/lib64/hwasan";
+static const char* const kHwasanVendorLibDir  = "/vendor/lib64/hwasan";
+
+// HWASan is only supported on aarch64.
+static const char* const kHwsanDefaultLdPaths[] = {
+  kHwasanSystemLibDir,
+  kSystemLibDir,
+  kHwasanOdmLibDir,
+  kOdmLibDir,
+  kHwasanVendorLibDir,
+  kVendorLibDir,
+  nullptr
+};
+
+// Is HWASAN enabled?
+static bool g_is_hwasan = false;
+#else
+static const char* const kHwsanDefaultLdPaths[] = {
+  kSystemLibDir,
+  kOdmLibDir,
+  kVendorLibDir,
+  nullptr
+};
+
+// Never any HWASan. Help the compiler remove the code we don't need.
+constexpr bool g_is_hwasan = false;
+#endif
+
 // Is ASAN enabled?
 static bool g_is_asan = false;
 
@@ -374,7 +406,7 @@
     char* static_tls = reinterpret_cast<char*>(__get_bionic_tcb()) - layout.offset_bionic_tcb();
     return static_tls + tls_mod.static_offset;
   } else if (should_alloc) {
-    const TlsIndex ti { si_tls->module_id, 0 };
+    const TlsIndex ti { si_tls->module_id, static_cast<size_t>(0 - TLS_DTV_OFFSET) };
     return TLS_GET_ADDR(&ti);
   } else {
     TlsDtv* dtv = __get_tcb_dtv(__get_bionic_tcb());
@@ -1209,8 +1241,6 @@
   if ((fs_stat.f_type != TMPFS_MAGIC) && (!ns->is_accessible(realpath))) {
     // TODO(dimitry): workaround for http://b/26394120 - the exempt-list
 
-    // TODO(dimitry) before O release: add a namespace attribute to have this enabled
-    // only for classloader-namespaces
     const soinfo* needed_by = task->is_dt_needed() ? task->get_needed_by() : nullptr;
     if (is_exempt_lib(ns, name, needed_by)) {
       // print warning only if needed by non-system library
@@ -1588,18 +1618,16 @@
     task->set_extinfo(is_dt_needed ? nullptr : extinfo);
     task->set_dt_needed(is_dt_needed);
 
-    LD_LOG(kLogDlopen, "find_libraries(ns=%s): task=%s, is_dt_needed=%d", ns->get_name(),
-           task->get_name(), is_dt_needed);
-
     // Note: start from the namespace that is stored in the LoadTask. This namespace
     // is different from the current namespace when the LoadTask is for a transitive
     // dependency and the lib that created the LoadTask is not found in the
-    // current namespace but in one of the linked namespace.
-    if (!find_library_internal(const_cast<android_namespace_t*>(task->get_start_from()),
-                               task,
-                               &zip_archive_cache,
-                               &load_tasks,
-                               rtld_flags)) {
+    // current namespace but in one of the linked namespaces.
+    android_namespace_t* start_ns = const_cast<android_namespace_t*>(task->get_start_from());
+
+    LD_LOG(kLogDlopen, "find_library_internal(ns=%s@%p): task=%s, is_dt_needed=%d",
+           start_ns->get_name(), start_ns, task->get_name(), is_dt_needed);
+
+    if (!find_library_internal(start_ns, task, &zip_archive_cache, &load_tasks, rtld_flags)) {
       return false;
     }
 
@@ -2157,26 +2185,46 @@
   }
   // End Workaround for dlopen(/system/lib/<soname>) when .so is in /apex.
 
-  std::string asan_name_holder;
+  std::string translated_name_holder;
 
+  assert(!g_is_hwasan || !g_is_asan);
   const char* translated_name = name;
   if (g_is_asan && translated_name != nullptr && translated_name[0] == '/') {
     char original_path[PATH_MAX];
     if (realpath(name, original_path) != nullptr) {
-      asan_name_holder = std::string(kAsanLibDirPrefix) + original_path;
-      if (file_exists(asan_name_holder.c_str())) {
+      translated_name_holder = std::string(kAsanLibDirPrefix) + original_path;
+      if (file_exists(translated_name_holder.c_str())) {
         soinfo* si = nullptr;
         if (find_loaded_library_by_realpath(ns, original_path, true, &si)) {
           PRINT("linker_asan dlopen NOT translating \"%s\" -> \"%s\": library already loaded", name,
-                asan_name_holder.c_str());
+                translated_name_holder.c_str());
         } else {
           PRINT("linker_asan dlopen translating \"%s\" -> \"%s\"", name, translated_name);
-          translated_name = asan_name_holder.c_str();
+          translated_name = translated_name_holder.c_str();
+        }
+      }
+    }
+  } else if (g_is_hwasan && translated_name != nullptr && translated_name[0] == '/') {
+    char original_path[PATH_MAX];
+    if (realpath(name, original_path) != nullptr) {
+      // Keep this the same as CreateHwasanPath in system/linkerconfig/modules/namespace.cc.
+      std::string path(original_path);
+      auto slash = path.rfind('/');
+      if (slash != std::string::npos || slash != path.size() - 1) {
+        translated_name_holder = path.substr(0, slash) + "/hwasan" + path.substr(slash);
+      }
+      if (!translated_name_holder.empty() && file_exists(translated_name_holder.c_str())) {
+        soinfo* si = nullptr;
+        if (find_loaded_library_by_realpath(ns, original_path, true, &si)) {
+          PRINT("linker_hwasan dlopen NOT translating \"%s\" -> \"%s\": library already loaded", name,
+                translated_name_holder.c_str());
+        } else {
+          PRINT("linker_hwasan dlopen translating \"%s\" -> \"%s\"", name, translated_name);
+          translated_name = translated_name_holder.c_str();
         }
       }
     }
   }
-
   ProtectedDataGuard guard;
   soinfo* si = find_library(ns, translated_name, flags, extinfo, caller);
   loading_trace.End();
@@ -2508,11 +2556,12 @@
     return false;
   }
 
-  auto sonames = android::base::Split(shared_lib_sonames, ":");
-  std::unordered_set<std::string> sonames_set(sonames.begin(), sonames.end());
+  std::vector<std::string> sonames = android::base::Split(shared_lib_sonames, ":");
+  std::unordered_set<std::string> sonames_set(std::make_move_iterator(sonames.begin()),
+                                              std::make_move_iterator(sonames.end()));
 
   ProtectedDataGuard guard;
-  namespace_from->add_linked_namespace(namespace_to, sonames_set, false);
+  namespace_from->add_linked_namespace(namespace_to, std::move(sonames_set), false);
 
   return true;
 }
@@ -3164,6 +3213,14 @@
       case DT_AARCH64_VARIANT_PCS:
         // Ignored: AArch64 processor-specific dynamic array tags.
         break;
+      // TODO(mitchp): Add support to libc_init_mte to use these dynamic array entries instead of
+      // the Android-specific ELF note.
+      case DT_AARCH64_MEMTAG_MODE:
+      case DT_AARCH64_MEMTAG_HEAP:
+      case DT_AARCH64_MEMTAG_STACK:
+      case DT_AARCH64_MEMTAG_GLOBALS:
+      case DT_AARCH64_MEMTAG_GLOBALSSZ:
+        break;
 #endif
 
       default:
@@ -3349,9 +3406,10 @@
   return true;
 }
 
-static std::vector<android_namespace_t*> init_default_namespace_no_config(bool is_asan) {
+static std::vector<android_namespace_t*> init_default_namespace_no_config(bool is_asan, bool is_hwasan) {
   g_default_namespace.set_isolated(false);
-  auto default_ld_paths = is_asan ? kAsanDefaultLdPaths : kDefaultLdPaths;
+  auto default_ld_paths = is_asan ? kAsanDefaultLdPaths : (
+    is_hwasan ? kHwsanDefaultLdPaths : kDefaultLdPaths);
 
   char real_path[PATH_MAX];
   std::vector<std::string> ld_default_paths;
@@ -3455,6 +3513,7 @@
   return kLdConfigFilePath;
 }
 
+
 std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path) {
   g_default_namespace.set_name("(default)");
 
@@ -3468,6 +3527,16 @@
               (strcmp(bname, "linker_asan") == 0 ||
                strcmp(bname, "linker_asan64") == 0);
 
+#if defined(__aarch64__)
+  // HWASan is only supported on AArch64.
+  // The AT_SECURE restriction is because this is a debug feature that does
+  // not need to work on secure binaries, it doesn't hurt to disallow the
+  // environment variable for them, as it impacts the program execution.
+  char* hwasan_env = getenv("LD_HWASAN");
+  g_is_hwasan = (bname != nullptr &&
+              strcmp(bname, "linker_hwasan64") == 0) ||
+              (hwasan_env != nullptr && !getauxval(AT_SECURE) && strcmp(hwasan_env, "1") == 0);
+#endif
   const Config* config = nullptr;
 
   {
@@ -3475,7 +3544,7 @@
     INFO("[ Reading linker config \"%s\" ]", ld_config_file_path.c_str());
     ScopedTrace trace(("linker config " + ld_config_file_path).c_str());
     std::string error_msg;
-    if (!Config::read_binary_config(ld_config_file_path.c_str(), executable_path, g_is_asan,
+    if (!Config::read_binary_config(ld_config_file_path.c_str(), executable_path, g_is_asan, g_is_hwasan,
                                     &config, &error_msg)) {
       if (!error_msg.empty()) {
         DL_WARN("Warning: couldn't read '%s' for '%s' (using default configuration instead): %s",
@@ -3486,7 +3555,7 @@
   }
 
   if (config == nullptr) {
-    return init_default_namespace_no_config(g_is_asan);
+    return init_default_namespace_no_config(g_is_asan, g_is_hwasan);
   }
 
   const auto& namespace_configs = config->namespace_configs();
diff --git a/linker/linker.generic.map b/linker/linker.generic.map
index f3c01c0..4d7f236 100644
--- a/linker/linker.generic.map
+++ b/linker/linker.generic.map
@@ -23,6 +23,7 @@
     __loader_remove_thread_local_dtor;
     __loader_shared_globals;
     rtld_db_dlactivity;
+    __loader_android_handle_signal;
   local:
     *;
 };
diff --git a/linker/linker_config.cpp b/linker/linker_config.cpp
index 1771e87..ad40c50 100644
--- a/linker/linker_config.cpp
+++ b/linker/linker_config.cpp
@@ -463,6 +463,7 @@
 bool Config::read_binary_config(const char* ld_config_file_path,
                                       const char* binary_realpath,
                                       bool is_asan,
+                                      bool is_hwasan,
                                       const Config** config,
                                       std::string* error_msg) {
   g_config.clear();
@@ -579,6 +580,8 @@
     // these are affected by is_asan flag
     if (is_asan) {
       property_name_prefix += ".asan";
+    } else if (is_hwasan) {
+      property_name_prefix += ".hwasan";
     }
 
     // search paths are resolved (canonicalized). This is required mainly for
diff --git a/linker/linker_config.h b/linker/linker_config.h
index fe23ec1..09fea45 100644
--- a/linker/linker_config.h
+++ b/linker/linker_config.h
@@ -166,6 +166,7 @@
   static bool read_binary_config(const char* ld_config_file_path,
                                  const char* binary_realpath,
                                  bool is_asan,
+                                 bool is_hwasan,
                                  const Config** config,
                                  std::string* error_msg);
 
diff --git a/linker/linker_config_test.cpp b/linker/linker_config_test.cpp
index acdf641..7e947f3 100644
--- a/linker/linker_config_test.cpp
+++ b/linker/linker_config_test.cpp
@@ -40,6 +40,7 @@
 #include <android-base/file.h>
 #include <android-base/scopeguard.h>
 #include <android-base/stringprintf.h>
+#include <vector>
 
 #if defined(__LP64__)
 #define ARCH_SUFFIX "64"
@@ -64,6 +65,10 @@
   "namespace.default.asan.search.paths = /data\n"
   "namespace.default.asan.search.paths += /vendor/${LIB}\n"
   "namespace.default.asan.permitted.paths = /data:/vendor\n"
+  "namespace.default.hwasan.search.paths = /vendor/${LIB}/hwasan\n"
+  "namespace.default.hwasan.search.paths += /vendor/${LIB}\n"
+  "namespace.default.hwasan.permitted.paths = /vendor/${LIB}/hwasan\n"
+  "namespace.default.hwasan.permitted.paths += /vendor/${LIB}\n"
   "namespace.default.links = system\n"
   "namespace.default.links += vndk\n"
   // irregular whitespaces are added intentionally for testing purpose
@@ -77,11 +82,17 @@
   "namespace.system.permitted.paths = /system/${LIB}\n"
   "namespace.system.asan.search.paths = /data:/system/${LIB}\n"
   "namespace.system.asan.permitted.paths = /data:/system\n"
+  "namespace.system.hwasan.search.paths = /system/${LIB}/hwasan\n"
+  "namespace.system.hwasan.search.paths += /system/${LIB}\n"
+  "namespace.system.hwasan.permitted.paths = /system/${LIB}/hwasan\n"
+  "namespace.system.hwasan.permitted.paths += /system/${LIB}\n"
   "namespace.vndk.isolated = tr\n"
   "namespace.vndk.isolated += ue\n" // should be ignored and return as 'false'.
   "namespace.vndk.search.paths = /system/${LIB}/vndk\n"
   "namespace.vndk.asan.search.paths = /data\n"
   "namespace.vndk.asan.search.paths += /system/${LIB}/vndk\n"
+  "namespace.vndk.hwasan.search.paths = /system/${LIB}/vndk/hwasan\n"
+  "namespace.vndk.hwasan.search.paths += /system/${LIB}/vndk\n"
   "namespace.vndk.links = default\n"
   "namespace.vndk.link.default.allow_all_shared_libs = true\n"
   "namespace.vndk.link.vndk_in_system.allow_all_shared_libs = true\n"
@@ -107,26 +118,50 @@
   return resolved_paths;
 }
 
-static void run_linker_config_smoke_test(bool is_asan) {
-  const std::vector<std::string> kExpectedDefaultSearchPath =
-      resolve_paths(is_asan ? std::vector<std::string>({ "/data", "/vendor/lib" ARCH_SUFFIX }) :
-                              std::vector<std::string>({ "/vendor/lib" ARCH_SUFFIX }));
+enum class SmokeTestType {
+  None,
+  Asan,
+  Hwasan,
+};
 
-  const std::vector<std::string> kExpectedDefaultPermittedPath =
-      resolve_paths(is_asan ? std::vector<std::string>({ "/data", "/vendor" }) :
-                              std::vector<std::string>({ "/vendor/lib" ARCH_SUFFIX }));
+static void run_linker_config_smoke_test(SmokeTestType type) {
+  std::vector<std::string> expected_default_search_path;
+  std::vector<std::string> expected_default_permitted_path;
+  std::vector<std::string> expected_system_search_path;
+  std::vector<std::string> expected_system_permitted_path;
+  std::vector<std::string> expected_vndk_search_path;
 
-  const std::vector<std::string> kExpectedSystemSearchPath =
-      resolve_paths(is_asan ? std::vector<std::string>({ "/data", "/system/lib" ARCH_SUFFIX }) :
-                              std::vector<std::string>({ "/system/lib" ARCH_SUFFIX }));
+  switch (type) {
+    case SmokeTestType::None:
+      expected_default_search_path = { "/vendor/lib" ARCH_SUFFIX };
+      expected_default_permitted_path = { "/vendor/lib" ARCH_SUFFIX };
+      expected_system_search_path = { "/system/lib" ARCH_SUFFIX };
+      expected_system_permitted_path = { "/system/lib" ARCH_SUFFIX };
+      expected_vndk_search_path = { "/system/lib" ARCH_SUFFIX "/vndk" };
+      break;
+    case SmokeTestType::Asan:
+      expected_default_search_path = { "/data", "/vendor/lib" ARCH_SUFFIX };
+      expected_default_permitted_path = { "/data", "/vendor" };
+      expected_system_search_path = { "/data", "/system/lib" ARCH_SUFFIX };
+      expected_system_permitted_path = { "/data", "/system" };
+      expected_vndk_search_path = { "/data", "/system/lib" ARCH_SUFFIX "/vndk" };
+      break;
+    case SmokeTestType::Hwasan:
+      expected_default_search_path = { "/vendor/lib" ARCH_SUFFIX "/hwasan", "/vendor/lib" ARCH_SUFFIX };
+      expected_default_permitted_path = { "/vendor/lib" ARCH_SUFFIX "/hwasan", "/vendor/lib" ARCH_SUFFIX };
+      expected_system_search_path = { "/system/lib" ARCH_SUFFIX "/hwasan" , "/system/lib" ARCH_SUFFIX };
+      expected_system_permitted_path = { "/system/lib" ARCH_SUFFIX "/hwasan", "/system/lib" ARCH_SUFFIX };
+      expected_vndk_search_path = { "/system/lib" ARCH_SUFFIX "/vndk/hwasan", "/system/lib" ARCH_SUFFIX "/vndk" };
+      break;
+  }
 
-  const std::vector<std::string> kExpectedSystemPermittedPath =
-      resolve_paths(is_asan ? std::vector<std::string>({ "/data", "/system" }) :
-                              std::vector<std::string>({ "/system/lib" ARCH_SUFFIX }));
-
-  const std::vector<std::string> kExpectedVndkSearchPath =
-      resolve_paths(is_asan ? std::vector<std::string>({ "/data", "/system/lib" ARCH_SUFFIX "/vndk"}) :
-                              std::vector<std::string>({ "/system/lib" ARCH_SUFFIX "/vndk"}));
+  expected_default_search_path = resolve_paths(expected_default_search_path);
+  // expected_default_permitted_path is skipped on purpose, permitted paths
+  // do not get resolved in linker_config.cpp
+  expected_system_search_path = resolve_paths(expected_system_search_path);
+  // expected_system_permitted_path is skipped on purpose, permitted paths
+  // do not get resolved in linker_config.cpp
+  expected_vndk_search_path = resolve_paths(expected_vndk_search_path);
 
   TemporaryFile tmp_file;
   close(tmp_file.fd);
@@ -149,7 +184,8 @@
   std::string error_msg;
   ASSERT_TRUE(Config::read_binary_config(tmp_file.path,
                                          executable_path.c_str(),
-                                         is_asan,
+                                         type == SmokeTestType::Asan,
+                                         type == SmokeTestType::Hwasan,
                                          &config,
                                          &error_msg)) << error_msg;
   ASSERT_TRUE(config != nullptr);
@@ -162,8 +198,8 @@
 
   ASSERT_TRUE(default_ns_config->isolated());
   ASSERT_FALSE(default_ns_config->visible());
-  ASSERT_EQ(kExpectedDefaultSearchPath, default_ns_config->search_paths());
-  ASSERT_EQ(kExpectedDefaultPermittedPath, default_ns_config->permitted_paths());
+  ASSERT_EQ(expected_default_search_path, default_ns_config->search_paths());
+  ASSERT_EQ(expected_default_permitted_path, default_ns_config->permitted_paths());
 
   const auto& default_ns_links = default_ns_config->links();
   ASSERT_EQ(2U, default_ns_links.size());
@@ -202,14 +238,14 @@
 
   ASSERT_TRUE(ns_system->isolated());
   ASSERT_TRUE(ns_system->visible());
-  ASSERT_EQ(kExpectedSystemSearchPath, ns_system->search_paths());
-  ASSERT_EQ(kExpectedSystemPermittedPath, ns_system->permitted_paths());
+  ASSERT_EQ(expected_system_search_path, ns_system->search_paths());
+  ASSERT_EQ(expected_system_permitted_path, ns_system->permitted_paths());
 
   ASSERT_TRUE(ns_vndk != nullptr) << "vndk namespace was not found";
 
   ASSERT_FALSE(ns_vndk->isolated()); // malformed bool property
   ASSERT_FALSE(ns_vndk->visible()); // undefined bool property
-  ASSERT_EQ(kExpectedVndkSearchPath, ns_vndk->search_paths());
+  ASSERT_EQ(expected_vndk_search_path, ns_vndk->search_paths());
 
   const auto& ns_vndk_links = ns_vndk->links();
   ASSERT_EQ(1U, ns_vndk_links.size());
@@ -223,11 +259,15 @@
 }
 
 TEST(linker_config, smoke) {
-  run_linker_config_smoke_test(false);
+  run_linker_config_smoke_test(SmokeTestType::None);
 }
 
 TEST(linker_config, asan_smoke) {
-  run_linker_config_smoke_test(true);
+  run_linker_config_smoke_test(SmokeTestType::Asan);
+}
+
+TEST(linker_config, hwasan_smoke) {
+  run_linker_config_smoke_test(SmokeTestType::Hwasan);
 }
 
 TEST(linker_config, ns_link_shared_libs_invalid_settings) {
@@ -259,6 +299,7 @@
   ASSERT_FALSE(Config::read_binary_config(tmp_file.path,
                                           executable_path.c_str(),
                                           false,
+                                          false,
                                           &config,
                                           &error_msg));
   ASSERT_TRUE(config == nullptr);
@@ -304,6 +345,7 @@
   ASSERT_TRUE(Config::read_binary_config(tmp_file.path,
                                          executable_path.c_str(),
                                          false,
+                                         false,
                                          &config,
                                          &error_msg)) << error_msg;
 
diff --git a/linker/linker_debuggerd.h b/linker/linker_debuggerd.h
index d701879..95f99e7 100644
--- a/linker/linker_debuggerd.h
+++ b/linker/linker_debuggerd.h
@@ -28,4 +28,7 @@
 
 #pragma once
 
+#include <signal.h>
+
 void linker_debuggerd_init();
+extern "C" bool debuggerd_handle_signal(int signal_number, siginfo_t* info, void* context);
diff --git a/linker/linker_debuggerd_android.cpp b/linker/linker_debuggerd_android.cpp
index cba6345..ab6fc30 100644
--- a/linker/linker_debuggerd_android.cpp
+++ b/linker/linker_debuggerd_android.cpp
@@ -43,6 +43,18 @@
       .scudo_stack_depot = __libc_shared_globals()->scudo_stack_depot,
       .scudo_region_info = __libc_shared_globals()->scudo_region_info,
       .scudo_ring_buffer = __libc_shared_globals()->scudo_ring_buffer,
+      .scudo_ring_buffer_size = __libc_shared_globals()->scudo_ring_buffer_size,
+  };
+}
+
+static gwp_asan_callbacks_t get_gwp_asan_callbacks() {
+  return {
+      .debuggerd_needs_gwp_asan_recovery =
+          __libc_shared_globals()->debuggerd_needs_gwp_asan_recovery,
+      .debuggerd_gwp_asan_pre_crash_report =
+          __libc_shared_globals()->debuggerd_gwp_asan_pre_crash_report,
+      .debuggerd_gwp_asan_post_crash_report =
+          __libc_shared_globals()->debuggerd_gwp_asan_post_crash_report,
   };
 }
 #endif
@@ -52,9 +64,10 @@
   // so don't pass in any process info from the bootstrap linker.
   debuggerd_callbacks_t callbacks = {
 #if defined(__ANDROID_APEX__)
-      .get_process_info = get_process_info,
+    .get_process_info = get_process_info,
+    .get_gwp_asan_callbacks = get_gwp_asan_callbacks,
 #endif
-      .post_dump = notify_gdb_of_libraries,
+    .post_dump = notify_gdb_of_libraries,
   };
   debuggerd_init(&callbacks);
 }
diff --git a/linker/linker_debuggerd_stub.cpp b/linker/linker_debuggerd_stub.cpp
index 631e6e4..c671dd9 100644
--- a/linker/linker_debuggerd_stub.cpp
+++ b/linker/linker_debuggerd_stub.cpp
@@ -28,5 +28,11 @@
 
 #include "linker_debuggerd.h"
 
+#include <signal.h>
+
 void linker_debuggerd_init() {
 }
+extern "C" bool debuggerd_handle_signal(int /* signal_number */, siginfo_t* /* info */,
+                                        void* /* context */) {
+  return false;
+}
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index f0e7b1b..26e2228 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -43,7 +43,6 @@
 #include "linker_tls.h"
 #include "linker_utils.h"
 
-#include "private/bionic_auxv.h"
 #include "private/bionic_call_ifunc_resolver.h"
 #include "private/bionic_globals.h"
 #include "private/bionic_tls.h"
@@ -203,35 +202,29 @@
   ElfW(Addr) entry_point;
 };
 
-static ExecutableInfo get_executable_info() {
+static ExecutableInfo get_executable_info(const char* arg_path) {
   ExecutableInfo result = {};
+  char const* exe_path = "/proc/self/exe";
 
-  if (is_first_stage_init()) {
-    // /proc fs is not mounted when first stage init starts. Therefore we can't
-    // use /proc/self/exe for init.
-    stat("/init", &result.file_stat);
-
-    // /init may be a symlink, so try to read it as such.
-    char path[PATH_MAX];
-    ssize_t path_len = readlink("/init", path, sizeof(path));
-    if (path_len == -1 || path_len >= static_cast<ssize_t>(sizeof(path))) {
-      result.path = "/init";
-    } else {
-      result.path = std::string(path, path_len);
+  // Stat "/proc/self/exe" instead of executable_path because
+  // the executable could be unlinked by this point and it should
+  // not cause a crash (see http://b/31084669)
+  if (TEMP_FAILURE_RETRY(stat(exe_path, &result.file_stat) == -1)) {
+    // Fallback to argv[0] for the case where /proc isn't available
+    if (TEMP_FAILURE_RETRY(stat(arg_path, &result.file_stat) == -1)) {
+      async_safe_fatal("unable to stat either \"/proc/self/exe\" or \"%s\": %s",
+          arg_path, strerror(errno));
     }
+    exe_path = arg_path;
+  }
+
+  // Path might be a symlink
+  char sym_path[PATH_MAX];
+  ssize_t sym_path_len = readlink(exe_path, sym_path, sizeof(sym_path));
+  if (sym_path_len > 0 && sym_path_len < static_cast<ssize_t>(sizeof(sym_path))) {
+    result.path = std::string(sym_path, sym_path_len);
   } else {
-    // Stat "/proc/self/exe" instead of executable_path because
-    // the executable could be unlinked by this point and it should
-    // not cause a crash (see http://b/31084669)
-    if (TEMP_FAILURE_RETRY(stat("/proc/self/exe", &result.file_stat)) != 0) {
-      async_safe_fatal("unable to stat \"/proc/self/exe\": %s", strerror(errno));
-    }
-    char path[PATH_MAX];
-    ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path));
-    if (path_len == -1 || path_len >= static_cast<ssize_t>(sizeof(path))) {
-      async_safe_fatal("readlink('/proc/self/exe') failed: %s", strerror(errno));
-    }
-    result.path = std::string(path, path_len);
+    result.path = std::string(exe_path, strlen(exe_path));
   }
 
   result.phdr = reinterpret_cast<const ElfW(Phdr)*>(getauxval(AT_PHDR));
@@ -359,7 +352,7 @@
   }
 
   const ExecutableInfo exe_info = exe_to_load ? load_executable(exe_to_load) :
-                                                get_executable_info();
+                                                get_executable_info(args.argv[0]);
 
   INFO("[ Linking executable \"%s\" ]", exe_info.path.c_str());
 
diff --git a/linker/linker_namespaces.h b/linker/linker_namespaces.h
index 6817901..671e0b5 100644
--- a/linker/linker_namespaces.h
+++ b/linker/linker_namespaces.h
@@ -41,11 +41,11 @@
 struct android_namespace_link_t {
  public:
   android_namespace_link_t(android_namespace_t* linked_namespace,
-                           const std::unordered_set<std::string>& shared_lib_sonames,
+                           std::unordered_set<std::string> shared_lib_sonames,
                            bool allow_all_shared_libs)
-      : linked_namespace_(linked_namespace), shared_lib_sonames_(shared_lib_sonames),
-        allow_all_shared_libs_(allow_all_shared_libs)
-  {}
+      : linked_namespace_(linked_namespace),
+        shared_lib_sonames_(std::move(shared_lib_sonames)),
+        allow_all_shared_libs_(allow_all_shared_libs) {}
 
   android_namespace_t* linked_namespace() const {
     return linked_namespace_;
@@ -127,10 +127,10 @@
     return linked_namespaces_;
   }
   void add_linked_namespace(android_namespace_t* linked_namespace,
-                            const std::unordered_set<std::string>& shared_lib_sonames,
+                            std::unordered_set<std::string> shared_lib_sonames,
                             bool allow_all_shared_libs) {
-    linked_namespaces_.push_back(
-        android_namespace_link_t(linked_namespace, shared_lib_sonames, allow_all_shared_libs));
+    linked_namespaces_.emplace_back(linked_namespace, std::move(shared_lib_sonames),
+                                    allow_all_shared_libs);
   }
 
   void add_soinfo(soinfo* si) {
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index 60fd776..73cfced 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -51,6 +51,8 @@
   return EM_AARCH64;
 #elif defined(__i386__)
   return EM_386;
+#elif defined(__riscv)
+  return EM_RISCV;
 #elif defined(__x86_64__)
   return EM_X86_64;
 #endif
@@ -173,7 +175,8 @@
   if (did_load_) {
     return true;
   }
-  if (ReserveAddressSpace(address_space) && LoadSegments() && FindPhdr() &&
+  bool reserveSuccess = ReserveAddressSpace(address_space);
+  if (reserveSuccess && LoadSegments() && FindPhdr() &&
       FindGnuPropertySection()) {
     did_load_ = true;
 #if defined(__aarch64__)
@@ -184,6 +187,13 @@
     }
 #endif
   }
+  if (reserveSuccess && !did_load_) {
+    if (load_start_ != nullptr && load_size_ != 0) {
+      if (!mapped_by_caller_) {
+        munmap(load_start_, load_size_);
+      }
+    }
+  }
 
   return did_load_;
 }
@@ -214,6 +224,7 @@
   if (em == EM_386) return "EM_386";
   if (em == EM_AARCH64) return "EM_AARCH64";
   if (em == EM_ARM) return "EM_ARM";
+  if (em == EM_RISCV) return "EM_RISCV";
   if (em == EM_X86_64) return "EM_X86_64";
   return "EM_???";
 }
diff --git a/linker/linker_relocate.cpp b/linker/linker_relocate.cpp
index c7c7bfb..952dade 100644
--- a/linker/linker_relocate.cpp
+++ b/linker/linker_relocate.cpp
@@ -49,7 +49,9 @@
     case R_GENERIC_TLS_DTPMOD:
     case R_GENERIC_TLS_DTPREL:
     case R_GENERIC_TLS_TPREL:
+#if defined(R_GENERIC_TLSDESC)
     case R_GENERIC_TLSDESC:
+#endif
       return true;
     default:
       return false;
@@ -426,7 +428,7 @@
     case R_GENERIC_TLS_DTPREL:
       count_relocation_if<IsGeneral>(kRelocRelative);
       {
-        const ElfW(Addr) result = sym_addr + get_addend_rel();
+        const ElfW(Addr) result = sym_addr + get_addend_rel() - TLS_DTV_OFFSET;
         trace_reloc("RELO TLS_DTPREL %16p <- %16p %s",
                     rel_target, reinterpret_cast<void*>(result), sym_name);
         *static_cast<ElfW(Addr)*>(rel_target) = result;
diff --git a/linker/linker_relocs.h b/linker/linker_relocs.h
index 93d899e..37a7880 100644
--- a/linker/linker_relocs.h
+++ b/linker/linker_relocs.h
@@ -73,6 +73,20 @@
 #define R_GENERIC_TLS_TPREL     R_386_TLS_TPOFF
 #define R_GENERIC_TLSDESC       R_386_TLS_DESC
 
+#elif defined (__riscv)
+
+#define R_GENERIC_JUMP_SLOT     R_RISCV_JUMP_SLOT
+#define R_GENERIC_ABSOLUTE      R_RISCV_64
+#define R_GENERIC_GLOB_DAT      R_RISCV_64
+#define R_GENERIC_RELATIVE      R_RISCV_RELATIVE
+#define R_GENERIC_IRELATIVE     R_RISCV_IRELATIVE
+#define R_GENERIC_COPY          R_RISCV_COPY
+#define R_GENERIC_TLS_DTPMOD    R_RISCV_TLS_DTPMOD64
+#define R_GENERIC_TLS_DTPREL    R_RISCV_TLS_DTPREL64
+#define R_GENERIC_TLS_TPREL     R_RISCV_TLS_TPREL64
+// TODO: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/94
+// #define R_GENERIC_TLSDESC       R_RISCV_TLS_DESC
+
 #elif defined (__x86_64__)
 
 #define R_GENERIC_JUMP_SLOT     R_X86_64_JUMP_SLOT
diff --git a/tests/Android.bp b/tests/Android.bp
index 71be058..281e29d 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -66,18 +66,20 @@
         "libcutils_headers",
         "gwp_asan_headers"
     ],
-    // Ensure that the tests exercise shadow call stack support and
-    // the hint space PAC/BTI instructions.
+    stl: "libc++",
+
+    // Ensure that the tests exercise shadow call stack support.
+    // We don't use `scs: true` here because that would give us a second
+    // variant of this library where we actually just want to say "this
+    // library should always be built this way".
     arch: {
         arm64: {
-            cflags: [
-                "-fsanitize=shadow-call-stack",
-                // Disable this option for now: see b/151372823
-                //"-mbranch-protection=standard",
-            ],
+            cflags: ["-fsanitize=shadow-call-stack"],
+        },
+        riscv64: {
+            cflags: ["-fsanitize=shadow-call-stack"],
         },
     },
-    stl: "libc++",
     sanitize: {
         address: false,
     },
@@ -105,6 +107,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-rw_load_segment.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-rw_load_segment.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-rw_load_segment.so"],
         },
@@ -128,6 +133,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-unaligned_shdr_offset.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-unaligned_shdr_offset.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-unaligned_shdr_offset.so"],
         },
@@ -151,6 +159,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shentsize.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shentsize.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shentsize.so"],
         },
@@ -174,6 +185,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shstrndx.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shstrndx.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shstrndx.so"],
         },
@@ -197,6 +211,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-empty_shdr_table.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-empty_shdr_table.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-empty_shdr_table.so"],
         },
@@ -220,6 +237,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shdr_table_offset.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_offset.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shdr_table_offset.so"],
         },
@@ -243,6 +263,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-zero_shdr_table_content.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_content.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-zero_shdr_table_content.so"],
         },
@@ -266,6 +289,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-textrels.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-textrels.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-textrels.so"],
         },
@@ -289,6 +315,9 @@
         arm64: {
             srcs: ["prebuilt-elf-files/arm64/libtest_invalid-textrels2.so"],
         },
+        riscv64: {
+            srcs: ["prebuilt-elf-files/riscv64/libtest_invalid-textrels2.so"],
+        },
         x86: {
             srcs: ["prebuilt-elf-files/x86/libtest_invalid-textrels2.so"],
         },
@@ -340,6 +369,9 @@
 cc_test_library {
     name: "libBionicStandardTests",
     defaults: ["bionic_tests_defaults"],
+    tidy_disabled_srcs: [
+        "malloc_test.cpp", // timed out with clang-tidy, and too many warnings
+    ],
     srcs: [
         "__aeabi_read_tp_test.cpp",
         "__cxa_atexit_test.cpp",
@@ -471,6 +503,7 @@
         "sys_vfs_test.cpp",
         "sys_wait_test.cpp",
         "sys_xattr_test.cpp",
+        "syslog_test.cpp",
         "system_properties_test.cpp",
         "system_properties_test2.cpp",
         "termios_test.cpp",
@@ -482,6 +515,7 @@
         "unistd_test.cpp",
         "utils.cpp",
         "utmp_test.cpp",
+        "utmpx_test.cpp",
         "wchar_test.cpp",
         "wctype_test.cpp",
     ],
@@ -508,6 +542,10 @@
 
                 // unsupported relocation type 37
                 "ifunc_test.cpp",
+
+                // musl #defines utmp to utmpx, causing a collision with
+                // utmpx_test.cpp
+                "utmp_test.cpp",
             ],
         },
     },
@@ -1079,6 +1117,30 @@
 }
 
 cc_test {
+    name: "hwasan_test",
+    enabled: false,
+    // This does not use bionic_tests_defaults because it is not supported on
+    // host.
+    arch: {
+        arm64: {
+            enabled: true,
+        },
+    },
+    sanitize: {
+        hwaddress: true,
+    },
+    srcs: [
+        "hwasan_test.cpp",
+    ],
+    shared_libs: [
+        "libbase",
+    ],
+    data_libs: ["libtest_simple_hwasan", "libtest_simple_hwasan_nohwasan"],
+    header_libs: ["bionic_libc_platform_headers"],
+    test_suites: ["device-tests"],
+}
+
+cc_test {
     name: "bionic-stress-tests",
     defaults: [
         "bionic_tests_defaults",
diff --git a/tests/NOTICE b/tests/NOTICE
index 167f90b..cc99d20 100644
--- a/tests/NOTICE
+++ b/tests/NOTICE
@@ -426,3 +426,31 @@
 
 -------------------------------------------------------------------
 
+Copyright (C) 2023 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
diff --git a/tests/__cxa_atexit_test.cpp b/tests/__cxa_atexit_test.cpp
index 6a122d1..9f73261 100644
--- a/tests/__cxa_atexit_test.cpp
+++ b/tests/__cxa_atexit_test.cpp
@@ -26,19 +26,30 @@
  * SUCH DAMAGE.
  */
 
-#include <cxxabi.h>
 #include <gtest/gtest.h>
 
+extern "C" {
+int __cxa_atexit(void (*func)(void*), void* arg, void* dso);
+
+// TODO(b/175635923). __cxa_finalize's return type should actually be "void",
+// but it is declared "int" here instead to be compatible with the declaration
+// in an old version of cxxabi.h, which is included indirectly. The declarations
+// of __cxa_atexit and __cxa_finalize are removed from newer versions of
+// cxxabi.h, so once libc++ is updated, this return type should be changed to
+// "void".
+int __cxa_finalize(void* dso);
+}
+
 TEST(__cxa_atexit, simple) {
   int counter = 0;
 
-  __cxxabiv1::__cxa_atexit([](void* arg) { ++*static_cast<int*>(arg); }, &counter, &counter);
+  __cxa_atexit([](void* arg) { ++*static_cast<int*>(arg); }, &counter, &counter);
 
-  __cxxabiv1::__cxa_finalize(&counter);
+  __cxa_finalize(&counter);
   ASSERT_EQ(counter, 1);
 
   // The handler won't be called twice.
-  __cxxabiv1::__cxa_finalize(&counter);
+  __cxa_finalize(&counter);
   ASSERT_EQ(counter, 1);
 }
 
@@ -54,16 +65,16 @@
   };
 
   for (int i = 0; i < 500; ++i) {
-    __cxxabiv1::__cxa_atexit(append_to_actual, new int{i}, &handles[i % 2]);
+    __cxa_atexit(append_to_actual, new int{i}, &handles[i % 2]);
   }
 
-  __cxxabiv1::__cxa_finalize(&handles[0]);
+  __cxa_finalize(&handles[0]);
 
   for (int i = 500; i < 750; ++i) {
-    __cxxabiv1::__cxa_atexit(append_to_actual, new int{i}, &handles[1]);
+    __cxa_atexit(append_to_actual, new int{i}, &handles[1]);
   }
 
-  __cxxabiv1::__cxa_finalize(&handles[1]);
+  __cxa_finalize(&handles[1]);
 
   std::vector<int> expected;
   for (int i = 498; i >= 0; i -= 2) expected.push_back(i);
diff --git a/tests/__cxa_demangle_test.cpp b/tests/__cxa_demangle_test.cpp
index 4628a61..d400619 100644
--- a/tests/__cxa_demangle_test.cpp
+++ b/tests/__cxa_demangle_test.cpp
@@ -29,11 +29,9 @@
 #include <cxxabi.h>
 #include <gtest/gtest.h>
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 TEST(__cxa_demangle, cxa_demangle_fuzz_152588929) {
 #if defined(__aarch64__)
-  char* p = __cxa_demangle("1\006ILeeeEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", 0, 0, 0);
+  char* p = abi::__cxa_demangle("1\006ILeeeEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", 0, 0, 0);
   ASSERT_STREQ("\x6<-0x1.cecececececececececececececep+11983", p);
   free(p);
 #endif
@@ -41,7 +39,7 @@
 
 TEST(__cxa_demangle, DISABLED_cxa_demangle_fuzz_167977068) {
 #if defined(__aarch64__)
-  char* p = __cxa_demangle("DTLeeeeeeeeeeeeeeeeeeeeeeeeeEEEEeeEEEE", 0, 0, 0);
+  char* p = abi::__cxa_demangle("DTLeeeeeeeeeeeeeeeeeeeeeeeeeEEEEeeEEEE", 0, 0, 0);
   ASSERT_EQ(nullptr, p) << p;
   free(p);
 #endif
diff --git a/tests/async_safe_test.cpp b/tests/async_safe_test.cpp
index f52387e..dc4db07 100644
--- a/tests/async_safe_test.cpp
+++ b/tests/async_safe_test.cpp
@@ -16,6 +16,8 @@
 
 #include <gtest/gtest.h>
 
+#include <errno.h>
+
 #if defined(__BIONIC__)
 #include <async_safe/log.h>
 #endif // __BIONIC__
@@ -227,3 +229,19 @@
   GTEST_SKIP() << "bionic-only test";
 #endif // __BIONIC__
 }
+
+// Verify that using %m is never cut off.
+TEST(async_safe_format_buffer, percent_m_fits_in_buffer) {
+#if defined(__BIONIC__)
+  for (int i = 0; i < 256; i++) {
+    errno = i;
+    char async_buf[256];
+    async_safe_format_buffer(async_buf, sizeof(async_buf), "%m");
+    char strerror_buf[1024];
+    strerror_r(errno, strerror_buf, sizeof(strerror_buf));
+    ASSERT_STREQ(strerror_buf, async_buf);
+  }
+#else   // __BIONIC__
+  GTEST_SKIP() << "bionic-only test";
+#endif  // __BIONIC__
+}
diff --git a/tests/clang_fortify_tests.cpp b/tests/clang_fortify_tests.cpp
index 40cb83f..544af43 100644
--- a/tests/clang_fortify_tests.cpp
+++ b/tests/clang_fortify_tests.cpp
@@ -387,6 +387,8 @@
 }
 
 static void testStdlib() {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   char path_buffer[PATH_MAX - 1];
   // expected-warning@+2{{ignoring return value of function}}
   // expected-error@+1{{must be NULL or a pointer to a buffer with >= PATH_MAX bytes}}
@@ -401,6 +403,7 @@
   // expected-warning@+2{{ignoring return value of function}}
   // expected-error@+1{{flipped arguments?}}
   realpath(nullptr, nullptr);
+#pragma clang diagnostic pop
 }
 }  // namespace compilation_tests
 #endif
diff --git a/tests/dl_test.cpp b/tests/dl_test.cpp
index a61586b..2f3e905 100644
--- a/tests/dl_test.cpp
+++ b/tests/dl_test.cpp
@@ -32,9 +32,10 @@
 #include <regex>
 #include <string>
 
-#include "gtest_globals.h"
 #include <android-base/file.h>
+#include <android-base/macros.h>
 #include <android-base/test_utils.h>
+#include "gtest_globals.h"
 #include "utils.h"
 
 extern "C" int main_global_default_serial() {
@@ -84,22 +85,13 @@
 
 #if defined(__BIONIC__)
 #if defined(__LP64__)
-  static constexpr const char* kPathToLinker = "/system/bin/linker64";
+#define LINKER_NAME "linker64"
 #else
-  static constexpr const char* kPathToLinker = "/system/bin/linker";
+#define LINKER_NAME "linker"
 #endif
-
-#if defined (__aarch64__)
-  static constexpr const char* kAlternatePathToLinker = "/system/bin/arm64/linker64";
-#elif defined (__arm__)
-  static constexpr const char* kAlternatePathToLinker = "/system/bin/arm/linker";
-#elif defined (__x86_64__)
-  static constexpr const char* kAlternatePathToLinker = "/system/bin/x86_64/linker64";
-#elif defined (__i386__)
-  static constexpr const char* kAlternatePathToLinker = "/system/bin/x86/linker";
-#else
-#error "Unknown architecture"
-#endif
+static constexpr const char* kPathToLinker = "/system/bin/" LINKER_NAME;
+static constexpr const char* kAlternatePathToLinker = "/system/bin/" ABI_STRING "/" LINKER_NAME;
+#undef LINKER_NAME
 
 const char* PathToLinker() {
   // On the systems with emulated architecture linker would be of different
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index 940e726..b68ee7b 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -33,6 +33,7 @@
 #include <thread>
 
 #include <android-base/file.h>
+#include <android-base/macros.h>
 #include <android-base/scopeguard.h>
 
 #include "gtest_globals.h"
@@ -888,11 +889,14 @@
   void* sym;
 
 #if defined(__BIONIC__) && !defined(__LP64__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   // RTLD_DEFAULT in lp32 bionic is not (void*)0
   // so it can be distinguished from the NULL handle.
   sym = dlsym(nullptr, "test");
   ASSERT_TRUE(sym == nullptr);
   ASSERT_STREQ("dlsym failed: library handle is null", dlerror());
+#pragma clang diagnostic pop
 #endif
 
   // Symbol that doesn't exist.
@@ -966,20 +970,16 @@
 #endif
 }
 
-#if defined (__aarch64__)
-#define ALTERNATE_PATH_TO_SYSTEM_LIB "/system/lib64/arm64/"
-#elif defined (__arm__)
-#define ALTERNATE_PATH_TO_SYSTEM_LIB "/system/lib/arm/"
-#elif defined (__i386__)
-#define ALTERNATE_PATH_TO_SYSTEM_LIB "/system/lib/x86/"
-#elif defined (__x86_64__)
-#define ALTERNATE_PATH_TO_SYSTEM_LIB "/system/lib64/x86_64/"
+#define ALTERNATE_PATH_TO_SYSTEM_LIB "/system/lib64/" ABI_STRING "/"
+#if __has_feature(hwaddress_sanitizer)
+#define PATH_TO_LIBC PATH_TO_SYSTEM_LIB "hwasan/libc.so"
+#define PATH_TO_BOOTSTRAP_LIBC PATH_TO_SYSTEM_LIB "bootstrap/hwasan/libc.so"
+#define ALTERNATE_PATH_TO_LIBC ALTERNATE_PATH_TO_SYSTEM_LIB "hwasan/libc.so"
 #else
-#error "Unknown architecture"
-#endif
 #define PATH_TO_LIBC PATH_TO_SYSTEM_LIB "libc.so"
 #define PATH_TO_BOOTSTRAP_LIBC PATH_TO_SYSTEM_LIB "bootstrap/libc.so"
 #define ALTERNATE_PATH_TO_LIBC ALTERNATE_PATH_TO_SYSTEM_LIB "libc.so"
+#endif
 
 TEST(dlfcn, dladdr_libc) {
 #if defined(__GLIBC__)
@@ -987,24 +987,25 @@
 #endif
 
   Dl_info info;
-  void* addr = reinterpret_cast<void*>(puts); // well-known libc function
+  void* addr = reinterpret_cast<void*>(puts);  // An arbitrary libc function.
   ASSERT_TRUE(dladdr(addr, &info) != 0);
 
-  char libc_realpath[PATH_MAX];
-
   // Check if libc is in canonical path or in alternate path.
+  const char* expected_path;
   if (strncmp(ALTERNATE_PATH_TO_SYSTEM_LIB,
               info.dli_fname,
               sizeof(ALTERNATE_PATH_TO_SYSTEM_LIB) - 1) == 0) {
     // Platform with emulated architecture.  Symlink on ARC++.
-    ASSERT_TRUE(realpath(ALTERNATE_PATH_TO_LIBC, libc_realpath) == libc_realpath);
+    expected_path = ALTERNATE_PATH_TO_LIBC;
   } else if (strncmp(PATH_TO_BOOTSTRAP_LIBC, info.dli_fname,
                      sizeof(PATH_TO_BOOTSTRAP_LIBC) - 1) == 0) {
-    ASSERT_TRUE(realpath(PATH_TO_BOOTSTRAP_LIBC, libc_realpath) == libc_realpath);
+    expected_path = PATH_TO_BOOTSTRAP_LIBC;
   } else {
     // /system/lib is symlink when this test is executed on host.
-    ASSERT_TRUE(realpath(PATH_TO_LIBC, libc_realpath) == libc_realpath);
+    expected_path = PATH_TO_LIBC;
   }
+  char libc_realpath[PATH_MAX];
+  ASSERT_TRUE(realpath(expected_path, libc_realpath) != nullptr) << strerror(errno);
 
   ASSERT_STREQ(libc_realpath, info.dli_fname);
   // TODO: add check for dfi_fbase
@@ -1017,9 +1018,12 @@
 
   dlerror(); // Clear any pending errors.
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   // No symbol corresponding to NULL.
   ASSERT_EQ(dladdr(nullptr, &info), 0); // Zero on error, non-zero on success.
   ASSERT_TRUE(dlerror() == nullptr); // dladdr(3) doesn't set dlerror(3).
+#pragma clang diagnostic pop
 
   // No symbol corresponding to a stack address.
   ASSERT_EQ(dladdr(&info, &info), 0); // Zero on error, non-zero on success.
@@ -1655,6 +1659,9 @@
 }
 
 TEST(dlfcn, dlopen_invalid_local_tls) {
+#if defined(__riscv)
+  // This is a test for bad gold behavior, and gold doesn't support riscv64.
+#else
   const std::string libpath = GetPrebuiltElfDir() + "/libtest_invalid-local-tls.so";
 
   void* handle = dlopen(libpath.c_str(), RTLD_NOW);
@@ -1667,6 +1674,7 @@
   std::string expected_dlerror = std::string("dlopen failed: unexpected TLS reference to ") +
                                  referent + " in \"" + libpath + "\"";
   ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
+#endif
 }
 
 TEST(dlfcn, dlopen_df_1_global) {
diff --git a/tests/elftls_dl_test.cpp b/tests/elftls_dl_test.cpp
index 82ccf82..56736e7 100644
--- a/tests/elftls_dl_test.cpp
+++ b/tests/elftls_dl_test.cpp
@@ -30,6 +30,7 @@
 #include <link.h>
 
 #include <android-base/file.h>
+#include <android-base/test_utils.h>
 #include <gtest/gtest.h>
 
 #include <thread>
@@ -153,6 +154,7 @@
 }
 
 TEST(elftls_dl, dtv_resize) {
+  SKIP_WITH_HWASAN; // TODO(b/271243811): Fix for new toolchain
 #if defined(__BIONIC__)
 #define LOAD_LIB(soname) ({                           \
     auto lib = dlopen(soname, RTLD_LOCAL | RTLD_NOW); \
diff --git a/tests/fcntl_test.cpp b/tests/fcntl_test.cpp
index d50a438..862f498 100644
--- a/tests/fcntl_test.cpp
+++ b/tests/fcntl_test.cpp
@@ -23,6 +23,7 @@
 #include <sys/vfs.h>
 
 #include <android-base/file.h>
+#include <android-base/silent_death_test.h>
 #include <android-base/stringprintf.h>
 
 // Glibc v2.19 doesn't include these in fcntl.h so host builds will fail without.
@@ -33,6 +34,8 @@
 #include <linux/magic.h>
 #endif
 
+using fcntl_DeathTest = SilentDeathTest;
+
 TEST(fcntl, fcntl_smoke) {
   int fd = open("/proc/version", O_RDONLY);
   ASSERT_TRUE(fd != -1);
@@ -356,3 +359,7 @@
   ASSERT_EQ(0, close(fd));
 #endif
 }
+
+TEST(fcntl_DeathTest, fcntl_F_SETFD) {
+  EXPECT_DEATH(fcntl(0, F_SETFD, O_NONBLOCK), "non-FD_CLOEXEC");
+}
diff --git a/tests/fenv_test.cpp b/tests/fenv_test.cpp
index c5b5eca..9cf9d98 100644
--- a/tests/fenv_test.cpp
+++ b/tests/fenv_test.cpp
@@ -117,6 +117,21 @@
   ASSERT_EQ(FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
 }
 
+TEST(fenv, fegetenv_fesetenv_rounding_mode) {
+  // Test that fegetenv()/fesetenv() includes the rounding mode.
+  fesetround(FE_DOWNWARD);
+  ASSERT_EQ(FE_DOWNWARD, fegetround());
+
+  fenv_t env;
+  fegetenv(&env);
+
+  fesetround(FE_UPWARD);
+  ASSERT_EQ(FE_UPWARD, fegetround());
+
+  fesetenv(&env);
+  ASSERT_EQ(FE_DOWNWARD, fegetround());
+}
+
 TEST(fenv, feholdexcept_feupdateenv) {
   // Set FE_OVERFLOW only.
   feclearexcept(FE_ALL_EXCEPT);
@@ -187,9 +202,10 @@
 
 TEST(fenv, feenableexcept_fegetexcept) {
 #if !defined(ANDROID_HOST_MUSL)
-#if defined(__aarch64__) || defined(__arm__)
-  // ARM doesn't support this. They used to if you go back far enough, but it was removed in
-  // the Cortex-A8 between r3p1 and r3p2.
+#if defined(__aarch64__) || defined(__arm__) || defined(__riscv)
+  // ARM and RISC-V don't support hardware trapping of floating point
+  // exceptions. ARM used to if you go back far enough, but it was
+  // removed in the Cortex-A8 between r3p1 and r3p2. RISC-V never has.
   ASSERT_EQ(-1, feenableexcept(FE_INVALID));
   ASSERT_EQ(0, fegetexcept());
   ASSERT_EQ(-1, feenableexcept(FE_DIVBYZERO));
@@ -200,8 +216,10 @@
   ASSERT_EQ(0, fegetexcept());
   ASSERT_EQ(-1, feenableexcept(FE_INEXACT));
   ASSERT_EQ(0, fegetexcept());
+#if defined(_FE_DENORMAL)  // riscv64 doesn't support this.
   ASSERT_EQ(-1, feenableexcept(FE_DENORMAL));
   ASSERT_EQ(0, fegetexcept());
+#endif
 #else
   // We can't recover from SIGFPE, so sacrifice a child...
   pid_t pid = fork();
diff --git a/tests/fortify_test.cpp b/tests/fortify_test.cpp
index 4abee67..cc3080d 100644
--- a/tests/fortify_test.cpp
+++ b/tests/fortify_test.cpp
@@ -670,6 +670,10 @@
   ASSERT_FORTIFY(readlinkat(AT_FDCWD, "/dev/null", buf, ct));
 }
 
+TEST(TEST_NAME, snprintf_nullptr_valid) {
+  ASSERT_EQ(10, snprintf(nullptr, 0, "0123456789"));
+}
+
 extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
 extern "C" char* __strcat_chk(char*, const char*, size_t);
 
diff --git a/tests/grp_pwd_test.cpp b/tests/grp_pwd_test.cpp
index bf65720..65a54a6 100644
--- a/tests/grp_pwd_test.cpp
+++ b/tests/grp_pwd_test.cpp
@@ -441,6 +441,17 @@
     }
     return result;
   };
+
+  // AID_PRNG_SEEDER (1092) was added in TM-QPR2, but CTS is shared
+  // across Android 13 versions so we may or may not find it in this
+  // test (b/253185870).
+  if (android::base::GetIntProperty("ro.build.version.sdk", 0) == __ANDROID_API_T__) {
+#ifndef AID_PRNG_SEEDER
+#define AID_PRNG_SEEDER 1092
+#endif
+    ids.erase(AID_PRNG_SEEDER);
+    expected_ids.erase(AID_PRNG_SEEDER);
+  }
   EXPECT_EQ(expected_ids, ids) << return_differences();
 }
 #endif
diff --git a/tests/gwp_asan_test.cpp b/tests/gwp_asan_test.cpp
index 5f5e3dd..c31f48c 100644
--- a/tests/gwp_asan_test.cpp
+++ b/tests/gwp_asan_test.cpp
@@ -34,6 +34,7 @@
 #if defined(__BIONIC__)
 
 #include "android-base/file.h"
+#include "android-base/test_utils.h"
 #include "gwp_asan/options.h"
 #include "platform/bionic/malloc.h"
 #include "sys/system_properties.h"
@@ -57,6 +58,9 @@
 // the torture mode is is generally 40,000, so that svelte devices don't
 // explode, as this uses ~163MiB RAM (4KiB per live allocation).
 TEST(gwp_asan_integration, malloc_tests_under_torture) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   RunGwpAsanTest("malloc.*:-malloc.mallinfo*");
 }
 
@@ -139,6 +143,16 @@
   EXPECT_DEATH({ *x = 7; }, "");
 }
 
+// A weaker version of the above tests, only checking that GWP-ASan is enabled
+// for any pointer, not *our* pointer. This allows us to test the system_default
+// sysprops without potentially OOM-ing other random processes:
+// b/273904016#comment5
+TEST(gwp_asan_integration, DISABLED_assert_gwp_asan_enabled_weaker) {
+  std::string maps;
+  EXPECT_TRUE(android::base::ReadFileToString("/proc/self/maps", &maps));
+  EXPECT_TRUE(maps.find("GWP-ASan") != std::string::npos) << maps;
+}
+
 TEST(gwp_asan_integration, DISABLED_assert_gwp_asan_disabled) {
   std::string maps;
   EXPECT_TRUE(android::base::ReadFileToString("/proc/self/maps", &maps));
@@ -146,6 +160,9 @@
 }
 
 TEST(gwp_asan_integration, sysprops_program_specific) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   std::string path = testing::internal::GetArgvs()[0];
@@ -160,6 +177,9 @@
 }
 
 TEST(gwp_asan_integration, sysprops_persist_program_specific) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   std::string path = testing::internal::GetArgvs()[0];
@@ -174,41 +194,32 @@
   RunSubtestNoEnv("gwp_asan_integration.DISABLED_assert_gwp_asan_enabled");
 }
 
-TEST(gwp_asan_integration, sysprops_system) {
-  SyspropRestorer restorer;
-
-  __system_property_set("libc.debug.gwp_asan.sample_rate.system_default", "1");
-  __system_property_set("libc.debug.gwp_asan.process_sampling.system_default", "1");
-  __system_property_set("libc.debug.gwp_asan.max_allocs.system_default", "40000");
-
-  RunSubtestNoEnv("gwp_asan_integration.DISABLED_assert_gwp_asan_enabled");
-}
-
-TEST(gwp_asan_integration, sysprops_persist_system) {
-  SyspropRestorer restorer;
-
-  __system_property_set("persist.libc.debug.gwp_asan.sample_rate.system_default", "1");
-  __system_property_set("persist.libc.debug.gwp_asan.process_sampling.system_default", "1");
-  __system_property_set("persist.libc.debug.gwp_asan.max_allocs.system_default", "40000");
-
-  RunSubtestNoEnv("gwp_asan_integration.DISABLED_assert_gwp_asan_enabled");
-}
-
 TEST(gwp_asan_integration, sysprops_non_persist_overrides_persist) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   __system_property_set("libc.debug.gwp_asan.sample_rate.system_default", "1");
   __system_property_set("libc.debug.gwp_asan.process_sampling.system_default", "1");
-  __system_property_set("libc.debug.gwp_asan.max_allocs.system_default", "40000");
+  // Note, any processes launched elsewhere on the system right now will have
+  // GWP-ASan enabled. Make sure that we only use a single slot, otherwise we
+  // could end up causing said badly-timed processes to use up to 163MiB extra
+  // penalty that 40,000 allocs would cause. See b/273904016#comment5 for more
+  // context.
+  __system_property_set("libc.debug.gwp_asan.max_allocs.system_default", "1");
 
   __system_property_set("persist.libc.debug.gwp_asan.sample_rate.system_default", "0");
   __system_property_set("persist.libc.debug.gwp_asan.process_sampling.system_default", "0");
   __system_property_set("persist.libc.debug.gwp_asan.max_allocs.system_default", "0");
 
-  RunSubtestNoEnv("gwp_asan_integration.DISABLED_assert_gwp_asan_enabled");
+  RunSubtestNoEnv("gwp_asan_integration.DISABLED_assert_gwp_asan_enabled_weaker");
 }
 
 TEST(gwp_asan_integration, sysprops_program_specific_overrides_default) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   std::string path = testing::internal::GetArgvs()[0];
@@ -228,6 +239,9 @@
 }
 
 TEST(gwp_asan_integration, sysprops_can_disable) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   __system_property_set("libc.debug.gwp_asan.sample_rate.system_default", "0");
@@ -238,6 +252,9 @@
 }
 
 TEST(gwp_asan_integration, env_overrides_sysprop) {
+  // Do not override HWASan with GWP ASan.
+  SKIP_WITH_HWASAN;
+
   SyspropRestorer restorer;
 
   __system_property_set("libc.debug.gwp_asan.sample_rate.system_default", "0");
diff --git a/tests/headers/posix/Android.bp b/tests/headers/posix/Android.bp
index 4a20d45..0809cdb 100644
--- a/tests/headers/posix/Android.bp
+++ b/tests/headers/posix/Android.bp
@@ -33,8 +33,5 @@
         darwin: {
             enabled: false,
         },
-        musl: {
-            enabled: false,
-        },
     },
 }
diff --git a/tests/headers/posix/fcntl_h.c b/tests/headers/posix/fcntl_h.c
index a55fe89..418add0 100644
--- a/tests/headers/posix/fcntl_h.c
+++ b/tests/headers/posix/fcntl_h.c
@@ -84,7 +84,11 @@
 
   // POSIX: "The <fcntl.h> header shall define the symbolic constants for
   // file modes for use as values of mode_t as described in <sys/stat.h>."
+  // Musl only defines the file mode bits (S_IFUSR, etc.) and not the file
+  // type bits (S_IFMT, etc.).
+#if !defined(ANDROID_HOST_MUSL)
 #include "sys_stat_h_mode_constants.h"
+#endif
 
   MACRO(AT_FDCWD);
 #if !defined(__BIONIC__) // See comment in "faccessat.cpp".
diff --git a/tests/headers/posix/limits_h.c b/tests/headers/posix/limits_h.c
index 143f717..7e92d81 100644
--- a/tests/headers/posix/limits_h.c
+++ b/tests/headers/posix/limits_h.c
@@ -32,15 +32,17 @@
 
 static void limits_h() {
   // These are only defined if they're constants.
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(AIO_LISTIO_MAX);
   MACRO(AIO_MAX);
 #endif
-#if !defined(__BIONIC__)
+#if !defined(__BIONIC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(AIO_PRIO_DELTA_MAX);
 #endif
 #if !defined(__BIONIC__) && !defined(__GLIBC__)
   MACRO(ARG_MAX);
+#endif
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(ATEXIT_MAX);
   MACRO(CHILD_MAX);
 #endif
@@ -50,14 +52,16 @@
   MACRO(HOST_NAME_MAX);
   MACRO(IOV_MAX);
   MACRO(LOGIN_NAME_MAX);
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(MQ_OPEN_MAX);
 #endif
 #if !defined(__BIONIC__)
   MACRO(MQ_PRIO_MAX);
 #endif
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(OPEN_MAX);
+#endif
+#if !defined(__BIONIC__) && !defined(__GLIBC__)
   MACRO(PAGESIZE);
   MACRO(PAGE_SIZE);
 #endif
@@ -66,19 +70,25 @@
 #if !defined(__BIONIC__)
   MACRO(PTHREAD_STACK_MIN);
 #endif
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(PTHREAD_THREADS_MAX);
 #endif
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(RTSIG_MAX);
+#endif
 #if !defined(__BIONIC__) && !defined(__GLIBC__)
   MACRO(SEM_NSEMS_MAX);
 #endif
   MACRO(SEM_VALUE_MAX);
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(SIGQUEUE_MAX);
   MACRO(SS_REPL_MAX);
   MACRO(STREAM_MAX);
+#endif
+#if !defined(__BIONIC__) && !defined(__GLIBC__)
   MACRO(SYMLOOP_MAX);
+#endif
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(TIMER_MAX);
 #endif
 #if !defined(__BIONIC__)
@@ -90,10 +100,14 @@
 
 #if !defined(__BIONIC__) && !defined(__GLIBC__)
   MACRO(FILESIZEBITS);
+#endif
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(LINK_MAX);
 #endif
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(MAX_CANON);
   MACRO(MAX_INPUT);
+#endif
   MACRO(NAME_MAX);
   MACRO(PATH_MAX);
   MACRO(PIPE_BUF);
@@ -104,7 +118,7 @@
   MACRO(POSIX_REC_MIN_XFER_SIZE);
   MACRO(POSIX_REC_XFER_ALIGN);
 #endif
-#if !defined(__BIONIC__) && !defined(__GLIBC__)
+#if !defined(__BIONIC__) && !defined(__GLIBC__) && !defined(ANDROID_HOST_MUSL)
   MACRO(SYMLINK_MAX);
 #endif
 
diff --git a/tests/headers/posix/sys_stat_h.c b/tests/headers/posix/sys_stat_h.c
index b22e34f..a299426 100644
--- a/tests/headers/posix/sys_stat_h.c
+++ b/tests/headers/posix/sys_stat_h.c
@@ -69,7 +69,7 @@
   STRUCT_MEMBER(struct stat, struct timespec, st_mtim);
   STRUCT_MEMBER(struct stat, struct timespec, st_ctim);
 #if defined(__BIONIC__)
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__riscv)
   STRUCT_MEMBER(struct stat, int, st_blksize);
 #elif defined(__x86_64__)
   STRUCT_MEMBER(struct stat, long, st_blksize);
diff --git a/tests/headers/posix/unistd_h.c b/tests/headers/posix/unistd_h.c
index b713f53..0b2cee5 100644
--- a/tests/headers/posix/unistd_h.c
+++ b/tests/headers/posix/unistd_h.c
@@ -51,8 +51,10 @@
   MACRO(_POSIX_MESSAGE_PASSING);
   MACRO(_POSIX_MONOTONIC_CLOCK);
   MACRO(_POSIX_NO_TRUNC);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_PRIORITIZED_IO);
   MACRO(_POSIX_PRIORITY_SCHEDULING);
+#endif
   MACRO(_POSIX_RAW_SOCKETS);
   MACRO(_POSIX_READER_WRITER_LOCKS);
   MACRO(_POSIX_REALTIME_SIGNALS);
@@ -63,35 +65,51 @@
   MACRO(_POSIX_SHELL);
   MACRO(_POSIX_SPAWN);
   MACRO(_POSIX_SPIN_LOCKS);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_SPORADIC_SERVER);
   MACRO(_POSIX_SYNCHRONIZED_IO);
+#endif
   MACRO(_POSIX_THREAD_ATTR_STACKADDR);
   MACRO(_POSIX_THREAD_ATTR_STACKSIZE);
   MACRO(_POSIX_THREAD_CPUTIME);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_THREAD_PRIO_INHERIT);
   MACRO(_POSIX_THREAD_PRIO_PROTECT);
+#endif
   MACRO(_POSIX_THREAD_PRIORITY_SCHEDULING);
   MACRO(_POSIX_THREAD_PROCESS_SHARED);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_THREAD_ROBUST_PRIO_INHERIT);
   MACRO(_POSIX_THREAD_ROBUST_PRIO_PROTECT);
+#endif
   MACRO(_POSIX_THREAD_SAFE_FUNCTIONS);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_THREAD_SPORADIC_SERVER);
+#endif
   MACRO(_POSIX_THREADS);
   MACRO(_POSIX_TIMEOUTS);
   MACRO(_POSIX_TIMERS);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX_TYPED_MEMORY_OBJECTS);
+#endif
   MACRO(_POSIX2_C_BIND);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_POSIX2_CHAR_TERM);
   MACRO(_POSIX2_LOCALEDEF);
   MACRO(_POSIX2_SW_DEV);
+#endif
 #if 0 // No libc I can find actually has this.
   MACRO(_POSIX2_UPE);
 #endif
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_XOPEN_CRYPT);
+#endif
   MACRO(_XOPEN_ENH_I18N);
+#if !defined(ANDROID_HOST_MUSL)
   MACRO(_XOPEN_REALTIME);
   MACRO(_XOPEN_REALTIME_THREADS);
   MACRO(_XOPEN_SHM);
+#endif
   MACRO(_XOPEN_UNIX);
 #if defined(_XOPEN_UUCP)
 #if _XOPEN_UUCP != -1 && _XOPEN_UUCP != 0 && _XOPEN_UUCP != 200809L
diff --git a/tests/headers/posix/utmpx_h.c b/tests/headers/posix/utmpx_h.c
new file mode 100644
index 0000000..44dfac9
--- /dev/null
+++ b/tests/headers/posix/utmpx_h.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <utmpx.h>
+
+#include "header_checks.h"
+
+static void utmpx_h() {
+  TYPE(struct utmpx);
+  STRUCT_MEMBER_ARRAY(struct utmpx, char/*[]*/, ut_user);
+  STRUCT_MEMBER_ARRAY(struct utmpx, char/*[]*/, ut_id);
+  STRUCT_MEMBER_ARRAY(struct utmpx, char/*[]*/, ut_line);
+  STRUCT_MEMBER(struct utmpx, pid_t, ut_pid);
+  STRUCT_MEMBER(struct utmpx, short, ut_type);
+#if !defined(__GLIBC__)
+  // POSIX says struct timeval, but glibc has an anonymous struct.
+  STRUCT_MEMBER(struct utmpx, struct timeval, ut_tv);
+#endif
+
+  TYPE(pid_t);
+  TYPE(struct timeval);
+
+  MACRO(EMPTY);
+  MACRO(BOOT_TIME);
+  MACRO(OLD_TIME);
+  MACRO(NEW_TIME);
+  MACRO(USER_PROCESS);
+  MACRO(INIT_PROCESS);
+  MACRO(LOGIN_PROCESS);
+  MACRO(DEAD_PROCESS);
+
+  FUNCTION(endutxent, void (*f)(void));
+  FUNCTION(getutxent, struct utmpx* (*f)(void));
+  FUNCTION(getutxid, struct utmpx* (*f)(const struct utmpx*));
+  FUNCTION(getutxline, struct utmpx* (*f)(const struct utmpx*));
+  FUNCTION(pututxline, struct utmpx* (*f)(const struct utmpx*));
+  FUNCTION(setutxent, void (*f)(void));
+}
diff --git a/tests/heap_tagging_level_test.cpp b/tests/heap_tagging_level_test.cpp
index 96c2ffd..917be37 100644
--- a/tests/heap_tagging_level_test.cpp
+++ b/tests/heap_tagging_level_test.cpp
@@ -26,6 +26,7 @@
 
 #include "SignalUtils.h"
 
+#include <android-base/properties.h>
 #include <android-base/test_utils.h>
 #include <bionic/malloc_tagged_pointers.h>
 
@@ -222,6 +223,10 @@
 
 TEST_P(MemtagNoteTest, SEGV) {
 #if defined(__BIONIC__) && defined(__aarch64__)
+  SKIP_WITH_NATIVE_BRIDGE;  // http://b/242170715
+  if (android::base::GetProperty("persist.arm64.memtag.default", "") != "") {
+    GTEST_SKIP() << "not supported when overriding memtag mode with property";
+  }
   // Note that we do not check running_with_hwasan() - what matters here is whether the test binary
   // itself is built with HWASan.
   bool withHWASAN = __has_feature(hwaddress_sanitizer);
diff --git a/tests/hwasan_test.cpp b/tests/hwasan_test.cpp
new file mode 100644
index 0000000..e32534e
--- /dev/null
+++ b/tests/hwasan_test.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#include <gtest/gtest.h>
+
+#include <android-base/silent_death_test.h>
+#include <android-base/test_utils.h>
+
+using HwasanDeathTest = SilentDeathTest;
+
+TEST_F(HwasanDeathTest, UseAfterFree) {
+  EXPECT_DEATH(
+      {
+        void* m = malloc(1);
+        volatile char* x = const_cast<volatile char*>(reinterpret_cast<char*>(m));
+        *x = 1;
+        free(m);
+        *x = 2;
+      },
+      "use-after-free");
+}
+
+TEST_F(HwasanDeathTest, OutOfBounds) {
+  EXPECT_DEATH(
+      {
+        void* m = malloc(1);
+        volatile char* x = const_cast<volatile char*>(reinterpret_cast<char*>(m));
+        x[1] = 1;
+      },
+      "buffer-overflow");
+}
+
+// Check whether dlopen of /foo/bar.so checks /foo/hwasan/bar.so first.
+TEST(HwasanTest, DlopenAbsolutePath) {
+  std::string path = android::base::GetExecutableDirectory() + "/libtest_simple_hwasan.so";
+  ASSERT_EQ(0, access(path.c_str(), F_OK));  // Verify test setup.
+  std::string hwasan_path =
+      android::base::GetExecutableDirectory() + "/hwasan/libtest_simple_hwasan.so";
+  ASSERT_EQ(0, access(hwasan_path.c_str(), F_OK));  // Verify test setup.
+
+  void* handle = dlopen(path.c_str(), RTLD_NOW);
+  ASSERT_TRUE(handle != nullptr);
+  uint32_t* compiled_with_hwasan =
+      reinterpret_cast<uint32_t*>(dlsym(handle, "dlopen_testlib_compiled_with_hwasan"));
+  EXPECT_TRUE(*compiled_with_hwasan);
+  dlclose(handle);
+}
+
+TEST(HwasanTest, IsRunningWithHWasan) {
+  EXPECT_TRUE(running_with_hwasan());
+}
diff --git a/tests/libs/Android.bp b/tests/libs/Android.bp
index 66a902e..a2fbe55 100644
--- a/tests/libs/Android.bp
+++ b/tests/libs/Android.bp
@@ -41,6 +41,9 @@
             enabled: false,
         },
     },
+    strip: {
+        none: true,
+    },
 }
 
 // -----------------------------------------------------------------------------
@@ -240,6 +243,38 @@
 }
 
 // -----------------------------------------------------------------------------
+// Libraries used by hwasan_test
+// -----------------------------------------------------------------------------
+cc_test_library {
+    name: "libtest_simple_hwasan",
+    arch: {
+        arm64: {
+            enabled: true,
+        },
+    },
+    sanitize: {
+        hwaddress: true,
+    },
+    relative_install_path: "hwasan",
+    enabled: false,
+    srcs: ["dlopen_testlib_simple_hwasan.cpp"],
+}
+
+cc_test_library {
+    // A weird name. This is the vanilla (non-HWASan) copy of the library that
+    // is used for the hwasan test.
+    name: "libtest_simple_hwasan_nohwasan",
+    arch: {
+        arm64: {
+            enabled: true,
+        },
+    },
+    stem: "libtest_simple_hwasan",
+    enabled: false,
+    srcs: ["dlopen_testlib_simple_hwasan.cpp"],
+}
+
+// -----------------------------------------------------------------------------
 // Library used by dlext direct unload on the namespace boundary tests
 // -----------------------------------------------------------------------------
 cc_test_library {
@@ -1532,12 +1567,6 @@
     host_supported: false,
     defaults: ["bionic_testlib_defaults"],
     srcs: ["relocations.cpp"],
-
-    // Hack to ensure we're using llvm-objcopy because our binutils prebuilt
-    // only supports the old numbers (http://b/141010852).
-    strip: {
-      keep_symbols: true,
-    },
 }
 
 // This is the same encoding as SHT_RELR, but using OS-specific constants.
@@ -1664,6 +1693,7 @@
      },
    },
    header_libs: ["bionic_libc_platform_headers"],
+   cflags: ["-fexceptions"],
 }
 
 cc_test {
@@ -1679,6 +1709,7 @@
      },
    },
    header_libs: ["bionic_libc_platform_headers"],
+   cflags: ["-fexceptions"],
 }
 
 cc_genrule {
diff --git a/libc/include/android/legacy_errno_inlines.h b/tests/libs/dlopen_testlib_simple_hwasan.cpp
similarity index 80%
rename from libc/include/android/legacy_errno_inlines.h
rename to tests/libs/dlopen_testlib_simple_hwasan.cpp
index fcbca13..ddf8a31 100644
--- a/libc/include/android/legacy_errno_inlines.h
+++ b/tests/libs/dlopen_testlib_simple_hwasan.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,21 +26,14 @@
  * SUCH DAMAGE.
  */
 
-#pragma once
+#include <stdint.h>
 
-#include <sys/cdefs.h>
-
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
-
-__BEGIN_DECLS
-
-static __inline int __attribute__((deprecated)) __set_errno(int n) {
-  errno = n;
-  return -1;
-}
-
-__END_DECLS
-
+#if __has_feature(hwaddress_sanitizer)
+extern "C" uint32_t dlopen_testlib_compiled_with_hwasan = true;
+#else
+extern "C" uint32_t dlopen_testlib_compiled_with_hwasan = false;
 #endif
+
+extern "C" bool dlopen_testlib_simple_hwasan_func() {
+  return true;
+}
diff --git a/tests/libs/stack_tagging_helper.cpp b/tests/libs/stack_tagging_helper.cpp
index a239dc1..d29844d 100644
--- a/tests/libs/stack_tagging_helper.cpp
+++ b/tests/libs/stack_tagging_helper.cpp
@@ -260,6 +260,81 @@
   CHECK(memtag_stack);
 }
 
+static uintptr_t GetTag(void* addr) {
+  return reinterpret_cast<uintptr_t>(addr) & (0xFULL << 56);
+}
+
+static uintptr_t GetTag(volatile void* addr) {
+  return GetTag(const_cast<void*>(addr));
+}
+
+static volatile char* throw_frame;
+static volatile char* skip_frame3_frame;
+volatile char *x;
+
+__attribute__((noinline)) void throws() {
+  // Prevent optimization.
+  if (getpid() == 0) return;
+  throw_frame = reinterpret_cast<char*>(__builtin_frame_address(0));
+  throw "error";
+}
+
+__attribute__((noinline)) void maybe_throws() {
+  // These are all unique sizes so in case of a failure, we can see which ones
+  // are not untagged from the tag dump.
+  volatile char y[5 * 16]= {};
+  x = y;
+  // Make sure y is tagged.
+  CHECK(GetTag(&y) != GetTag(__builtin_frame_address(0)));
+  throws();
+}
+
+__attribute__((noinline, no_sanitize("memtag"))) void skip_frame() {
+  volatile char y[6*16] = {};
+  x = y;
+  // Make sure y is not tagged.
+  CHECK(GetTag(&y) == GetTag(__builtin_frame_address(0)));
+  maybe_throws();
+}
+
+__attribute__((noinline)) void skip_frame2() {
+  volatile char y[7*16] = {};
+  x = y;
+  // Make sure y is tagged.
+  CHECK(GetTag(&y) != GetTag(__builtin_frame_address(0)));
+  skip_frame();
+}
+
+__attribute__((noinline, no_sanitize("memtag"))) void skip_frame3() {
+  volatile char y[8*16] = {};
+  x = y;
+  skip_frame3_frame = reinterpret_cast<char*>(__builtin_frame_address(0));
+  // Make sure y is not tagged.
+  CHECK(GetTag(&y) == GetTag(__builtin_frame_address(0)));
+  skip_frame2();
+}
+
+void test_exception_cleanup() {
+  // This is here for debugging purposes, if something goes wrong we can
+  // verify that this placeholder did not get untagged.
+  volatile char placeholder[16*16] = {};
+  x = placeholder;
+  try {
+    skip_frame3();
+  } catch (const char* e) {
+  }
+  if (throw_frame >= skip_frame3_frame) {
+    fprintf(stderr, "invalid throw frame");
+    exit(1);
+  }
+  for (char* b = const_cast<char*>(throw_frame); b < skip_frame3_frame; ++b) {
+    if (mte_get_tag(b) != b) {
+      fprintf(stderr, "invalid tag at %p", b);
+      exit(1);
+    }
+  }
+}
+
 int main(int argc, char** argv) {
   if (argc < 2) {
     printf("nothing to do\n");
@@ -296,6 +371,11 @@
     return 0;
   }
 
+  if (strcmp(argv[1], "exception_cleanup") == 0) {
+    test_exception_cleanup();
+    return 0;
+  }
+
   printf("unrecognized command: %s\n", argv[1]);
   return 1;
 }
diff --git a/tests/locale_test.cpp b/tests/locale_test.cpp
index b4da6de..a220c83 100644
--- a/tests/locale_test.cpp
+++ b/tests/locale_test.cpp
@@ -79,9 +79,12 @@
 }
 
 TEST(locale, newlocale_NULL_locale_name) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   errno = 0;
   EXPECT_EQ(nullptr, newlocale(LC_ALL, nullptr, nullptr));
   EXPECT_EQ(EINVAL, errno);
+#pragma clang diagnostic pop
 }
 
 TEST(locale, newlocale_bad_locale_name) {
diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp
index 3cc5bbd..22905f4 100644
--- a/tests/malloc_test.cpp
+++ b/tests/malloc_test.cpp
@@ -35,7 +35,11 @@
 
 #include <algorithm>
 #include <atomic>
+#include <functional>
+#include <string>
 #include <thread>
+#include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include <tinyxml2.h>
@@ -661,13 +665,13 @@
 }
 
 TEST(malloc, mallopt_smoke) {
-#if !defined(ANDROID_HOST_MUSL)
+#if defined(__BIONIC__)
   errno = 0;
   ASSERT_EQ(0, mallopt(-1000, 1));
   // mallopt doesn't set errno.
   ASSERT_EQ(0, errno);
 #else
-  GTEST_SKIP() << "musl doesn't have mallopt";
+  GTEST_SKIP() << "bionic-only test";
 #endif
 }
 
@@ -694,6 +698,44 @@
 #endif
 }
 
+TEST(malloc, mallopt_purge_all) {
+#if defined(__BIONIC__)
+  SKIP_WITH_HWASAN << "hwasan does not implement mallopt";
+  errno = 0;
+  ASSERT_EQ(1, mallopt(M_PURGE_ALL, 0));
+#else
+  GTEST_SKIP() << "bionic-only test";
+#endif
+}
+
+// Verify that all of the mallopt values are unique.
+TEST(malloc, mallopt_unique_params) {
+#if defined(__BIONIC__)
+  std::vector<std::pair<int, std::string>> params{
+      std::make_pair(M_DECAY_TIME, "M_DECAY_TIME"),
+      std::make_pair(M_PURGE, "M_PURGE"),
+      std::make_pair(M_PURGE_ALL, "M_PURGE_ALL"),
+      std::make_pair(M_MEMTAG_TUNING, "M_MEMTAG_TUNING"),
+      std::make_pair(M_THREAD_DISABLE_MEM_INIT, "M_THREAD_DISABLE_MEM_INIT"),
+      std::make_pair(M_CACHE_COUNT_MAX, "M_CACHE_COUNT_MAX"),
+      std::make_pair(M_CACHE_SIZE_MAX, "M_CACHE_SIZE_MAX"),
+      std::make_pair(M_TSDS_COUNT_MAX, "M_TSDS_COUNT_MAX"),
+      std::make_pair(M_BIONIC_ZERO_INIT, "M_BIONIC_ZERO_INIT"),
+      std::make_pair(M_BIONIC_SET_HEAP_TAGGING_LEVEL, "M_BIONIC_SET_HEAP_TAGGING_LEVEL"),
+  };
+
+  std::unordered_map<int, std::string> all_params;
+  for (const auto& param : params) {
+    EXPECT_TRUE(all_params.count(param.first) == 0)
+        << "mallopt params " << all_params[param.first] << " and " << param.second
+        << " have the same value " << param.first;
+    all_params.insert(param);
+  }
+#else
+  GTEST_SKIP() << "bionic-only test";
+#endif
+}
+
 #if defined(__BIONIC__)
 static void GetAllocatorVersion(bool* allocator_scudo) {
   TemporaryFile tf;
@@ -1528,3 +1570,161 @@
     }
   }
 }
+
+void VerifyAllocationsAreZero(std::function<void*(size_t)> alloc_func, std::string function_name,
+                              std::vector<size_t>& test_sizes, size_t max_allocations) {
+  // Vector of zero'd data used for comparisons. Make it twice the largest size.
+  std::vector<char> zero(test_sizes.back() * 2, 0);
+
+  SCOPED_TRACE(testing::Message() << function_name << " failed to zero memory");
+
+  for (size_t test_size : test_sizes) {
+    std::vector<void*> ptrs(max_allocations);
+    for (size_t i = 0; i < ptrs.size(); i++) {
+      SCOPED_TRACE(testing::Message() << "size " << test_size << " at iteration " << i);
+      ptrs[i] = alloc_func(test_size);
+      ASSERT_TRUE(ptrs[i] != nullptr);
+      size_t alloc_size = malloc_usable_size(ptrs[i]);
+      ASSERT_LE(alloc_size, zero.size());
+      ASSERT_EQ(0, memcmp(ptrs[i], zero.data(), alloc_size));
+
+      // Set the memory to non-zero to make sure if the pointer
+      // is reused it's still zero.
+      memset(ptrs[i], 0xab, alloc_size);
+    }
+    // Free the pointers.
+    for (size_t i = 0; i < ptrs.size(); i++) {
+      free(ptrs[i]);
+    }
+    for (size_t i = 0; i < ptrs.size(); i++) {
+      SCOPED_TRACE(testing::Message() << "size " << test_size << " at iteration " << i);
+      ptrs[i] = malloc(test_size);
+      ASSERT_TRUE(ptrs[i] != nullptr);
+      size_t alloc_size = malloc_usable_size(ptrs[i]);
+      ASSERT_LE(alloc_size, zero.size());
+      ASSERT_EQ(0, memcmp(ptrs[i], zero.data(), alloc_size));
+    }
+    // Free all of the pointers later to maximize the chance of reusing from
+    // the first loop.
+    for (size_t i = 0; i < ptrs.size(); i++) {
+      free(ptrs[i]);
+    }
+  }
+}
+
+// Verify that small and medium allocations are always zero.
+// @CddTest = 9.7/C-4-1
+TEST(malloc, zeroed_allocations_small_medium_sizes) {
+#if !defined(__BIONIC__)
+  GTEST_SKIP() << "Only valid on bionic";
+#endif
+
+  if (IsLowRamDevice()) {
+    GTEST_SKIP() << "Skipped on low memory devices.";
+  }
+
+  constexpr size_t kMaxAllocations = 1024;
+  std::vector<size_t> test_sizes = {16, 48, 128, 1024, 4096, 65536};
+  VerifyAllocationsAreZero([](size_t size) -> void* { return malloc(size); }, "malloc", test_sizes,
+                           kMaxAllocations);
+
+  VerifyAllocationsAreZero([](size_t size) -> void* { return memalign(64, size); }, "memalign",
+                           test_sizes, kMaxAllocations);
+
+  VerifyAllocationsAreZero(
+      [](size_t size) -> void* {
+        void* ptr;
+        if (posix_memalign(&ptr, 64, size) == 0) {
+          return ptr;
+        }
+        return nullptr;
+      },
+      "posix_memalign", test_sizes, kMaxAllocations);
+}
+
+// Verify that large allocations are always zero.
+// @CddTest = 9.7/C-4-1
+TEST(malloc, zeroed_allocations_large_sizes) {
+#if !defined(__BIONIC__)
+  GTEST_SKIP() << "Only valid on bionic";
+#endif
+
+  if (IsLowRamDevice()) {
+    GTEST_SKIP() << "Skipped on low memory devices.";
+  }
+
+  constexpr size_t kMaxAllocations = 20;
+  std::vector<size_t> test_sizes = {1000000, 2000000, 3000000, 4000000};
+  VerifyAllocationsAreZero([](size_t size) -> void* { return malloc(size); }, "malloc", test_sizes,
+                           kMaxAllocations);
+
+  VerifyAllocationsAreZero([](size_t size) -> void* { return memalign(64, size); }, "memalign",
+                           test_sizes, kMaxAllocations);
+
+  VerifyAllocationsAreZero(
+      [](size_t size) -> void* {
+        void* ptr;
+        if (posix_memalign(&ptr, 64, size) == 0) {
+          return ptr;
+        }
+        return nullptr;
+      },
+      "posix_memalign", test_sizes, kMaxAllocations);
+}
+
+// Verify that reallocs are zeroed when expanded.
+// @CddTest = 9.7/C-4-1
+TEST(malloc, zeroed_allocations_realloc) {
+#if !defined(__BIONIC__)
+  GTEST_SKIP() << "Only valid on bionic";
+#endif
+
+  if (IsLowRamDevice()) {
+    GTEST_SKIP() << "Skipped on low memory devices.";
+  }
+
+  // Vector of zero'd data used for comparisons.
+  constexpr size_t kMaxMemorySize = 131072;
+  std::vector<char> zero(kMaxMemorySize, 0);
+
+  constexpr size_t kMaxAllocations = 1024;
+  std::vector<size_t> test_sizes = {16, 48, 128, 1024, 4096, 65536};
+  // Do a number of allocations and set them to non-zero.
+  for (size_t test_size : test_sizes) {
+    std::vector<void*> ptrs(kMaxAllocations);
+    for (size_t i = 0; i < kMaxAllocations; i++) {
+      ptrs[i] = malloc(test_size);
+      ASSERT_TRUE(ptrs[i] != nullptr);
+
+      // Set the memory to non-zero to make sure if the pointer
+      // is reused it's still zero.
+      memset(ptrs[i], 0xab, malloc_usable_size(ptrs[i]));
+    }
+    // Free the pointers.
+    for (size_t i = 0; i < kMaxAllocations; i++) {
+      free(ptrs[i]);
+    }
+  }
+
+  // Do the reallocs to a larger size and verify the rest of the allocation
+  // is zero.
+  constexpr size_t kInitialSize = 8;
+  for (size_t test_size : test_sizes) {
+    std::vector<void*> ptrs(kMaxAllocations);
+    for (size_t i = 0; i < kMaxAllocations; i++) {
+      ptrs[i] = malloc(kInitialSize);
+      ASSERT_TRUE(ptrs[i] != nullptr);
+      size_t orig_alloc_size = malloc_usable_size(ptrs[i]);
+
+      ptrs[i] = realloc(ptrs[i], test_size);
+      ASSERT_TRUE(ptrs[i] != nullptr);
+      size_t new_alloc_size = malloc_usable_size(ptrs[i]);
+      char* ptr = reinterpret_cast<char*>(ptrs[i]);
+      ASSERT_EQ(0, memcmp(&ptr[orig_alloc_size], zero.data(), new_alloc_size - orig_alloc_size))
+          << "realloc from " << kInitialSize << " to size " << test_size << " at iteration " << i;
+    }
+    for (size_t i = 0; i < kMaxAllocations; i++) {
+      free(ptrs[i]);
+    }
+  }
+}
diff --git a/tests/math_test.cpp b/tests/math_test.cpp
index 76b5078..60872f3 100644
--- a/tests/math_test.cpp
+++ b/tests/math_test.cpp
@@ -1053,22 +1053,22 @@
   auto guard = android::base::make_scope_guard([]() { fesetenv(FE_DFL_ENV); });
 
   fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode.
-  ASSERT_EQ(1235, lrint(1234.01));
-  ASSERT_EQ(1235, lrintf(1234.01f));
-  ASSERT_EQ(1235, lrintl(1234.01L));
+  EXPECT_EQ(1235, lrint(1234.01));
+  EXPECT_EQ(1235, lrintf(1234.01f));
+  EXPECT_EQ(1235, lrintl(1234.01L));
   fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode.
-  ASSERT_EQ(1234, lrint(1234.01));
-  ASSERT_EQ(1234, lrintf(1234.01f));
-  ASSERT_EQ(1234, lrintl(1234.01L));
+  EXPECT_EQ(1234, lrint(1234.01));
+  EXPECT_EQ(1234, lrintf(1234.01f));
+  EXPECT_EQ(1234, lrintl(1234.01L));
 
   fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode.
-  ASSERT_EQ(1235L, llrint(1234.01));
-  ASSERT_EQ(1235L, llrintf(1234.01f));
-  ASSERT_EQ(1235L, llrintl(1234.01L));
+  EXPECT_EQ(1235L, llrint(1234.01));
+  EXPECT_EQ(1235L, llrintf(1234.01f));
+  EXPECT_EQ(1235L, llrintl(1234.01L));
   fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode.
-  ASSERT_EQ(1234L, llrint(1234.01));
-  ASSERT_EQ(1234L, llrintf(1234.01f));
-  ASSERT_EQ(1234L, llrintl(1234.01L));
+  EXPECT_EQ(1234L, llrint(1234.01));
+  EXPECT_EQ(1234L, llrintf(1234.01f));
+  EXPECT_EQ(1234L, llrintl(1234.01L));
 }
 
 TEST(MATH_TEST, rint) {
diff --git a/tests/memtag_stack_test.cpp b/tests/memtag_stack_test.cpp
index 1b336bc..97084ec 100644
--- a/tests/memtag_stack_test.cpp
+++ b/tests/memtag_stack_test.cpp
@@ -29,7 +29,7 @@
 TEST_P(MemtagStackTest, test) {
 #if defined(__BIONIC__) && defined(__aarch64__)
   if (!mte_supported()) {
-    return;
+    GTEST_SKIP() << "MTE unsupported";
   }
   bool is_static = std::get<1>(GetParam());
   std::string helper =
@@ -44,13 +44,13 @@
 #endif
 }
 
-INSTANTIATE_TEST_SUITE_P(, MemtagStackTest,
-                         testing::Combine(testing::Values("vfork_execve", "vfork_execl",
-                                                          "vfork_exit", "longjmp",
-                                                          "longjmp_sigaltstack", "android_mallopt"),
-                                          testing::Bool()),
-                         [](const ::testing::TestParamInfo<MemtagStackTest::ParamType>& info) {
-                           std::string s = std::get<0>(info.param);
-                           if (std::get<1>(info.param)) s += "_static";
-                           return s;
-                         });
+INSTANTIATE_TEST_SUITE_P(
+    , MemtagStackTest,
+    testing::Combine(testing::Values("vfork_execve", "vfork_execl", "vfork_exit", "longjmp",
+                                     "longjmp_sigaltstack", "android_mallopt", "exception_cleanup"),
+                     testing::Bool()),
+    [](const ::testing::TestParamInfo<MemtagStackTest::ParamType>& info) {
+      std::string s = std::get<0>(info.param);
+      if (std::get<1>(info.param)) s += "_static";
+      return s;
+    });
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_empty.so b/tests/prebuilt-elf-files/riscv64/libtest_empty.so
new file mode 100755
index 0000000..f3218f7
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_empty.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-empty_shdr_table.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-empty_shdr_table.so
new file mode 100755
index 0000000..9f15ff9
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-empty_shdr_table.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-rw_load_segment.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-rw_load_segment.so
new file mode 100755
index 0000000..32db3b9
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-rw_load_segment.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels.so
new file mode 100755
index 0000000..5ee9aab
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..664d3df
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-unaligned_shdr_offset.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-unaligned_shdr_offset.so
new file mode 100755
index 0000000..3e773c0
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-unaligned_shdr_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_content.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_content.so
new file mode 100755
index 0000000..d3bcd9a
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_content.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_offset.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_offset.so
new file mode 100755
index 0000000..956dca8
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shdr_table_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shentsize.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shentsize.so
new file mode 100755
index 0000000..e663dae
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shentsize.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..294f854
--- /dev/null
+++ b/tests/prebuilt-elf-files/riscv64/libtest_invalid-zero_shstrndx.so
Binary files differ
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp
index 907a35c..aad2a4d 100644
--- a/tests/pthread_test.cpp
+++ b/tests/pthread_test.cpp
@@ -41,6 +41,7 @@
 #include <android-base/scopeguard.h>
 #include <android-base/silent_death_test.h>
 #include <android-base/strings.h>
+#include <android-base/test_utils.h>
 
 #include "private/bionic_constants.h"
 #include "SignalUtils.h"
@@ -184,6 +185,30 @@
   ASSERT_EQ(0, pthread_key_delete(key));
 }
 
+static void* FnWithStackFrame(void*) {
+  int x;
+  *const_cast<volatile int*>(&x) = 1;
+  return nullptr;
+}
+
+TEST(pthread, pthread_heap_allocated_stack) {
+  SKIP_WITH_HWASAN; // TODO(b/148982147): Re-enable when fixed.
+
+  size_t stack_size = 640 * 1024;
+  std::unique_ptr<char[]> stack(new (std::align_val_t(getpagesize())) char[stack_size]);
+  memset(stack.get(), '\xff', stack_size);
+
+  pthread_attr_t attr;
+  ASSERT_EQ(0, pthread_attr_init(&attr));
+  ASSERT_EQ(0, pthread_attr_setstack(&attr, stack.get(), stack_size));
+
+  pthread_t t;
+  ASSERT_EQ(0, pthread_create(&t, &attr, FnWithStackFrame, nullptr));
+
+  void* result;
+  ASSERT_EQ(0, pthread_join(t, &result));
+}
+
 TEST(pthread, static_pthread_key_used_before_creation) {
 #if defined(__BIONIC__)
   // See http://b/19625804. The bug is about a static/global pthread key being used before creation.
diff --git a/tests/sched_test.cpp b/tests/sched_test.cpp
index 03e8062..fa1a07f 100644
--- a/tests/sched_test.cpp
+++ b/tests/sched_test.cpp
@@ -303,5 +303,8 @@
 }
 
 TEST(sched, sched_getaffinity_failure) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   ASSERT_EQ(-1, sched_getaffinity(getpid(), 0, nullptr));
+#pragma clang diagnostic pop
 }
diff --git a/tests/scs_test.cpp b/tests/scs_test.cpp
index 24cb347..0776a43 100644
--- a/tests/scs_test.cpp
+++ b/tests/scs_test.cpp
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#if __has_feature(shadow_call_stack)
-
 #include <gtest/gtest.h>
 
 #include "private/bionic_constants.h"
@@ -33,7 +31,9 @@
 }
 
 TEST(scs_test, stack_overflow) {
+#if defined(__aarch64__) || defined(__riscv)
   ASSERT_EXIT(recurse1(SCS_SIZE), testing::KilledBySignal(SIGSEGV), "");
-}
-
+#else
+  GTEST_SKIP() << "no SCS on this architecture";
 #endif
+}
diff --git a/tests/semaphore_test.cpp b/tests/semaphore_test.cpp
index f3f6020..6f8797f 100644
--- a/tests/semaphore_test.cpp
+++ b/tests/semaphore_test.cpp
@@ -165,8 +165,10 @@
 TEST_F(semaphore_DeathTest, sem_timedwait_null_timeout) {
   sem_t s;
   ASSERT_EQ(0, sem_init(&s, 0, 0));
-
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   ASSERT_EXIT(sem_timedwait(&s, nullptr), testing::KilledBySignal(SIGSEGV), "");
+#pragma clang diagnostic pop
 }
 
 TEST(semaphore, sem_getvalue) {
diff --git a/tests/setjmp_test.cpp b/tests/setjmp_test.cpp
index 472aa20..6ae8bfd 100644
--- a/tests/setjmp_test.cpp
+++ b/tests/setjmp_test.cpp
@@ -81,8 +81,10 @@
     sigset64_t ss;
     sigemptyset64(&ss);
     sigaddset64(&ss, SIGUSR1 + offset);
+#if defined(__BIONIC__)
     // TIMER_SIGNAL.
     sigaddset64(&ss, __SIGRTMIN);
+#endif
     sigaddset64(&ss, SIGRTMIN + offset);
     return ss;
   }
@@ -224,13 +226,15 @@
 }
 
 #if defined(__arm__)
-#define __JB_SIGFLAG 0
+#define JB_SIGFLAG_OFFSET 0
 #elif defined(__aarch64__)
-#define __JB_SIGFLAG 0
+#define JB_SIGFLAG_OFFSET 0
 #elif defined(__i386__)
-#define __JB_SIGFLAG 8
+#define JB_SIGFLAG_OFFSET 8
+#elif defined(__riscv)
+#define JB_SIGFLAG_OFFSET 0
 #elif defined(__x86_64)
-#define __JB_SIGFLAG 8
+#define JB_SIGFLAG_OFFSET 8
 #endif
 
 TEST_F(setjmp_DeathTest, setjmp_cookie) {
@@ -238,7 +242,7 @@
   int value = setjmp(jb);
   ASSERT_EQ(0, value);
 
-  long* sigflag = reinterpret_cast<long*>(jb) + __JB_SIGFLAG;
+  long* sigflag = reinterpret_cast<long*>(jb) + JB_SIGFLAG_OFFSET;
 
   // Make sure there's actually a cookie.
   EXPECT_NE(0, *sigflag & ~1);
@@ -274,7 +278,6 @@
 }
 
 TEST(setjmp, bug_152210274) {
-  SKIP_WITH_HWASAN; // b/227390656
   // Ensure that we never have a mangled value in the stack pointer.
 #if defined(__BIONIC__)
   struct sigaction sa = {.sa_flags = SA_SIGINFO, .sa_sigaction = [](int, siginfo_t*, void*) {}};
@@ -295,15 +298,19 @@
         perror("setjmp");
         abort();
       }
-      if (*static_cast<pid_t*>(arg) == 100) longjmp(buf, 1);
+      // This will never be true, but the compiler doesn't know that, so the
+      // setjmp won't be removed by DCE. With HWASan/MTE this also acts as a
+      // kind of enforcement that the threads are done before leaving the test.
+      if (*static_cast<size_t*>(arg) != 123) longjmp(buf, 1);
     }
     return nullptr;
   };
+  pthread_t threads[kNumThreads];
   pid_t tids[kNumThreads] = {};
+  size_t var = 123;
   for (size_t i = 0; i < kNumThreads; ++i) {
-    pthread_t t;
-    ASSERT_EQ(0, pthread_create(&t, nullptr, jumper, &tids[i]));
-    tids[i] = pthread_gettid_np(t);
+    ASSERT_EQ(0, pthread_create(&threads[i], nullptr, jumper, &var));
+    tids[i] = pthread_gettid_np(threads[i]);
   }
 
   // Start the interrupter thread.
@@ -323,6 +330,9 @@
   pthread_t t;
   ASSERT_EQ(0, pthread_create(&t, nullptr, interrupter, tids));
   pthread_join(t, nullptr);
+  for (size_t i = 0; i < kNumThreads; i++) {
+    pthread_join(threads[i], nullptr);
+  }
 #else
   GTEST_SKIP() << "tests uses functions not in glibc";
 #endif
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index 5bda8b3..fa648d2 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -34,6 +34,13 @@
 
 using namespace std::chrono_literals;
 
+#if defined(ANDROID_HOST_MUSL)
+// Musl doesn't export __SIGRTMIN and __SIGRTMAX, #define
+// them here.
+#define __SIGRTMIN 32
+#define __SIGRTMAX 64
+#endif
+
 static int SIGNAL_MIN() {
   return 1; // Signals start at 1 (SIGHUP), not 0.
 }
@@ -816,9 +823,9 @@
 #endif
 
 TEST(signal, sigset_size) {
-  // The setjmp implementations assume that sigset_t can fit in a
-  // long. This is true because ARM and x86 have broken rt signal support,
-  // and AArch64 and x86_64 both have a SIGRTMAX defined as 64.
+  // The setjmp implementations assume that sigset_t can fit in a long.
+  // This is true because the 32-bit ABIs have broken rt signal support,
+  // but the 64-bit ABIs both have a SIGRTMAX defined as 64.
 #if defined(__BIONIC__)
   static_assert(sizeof(sigset_t) <= sizeof(long), "sigset_t doesn't fit in a long");
 #endif
diff --git a/tests/spawn_test.cpp b/tests/spawn_test.cpp
index a9563b8..ab3e877 100644
--- a/tests/spawn_test.cpp
+++ b/tests/spawn_test.cpp
@@ -232,18 +232,28 @@
 }
 
 TEST(spawn, posix_spawn_file_actions) {
+#if !defined(__GLIBC__)
   int fds[2];
   ASSERT_NE(-1, pipe(fds));
 
   posix_spawn_file_actions_t fa;
   ASSERT_EQ(0, posix_spawn_file_actions_init(&fa));
 
+  // Test addclose and adddup2 by redirecting output to the pipe created above.
   ASSERT_EQ(0, posix_spawn_file_actions_addclose(&fa, fds[0]));
   ASSERT_EQ(0, posix_spawn_file_actions_adddup2(&fa, fds[1], 1));
   ASSERT_EQ(0, posix_spawn_file_actions_addclose(&fa, fds[1]));
   // Check that close(2) failures are ignored by closing the same fd again.
   ASSERT_EQ(0, posix_spawn_file_actions_addclose(&fa, fds[1]));
+  // Open a file directly, to test addopen.
   ASSERT_EQ(0, posix_spawn_file_actions_addopen(&fa, 56, "/proc/version", O_RDONLY, 0));
+  // Test addfchdir by opening the same file a second way...
+  ASSERT_EQ(0, posix_spawn_file_actions_addopen(&fa, 57, "/proc", O_PATH, 0));
+  ASSERT_EQ(0, posix_spawn_file_actions_addfchdir_np(&fa, 57));
+  ASSERT_EQ(0, posix_spawn_file_actions_addopen(&fa, 58, "version", O_RDONLY, 0));
+  // Test addchdir by opening the same file a third way...
+  ASSERT_EQ(0, posix_spawn_file_actions_addchdir_np(&fa, "/"));
+  ASSERT_EQ(0, posix_spawn_file_actions_addopen(&fa, 59, "proc/version", O_RDONLY, 0));
 
   ExecTestHelper eth;
   eth.SetArgs({"ls", "-l", "/proc/self/fd", nullptr});
@@ -259,12 +269,21 @@
   AssertChildExited(pid, 0);
 
   // We'll know the dup2 worked if we see any ls(1) output in our pipe.
-  // The open we can check manually...
+  // The opens we can check manually (and they implicitly check the chdirs)...
   bool open_to_fd_56_worked = false;
+  bool open_to_fd_58_worked = false;
+  bool open_to_fd_59_worked = false;
   for (const auto& line : android::base::Split(content, "\n")) {
     if (line.find(" 56 -> /proc/version") != std::string::npos) open_to_fd_56_worked = true;
+    if (line.find(" 58 -> /proc/version") != std::string::npos) open_to_fd_58_worked = true;
+    if (line.find(" 59 -> /proc/version") != std::string::npos) open_to_fd_59_worked = true;
   }
-  ASSERT_TRUE(open_to_fd_56_worked);
+  ASSERT_TRUE(open_to_fd_56_worked) << content;
+  ASSERT_TRUE(open_to_fd_58_worked) << content;
+  ASSERT_TRUE(open_to_fd_59_worked) << content;
+#else
+  GTEST_SKIP() << "our old glibc doesn't have the chdirs; newer versions and musl do.";
+#endif
 }
 
 static void CatFileToString(posix_spawnattr_t* sa, const char* path, std::string* content) {
diff --git a/tests/stack_protector_test_helper.cpp b/tests/stack_protector_test_helper.cpp
index fd90b93..69b3c5d 100644
--- a/tests/stack_protector_test_helper.cpp
+++ b/tests/stack_protector_test_helper.cpp
@@ -15,11 +15,11 @@
  */
 
 // Deliberately overwrite the stack canary.
-__attribute__((noinline)) void modify_stack_protector_test() {
+__attribute__((noinline, optnone)) void modify_stack_protector_test() {
   // We can't use memset here because it's fortified, and we want to test
   // the line of defense *after* that.
-  // Without volatile, the generic x86/x86-64 targets don't write to the stack.
-  volatile char* p;
-  p = reinterpret_cast<volatile char*>(&p + 1);
-  *p = '\0';
+  // We can't make a constant change, since the existing byte might already have
+  // had that value.
+  char* p = reinterpret_cast<char*>(&p + 1);
+  *p = ~*p;
 }
diff --git a/tests/stdio_ext_test.cpp b/tests/stdio_ext_test.cpp
index fce600a..dce1a66 100644
--- a/tests/stdio_ext_test.cpp
+++ b/tests/stdio_ext_test.cpp
@@ -78,6 +78,24 @@
   fclose(fp);
 }
 
+TEST(stdio_ext, __freadahead) {
+#if defined(__GLIBC__)
+  GTEST_SKIP() << "glibc doesn't have __freadahead";
+#else
+  FILE* fp = tmpfile();
+  ASSERT_NE(EOF, fputs("hello", fp));
+  rewind(fp);
+
+  ASSERT_EQ('h', fgetc(fp));
+  ASSERT_EQ(4u, __freadahead(fp));
+
+  ASSERT_EQ('H', ungetc('H', fp));
+  ASSERT_EQ(5u, __freadahead(fp));
+
+  fclose(fp);
+#endif
+}
+
 TEST(stdio_ext, __fpurge) {
   FILE* fp = tmpfile();
 
diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp
index 21b3f6c..800732f 100644
--- a/tests/stdio_test.cpp
+++ b/tests/stdio_test.cpp
@@ -36,6 +36,7 @@
 
 #include <android-base/file.h>
 #include <android-base/silent_death_test.h>
+#include <android-base/strings.h>
 #include <android-base/test_utils.h>
 #include <android-base/unique_fd.h>
 
@@ -140,6 +141,22 @@
   fclose(fp);
 }
 
+TEST(STDIO_TEST, tmpfile_TMPDIR) {
+  TemporaryDir td;
+  setenv("TMPDIR", td.path, 1);
+
+  FILE* fp = tmpfile();
+  ASSERT_TRUE(fp != nullptr);
+
+  std::string fd_path = android::base::StringPrintf("/proc/self/fd/%d", fileno(fp));
+  char path[PATH_MAX];
+  ASSERT_GT(readlink(fd_path.c_str(), path, sizeof(path)), 0);
+  // $TMPDIR influenced where our temporary file ended up?
+  ASSERT_TRUE(android::base::StartsWith(path, td.path)) << path;
+  // And we used O_TMPFILE, right?
+  ASSERT_TRUE(android::base::EndsWith(path, " (deleted)")) << path;
+}
+
 TEST(STDIO_TEST, dprintf) {
   TemporaryFile tf;
 
@@ -190,6 +207,8 @@
 }
 
 TEST(STDIO_TEST, getdelim_invalid) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   FILE* fp = tmpfile();
   ASSERT_TRUE(fp != nullptr);
 
@@ -206,6 +225,7 @@
   ASSERT_EQ(getdelim(&buffer, nullptr, ' ', fp), -1);
   ASSERT_EQ(EINVAL, errno);
   fclose(fp);
+#pragma clang diagnostic pop
 }
 
 TEST(STDIO_TEST, getdelim_directory) {
@@ -260,6 +280,8 @@
 }
 
 TEST(STDIO_TEST, getline_invalid) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   FILE* fp = tmpfile();
   ASSERT_TRUE(fp != nullptr);
 
@@ -276,6 +298,7 @@
   ASSERT_EQ(getline(&buffer, nullptr, fp), -1);
   ASSERT_EQ(EINVAL, errno);
   fclose(fp);
+#pragma clang diagnostic pop
 }
 
 TEST(STDIO_TEST, printf_ssize_t) {
@@ -490,22 +513,22 @@
 
   // NaN.
 
-  snprintf_fn(buf, sizeof(buf), fmt, nanf(""));
+  snprintf_fn(buf, sizeof(buf), fmt, nan(""));
   EXPECT_STREQ(nan_, buf) << fmt;
   EXPECT_EQ(1, sscanf_fn(buf, fmt, &f));
   EXPECT_TRUE(isnan(f));
 
-  snprintf_fn(buf, sizeof(buf), fmt, -nanf(""));
+  snprintf_fn(buf, sizeof(buf), fmt, -nan(""));
   EXPECT_STREQ(minus_nan, buf) << fmt;
   EXPECT_EQ(1, sscanf_fn(buf, fmt, &f));
   EXPECT_TRUE(isnan(f));
 
-  snprintf_fn(buf, sizeof(buf), fmt_plus, nanf(""));
+  snprintf_fn(buf, sizeof(buf), fmt_plus, nan(""));
   EXPECT_STREQ(plus_nan, buf) << fmt_plus;
   EXPECT_EQ(1, sscanf_fn(buf, fmt, &f));
   EXPECT_TRUE(isnan(f));
 
-  snprintf_fn(buf, sizeof(buf), fmt_plus, -nanf(""));
+  snprintf_fn(buf, sizeof(buf), fmt_plus, -nan(""));
   EXPECT_STREQ(minus_nan, buf) << fmt_plus;
   EXPECT_EQ(1, sscanf_fn(buf, fmt, &f));
   EXPECT_TRUE(isnan(f));
@@ -1944,6 +1967,8 @@
 
 TEST(STDIO_TEST, open_memstream_EINVAL) {
 #if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   char* p;
   size_t size;
 
@@ -1956,6 +1981,7 @@
   errno = 0;
   ASSERT_EQ(nullptr, open_memstream(&p, nullptr));
   ASSERT_EQ(EINVAL, errno);
+#pragma clang diagnostic pop
 #else
   GTEST_SKIP() << "glibc is broken";
 #endif
@@ -2975,75 +3001,153 @@
 }
 
 TEST(STDIO_TEST, snprintf_b) {
-  // Our clang doesn't know about %b/%B yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#if defined(__BIONIC__)
   char buf[BUFSIZ];
-  EXPECT_EQ(5, snprintf(buf, sizeof(buf), "<%b>", 5));
+
+  uint8_t b = 5;
+  EXPECT_EQ(5, snprintf(buf, sizeof(buf), "<%" PRIb8 ">", b));
   EXPECT_STREQ("<101>", buf);
-  EXPECT_EQ(10, snprintf(buf, sizeof(buf), "<%08b>", 5));
+  EXPECT_EQ(10, snprintf(buf, sizeof(buf), "<%08" PRIb8 ">", b));
   EXPECT_STREQ("<00000101>", buf);
-  EXPECT_EQ(34, snprintf(buf, sizeof(buf), "<%b>", 0xaaaaaaaa));
+
+  uint16_t s = 0xaaaa;
+  EXPECT_EQ(18, snprintf(buf, sizeof(buf), "<%" PRIb16 ">", s));
+  EXPECT_STREQ("<1010101010101010>", buf);
+  EXPECT_EQ(20, snprintf(buf, sizeof(buf), "<%#" PRIb16 ">", s));
+  EXPECT_STREQ("<0b1010101010101010>", buf);
+
+  EXPECT_EQ(34, snprintf(buf, sizeof(buf), "<%" PRIb32 ">", 0xaaaaaaaa));
   EXPECT_STREQ("<10101010101010101010101010101010>", buf);
-  EXPECT_EQ(36, snprintf(buf, sizeof(buf), "<%#b>", 0xaaaaaaaa));
+  EXPECT_EQ(36, snprintf(buf, sizeof(buf), "<%#" PRIb32 ">", 0xaaaaaaaa));
   EXPECT_STREQ("<0b10101010101010101010101010101010>", buf);
+
+  // clang doesn't like "%lb" (https://github.com/llvm/llvm-project/issues/62247)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat"
+  EXPECT_EQ(66, snprintf(buf, sizeof(buf), "<%" PRIb64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_STREQ("<1010101010101010101010101010101010101010101010101010101010101010>", buf);
+  EXPECT_EQ(68, snprintf(buf, sizeof(buf), "<%#" PRIb64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_STREQ("<0b1010101010101010101010101010101010101010101010101010101010101010>", buf);
+#pragma clang diagnostic pop
+
   EXPECT_EQ(3, snprintf(buf, sizeof(buf), "<%#b>", 0));
   EXPECT_STREQ("<0>", buf);
-#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %b in glibc";
+#endif
 }
 
 TEST(STDIO_TEST, snprintf_B) {
-  // Our clang doesn't know about %b/%B yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#if defined(__BIONIC__)
   char buf[BUFSIZ];
-  EXPECT_EQ(5, snprintf(buf, sizeof(buf), "<%B>", 5));
+
+  uint8_t b = 5;
+  EXPECT_EQ(5, snprintf(buf, sizeof(buf), "<%" PRIB8 ">", b));
   EXPECT_STREQ("<101>", buf);
-  EXPECT_EQ(10, snprintf(buf, sizeof(buf), "<%08B>", 5));
+  EXPECT_EQ(10, snprintf(buf, sizeof(buf), "<%08" PRIB8 ">", b));
   EXPECT_STREQ("<00000101>", buf);
-  EXPECT_EQ(34, snprintf(buf, sizeof(buf), "<%B>", 0xaaaaaaaa));
+
+  uint16_t s = 0xaaaa;
+  EXPECT_EQ(18, snprintf(buf, sizeof(buf), "<%" PRIB16 ">", s));
+  EXPECT_STREQ("<1010101010101010>", buf);
+  EXPECT_EQ(20, snprintf(buf, sizeof(buf), "<%#" PRIB16 ">", s));
+  EXPECT_STREQ("<0B1010101010101010>", buf);
+
+  EXPECT_EQ(34, snprintf(buf, sizeof(buf), "<%" PRIB32 ">", 0xaaaaaaaa));
   EXPECT_STREQ("<10101010101010101010101010101010>", buf);
-  EXPECT_EQ(36, snprintf(buf, sizeof(buf), "<%#B>", 0xaaaaaaaa));
+  EXPECT_EQ(36, snprintf(buf, sizeof(buf), "<%#" PRIB32 ">", 0xaaaaaaaa));
   EXPECT_STREQ("<0B10101010101010101010101010101010>", buf);
-  EXPECT_EQ(3, snprintf(buf, sizeof(buf), "<%#B>", 0));
-  EXPECT_STREQ("<0>", buf);
+
+  // clang doesn't like "%lB" (https://github.com/llvm/llvm-project/issues/62247)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat"
+  EXPECT_EQ(66, snprintf(buf, sizeof(buf), "<%" PRIB64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_STREQ("<1010101010101010101010101010101010101010101010101010101010101010>", buf);
+  EXPECT_EQ(68, snprintf(buf, sizeof(buf), "<%#" PRIB64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_STREQ("<0B1010101010101010101010101010101010101010101010101010101010101010>", buf);
 #pragma clang diagnostic pop
+
+  EXPECT_EQ(3, snprintf(buf, sizeof(buf), "<%#b>", 0));
+  EXPECT_STREQ("<0>", buf);
+#else
+  GTEST_SKIP() << "no %B in glibc";
+#endif
 }
 
 TEST(STDIO_TEST, swprintf_b) {
-  // Our clang doesn't know about %b/%B yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#if defined(__BIONIC__)
   wchar_t buf[BUFSIZ];
-  EXPECT_EQ(5, swprintf(buf, sizeof(buf), L"<%b>", 5));
+
+  uint8_t b = 5;
+  EXPECT_EQ(5, swprintf(buf, sizeof(buf), L"<%" PRIb8 ">", b));
   EXPECT_EQ(std::wstring(L"<101>"), buf);
-  EXPECT_EQ(10, swprintf(buf, sizeof(buf), L"<%08b>", 5));
+  EXPECT_EQ(10, swprintf(buf, sizeof(buf), L"<%08" PRIb8 ">", b));
   EXPECT_EQ(std::wstring(L"<00000101>"), buf);
-  EXPECT_EQ(34, swprintf(buf, sizeof(buf), L"<%b>", 0xaaaaaaaa));
+
+  uint16_t s = 0xaaaa;
+  EXPECT_EQ(18, swprintf(buf, sizeof(buf), L"<%" PRIb16 ">", s));
+  EXPECT_EQ(std::wstring(L"<1010101010101010>"), buf);
+  EXPECT_EQ(20, swprintf(buf, sizeof(buf), L"<%#" PRIb16 ">", s));
+  EXPECT_EQ(std::wstring(L"<0b1010101010101010>"), buf);
+
+  EXPECT_EQ(34, swprintf(buf, sizeof(buf), L"<%" PRIb32 ">", 0xaaaaaaaa));
   EXPECT_EQ(std::wstring(L"<10101010101010101010101010101010>"), buf);
-  EXPECT_EQ(36, swprintf(buf, sizeof(buf), L"<%#b>", 0xaaaaaaaa));
+  EXPECT_EQ(36, swprintf(buf, sizeof(buf), L"<%#" PRIb32 ">", 0xaaaaaaaa));
   EXPECT_EQ(std::wstring(L"<0b10101010101010101010101010101010>"), buf);
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat"  // clang doesn't like "%lb"
+  EXPECT_EQ(66, swprintf(buf, sizeof(buf), L"<%" PRIb64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_EQ(std::wstring(L"<1010101010101010101010101010101010101010101010101010101010101010>"),
+            buf);
+  EXPECT_EQ(68, swprintf(buf, sizeof(buf), L"<%#" PRIb64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_EQ(std::wstring(L"<0b1010101010101010101010101010101010101010101010101010101010101010>"),
+            buf);
+#pragma clang diagnostic pop
+
   EXPECT_EQ(3, swprintf(buf, sizeof(buf), L"<%#b>", 0));
   EXPECT_EQ(std::wstring(L"<0>"), buf);
-#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %b in glibc";
+#endif
 }
 
 TEST(STDIO_TEST, swprintf_B) {
-  // Our clang doesn't know about %b/%B yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#if defined(__BIONIC__)
   wchar_t buf[BUFSIZ];
-  EXPECT_EQ(5, swprintf(buf, sizeof(buf), L"<%B>", 5));
+
+  uint8_t b = 5;
+  EXPECT_EQ(5, swprintf(buf, sizeof(buf), L"<%" PRIB8 ">", b));
   EXPECT_EQ(std::wstring(L"<101>"), buf);
-  EXPECT_EQ(10, swprintf(buf, sizeof(buf), L"<%08B>", 5));
+  EXPECT_EQ(10, swprintf(buf, sizeof(buf), L"<%08" PRIB8 ">", b));
   EXPECT_EQ(std::wstring(L"<00000101>"), buf);
-  EXPECT_EQ(34, swprintf(buf, sizeof(buf), L"<%B>", 0xaaaaaaaa));
+
+  uint16_t s = 0xaaaa;
+  EXPECT_EQ(18, swprintf(buf, sizeof(buf), L"<%" PRIB16 ">", s));
+  EXPECT_EQ(std::wstring(L"<1010101010101010>"), buf);
+  EXPECT_EQ(20, swprintf(buf, sizeof(buf), L"<%#" PRIB16 ">", s));
+  EXPECT_EQ(std::wstring(L"<0B1010101010101010>"), buf);
+
+  EXPECT_EQ(34, swprintf(buf, sizeof(buf), L"<%" PRIB32 ">", 0xaaaaaaaa));
   EXPECT_EQ(std::wstring(L"<10101010101010101010101010101010>"), buf);
-  EXPECT_EQ(36, swprintf(buf, sizeof(buf), L"<%#B>", 0xaaaaaaaa));
+  EXPECT_EQ(36, swprintf(buf, sizeof(buf), L"<%#" PRIB32 ">", 0xaaaaaaaa));
   EXPECT_EQ(std::wstring(L"<0B10101010101010101010101010101010>"), buf);
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat"  // clang doesn't like "%lb"
+  EXPECT_EQ(66, swprintf(buf, sizeof(buf), L"<%" PRIB64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_EQ(std::wstring(L"<1010101010101010101010101010101010101010101010101010101010101010>"),
+            buf);
+  EXPECT_EQ(68, swprintf(buf, sizeof(buf), L"<%#" PRIB64 ">", 0xaaaaaaaa'aaaaaaaa));
+  EXPECT_EQ(std::wstring(L"<0B1010101010101010101010101010101010101010101010101010101010101010>"),
+            buf);
+#pragma clang diagnostic pop
+
   EXPECT_EQ(3, swprintf(buf, sizeof(buf), L"<%#B>", 0));
   EXPECT_EQ(std::wstring(L"<0>"), buf);
-#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %B in glibc";
+#endif
 }
 
 TEST(STDIO_TEST, scanf_i_decimal) {
@@ -3143,10 +3247,6 @@
 }
 
 TEST(STDIO_TEST, scanf_b) {
-  // Our clang doesn't know about %b yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat"
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
   int i;
   char ch;
   EXPECT_EQ(2, sscanf("<1012>", "<%b%c>", &i, &ch));
@@ -3159,14 +3259,9 @@
   EXPECT_EQ(2, sscanf("-0b", "%i%c", &i, &ch));
   EXPECT_EQ(0, i);
   EXPECT_EQ('b', ch);
-#pragma clang diagnostic pop
 }
 
 TEST(STDIO_TEST, swscanf_b) {
-  // Our clang doesn't know about %b yet.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat"
-#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
   int i;
   char ch;
   EXPECT_EQ(2, swscanf(L"<1012>", L"<%b%c>", &i, &ch));
@@ -3179,5 +3274,313 @@
   EXPECT_EQ(2, swscanf(L"-0b", L"%i%c", &i, &ch));
   EXPECT_EQ(0, i);
   EXPECT_EQ('b', ch);
-#pragma clang diagnostic pop
 }
+
+TEST(STDIO_TEST, snprintf_w_base) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+  char buf[BUFSIZ];
+  int8_t a = 0b101;
+  snprintf(buf, sizeof(buf), "<%w8b>", a);
+  EXPECT_STREQ("<101>", buf);
+  int8_t b1 = 0xFF;
+  snprintf(buf, sizeof(buf), "<%w8d>", b1);
+  EXPECT_STREQ("<-1>", buf);
+  int8_t b2 = 0x1FF;
+  snprintf(buf, sizeof(buf), "<%w8d>", b2);
+  EXPECT_STREQ("<-1>", buf);
+  int16_t c = 0xFFFF;
+  snprintf(buf, sizeof(buf), "<%w16i>", c);
+  EXPECT_STREQ("<-1>", buf);
+  int32_t d = 021;
+  snprintf(buf, sizeof(buf), "<%w32o>", d);
+  EXPECT_STREQ("<21>", buf);
+  uint32_t e = -1;
+  snprintf(buf, sizeof(buf), "<%w32u>", e);
+  EXPECT_STREQ("<4294967295>", buf);
+  int64_t f = 0x3b;
+  snprintf(buf, sizeof(buf), "<%w64x>", f);
+  EXPECT_STREQ("<3b>", buf);
+  snprintf(buf, sizeof(buf), "<%w64X>", f);
+  EXPECT_STREQ("<3B>", buf);
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, snprintf_w_arguments_reordering) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wformat-extra-args"
+  char buf[BUFSIZ];
+  int32_t a = 0xaaaaaaaa;
+  int64_t b = 0x11111111'22222222;
+  int64_t c = 0x33333333'44444444;
+  int64_t d = 0xaaaaaaaa'aaaaaaaa;
+  snprintf(buf, sizeof(buf), "<%2$w32b --- %1$w64x>", c, a);
+  EXPECT_STREQ("<10101010101010101010101010101010 --- 3333333344444444>", buf);
+  snprintf(buf, sizeof(buf), "<%3$w64b --- %1$w64x --- %2$w64x>", b, c, d);
+  EXPECT_STREQ(
+      "<1010101010101010101010101010101010101010101010101010101010101010 --- 1111111122222222 --- "
+      "3333333344444444>",
+      buf);
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, snprintf_invalid_w_width) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  char buf[BUFSIZ];
+  int32_t a = 100;
+  EXPECT_DEATH(snprintf(buf, sizeof(buf), "%w20d", &a), "%w20 is unsupported");
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_w_base) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+  wchar_t buf[BUFSIZ];
+  int8_t a = 0b101;
+  swprintf(buf, sizeof(buf), L"<%w8b>", a);
+  EXPECT_EQ(std::wstring(L"<101>"), buf);
+  int8_t b1 = 0xFF;
+  swprintf(buf, sizeof(buf), L"<%w8d>", b1);
+  EXPECT_EQ(std::wstring(L"<-1>"), buf);
+  int8_t b2 = 0x1FF;
+  swprintf(buf, sizeof(buf), L"<%w8d>", b2);
+  EXPECT_EQ(std::wstring(L"<-1>"), buf);
+  int16_t c = 0xFFFF;
+  swprintf(buf, sizeof(buf), L"<%w16i>", c);
+  EXPECT_EQ(std::wstring(L"<-1>"), buf);
+  int32_t d = 021;
+  swprintf(buf, sizeof(buf), L"<%w32o>", d);
+  EXPECT_EQ(std::wstring(L"<21>"), buf);
+  uint32_t e = -1;
+  swprintf(buf, sizeof(buf), L"<%w32u>", e);
+  EXPECT_EQ(std::wstring(L"<4294967295>"), buf);
+  int64_t f = 0x3b;
+  swprintf(buf, sizeof(buf), L"<%w64x>", f);
+  EXPECT_EQ(std::wstring(L"<3b>"), buf);
+  swprintf(buf, sizeof(buf), L"<%w64X>", f);
+  EXPECT_EQ(std::wstring(L"<3B>"), buf);
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_w_arguments_reordering) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wformat-extra-args"
+  wchar_t buf[BUFSIZ];
+  int32_t a = 0xaaaaaaaa;
+  int64_t b = 0x11111111'22222222;
+  int64_t c = 0x33333333'44444444;
+  int64_t d = 0xaaaaaaaa'aaaaaaaa;
+  swprintf(buf, sizeof(buf), L"<%2$w32b --- %1$w64x>", c, a);
+  EXPECT_EQ(std::wstring(L"<10101010101010101010101010101010 --- 3333333344444444>"), buf);
+  swprintf(buf, sizeof(buf), L"<%3$w64b --- %1$w64x --- %2$w64x>", b, c, d);
+  EXPECT_EQ(std::wstring(L"<1010101010101010101010101010101010101010101010101010101010101010 --- "
+                         L"1111111122222222 --- 3333333344444444>"),
+            buf);
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_invalid_w_width) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  wchar_t buf[BUFSIZ];
+  int32_t a = 100;
+  EXPECT_DEATH(swprintf(buf, sizeof(buf), L"%w20d", &a), "%w20 is unsupported");
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, snprintf_wf_base) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+#pragma clang diagnostic ignored "-Wformat"
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  char buf[BUFSIZ];
+  int_fast8_t a = 0b101;
+  snprintf(buf, sizeof(buf), "<%wf8b>", a);
+  EXPECT_STREQ("<101>", buf);
+  int_fast8_t b = 0x12341234'12341234;
+  snprintf(buf, sizeof(buf), "<%wf8x>", b);
+  EXPECT_STREQ("<34>", buf);
+  uint_fast16_t c = 0x11111111'22222222;
+#if defined(__LP64__)
+  snprintf(buf, sizeof(buf), "<%wf16x>", c);
+  EXPECT_STREQ("<1111111122222222>", buf);
+#else
+  snprintf(buf, sizeof(buf), "<%wf16x>", c);
+  EXPECT_STREQ("<22222222>", buf);
+#endif
+  int_fast32_t d = 0x33333333'44444444;
+#if defined(__LP64__)
+  snprintf(buf, sizeof(buf), "<%wf32x>", d);
+  EXPECT_STREQ("<3333333344444444>", buf);
+#else
+  snprintf(buf, sizeof(buf), "<%wf32x>", d);
+  EXPECT_STREQ("<44444444>", buf);
+#endif
+  int_fast64_t e = 0xaaaaaaaa'aaaaaaaa;
+  snprintf(buf, sizeof(buf), "<%wf64x>", e);
+  EXPECT_STREQ("<aaaaaaaaaaaaaaaa>", buf);
+  snprintf(buf, sizeof(buf), "<%wf64X>", e);
+  EXPECT_STREQ("<AAAAAAAAAAAAAAAA>", buf);
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %wf in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, snprintf_wf_arguments_reordering) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+#pragma clang diagnostic ignored "-Wformat"
+#pragma clang diagnostic ignored "-Wformat-extra-args"
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  char buf[BUFSIZ];
+  int_fast16_t a = 0x11111111'22222222;
+  int_fast32_t b = 0x33333333'44444444;
+  int_fast32_t c = 0xaaaaaaaa'aaaaaaaa;
+#if defined(__LP64__)
+  snprintf(buf, sizeof(buf), "<%2$wf32x --- %1$wf32b>", c, b);
+  EXPECT_STREQ(
+      "<3333333344444444 --- 1010101010101010101010101010101010101010101010101010101010101010>",
+      buf);
+  snprintf(buf, sizeof(buf), "<%3$wf32b --- %1$wf16x --- %2$wf32x>", a, b, c);
+  EXPECT_STREQ(
+      "<1010101010101010101010101010101010101010101010101010101010101010 --- 1111111122222222 --- "
+      "3333333344444444>",
+      buf);
+#else
+  snprintf(buf, sizeof(buf), "<%2$wf32x --- %1$wf32b>", c, b);
+  EXPECT_STREQ("<44444444 --- 10101010101010101010101010101010>", buf);
+  snprintf(buf, sizeof(buf), "<%3$wf32b --- %1$wf16x --- %2$wf32x>", a, b, c);
+  EXPECT_STREQ("<10101010101010101010101010101010 --- 22222222 --- 44444444>", buf);
+#endif
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, snprintf_invalid_wf_width) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat"
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  char buf[BUFSIZ];
+  int_fast32_t a = 100;
+  EXPECT_DEATH(snprintf(buf, sizeof(buf), "%wf20d", &a), "%wf20 is unsupported");
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_wf_base) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+  wchar_t buf[BUFSIZ];
+  int_fast8_t a = 0b101;
+  swprintf(buf, sizeof(buf), L"<%wf8b>", a);
+  EXPECT_EQ(std::wstring(L"<101>"), buf);
+  int_fast8_t b = 0x12341234'12341234;
+  swprintf(buf, sizeof(buf), L"<%wf8x>", b);
+  EXPECT_EQ(std::wstring(L"<34>"), buf);
+  uint_fast16_t c = 0x11111111'22222222;
+#if defined(__LP64__)
+  swprintf(buf, sizeof(buf), L"<%wf16x>", c);
+  EXPECT_EQ(std::wstring(L"<1111111122222222>"), buf);
+#else
+  swprintf(buf, sizeof(buf), L"<%wf16x>", c);
+  EXPECT_EQ(std::wstring(L"<22222222>"), buf);
+#endif
+  int_fast32_t d = 0x33333333'44444444;
+#if defined(__LP64__)
+  swprintf(buf, sizeof(buf), L"<%wf32x>", d);
+  EXPECT_EQ(std::wstring(L"<3333333344444444>"), buf);
+#else
+  swprintf(buf, sizeof(buf), L"<%wf32x>", d);
+  EXPECT_EQ(std::wstring(L"<44444444>"), buf);
+#endif
+  int_fast64_t e = 0xaaaaaaaa'aaaaaaaa;
+  swprintf(buf, sizeof(buf), L"<%wf64x>", e);
+  EXPECT_EQ(std::wstring(L"<aaaaaaaaaaaaaaaa>"), buf);
+  swprintf(buf, sizeof(buf), L"<%wf64X>", e);
+  EXPECT_EQ(std::wstring(L"<AAAAAAAAAAAAAAAA>"), buf);
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_wf_arguments_reordering) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+#pragma clang diagnostic ignored "-Wformat-extra-args"
+  wchar_t buf[BUFSIZ];
+  int_fast16_t a = 0x11111111'22222222;
+  int_fast32_t b = 0x33333333'44444444;
+  int_fast32_t c = 0xaaaaaaaa'aaaaaaaa;
+#if defined(__LP64__)
+  swprintf(buf, sizeof(buf), L"<%2$wf32x --- %1$wf32b>", c, b);
+  EXPECT_EQ(std::wstring(L"<3333333344444444 --- "
+                         L"1010101010101010101010101010101010101010101010101010101010101010>"),
+            buf);
+  swprintf(buf, sizeof(buf), L"<%3$wf32b --- %1$wf16x --- %2$wf32x>", a, b, c);
+  EXPECT_EQ(std::wstring(L"<1010101010101010101010101010101010101010101010101010101010101010 --- "
+                         L"1111111122222222 --- 3333333344444444>"),
+            buf);
+#else
+  swprintf(buf, sizeof(buf), L"<%2$wf32x --- %1$wf32b>", c, b);
+  EXPECT_EQ(std::wstring(L"<44444444 --- 10101010101010101010101010101010>"), buf);
+  swprintf(buf, sizeof(buf), L"<%3$wf32b --- %1$wf16x --- %2$wf32x>", a, b, c);
+  EXPECT_EQ(std::wstring(L"<10101010101010101010101010101010 --- 22222222 --- 44444444>"), buf);
+#endif
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
+
+TEST(STDIO_TEST, swprintf_invalid_wf_width) {
+#if defined(__BIONIC__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-invalid-specifier"
+  wchar_t buf[BUFSIZ];
+  int_fast32_t a = 100;
+  EXPECT_DEATH(swprintf(buf, sizeof(buf), L"%wf20d", &a), "%wf20 is unsupported");
+#pragma clang diagnostic pop
+#else
+  GTEST_SKIP() << "no %w in glibc";
+#endif
+}
\ No newline at end of file
diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp
index f507e08..45169e3 100644
--- a/tests/stdlib_test.cpp
+++ b/tests/stdlib_test.cpp
@@ -494,7 +494,10 @@
 TEST(stdlib, system_NULL) {
   // "The system() function shall always return non-zero when command is NULL."
   // http://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   ASSERT_NE(0, system(nullptr));
+#pragma clang diagnostic pop
 }
 
 // https://austingroupbugs.net/view.php?id=1440
diff --git a/tests/string_test.cpp b/tests/string_test.cpp
index 30c87dc..38957e2 100644
--- a/tests/string_test.cpp
+++ b/tests/string_test.cpp
@@ -136,7 +136,7 @@
   // A real-time signal.
   ASSERT_STREQ("Real-time signal 14", strsignal(SIGRTMIN + 14));
   // One of the signals the C library keeps to itself.
-  ASSERT_STREQ("Unknown signal 32", strsignal(__SIGRTMIN));
+  ASSERT_STREQ("Unknown signal 32", strsignal(32));  // __SIGRTMIN
 
   // Errors.
   ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small.
diff --git a/tests/sys_msg_test.cpp b/tests/sys_msg_test.cpp
index 200f654..da45087 100644
--- a/tests/sys_msg_test.cpp
+++ b/tests/sys_msg_test.cpp
@@ -74,9 +74,12 @@
 }
 
 TEST(sys_msg, msgctl_failure) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   errno = 0;
   ASSERT_EQ(-1, msgctl(-1, IPC_STAT, nullptr));
   ASSERT_TRUE(errno == EINVAL || errno == ENOSYS);
+#pragma clang diagnostic pop
 }
 
 TEST(sys_msg, msgget_failure) {
@@ -86,9 +89,12 @@
 }
 
 TEST(sys_msg, msgrcv_failure) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   errno = 0;
   ASSERT_EQ(-1, msgrcv(-1, nullptr, 0, 0, 0));
   ASSERT_TRUE(errno == EINVAL || errno == ENOSYS);
+#pragma clang diagnostic pop
 }
 
 TEST(sys_msg, msgsnd_failure) {
diff --git a/tests/sys_ptrace_test.cpp b/tests/sys_ptrace_test.cpp
index a079ead..b8c1537 100644
--- a/tests/sys_ptrace_test.cpp
+++ b/tests/sys_ptrace_test.cpp
@@ -257,6 +257,9 @@
   asm volatile("stm %0, { r0, r1, r2, r3 }" : : "r"(&data));
 #elif defined(__aarch64__)
   asm volatile("stp x0, x1, %0" : : "m"(data));
+#elif defined(__riscv)
+  UNUSED(data);
+  GTEST_LOG_(INFO) << "missing riscv64 instruction to store > 64 bits in one instruction";
 #endif
 }
 
diff --git a/tests/sys_random_test.cpp b/tests/sys_random_test.cpp
index 2e2665b..e0cbf78 100644
--- a/tests/sys_random_test.cpp
+++ b/tests/sys_random_test.cpp
@@ -48,6 +48,8 @@
 }
 
 TEST(sys_random, getentropy_EFAULT) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
 #if defined(HAVE_SYS_RANDOM)
   errno = 0;
   ASSERT_EQ(-1, getentropy(nullptr, 1));
@@ -55,6 +57,7 @@
 #else
   GTEST_SKIP() << "<sys/random.h> not available";
 #endif
+#pragma clang diagnostic pop
 }
 
 TEST(sys_random, getentropy_EIO) {
@@ -84,6 +87,8 @@
 }
 
 TEST(sys_random, getrandom_EFAULT) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
 #if defined(HAVE_SYS_RANDOM)
   errno = 0;
   ASSERT_EQ(-1, getrandom(nullptr, 256, 0));
@@ -91,6 +96,7 @@
 #else
   GTEST_SKIP() << "<sys/random.h> not available";
 #endif
+#pragma clang diagnostic pop
 }
 
 TEST(sys_random, getrandom_EINVAL) {
diff --git a/tests/sys_resource_test.cpp b/tests/sys_resource_test.cpp
index 0247fcb..492fabd 100644
--- a/tests/sys_resource_test.cpp
+++ b/tests/sys_resource_test.cpp
@@ -26,6 +26,7 @@
   ASSERT_NE(sizeof(rlimit), sizeof(rlimit64));
   ASSERT_EQ(4U, sizeof(rlim_t));
 #endif
+  ASSERT_EQ(8U, sizeof(rlim64_t));
 }
 
 class SysResourceTest : public ::testing::Test {
diff --git a/tests/sys_sem_test.cpp b/tests/sys_sem_test.cpp
index b98926b..4bac92f 100644
--- a/tests/sys_sem_test.cpp
+++ b/tests/sys_sem_test.cpp
@@ -87,15 +87,21 @@
 }
 
 TEST(sys_sem, semop_failure) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   errno = 0;
   ASSERT_EQ(-1, semop(-1, nullptr, 0));
   ASSERT_TRUE(errno == EINVAL || errno == ENOSYS);
+#pragma clang diagnostic pop
 }
 
 TEST(sys_sem, semtimedop_failure) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   errno = 0;
   ASSERT_EQ(-1, semtimedop(-1, nullptr, 0, nullptr));
   ASSERT_TRUE(errno == EINVAL || errno == ENOSYS);
+#pragma clang diagnostic pop
 }
 
 TEST(sys_sem, union_semun) {
diff --git a/tests/sys_sysinfo_test.cpp b/tests/sys_sysinfo_test.cpp
index cca2f44..69656ad 100644
--- a/tests/sys_sysinfo_test.cpp
+++ b/tests/sys_sysinfo_test.cpp
@@ -43,7 +43,7 @@
   memset(&si, 0, sizeof(si));
   ASSERT_EQ(0, sysinfo(&si));
 
-  ASSERT_GT(si.uptime, 10);  // You're not running CTS within 10s of booting!
+  ASSERT_GT(static_cast<long>(si.uptime), 10);  // You're not running CTS within 10s of booting!
   ASSERT_GT(uint64_t(si.totalram) * si.mem_unit, uint64_t(512 * 1024 * 1024));
   ASSERT_GE(si.totalram, si.freeram);
   ASSERT_GE(si.totalswap, si.freeswap);
diff --git a/tests/sys_wait_test.cpp b/tests/sys_wait_test.cpp
index c006972..200fabe 100644
--- a/tests/sys_wait_test.cpp
+++ b/tests/sys_wait_test.cpp
@@ -42,3 +42,22 @@
   ASSERT_EQ(66, si.si_status);
   ASSERT_EQ(CLD_EXITED, si.si_code);
 }
+
+// https://github.com/android/ndk/issues/1878
+TEST(sys_wait, macros) {
+#if defined(__GLIBC__)
+  // glibc before 2016 requires an lvalue.
+#else
+  ASSERT_FALSE(WIFEXITED(0x7f));
+  ASSERT_TRUE(WIFSTOPPED(0x7f));
+  ASSERT_FALSE(WIFCONTINUED(0x7f));
+
+  ASSERT_TRUE(WIFEXITED(0x80));
+  ASSERT_FALSE(WIFSTOPPED(0x80));
+  ASSERT_FALSE(WIFCONTINUED(0x80));
+
+  ASSERT_FALSE(WIFEXITED(0xffff));
+  ASSERT_FALSE(WIFSTOPPED(0xffff));
+  ASSERT_TRUE(WIFCONTINUED(0xffff));
+#endif
+}
diff --git a/tests/syslog_test.cpp b/tests/syslog_test.cpp
new file mode 100644
index 0000000..3ec3337
--- /dev/null
+++ b/tests/syslog_test.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <syslog.h>
+
+#include <errno.h>
+#include <gtest/gtest.h>
+
+#include "utils.h"
+
+TEST(syslog, syslog_percent_m) {
+  ExecTestHelper eth;
+  eth.Run(
+      [&]() {
+        openlog("foo", LOG_PERROR, LOG_AUTH);
+        errno = EINVAL;
+        syslog(LOG_ERR, "a b c: %m");
+        closelog();
+        exit(0);
+      },
+      0, "foo: a b c: Invalid argument\n");
+}
+
+TEST(syslog, syslog_empty) {
+  ExecTestHelper eth;
+  eth.Run(
+      [&]() {
+        openlog("foo", LOG_PERROR, LOG_AUTH);
+        errno = EINVAL;
+        syslog(LOG_ERR, "");
+        closelog();
+        exit(0);
+      },
+      0, "foo: \n");
+}
+
+TEST(syslog, syslog_truncation) {
+  ExecTestHelper eth;
+  eth.Run(
+      [&]() {
+        openlog("bar", LOG_PERROR, LOG_AUTH);
+        char too_long[2048] = {};
+        memset(too_long, 'x', sizeof(too_long) - 1);
+        syslog(LOG_ERR, "%s", too_long);
+        closelog();
+        exit(0);
+      },
+      0, "bar: x{1023}\n");
+}
diff --git a/tests/time_test.cpp b/tests/time_test.cpp
index 40e5c6d..d16600c 100644
--- a/tests/time_test.cpp
+++ b/tests/time_test.cpp
@@ -181,10 +181,25 @@
   ASSERT_NE(static_cast<time_t>(-1), mktime(&t));
   ASSERT_EQ(0, errno);
 
-  // This will overflow for LP32 or LP64.
+  // This will overflow for LP32.
   t.tm_year = INT_MAX;
 
   errno = 0;
+#if !defined(__LP64__)
+  ASSERT_EQ(static_cast<time_t>(-1), mktime(&t));
+  ASSERT_EQ(EOVERFLOW, errno);
+#else
+  ASSERT_EQ(static_cast<time_t>(67768036166016000U), mktime(&t));
+  ASSERT_EQ(0, errno);
+#endif
+
+  // This will overflow for LP32 or LP64.
+  // tm_year is int, this t struct points to INT_MAX + 1 no matter what TZ is.
+  t.tm_year = INT_MAX;
+  t.tm_mon = 11;
+  t.tm_mday = 45;
+
+  errno = 0;
   ASSERT_EQ(static_cast<time_t>(-1), mktime(&t));
   ASSERT_EQ(EOVERFLOW, errno);
 }
@@ -998,6 +1013,10 @@
   ASSERT_EQ(-1, ts.tv_sec);
 }
 
+TEST(time, clock_getres_null_resolution) {
+  ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, nullptr));
+}
+
 TEST(time, clock) {
   // clock(3) is hard to test, but a 1s sleep should cost less than 10ms on average.
   static const clock_t N = 5;
@@ -1250,8 +1269,39 @@
 TEST(time, timespec_get) {
 #if __BIONIC__
   timespec ts = {};
-  ASSERT_EQ(0, timespec_get(&ts, 123));
   ASSERT_EQ(TIME_UTC, timespec_get(&ts, TIME_UTC));
+  ASSERT_EQ(TIME_MONOTONIC, timespec_get(&ts, TIME_MONOTONIC));
+  ASSERT_EQ(TIME_ACTIVE, timespec_get(&ts, TIME_ACTIVE));
+  ASSERT_EQ(TIME_THREAD_ACTIVE, timespec_get(&ts, TIME_THREAD_ACTIVE));
+#else
+  GTEST_SKIP() << "glibc doesn't have timespec_get until 2.21";
+#endif
+}
+
+TEST(time, timespec_get_invalid) {
+#if __BIONIC__
+  timespec ts = {};
+  ASSERT_EQ(0, timespec_get(&ts, 123));
+#else
+  GTEST_SKIP() << "glibc doesn't have timespec_get until 2.21";
+#endif
+}
+
+TEST(time, timespec_getres) {
+#if __BIONIC__
+  timespec ts = {};
+  ASSERT_EQ(TIME_UTC, timespec_getres(&ts, TIME_UTC));
+  ASSERT_EQ(1, ts.tv_nsec);
+  ASSERT_EQ(0, ts.tv_sec);
+#else
+  GTEST_SKIP() << "glibc doesn't have timespec_get until 2.21";
+#endif
+}
+
+TEST(time, timespec_getres_invalid) {
+#if __BIONIC__
+  timespec ts = {};
+  ASSERT_EQ(0, timespec_getres(&ts, 123));
 #else
   GTEST_SKIP() << "glibc doesn't have timespec_get until 2.21";
 #endif
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index 5fce5b8..4c21627 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -294,10 +294,13 @@
 }
 
 TEST(UNISTD_TEST, setenv_EINVAL) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   EXPECT_EQ(-1, setenv(nullptr, "value", 0));
   EXPECT_EQ(EINVAL, errno);
   EXPECT_EQ(-1, setenv(nullptr, "value", 1));
   EXPECT_EQ(EINVAL, errno);
+#pragma clang diagnostic pop
   EXPECT_EQ(-1, setenv("", "value", 0));
   EXPECT_EQ(EINVAL, errno);
   EXPECT_EQ(-1, setenv("", "value", 1));
@@ -586,9 +589,10 @@
   TestGetTidCachingWithFork(CloneAndSetTid, exit);
 }
 
+__attribute__((no_sanitize("hwaddress", "memtag")))
 static int CloneStartRoutine(int (*start_routine)(void*)) {
   void* child_stack[1024];
-  return clone(start_routine, untag_address(&child_stack[1024]), SIGCHLD, nullptr);
+  return clone(start_routine, &child_stack[1024], SIGCHLD, nullptr);
 }
 
 static int GetPidCachingCloneStartRoutine(void*) {
diff --git a/tests/utils.cpp b/tests/utils.cpp
index 8258833..92ab145 100644
--- a/tests/utils.cpp
+++ b/tests/utils.cpp
@@ -28,6 +28,10 @@
 
 #include "utils.h"
 
+#include <string>
+
+#include <android-base/properties.h>
+
 void RunGwpAsanTest(const char* test_name) {
   ExecTestHelper eh;
   eh.SetEnv({"GWP_ASAN_SAMPLE_RATE=1", "GWP_ASAN_PROCESS_SAMPLING=1", "GWP_ASAN_MAX_ALLOCS=40000",
@@ -53,3 +57,9 @@
          // |expected_output_regex|, ensure at least one test ran:
          R"(\[  PASSED  \] [1-9]+0? test)");
 }
+
+bool IsLowRamDevice() {
+  return android::base::GetBoolProperty("ro.config.low_ram", false) ||
+         (android::base::GetBoolProperty("ro.debuggable", false) &&
+          android::base::GetBoolProperty("debug.force_low_ram", false));
+}
diff --git a/tests/utils.h b/tests/utils.h
index 81869e3..2e00cc1 100644
--- a/tests/utils.h
+++ b/tests/utils.h
@@ -313,3 +313,5 @@
   return false;
 #endif
 }
+
+bool IsLowRamDevice();
diff --git a/tests/utmp_test.cpp b/tests/utmp_test.cpp
index 6d0d6f1..459f9c3 100644
--- a/tests/utmp_test.cpp
+++ b/tests/utmp_test.cpp
@@ -25,9 +25,11 @@
 }
 
 TEST(utmp, smoke) {
+  // The rest of <utmp.h> is just no-op implementations, so testing is trivial.
   ASSERT_EQ(-1, utmpname("hello"));
   setutent();
   ASSERT_EQ(NULL, getutent());
   endutent();
-  ASSERT_EQ(NULL, pututline(NULL));
+  utmp failure = {.ut_type = EMPTY};
+  ASSERT_EQ(NULL, pututline(&failure));
 }
diff --git a/libc/include/android/legacy_errno_inlines.h b/tests/utmpx_test.cpp
similarity index 76%
copy from libc/include/android/legacy_errno_inlines.h
copy to tests/utmpx_test.cpp
index fcbca13..55427a6 100644
--- a/libc/include/android/legacy_errno_inlines.h
+++ b/tests/utmpx_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,21 +26,17 @@
  * SUCH DAMAGE.
  */
 
-#pragma once
+#include <gtest/gtest.h>
 
-#include <sys/cdefs.h>
+#include <utmpx.h>
 
-#if __ANDROID_API__ < 21
-
-#include <errno.h>
-
-__BEGIN_DECLS
-
-static __inline int __attribute__((deprecated)) __set_errno(int n) {
-  errno = n;
-  return -1;
+TEST(utmpx, smoke) {
+  // Our utmpx "implementation" just calls the utmp no-op functions.
+  setutxent();
+  utmpx empty = {.ut_type = EMPTY};
+  ASSERT_EQ(NULL, getutxent());
+  ASSERT_EQ(NULL, getutxid(&empty));
+  ASSERT_EQ(NULL, getutxline(&empty));
+  endutxent();
+  ASSERT_EQ(NULL, pututxline(&empty));
 }
-
-__END_DECLS
-
-#endif
diff --git a/tests/wchar_test.cpp b/tests/wchar_test.cpp
index 16d4348..8716810 100644
--- a/tests/wchar_test.cpp
+++ b/tests/wchar_test.cpp
@@ -714,7 +714,8 @@
 #if defined(__BIONIC__)
   wchar_t* p;
   size_t size;
-
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
   // Invalid buffer.
   errno = 0;
   ASSERT_EQ(nullptr, open_wmemstream(nullptr, &size));
@@ -724,6 +725,7 @@
   errno = 0;
   ASSERT_EQ(nullptr, open_wmemstream(&p, nullptr));
   ASSERT_EQ(EINVAL, errno);
+#pragma clang diagnostic pop
 #else
   GTEST_SKIP() << "This test is bionic-specific";
 #endif
diff --git a/tools/generate-version-script.py b/tools/generate-version-script.py
index def621e..fab46b9 100755
--- a/tools/generate-version-script.py
+++ b/tools/generate-version-script.py
@@ -8,7 +8,7 @@
 import sys
 
 def has_arch_tags(tags):
-  for arch in ["arm", "arm64", "x86", "x86_64"]:
+  for arch in ["arm", "arm64", "riscv64", "x86", "x86_64"]:
     if arch in tags:
       return True
   return False
diff --git a/tools/versioner/src/Arch.cpp b/tools/versioner/src/Arch.cpp
index 3a27a6e..d4d0208 100644
--- a/tools/versioner/src/Arch.cpp
+++ b/tools/versioner/src/Arch.cpp
@@ -28,6 +28,9 @@
     case Arch::arm64:
       return "arm64";
 
+    case Arch::riscv64:
+      return "riscv64";
+
     case Arch::x86:
       return "x86";
 
@@ -41,6 +44,7 @@
 static const std::unordered_map<std::string, Arch> arch_name_map{
   {"arm", Arch::arm},
   {"arm64", Arch::arm64},
+  {"riscv64", Arch::riscv64},
   {"x86", Arch::x86},
   {"x86_64", Arch::x86_64},
 };
diff --git a/tools/versioner/src/Arch.h b/tools/versioner/src/Arch.h
index 74d0f8f..fd98abc 100644
--- a/tools/versioner/src/Arch.h
+++ b/tools/versioner/src/Arch.h
@@ -28,6 +28,7 @@
 enum class Arch : size_t {
   arm = 0,
   arm64,
+  riscv64,
   x86,
   x86_64,
 };
@@ -121,6 +122,7 @@
 static const std::set<Arch> supported_archs = {
   Arch::arm,
   Arch::arm64,
+  Arch::riscv64,
   Arch::x86,
   Arch::x86_64,
 };
@@ -128,17 +130,19 @@
 static ArchMap<std::string> arch_targets = {
   { Arch::arm, "arm-linux-androideabi" },
   { Arch::arm64, "aarch64-linux-android" },
+  { Arch::riscv64, "riscv64-linux-android" },
   { Arch::x86, "i686-linux-android" },
   { Arch::x86_64, "x86_64-linux-android" },
 };
 
 static const std::set<int> default_levels = {
-  14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30,
+  14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34,
 };
 
 static const ArchMap<int> arch_min_api = {
   { Arch::arm, 9 },
   { Arch::arm64, 21 },
+  { Arch::riscv64, 10000 },
   { Arch::x86, 9 },
   { Arch::x86_64, 21 },
 };
@@ -160,4 +164,7 @@
   {"P", 28},
   {"Q", 29},
   {"R", 30},
+  {"S", 31},
+  {"T", 33},
+  {"U", 34},
 };
diff --git a/tools/versioner/src/DeclarationDatabase.cpp b/tools/versioner/src/DeclarationDatabase.cpp
index ec2e38d..a029c3b 100644
--- a/tools/versioner/src/DeclarationDatabase.cpp
+++ b/tools/versioner/src/DeclarationDatabase.cpp
@@ -170,6 +170,7 @@
               &arch_availability[Arch::x86].introduced } },
           { "introduced_in_64",
             { &arch_availability[Arch::arm64].introduced,
+              &arch_availability[Arch::riscv64].introduced,
               &arch_availability[Arch::x86_64].introduced } },
         };
 
diff --git a/tools/versioner/src/Preprocessor.cpp b/tools/versioner/src/Preprocessor.cpp
index eb88c46..14f80d8 100644
--- a/tools/versioner/src/Preprocessor.cpp
+++ b/tools/versioner/src/Preprocessor.cpp
@@ -141,11 +141,12 @@
   static const std::vector<std::pair<std::string, std::set<Arch>>> arch_sets = {
     { "", supported_archs },
     { "!defined(__LP64__)", { Arch::arm, Arch::x86 } },
-    { "defined(__LP64__)", { Arch::arm64, Arch::x86_64 } },
+    { "defined(__LP64__)", { Arch::arm64, Arch::riscv64, Arch::x86_64 } },
   };
   std::map<Arch, std::string> individual_archs = {
     { Arch::arm, "defined(__arm__)" },
     { Arch::arm64, "defined(__aarch64__)" },
+    { Arch::riscv64, "defined(__riscv)" },
     { Arch::x86, "defined(__i386__)" },
     { Arch::x86_64, "defined(__x86_64__)" },
   };
diff --git a/tools/versioner/src/versioner.h b/tools/versioner/src/versioner.h
index e9c4989..225e14b 100644
--- a/tools/versioner/src/versioner.h
+++ b/tools/versioner/src/versioner.h
@@ -39,5 +39,5 @@
   { "sys/_system_properties.h", supported_archs },
 
   // time64.h #errors when included on LP64 archs.
-  { "time64.h", { Arch::arm64, Arch::x86_64 } },
+  { "time64.h", { Arch::arm64, Arch::riscv64, Arch::x86_64 } },
 };