public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v7 09/13] LoongArch: Add ABI Lists
@ 2022-07-19  1:22 caiyinyu
  2022-07-19  1:22 ` [PATCH v7 10/13] LoongArch: Build Infastructure caiyinyu
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: caiyinyu @ 2022-07-19  1:22 UTC (permalink / raw)
  To: adhemerval.zanella, libc-alpha, joseph_myers, carlos, i.swmail; +Cc: caiyinyu

---
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2153 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1030 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 11 files changed, 3382 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist

diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
new file mode 100644
index 0000000000..ac925ccb36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:l
+blkcnt_t:l
+blksize_t:i
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:m
+fd_mask:l
+fsblkcnt64_t:m
+fsblkcnt_t:m
+fsfilcnt64_t:m
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:m
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:l
+int8_t:a
+intptr_t:l
+key_t:i
+loff_t:l
+mode_t:j
+nlink_t:j
+off64_t:l
+off_t:l
+pid_t:i
+pthread_attr_t:14pthread_attr_t
+pthread_barrier_t:17pthread_barrier_t
+pthread_barrierattr_t:21pthread_barrierattr_t
+pthread_cond_t:14pthread_cond_t
+pthread_condattr_t:18pthread_condattr_t
+pthread_key_t:j
+pthread_mutex_t:15pthread_mutex_t
+pthread_mutexattr_t:19pthread_mutexattr_t
+pthread_once_t:i
+pthread_rwlock_t:16pthread_rwlock_t
+pthread_rwlockattr_t:20pthread_rwlockattr_t
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:l
+register_t:l
+rlim64_t:m
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:m
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:m
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
new file mode 100644
index 0000000000..93fcd64eee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.36 __libc_stack_end D 0x8
+GLIBC_2.36 __rseq_flags D 0x4
+GLIBC_2.36 __rseq_offset D 0x8
+GLIBC_2.36 __rseq_size D 0x4
+GLIBC_2.36 __stack_chk_guard D 0x8
+GLIBC_2.36 __tls_get_addr F
+GLIBC_2.36 _dl_mcount F
+GLIBC_2.36 _r_debug D 0x28
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
new file mode 100644
index 0000000000..404afa3683
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
@@ -0,0 +1 @@
+GLIBC_2.36 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
new file mode 100644
index 0000000000..b02bc6ddc8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -0,0 +1,2153 @@
+GLIBC_2.36 _Exit F
+GLIBC_2.36 _Fork F
+GLIBC_2.36 _IO_2_1_stderr_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdin_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdout_ D 0xe0
+GLIBC_2.36 _IO_adjust_column F
+GLIBC_2.36 _IO_adjust_wcolumn F
+GLIBC_2.36 _IO_default_doallocate F
+GLIBC_2.36 _IO_default_finish F
+GLIBC_2.36 _IO_default_pbackfail F
+GLIBC_2.36 _IO_default_uflow F
+GLIBC_2.36 _IO_default_xsgetn F
+GLIBC_2.36 _IO_default_xsputn F
+GLIBC_2.36 _IO_do_write F
+GLIBC_2.36 _IO_doallocbuf F
+GLIBC_2.36 _IO_fclose F
+GLIBC_2.36 _IO_fdopen F
+GLIBC_2.36 _IO_feof F
+GLIBC_2.36 _IO_ferror F
+GLIBC_2.36 _IO_fflush F
+GLIBC_2.36 _IO_fgetpos F
+GLIBC_2.36 _IO_fgetpos64 F
+GLIBC_2.36 _IO_fgets F
+GLIBC_2.36 _IO_file_attach F
+GLIBC_2.36 _IO_file_close F
+GLIBC_2.36 _IO_file_close_it F
+GLIBC_2.36 _IO_file_doallocate F
+GLIBC_2.36 _IO_file_finish F
+GLIBC_2.36 _IO_file_fopen F
+GLIBC_2.36 _IO_file_init F
+GLIBC_2.36 _IO_file_jumps D 0xa8
+GLIBC_2.36 _IO_file_open F
+GLIBC_2.36 _IO_file_overflow F
+GLIBC_2.36 _IO_file_read F
+GLIBC_2.36 _IO_file_seek F
+GLIBC_2.36 _IO_file_seekoff F
+GLIBC_2.36 _IO_file_setbuf F
+GLIBC_2.36 _IO_file_stat F
+GLIBC_2.36 _IO_file_sync F
+GLIBC_2.36 _IO_file_underflow F
+GLIBC_2.36 _IO_file_write F
+GLIBC_2.36 _IO_file_xsputn F
+GLIBC_2.36 _IO_flockfile F
+GLIBC_2.36 _IO_flush_all F
+GLIBC_2.36 _IO_flush_all_linebuffered F
+GLIBC_2.36 _IO_fopen F
+GLIBC_2.36 _IO_fprintf F
+GLIBC_2.36 _IO_fputs F
+GLIBC_2.36 _IO_fread F
+GLIBC_2.36 _IO_free_backup_area F
+GLIBC_2.36 _IO_free_wbackup_area F
+GLIBC_2.36 _IO_fsetpos F
+GLIBC_2.36 _IO_fsetpos64 F
+GLIBC_2.36 _IO_ftell F
+GLIBC_2.36 _IO_ftrylockfile F
+GLIBC_2.36 _IO_funlockfile F
+GLIBC_2.36 _IO_fwrite F
+GLIBC_2.36 _IO_getc F
+GLIBC_2.36 _IO_getline F
+GLIBC_2.36 _IO_getline_info F
+GLIBC_2.36 _IO_gets F
+GLIBC_2.36 _IO_init F
+GLIBC_2.36 _IO_init_marker F
+GLIBC_2.36 _IO_init_wmarker F
+GLIBC_2.36 _IO_iter_begin F
+GLIBC_2.36 _IO_iter_end F
+GLIBC_2.36 _IO_iter_file F
+GLIBC_2.36 _IO_iter_next F
+GLIBC_2.36 _IO_least_wmarker F
+GLIBC_2.36 _IO_link_in F
+GLIBC_2.36 _IO_list_all D 0x8
+GLIBC_2.36 _IO_list_lock F
+GLIBC_2.36 _IO_list_resetlock F
+GLIBC_2.36 _IO_list_unlock F
+GLIBC_2.36 _IO_marker_delta F
+GLIBC_2.36 _IO_marker_difference F
+GLIBC_2.36 _IO_padn F
+GLIBC_2.36 _IO_peekc_locked F
+GLIBC_2.36 _IO_popen F
+GLIBC_2.36 _IO_printf F
+GLIBC_2.36 _IO_proc_close F
+GLIBC_2.36 _IO_proc_open F
+GLIBC_2.36 _IO_putc F
+GLIBC_2.36 _IO_puts F
+GLIBC_2.36 _IO_remove_marker F
+GLIBC_2.36 _IO_seekmark F
+GLIBC_2.36 _IO_seekoff F
+GLIBC_2.36 _IO_seekpos F
+GLIBC_2.36 _IO_seekwmark F
+GLIBC_2.36 _IO_setb F
+GLIBC_2.36 _IO_setbuffer F
+GLIBC_2.36 _IO_setvbuf F
+GLIBC_2.36 _IO_sgetn F
+GLIBC_2.36 _IO_sprintf F
+GLIBC_2.36 _IO_sputbackc F
+GLIBC_2.36 _IO_sputbackwc F
+GLIBC_2.36 _IO_sscanf F
+GLIBC_2.36 _IO_str_init_readonly F
+GLIBC_2.36 _IO_str_init_static F
+GLIBC_2.36 _IO_str_overflow F
+GLIBC_2.36 _IO_str_pbackfail F
+GLIBC_2.36 _IO_str_seekoff F
+GLIBC_2.36 _IO_str_underflow F
+GLIBC_2.36 _IO_sungetc F
+GLIBC_2.36 _IO_sungetwc F
+GLIBC_2.36 _IO_switch_to_get_mode F
+GLIBC_2.36 _IO_switch_to_main_wget_area F
+GLIBC_2.36 _IO_switch_to_wbackup_area F
+GLIBC_2.36 _IO_switch_to_wget_mode F
+GLIBC_2.36 _IO_un_link F
+GLIBC_2.36 _IO_ungetc F
+GLIBC_2.36 _IO_unsave_markers F
+GLIBC_2.36 _IO_unsave_wmarkers F
+GLIBC_2.36 _IO_vfprintf F
+GLIBC_2.36 _IO_vsprintf F
+GLIBC_2.36 _IO_wdefault_doallocate F
+GLIBC_2.36 _IO_wdefault_finish F
+GLIBC_2.36 _IO_wdefault_pbackfail F
+GLIBC_2.36 _IO_wdefault_uflow F
+GLIBC_2.36 _IO_wdefault_xsgetn F
+GLIBC_2.36 _IO_wdefault_xsputn F
+GLIBC_2.36 _IO_wdo_write F
+GLIBC_2.36 _IO_wdoallocbuf F
+GLIBC_2.36 _IO_wfile_jumps D 0xa8
+GLIBC_2.36 _IO_wfile_overflow F
+GLIBC_2.36 _IO_wfile_seekoff F
+GLIBC_2.36 _IO_wfile_sync F
+GLIBC_2.36 _IO_wfile_underflow F
+GLIBC_2.36 _IO_wfile_xsputn F
+GLIBC_2.36 _IO_wmarker_delta F
+GLIBC_2.36 _IO_wsetb F
+GLIBC_2.36 __adjtimex F
+GLIBC_2.36 __argz_count F
+GLIBC_2.36 __argz_next F
+GLIBC_2.36 __argz_stringify F
+GLIBC_2.36 __asprintf F
+GLIBC_2.36 __asprintf_chk F
+GLIBC_2.36 __assert F
+GLIBC_2.36 __assert_fail F
+GLIBC_2.36 __assert_perror_fail F
+GLIBC_2.36 __backtrace F
+GLIBC_2.36 __backtrace_symbols F
+GLIBC_2.36 __backtrace_symbols_fd F
+GLIBC_2.36 __bsd_getpgrp F
+GLIBC_2.36 __bzero F
+GLIBC_2.36 __check_rhosts_file D 0x4
+GLIBC_2.36 __chk_fail F
+GLIBC_2.36 __clone F
+GLIBC_2.36 __close F
+GLIBC_2.36 __cmsg_nxthdr F
+GLIBC_2.36 __confstr_chk F
+GLIBC_2.36 __connect F
+GLIBC_2.36 __ctype_b_loc F
+GLIBC_2.36 __ctype_get_mb_cur_max F
+GLIBC_2.36 __ctype_tolower_loc F
+GLIBC_2.36 __ctype_toupper_loc F
+GLIBC_2.36 __curbrk D 0x8
+GLIBC_2.36 __cxa_at_quick_exit F
+GLIBC_2.36 __cxa_atexit F
+GLIBC_2.36 __cxa_finalize F
+GLIBC_2.36 __cxa_thread_atexit_impl F
+GLIBC_2.36 __cyg_profile_func_enter F
+GLIBC_2.36 __cyg_profile_func_exit F
+GLIBC_2.36 __daylight D 0x4
+GLIBC_2.36 __dcgettext F
+GLIBC_2.36 __dgettext F
+GLIBC_2.36 __dprintf_chk F
+GLIBC_2.36 __dup2 F
+GLIBC_2.36 __duplocale F
+GLIBC_2.36 __endmntent F
+GLIBC_2.36 __environ D 0x8
+GLIBC_2.36 __errno_location F
+GLIBC_2.36 __explicit_bzero_chk F
+GLIBC_2.36 __fbufsize F
+GLIBC_2.36 __fcntl F
+GLIBC_2.36 __fdelt_chk F
+GLIBC_2.36 __fdelt_warn F
+GLIBC_2.36 __ffs F
+GLIBC_2.36 __fgets_chk F
+GLIBC_2.36 __fgets_unlocked_chk F
+GLIBC_2.36 __fgetws_chk F
+GLIBC_2.36 __fgetws_unlocked_chk F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __flbf F
+GLIBC_2.36 __fork F
+GLIBC_2.36 __fpending F
+GLIBC_2.36 __fprintf_chk F
+GLIBC_2.36 __fpu_control D 0x4
+GLIBC_2.36 __fpurge F
+GLIBC_2.36 __fread_chk F
+GLIBC_2.36 __fread_unlocked_chk F
+GLIBC_2.36 __freadable F
+GLIBC_2.36 __freading F
+GLIBC_2.36 __freelocale F
+GLIBC_2.36 __fsetlocking F
+GLIBC_2.36 __fwprintf_chk F
+GLIBC_2.36 __fwritable F
+GLIBC_2.36 __fwriting F
+GLIBC_2.36 __getauxval F
+GLIBC_2.36 __getcwd_chk F
+GLIBC_2.36 __getdelim F
+GLIBC_2.36 __getdomainname_chk F
+GLIBC_2.36 __getgroups_chk F
+GLIBC_2.36 __gethostname_chk F
+GLIBC_2.36 __getlogin_r_chk F
+GLIBC_2.36 __getmntent_r F
+GLIBC_2.36 __getpagesize F
+GLIBC_2.36 __getpgid F
+GLIBC_2.36 __getpid F
+GLIBC_2.36 __gets_chk F
+GLIBC_2.36 __gettimeofday F
+GLIBC_2.36 __getwd_chk F
+GLIBC_2.36 __gmtime_r F
+GLIBC_2.36 __h_errno_location F
+GLIBC_2.36 __isalnum_l F
+GLIBC_2.36 __isalpha_l F
+GLIBC_2.36 __isascii_l F
+GLIBC_2.36 __isblank_l F
+GLIBC_2.36 __iscntrl_l F
+GLIBC_2.36 __isctype F
+GLIBC_2.36 __isdigit_l F
+GLIBC_2.36 __isgraph_l F
+GLIBC_2.36 __isinf F
+GLIBC_2.36 __isinff F
+GLIBC_2.36 __isinfl F
+GLIBC_2.36 __islower_l F
+GLIBC_2.36 __isnan F
+GLIBC_2.36 __isnanf F
+GLIBC_2.36 __isnanl F
+GLIBC_2.36 __isoc99_fscanf F
+GLIBC_2.36 __isoc99_fwscanf F
+GLIBC_2.36 __isoc99_scanf F
+GLIBC_2.36 __isoc99_sscanf F
+GLIBC_2.36 __isoc99_swscanf F
+GLIBC_2.36 __isoc99_vfscanf F
+GLIBC_2.36 __isoc99_vfwscanf F
+GLIBC_2.36 __isoc99_vscanf F
+GLIBC_2.36 __isoc99_vsscanf F
+GLIBC_2.36 __isoc99_vswscanf F
+GLIBC_2.36 __isoc99_vwscanf F
+GLIBC_2.36 __isoc99_wscanf F
+GLIBC_2.36 __isprint_l F
+GLIBC_2.36 __ispunct_l F
+GLIBC_2.36 __isspace_l F
+GLIBC_2.36 __isupper_l F
+GLIBC_2.36 __iswalnum_l F
+GLIBC_2.36 __iswalpha_l F
+GLIBC_2.36 __iswblank_l F
+GLIBC_2.36 __iswcntrl_l F
+GLIBC_2.36 __iswctype F
+GLIBC_2.36 __iswctype_l F
+GLIBC_2.36 __iswdigit_l F
+GLIBC_2.36 __iswgraph_l F
+GLIBC_2.36 __iswlower_l F
+GLIBC_2.36 __iswprint_l F
+GLIBC_2.36 __iswpunct_l F
+GLIBC_2.36 __iswspace_l F
+GLIBC_2.36 __iswupper_l F
+GLIBC_2.36 __iswxdigit_l F
+GLIBC_2.36 __isxdigit_l F
+GLIBC_2.36 __ivaliduser F
+GLIBC_2.36 __libc_allocate_rtsig F
+GLIBC_2.36 __libc_calloc F
+GLIBC_2.36 __libc_current_sigrtmax F
+GLIBC_2.36 __libc_current_sigrtmin F
+GLIBC_2.36 __libc_free F
+GLIBC_2.36 __libc_freeres F
+GLIBC_2.36 __libc_init_first F
+GLIBC_2.36 __libc_mallinfo F
+GLIBC_2.36 __libc_malloc F
+GLIBC_2.36 __libc_mallopt F
+GLIBC_2.36 __libc_memalign F
+GLIBC_2.36 __libc_pvalloc F
+GLIBC_2.36 __libc_realloc F
+GLIBC_2.36 __libc_sa_len F
+GLIBC_2.36 __libc_single_threaded D 0x1
+GLIBC_2.36 __libc_start_main F
+GLIBC_2.36 __libc_valloc F
+GLIBC_2.36 __longjmp_chk F
+GLIBC_2.36 __lseek F
+GLIBC_2.36 __mbrlen F
+GLIBC_2.36 __mbrtowc F
+GLIBC_2.36 __mbsnrtowcs_chk F
+GLIBC_2.36 __mbsrtowcs_chk F
+GLIBC_2.36 __mbstowcs_chk F
+GLIBC_2.36 __memcmpeq F
+GLIBC_2.36 __memcpy_chk F
+GLIBC_2.36 __memmove_chk F
+GLIBC_2.36 __mempcpy F
+GLIBC_2.36 __mempcpy_chk F
+GLIBC_2.36 __memset_chk F
+GLIBC_2.36 __monstartup F
+GLIBC_2.36 __mq_open_2 F
+GLIBC_2.36 __nanosleep F
+GLIBC_2.36 __newlocale F
+GLIBC_2.36 __nl_langinfo_l F
+GLIBC_2.36 __nss_configure_lookup F
+GLIBC_2.36 __nss_hostname_digits_dots F
+GLIBC_2.36 __obstack_printf_chk F
+GLIBC_2.36 __obstack_vprintf_chk F
+GLIBC_2.36 __open F
+GLIBC_2.36 __open64 F
+GLIBC_2.36 __open64_2 F
+GLIBC_2.36 __open_2 F
+GLIBC_2.36 __openat64_2 F
+GLIBC_2.36 __openat_2 F
+GLIBC_2.36 __overflow F
+GLIBC_2.36 __pipe F
+GLIBC_2.36 __poll F
+GLIBC_2.36 __poll_chk F
+GLIBC_2.36 __posix_getopt F
+GLIBC_2.36 __ppoll_chk F
+GLIBC_2.36 __pread64 F
+GLIBC_2.36 __pread64_chk F
+GLIBC_2.36 __pread_chk F
+GLIBC_2.36 __printf_chk F
+GLIBC_2.36 __printf_fp F
+GLIBC_2.36 __profile_frequency F
+GLIBC_2.36 __progname D 0x8
+GLIBC_2.36 __progname_full D 0x8
+GLIBC_2.36 __pthread_cleanup_routine F
+GLIBC_2.36 __pthread_key_create F
+GLIBC_2.36 __pthread_register_cancel F
+GLIBC_2.36 __pthread_register_cancel_defer F
+GLIBC_2.36 __pthread_rwlock_unlock F
+GLIBC_2.36 __pthread_unregister_cancel F
+GLIBC_2.36 __pthread_unregister_cancel_restore F
+GLIBC_2.36 __pthread_unwind_next F
+GLIBC_2.36 __ptsname_r_chk F
+GLIBC_2.36 __pwrite64 F
+GLIBC_2.36 __rawmemchr F
+GLIBC_2.36 __rcmd_errstr D 0x8
+GLIBC_2.36 __read F
+GLIBC_2.36 __read_chk F
+GLIBC_2.36 __readlink_chk F
+GLIBC_2.36 __readlinkat_chk F
+GLIBC_2.36 __realpath_chk F
+GLIBC_2.36 __recv_chk F
+GLIBC_2.36 __recvfrom_chk F
+GLIBC_2.36 __register_atfork F
+GLIBC_2.36 __res_init F
+GLIBC_2.36 __res_nclose F
+GLIBC_2.36 __res_ninit F
+GLIBC_2.36 __res_randomid F
+GLIBC_2.36 __res_state F
+GLIBC_2.36 __sbrk F
+GLIBC_2.36 __sched_cpualloc F
+GLIBC_2.36 __sched_cpucount F
+GLIBC_2.36 __sched_cpufree F
+GLIBC_2.36 __sched_get_priority_max F
+GLIBC_2.36 __sched_get_priority_min F
+GLIBC_2.36 __sched_getparam F
+GLIBC_2.36 __sched_getscheduler F
+GLIBC_2.36 __sched_setscheduler F
+GLIBC_2.36 __sched_yield F
+GLIBC_2.36 __select F
+GLIBC_2.36 __send F
+GLIBC_2.36 __setmntent F
+GLIBC_2.36 __setpgid F
+GLIBC_2.36 __sigaction F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __sigpause F
+GLIBC_2.36 __sigsetjmp F
+GLIBC_2.36 __sigsuspend F
+GLIBC_2.36 __snprintf_chk F
+GLIBC_2.36 __sprintf_chk F
+GLIBC_2.36 __stack_chk_fail F
+GLIBC_2.36 __statfs F
+GLIBC_2.36 __stpcpy F
+GLIBC_2.36 __stpcpy_chk F
+GLIBC_2.36 __stpncpy F
+GLIBC_2.36 __stpncpy_chk F
+GLIBC_2.36 __strcasecmp F
+GLIBC_2.36 __strcasecmp_l F
+GLIBC_2.36 __strcasestr F
+GLIBC_2.36 __strcat_chk F
+GLIBC_2.36 __strcoll_l F
+GLIBC_2.36 __strcpy_chk F
+GLIBC_2.36 __strdup F
+GLIBC_2.36 __strerror_r F
+GLIBC_2.36 __strfmon_l F
+GLIBC_2.36 __strftime_l F
+GLIBC_2.36 __strncasecmp_l F
+GLIBC_2.36 __strncat_chk F
+GLIBC_2.36 __strncpy_chk F
+GLIBC_2.36 __strndup F
+GLIBC_2.36 __strsep_g F
+GLIBC_2.36 __strtod_internal F
+GLIBC_2.36 __strtod_l F
+GLIBC_2.36 __strtof_internal F
+GLIBC_2.36 __strtof_l F
+GLIBC_2.36 __strtok_r F
+GLIBC_2.36 __strtol_internal F
+GLIBC_2.36 __strtol_l F
+GLIBC_2.36 __strtold_internal F
+GLIBC_2.36 __strtold_l F
+GLIBC_2.36 __strtoll_internal F
+GLIBC_2.36 __strtoll_l F
+GLIBC_2.36 __strtoul_internal F
+GLIBC_2.36 __strtoul_l F
+GLIBC_2.36 __strtoull_internal F
+GLIBC_2.36 __strtoull_l F
+GLIBC_2.36 __strverscmp F
+GLIBC_2.36 __strxfrm_l F
+GLIBC_2.36 __swprintf_chk F
+GLIBC_2.36 __sysconf F
+GLIBC_2.36 __syslog_chk F
+GLIBC_2.36 __sysv_signal F
+GLIBC_2.36 __timezone D 0x8
+GLIBC_2.36 __toascii_l F
+GLIBC_2.36 __tolower_l F
+GLIBC_2.36 __toupper_l F
+GLIBC_2.36 __towctrans F
+GLIBC_2.36 __towctrans_l F
+GLIBC_2.36 __towlower_l F
+GLIBC_2.36 __towupper_l F
+GLIBC_2.36 __ttyname_r_chk F
+GLIBC_2.36 __tzname D 0x10
+GLIBC_2.36 __uflow F
+GLIBC_2.36 __underflow F
+GLIBC_2.36 __uselocale F
+GLIBC_2.36 __vasprintf_chk F
+GLIBC_2.36 __vdprintf_chk F
+GLIBC_2.36 __vfork F
+GLIBC_2.36 __vfprintf_chk F
+GLIBC_2.36 __vfscanf F
+GLIBC_2.36 __vfwprintf_chk F
+GLIBC_2.36 __vprintf_chk F
+GLIBC_2.36 __vsnprintf F
+GLIBC_2.36 __vsnprintf_chk F
+GLIBC_2.36 __vsprintf_chk F
+GLIBC_2.36 __vsscanf F
+GLIBC_2.36 __vswprintf_chk F
+GLIBC_2.36 __vsyslog_chk F
+GLIBC_2.36 __vwprintf_chk F
+GLIBC_2.36 __wait F
+GLIBC_2.36 __waitpid F
+GLIBC_2.36 __wcpcpy_chk F
+GLIBC_2.36 __wcpncpy_chk F
+GLIBC_2.36 __wcrtomb_chk F
+GLIBC_2.36 __wcscasecmp_l F
+GLIBC_2.36 __wcscat_chk F
+GLIBC_2.36 __wcscoll_l F
+GLIBC_2.36 __wcscpy_chk F
+GLIBC_2.36 __wcsftime_l F
+GLIBC_2.36 __wcsncasecmp_l F
+GLIBC_2.36 __wcsncat_chk F
+GLIBC_2.36 __wcsncpy_chk F
+GLIBC_2.36 __wcsnrtombs_chk F
+GLIBC_2.36 __wcsrtombs_chk F
+GLIBC_2.36 __wcstod_internal F
+GLIBC_2.36 __wcstod_l F
+GLIBC_2.36 __wcstof_internal F
+GLIBC_2.36 __wcstof_l F
+GLIBC_2.36 __wcstol_internal F
+GLIBC_2.36 __wcstol_l F
+GLIBC_2.36 __wcstold_internal F
+GLIBC_2.36 __wcstold_l F
+GLIBC_2.36 __wcstoll_internal F
+GLIBC_2.36 __wcstoll_l F
+GLIBC_2.36 __wcstombs_chk F
+GLIBC_2.36 __wcstoul_internal F
+GLIBC_2.36 __wcstoul_l F
+GLIBC_2.36 __wcstoull_internal F
+GLIBC_2.36 __wcstoull_l F
+GLIBC_2.36 __wcsxfrm_l F
+GLIBC_2.36 __wctomb_chk F
+GLIBC_2.36 __wctrans_l F
+GLIBC_2.36 __wctype_l F
+GLIBC_2.36 __wmemcpy_chk F
+GLIBC_2.36 __wmemmove_chk F
+GLIBC_2.36 __wmempcpy_chk F
+GLIBC_2.36 __wmemset_chk F
+GLIBC_2.36 __woverflow F
+GLIBC_2.36 __wprintf_chk F
+GLIBC_2.36 __write F
+GLIBC_2.36 __wuflow F
+GLIBC_2.36 __wunderflow F
+GLIBC_2.36 __xpg_basename F
+GLIBC_2.36 __xpg_sigpause F
+GLIBC_2.36 __xpg_strerror_r F
+GLIBC_2.36 _dl_find_object F
+GLIBC_2.36 _dl_mcount_wrapper F
+GLIBC_2.36 _dl_mcount_wrapper_check F
+GLIBC_2.36 _environ D 0x8
+GLIBC_2.36 _exit F
+GLIBC_2.36 _flushlbf F
+GLIBC_2.36 _libc_intl_domainname D 0x5
+GLIBC_2.36 _longjmp F
+GLIBC_2.36 _mcleanup F
+GLIBC_2.36 _mcount F
+GLIBC_2.36 _nl_default_dirname D 0x12
+GLIBC_2.36 _nl_domain_bindings D 0x8
+GLIBC_2.36 _nl_msg_cat_cntr D 0x4
+GLIBC_2.36 _obstack_allocated_p F
+GLIBC_2.36 _obstack_begin F
+GLIBC_2.36 _obstack_begin_1 F
+GLIBC_2.36 _obstack_free F
+GLIBC_2.36 _obstack_memory_used F
+GLIBC_2.36 _obstack_newchunk F
+GLIBC_2.36 _pthread_cleanup_pop F
+GLIBC_2.36 _pthread_cleanup_push F
+GLIBC_2.36 _res D 0x238
+GLIBC_2.36 _res_hconf D 0x48
+GLIBC_2.36 _setjmp F
+GLIBC_2.36 _tolower F
+GLIBC_2.36 _toupper F
+GLIBC_2.36 a64l F
+GLIBC_2.36 abort F
+GLIBC_2.36 abs F
+GLIBC_2.36 accept F
+GLIBC_2.36 accept4 F
+GLIBC_2.36 access F
+GLIBC_2.36 acct F
+GLIBC_2.36 addmntent F
+GLIBC_2.36 addseverity F
+GLIBC_2.36 adjtime F
+GLIBC_2.36 adjtimex F
+GLIBC_2.36 aio_cancel F
+GLIBC_2.36 aio_cancel64 F
+GLIBC_2.36 aio_error F
+GLIBC_2.36 aio_error64 F
+GLIBC_2.36 aio_fsync F
+GLIBC_2.36 aio_fsync64 F
+GLIBC_2.36 aio_init F
+GLIBC_2.36 aio_read F
+GLIBC_2.36 aio_read64 F
+GLIBC_2.36 aio_return F
+GLIBC_2.36 aio_return64 F
+GLIBC_2.36 aio_suspend F
+GLIBC_2.36 aio_suspend64 F
+GLIBC_2.36 aio_write F
+GLIBC_2.36 aio_write64 F
+GLIBC_2.36 alarm F
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 alphasort F
+GLIBC_2.36 alphasort64 F
+GLIBC_2.36 argp_err_exit_status D 0x4
+GLIBC_2.36 argp_error F
+GLIBC_2.36 argp_failure F
+GLIBC_2.36 argp_help F
+GLIBC_2.36 argp_parse F
+GLIBC_2.36 argp_program_bug_address D 0x8
+GLIBC_2.36 argp_program_version D 0x8
+GLIBC_2.36 argp_program_version_hook D 0x8
+GLIBC_2.36 argp_state_help F
+GLIBC_2.36 argp_usage F
+GLIBC_2.36 argz_add F
+GLIBC_2.36 argz_add_sep F
+GLIBC_2.36 argz_append F
+GLIBC_2.36 argz_count F
+GLIBC_2.36 argz_create F
+GLIBC_2.36 argz_create_sep F
+GLIBC_2.36 argz_delete F
+GLIBC_2.36 argz_extract F
+GLIBC_2.36 argz_insert F
+GLIBC_2.36 argz_next F
+GLIBC_2.36 argz_replace F
+GLIBC_2.36 argz_stringify F
+GLIBC_2.36 asctime F
+GLIBC_2.36 asctime_r F
+GLIBC_2.36 asprintf F
+GLIBC_2.36 atof F
+GLIBC_2.36 atoi F
+GLIBC_2.36 atol F
+GLIBC_2.36 atoll F
+GLIBC_2.36 backtrace F
+GLIBC_2.36 backtrace_symbols F
+GLIBC_2.36 backtrace_symbols_fd F
+GLIBC_2.36 basename F
+GLIBC_2.36 bcmp F
+GLIBC_2.36 bcopy F
+GLIBC_2.36 bind F
+GLIBC_2.36 bind_textdomain_codeset F
+GLIBC_2.36 bindresvport F
+GLIBC_2.36 bindtextdomain F
+GLIBC_2.36 brk F
+GLIBC_2.36 bsd_signal F
+GLIBC_2.36 bsearch F
+GLIBC_2.36 btowc F
+GLIBC_2.36 bzero F
+GLIBC_2.36 c16rtomb F
+GLIBC_2.36 c32rtomb F
+GLIBC_2.36 c8rtomb F
+GLIBC_2.36 call_once F
+GLIBC_2.36 calloc F
+GLIBC_2.36 canonicalize_file_name F
+GLIBC_2.36 capget F
+GLIBC_2.36 capset F
+GLIBC_2.36 catclose F
+GLIBC_2.36 catgets F
+GLIBC_2.36 catopen F
+GLIBC_2.36 cfgetispeed F
+GLIBC_2.36 cfgetospeed F
+GLIBC_2.36 cfmakeraw F
+GLIBC_2.36 cfsetispeed F
+GLIBC_2.36 cfsetospeed F
+GLIBC_2.36 cfsetspeed F
+GLIBC_2.36 chdir F
+GLIBC_2.36 chflags F
+GLIBC_2.36 chmod F
+GLIBC_2.36 chown F
+GLIBC_2.36 chroot F
+GLIBC_2.36 clearenv F
+GLIBC_2.36 clearerr F
+GLIBC_2.36 clearerr_unlocked F
+GLIBC_2.36 clock F
+GLIBC_2.36 clock_adjtime F
+GLIBC_2.36 clock_getcpuclockid F
+GLIBC_2.36 clock_getres F
+GLIBC_2.36 clock_gettime F
+GLIBC_2.36 clock_nanosleep F
+GLIBC_2.36 clock_settime F
+GLIBC_2.36 clone F
+GLIBC_2.36 close F
+GLIBC_2.36 close_range F
+GLIBC_2.36 closedir F
+GLIBC_2.36 closefrom F
+GLIBC_2.36 closelog F
+GLIBC_2.36 cnd_broadcast F
+GLIBC_2.36 cnd_destroy F
+GLIBC_2.36 cnd_init F
+GLIBC_2.36 cnd_signal F
+GLIBC_2.36 cnd_timedwait F
+GLIBC_2.36 cnd_wait F
+GLIBC_2.36 confstr F
+GLIBC_2.36 connect F
+GLIBC_2.36 copy_file_range F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 creat F
+GLIBC_2.36 creat64 F
+GLIBC_2.36 ctermid F
+GLIBC_2.36 ctime F
+GLIBC_2.36 ctime_r F
+GLIBC_2.36 cuserid F
+GLIBC_2.36 daemon F
+GLIBC_2.36 daylight D 0x4
+GLIBC_2.36 dcgettext F
+GLIBC_2.36 dcngettext F
+GLIBC_2.36 delete_module F
+GLIBC_2.36 dgettext F
+GLIBC_2.36 difftime F
+GLIBC_2.36 dirfd F
+GLIBC_2.36 dirname F
+GLIBC_2.36 div F
+GLIBC_2.36 dl_iterate_phdr F
+GLIBC_2.36 dladdr F
+GLIBC_2.36 dladdr1 F
+GLIBC_2.36 dlclose F
+GLIBC_2.36 dlerror F
+GLIBC_2.36 dlinfo F
+GLIBC_2.36 dlmopen F
+GLIBC_2.36 dlopen F
+GLIBC_2.36 dlsym F
+GLIBC_2.36 dlvsym F
+GLIBC_2.36 dn_comp F
+GLIBC_2.36 dn_expand F
+GLIBC_2.36 dn_skipname F
+GLIBC_2.36 dngettext F
+GLIBC_2.36 dprintf F
+GLIBC_2.36 drand48 F
+GLIBC_2.36 drand48_r F
+GLIBC_2.36 dup F
+GLIBC_2.36 dup2 F
+GLIBC_2.36 dup3 F
+GLIBC_2.36 duplocale F
+GLIBC_2.36 dysize F
+GLIBC_2.36 eaccess F
+GLIBC_2.36 ecvt F
+GLIBC_2.36 ecvt_r F
+GLIBC_2.36 endaliasent F
+GLIBC_2.36 endfsent F
+GLIBC_2.36 endgrent F
+GLIBC_2.36 endhostent F
+GLIBC_2.36 endmntent F
+GLIBC_2.36 endnetent F
+GLIBC_2.36 endnetgrent F
+GLIBC_2.36 endprotoent F
+GLIBC_2.36 endpwent F
+GLIBC_2.36 endrpcent F
+GLIBC_2.36 endservent F
+GLIBC_2.36 endsgent F
+GLIBC_2.36 endspent F
+GLIBC_2.36 endttyent F
+GLIBC_2.36 endusershell F
+GLIBC_2.36 endutent F
+GLIBC_2.36 endutxent F
+GLIBC_2.36 environ D 0x8
+GLIBC_2.36 envz_add F
+GLIBC_2.36 envz_entry F
+GLIBC_2.36 envz_get F
+GLIBC_2.36 envz_merge F
+GLIBC_2.36 envz_remove F
+GLIBC_2.36 envz_strip F
+GLIBC_2.36 epoll_create F
+GLIBC_2.36 epoll_create1 F
+GLIBC_2.36 epoll_ctl F
+GLIBC_2.36 epoll_pwait F
+GLIBC_2.36 epoll_pwait2 F
+GLIBC_2.36 epoll_wait F
+GLIBC_2.36 erand48 F
+GLIBC_2.36 erand48_r F
+GLIBC_2.36 err F
+GLIBC_2.36 error F
+GLIBC_2.36 error_at_line F
+GLIBC_2.36 error_message_count D 0x4
+GLIBC_2.36 error_one_per_line D 0x4
+GLIBC_2.36 error_print_progname D 0x8
+GLIBC_2.36 errx F
+GLIBC_2.36 ether_aton F
+GLIBC_2.36 ether_aton_r F
+GLIBC_2.36 ether_hostton F
+GLIBC_2.36 ether_line F
+GLIBC_2.36 ether_ntoa F
+GLIBC_2.36 ether_ntoa_r F
+GLIBC_2.36 ether_ntohost F
+GLIBC_2.36 euidaccess F
+GLIBC_2.36 eventfd F
+GLIBC_2.36 eventfd_read F
+GLIBC_2.36 eventfd_write F
+GLIBC_2.36 execl F
+GLIBC_2.36 execle F
+GLIBC_2.36 execlp F
+GLIBC_2.36 execv F
+GLIBC_2.36 execve F
+GLIBC_2.36 execveat F
+GLIBC_2.36 execvp F
+GLIBC_2.36 execvpe F
+GLIBC_2.36 exit F
+GLIBC_2.36 explicit_bzero F
+GLIBC_2.36 faccessat F
+GLIBC_2.36 fallocate F
+GLIBC_2.36 fallocate64 F
+GLIBC_2.36 fanotify_init F
+GLIBC_2.36 fanotify_mark F
+GLIBC_2.36 fchdir F
+GLIBC_2.36 fchflags F
+GLIBC_2.36 fchmod F
+GLIBC_2.36 fchmodat F
+GLIBC_2.36 fchown F
+GLIBC_2.36 fchownat F
+GLIBC_2.36 fclose F
+GLIBC_2.36 fcloseall F
+GLIBC_2.36 fcntl F
+GLIBC_2.36 fcntl64 F
+GLIBC_2.36 fcvt F
+GLIBC_2.36 fcvt_r F
+GLIBC_2.36 fdatasync F
+GLIBC_2.36 fdopen F
+GLIBC_2.36 fdopendir F
+GLIBC_2.36 feof F
+GLIBC_2.36 feof_unlocked F
+GLIBC_2.36 ferror F
+GLIBC_2.36 ferror_unlocked F
+GLIBC_2.36 fexecve F
+GLIBC_2.36 fflush F
+GLIBC_2.36 fflush_unlocked F
+GLIBC_2.36 ffs F
+GLIBC_2.36 ffsl F
+GLIBC_2.36 ffsll F
+GLIBC_2.36 fgetc F
+GLIBC_2.36 fgetc_unlocked F
+GLIBC_2.36 fgetgrent F
+GLIBC_2.36 fgetgrent_r F
+GLIBC_2.36 fgetpos F
+GLIBC_2.36 fgetpos64 F
+GLIBC_2.36 fgetpwent F
+GLIBC_2.36 fgetpwent_r F
+GLIBC_2.36 fgets F
+GLIBC_2.36 fgets_unlocked F
+GLIBC_2.36 fgetsgent F
+GLIBC_2.36 fgetsgent_r F
+GLIBC_2.36 fgetspent F
+GLIBC_2.36 fgetspent_r F
+GLIBC_2.36 fgetwc F
+GLIBC_2.36 fgetwc_unlocked F
+GLIBC_2.36 fgetws F
+GLIBC_2.36 fgetws_unlocked F
+GLIBC_2.36 fgetxattr F
+GLIBC_2.36 fileno F
+GLIBC_2.36 fileno_unlocked F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 flistxattr F
+GLIBC_2.36 flock F
+GLIBC_2.36 flockfile F
+GLIBC_2.36 fmemopen F
+GLIBC_2.36 fmtmsg F
+GLIBC_2.36 fnmatch F
+GLIBC_2.36 fopen F
+GLIBC_2.36 fopen64 F
+GLIBC_2.36 fopencookie F
+GLIBC_2.36 fork F
+GLIBC_2.36 forkpty F
+GLIBC_2.36 fpathconf F
+GLIBC_2.36 fprintf F
+GLIBC_2.36 fputc F
+GLIBC_2.36 fputc_unlocked F
+GLIBC_2.36 fputs F
+GLIBC_2.36 fputs_unlocked F
+GLIBC_2.36 fputwc F
+GLIBC_2.36 fputwc_unlocked F
+GLIBC_2.36 fputws F
+GLIBC_2.36 fputws_unlocked F
+GLIBC_2.36 fread F
+GLIBC_2.36 fread_unlocked F
+GLIBC_2.36 free F
+GLIBC_2.36 freeaddrinfo F
+GLIBC_2.36 freeifaddrs F
+GLIBC_2.36 freelocale F
+GLIBC_2.36 fremovexattr F
+GLIBC_2.36 freopen F
+GLIBC_2.36 freopen64 F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fscanf F
+GLIBC_2.36 fsconfig F
+GLIBC_2.36 fseek F
+GLIBC_2.36 fseeko F
+GLIBC_2.36 fseeko64 F
+GLIBC_2.36 fsetpos F
+GLIBC_2.36 fsetpos64 F
+GLIBC_2.36 fsetxattr F
+GLIBC_2.36 fsmount F
+GLIBC_2.36 fsopen F
+GLIBC_2.36 fspick F
+GLIBC_2.36 fstat F
+GLIBC_2.36 fstat64 F
+GLIBC_2.36 fstatat F
+GLIBC_2.36 fstatat64 F
+GLIBC_2.36 fstatfs F
+GLIBC_2.36 fstatfs64 F
+GLIBC_2.36 fstatvfs F
+GLIBC_2.36 fstatvfs64 F
+GLIBC_2.36 fsync F
+GLIBC_2.36 ftell F
+GLIBC_2.36 ftello F
+GLIBC_2.36 ftello64 F
+GLIBC_2.36 ftime F
+GLIBC_2.36 ftok F
+GLIBC_2.36 ftruncate F
+GLIBC_2.36 ftruncate64 F
+GLIBC_2.36 ftrylockfile F
+GLIBC_2.36 fts64_children F
+GLIBC_2.36 fts64_close F
+GLIBC_2.36 fts64_open F
+GLIBC_2.36 fts64_read F
+GLIBC_2.36 fts64_set F
+GLIBC_2.36 fts_children F
+GLIBC_2.36 fts_close F
+GLIBC_2.36 fts_open F
+GLIBC_2.36 fts_read F
+GLIBC_2.36 fts_set F
+GLIBC_2.36 ftw F
+GLIBC_2.36 ftw64 F
+GLIBC_2.36 funlockfile F
+GLIBC_2.36 futimens F
+GLIBC_2.36 futimes F
+GLIBC_2.36 futimesat F
+GLIBC_2.36 fwide F
+GLIBC_2.36 fwprintf F
+GLIBC_2.36 fwrite F
+GLIBC_2.36 fwrite_unlocked F
+GLIBC_2.36 fwscanf F
+GLIBC_2.36 gai_cancel F
+GLIBC_2.36 gai_error F
+GLIBC_2.36 gai_strerror F
+GLIBC_2.36 gai_suspend F
+GLIBC_2.36 gcvt F
+GLIBC_2.36 get_avphys_pages F
+GLIBC_2.36 get_current_dir_name F
+GLIBC_2.36 get_nprocs F
+GLIBC_2.36 get_nprocs_conf F
+GLIBC_2.36 get_phys_pages F
+GLIBC_2.36 getaddrinfo F
+GLIBC_2.36 getaddrinfo_a F
+GLIBC_2.36 getaliasbyname F
+GLIBC_2.36 getaliasbyname_r F
+GLIBC_2.36 getaliasent F
+GLIBC_2.36 getaliasent_r F
+GLIBC_2.36 getauxval F
+GLIBC_2.36 getc F
+GLIBC_2.36 getc_unlocked F
+GLIBC_2.36 getchar F
+GLIBC_2.36 getchar_unlocked F
+GLIBC_2.36 getcontext F
+GLIBC_2.36 getcpu F
+GLIBC_2.36 getcwd F
+GLIBC_2.36 getdate F
+GLIBC_2.36 getdate_err D 0x4
+GLIBC_2.36 getdate_r F
+GLIBC_2.36 getdelim F
+GLIBC_2.36 getdents64 F
+GLIBC_2.36 getdirentries F
+GLIBC_2.36 getdirentries64 F
+GLIBC_2.36 getdomainname F
+GLIBC_2.36 getdtablesize F
+GLIBC_2.36 getegid F
+GLIBC_2.36 getentropy F
+GLIBC_2.36 getenv F
+GLIBC_2.36 geteuid F
+GLIBC_2.36 getfsent F
+GLIBC_2.36 getfsfile F
+GLIBC_2.36 getfsspec F
+GLIBC_2.36 getgid F
+GLIBC_2.36 getgrent F
+GLIBC_2.36 getgrent_r F
+GLIBC_2.36 getgrgid F
+GLIBC_2.36 getgrgid_r F
+GLIBC_2.36 getgrnam F
+GLIBC_2.36 getgrnam_r F
+GLIBC_2.36 getgrouplist F
+GLIBC_2.36 getgroups F
+GLIBC_2.36 gethostbyaddr F
+GLIBC_2.36 gethostbyaddr_r F
+GLIBC_2.36 gethostbyname F
+GLIBC_2.36 gethostbyname2 F
+GLIBC_2.36 gethostbyname2_r F
+GLIBC_2.36 gethostbyname_r F
+GLIBC_2.36 gethostent F
+GLIBC_2.36 gethostent_r F
+GLIBC_2.36 gethostid F
+GLIBC_2.36 gethostname F
+GLIBC_2.36 getifaddrs F
+GLIBC_2.36 getipv4sourcefilter F
+GLIBC_2.36 getitimer F
+GLIBC_2.36 getline F
+GLIBC_2.36 getloadavg F
+GLIBC_2.36 getlogin F
+GLIBC_2.36 getlogin_r F
+GLIBC_2.36 getmntent F
+GLIBC_2.36 getmntent_r F
+GLIBC_2.36 getnameinfo F
+GLIBC_2.36 getnetbyaddr F
+GLIBC_2.36 getnetbyaddr_r F
+GLIBC_2.36 getnetbyname F
+GLIBC_2.36 getnetbyname_r F
+GLIBC_2.36 getnetent F
+GLIBC_2.36 getnetent_r F
+GLIBC_2.36 getnetgrent F
+GLIBC_2.36 getnetgrent_r F
+GLIBC_2.36 getopt F
+GLIBC_2.36 getopt_long F
+GLIBC_2.36 getopt_long_only F
+GLIBC_2.36 getpagesize F
+GLIBC_2.36 getpass F
+GLIBC_2.36 getpeername F
+GLIBC_2.36 getpgid F
+GLIBC_2.36 getpgrp F
+GLIBC_2.36 getpid F
+GLIBC_2.36 getppid F
+GLIBC_2.36 getpriority F
+GLIBC_2.36 getprotobyname F
+GLIBC_2.36 getprotobyname_r F
+GLIBC_2.36 getprotobynumber F
+GLIBC_2.36 getprotobynumber_r F
+GLIBC_2.36 getprotoent F
+GLIBC_2.36 getprotoent_r F
+GLIBC_2.36 getpt F
+GLIBC_2.36 getpw F
+GLIBC_2.36 getpwent F
+GLIBC_2.36 getpwent_r F
+GLIBC_2.36 getpwnam F
+GLIBC_2.36 getpwnam_r F
+GLIBC_2.36 getpwuid F
+GLIBC_2.36 getpwuid_r F
+GLIBC_2.36 getrandom F
+GLIBC_2.36 getresgid F
+GLIBC_2.36 getresuid F
+GLIBC_2.36 getrlimit F
+GLIBC_2.36 getrlimit64 F
+GLIBC_2.36 getrpcbyname F
+GLIBC_2.36 getrpcbyname_r F
+GLIBC_2.36 getrpcbynumber F
+GLIBC_2.36 getrpcbynumber_r F
+GLIBC_2.36 getrpcent F
+GLIBC_2.36 getrpcent_r F
+GLIBC_2.36 getrusage F
+GLIBC_2.36 gets F
+GLIBC_2.36 getservbyname F
+GLIBC_2.36 getservbyname_r F
+GLIBC_2.36 getservbyport F
+GLIBC_2.36 getservbyport_r F
+GLIBC_2.36 getservent F
+GLIBC_2.36 getservent_r F
+GLIBC_2.36 getsgent F
+GLIBC_2.36 getsgent_r F
+GLIBC_2.36 getsgnam F
+GLIBC_2.36 getsgnam_r F
+GLIBC_2.36 getsid F
+GLIBC_2.36 getsockname F
+GLIBC_2.36 getsockopt F
+GLIBC_2.36 getsourcefilter F
+GLIBC_2.36 getspent F
+GLIBC_2.36 getspent_r F
+GLIBC_2.36 getspnam F
+GLIBC_2.36 getspnam_r F
+GLIBC_2.36 getsubopt F
+GLIBC_2.36 gettext F
+GLIBC_2.36 gettid F
+GLIBC_2.36 gettimeofday F
+GLIBC_2.36 getttyent F
+GLIBC_2.36 getttynam F
+GLIBC_2.36 getuid F
+GLIBC_2.36 getusershell F
+GLIBC_2.36 getutent F
+GLIBC_2.36 getutent_r F
+GLIBC_2.36 getutid F
+GLIBC_2.36 getutid_r F
+GLIBC_2.36 getutline F
+GLIBC_2.36 getutline_r F
+GLIBC_2.36 getutmp F
+GLIBC_2.36 getutmpx F
+GLIBC_2.36 getutxent F
+GLIBC_2.36 getutxid F
+GLIBC_2.36 getutxline F
+GLIBC_2.36 getw F
+GLIBC_2.36 getwc F
+GLIBC_2.36 getwc_unlocked F
+GLIBC_2.36 getwchar F
+GLIBC_2.36 getwchar_unlocked F
+GLIBC_2.36 getwd F
+GLIBC_2.36 getxattr F
+GLIBC_2.36 glob F
+GLIBC_2.36 glob64 F
+GLIBC_2.36 glob_pattern_p F
+GLIBC_2.36 globfree F
+GLIBC_2.36 globfree64 F
+GLIBC_2.36 gmtime F
+GLIBC_2.36 gmtime_r F
+GLIBC_2.36 gnu_dev_major F
+GLIBC_2.36 gnu_dev_makedev F
+GLIBC_2.36 gnu_dev_minor F
+GLIBC_2.36 gnu_get_libc_release F
+GLIBC_2.36 gnu_get_libc_version F
+GLIBC_2.36 grantpt F
+GLIBC_2.36 group_member F
+GLIBC_2.36 gsignal F
+GLIBC_2.36 gtty F
+GLIBC_2.36 h_errlist D 0x28
+GLIBC_2.36 h_nerr D 0x4
+GLIBC_2.36 hasmntopt F
+GLIBC_2.36 hcreate F
+GLIBC_2.36 hcreate_r F
+GLIBC_2.36 hdestroy F
+GLIBC_2.36 hdestroy_r F
+GLIBC_2.36 herror F
+GLIBC_2.36 hsearch F
+GLIBC_2.36 hsearch_r F
+GLIBC_2.36 hstrerror F
+GLIBC_2.36 htonl F
+GLIBC_2.36 htons F
+GLIBC_2.36 iconv F
+GLIBC_2.36 iconv_close F
+GLIBC_2.36 iconv_open F
+GLIBC_2.36 if_freenameindex F
+GLIBC_2.36 if_indextoname F
+GLIBC_2.36 if_nameindex F
+GLIBC_2.36 if_nametoindex F
+GLIBC_2.36 imaxabs F
+GLIBC_2.36 imaxdiv F
+GLIBC_2.36 in6addr_any D 0x10
+GLIBC_2.36 in6addr_loopback D 0x10
+GLIBC_2.36 index F
+GLIBC_2.36 inet6_opt_append F
+GLIBC_2.36 inet6_opt_find F
+GLIBC_2.36 inet6_opt_finish F
+GLIBC_2.36 inet6_opt_get_val F
+GLIBC_2.36 inet6_opt_init F
+GLIBC_2.36 inet6_opt_next F
+GLIBC_2.36 inet6_opt_set_val F
+GLIBC_2.36 inet6_option_alloc F
+GLIBC_2.36 inet6_option_append F
+GLIBC_2.36 inet6_option_find F
+GLIBC_2.36 inet6_option_init F
+GLIBC_2.36 inet6_option_next F
+GLIBC_2.36 inet6_option_space F
+GLIBC_2.36 inet6_rth_add F
+GLIBC_2.36 inet6_rth_getaddr F
+GLIBC_2.36 inet6_rth_init F
+GLIBC_2.36 inet6_rth_reverse F
+GLIBC_2.36 inet6_rth_segments F
+GLIBC_2.36 inet6_rth_space F
+GLIBC_2.36 inet_addr F
+GLIBC_2.36 inet_aton F
+GLIBC_2.36 inet_lnaof F
+GLIBC_2.36 inet_makeaddr F
+GLIBC_2.36 inet_netof F
+GLIBC_2.36 inet_network F
+GLIBC_2.36 inet_nsap_addr F
+GLIBC_2.36 inet_nsap_ntoa F
+GLIBC_2.36 inet_ntoa F
+GLIBC_2.36 inet_ntop F
+GLIBC_2.36 inet_pton F
+GLIBC_2.36 init_module F
+GLIBC_2.36 initgroups F
+GLIBC_2.36 initstate F
+GLIBC_2.36 initstate_r F
+GLIBC_2.36 innetgr F
+GLIBC_2.36 inotify_add_watch F
+GLIBC_2.36 inotify_init F
+GLIBC_2.36 inotify_init1 F
+GLIBC_2.36 inotify_rm_watch F
+GLIBC_2.36 insque F
+GLIBC_2.36 ioctl F
+GLIBC_2.36 iruserok F
+GLIBC_2.36 iruserok_af F
+GLIBC_2.36 isalnum F
+GLIBC_2.36 isalnum_l F
+GLIBC_2.36 isalpha F
+GLIBC_2.36 isalpha_l F
+GLIBC_2.36 isascii F
+GLIBC_2.36 isatty F
+GLIBC_2.36 isblank F
+GLIBC_2.36 isblank_l F
+GLIBC_2.36 iscntrl F
+GLIBC_2.36 iscntrl_l F
+GLIBC_2.36 isctype F
+GLIBC_2.36 isdigit F
+GLIBC_2.36 isdigit_l F
+GLIBC_2.36 isfdtype F
+GLIBC_2.36 isgraph F
+GLIBC_2.36 isgraph_l F
+GLIBC_2.36 isinf F
+GLIBC_2.36 isinff F
+GLIBC_2.36 isinfl F
+GLIBC_2.36 islower F
+GLIBC_2.36 islower_l F
+GLIBC_2.36 isnan F
+GLIBC_2.36 isnanf F
+GLIBC_2.36 isnanl F
+GLIBC_2.36 isprint F
+GLIBC_2.36 isprint_l F
+GLIBC_2.36 ispunct F
+GLIBC_2.36 ispunct_l F
+GLIBC_2.36 isspace F
+GLIBC_2.36 isspace_l F
+GLIBC_2.36 isupper F
+GLIBC_2.36 isupper_l F
+GLIBC_2.36 iswalnum F
+GLIBC_2.36 iswalnum_l F
+GLIBC_2.36 iswalpha F
+GLIBC_2.36 iswalpha_l F
+GLIBC_2.36 iswblank F
+GLIBC_2.36 iswblank_l F
+GLIBC_2.36 iswcntrl F
+GLIBC_2.36 iswcntrl_l F
+GLIBC_2.36 iswctype F
+GLIBC_2.36 iswctype_l F
+GLIBC_2.36 iswdigit F
+GLIBC_2.36 iswdigit_l F
+GLIBC_2.36 iswgraph F
+GLIBC_2.36 iswgraph_l F
+GLIBC_2.36 iswlower F
+GLIBC_2.36 iswlower_l F
+GLIBC_2.36 iswprint F
+GLIBC_2.36 iswprint_l F
+GLIBC_2.36 iswpunct F
+GLIBC_2.36 iswpunct_l F
+GLIBC_2.36 iswspace F
+GLIBC_2.36 iswspace_l F
+GLIBC_2.36 iswupper F
+GLIBC_2.36 iswupper_l F
+GLIBC_2.36 iswxdigit F
+GLIBC_2.36 iswxdigit_l F
+GLIBC_2.36 isxdigit F
+GLIBC_2.36 isxdigit_l F
+GLIBC_2.36 jrand48 F
+GLIBC_2.36 jrand48_r F
+GLIBC_2.36 kill F
+GLIBC_2.36 killpg F
+GLIBC_2.36 klogctl F
+GLIBC_2.36 l64a F
+GLIBC_2.36 labs F
+GLIBC_2.36 lchmod F
+GLIBC_2.36 lchown F
+GLIBC_2.36 lckpwdf F
+GLIBC_2.36 lcong48 F
+GLIBC_2.36 lcong48_r F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 ldiv F
+GLIBC_2.36 lfind F
+GLIBC_2.36 lgetxattr F
+GLIBC_2.36 link F
+GLIBC_2.36 linkat F
+GLIBC_2.36 lio_listio F
+GLIBC_2.36 lio_listio64 F
+GLIBC_2.36 listen F
+GLIBC_2.36 listxattr F
+GLIBC_2.36 llabs F
+GLIBC_2.36 lldiv F
+GLIBC_2.36 llistxattr F
+GLIBC_2.36 localeconv F
+GLIBC_2.36 localtime F
+GLIBC_2.36 localtime_r F
+GLIBC_2.36 lockf F
+GLIBC_2.36 lockf64 F
+GLIBC_2.36 login F
+GLIBC_2.36 login_tty F
+GLIBC_2.36 logout F
+GLIBC_2.36 logwtmp F
+GLIBC_2.36 longjmp F
+GLIBC_2.36 lrand48 F
+GLIBC_2.36 lrand48_r F
+GLIBC_2.36 lremovexattr F
+GLIBC_2.36 lsearch F
+GLIBC_2.36 lseek F
+GLIBC_2.36 lseek64 F
+GLIBC_2.36 lsetxattr F
+GLIBC_2.36 lstat F
+GLIBC_2.36 lstat64 F
+GLIBC_2.36 lutimes F
+GLIBC_2.36 madvise F
+GLIBC_2.36 makecontext F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mblen F
+GLIBC_2.36 mbrlen F
+GLIBC_2.36 mbrtoc16 F
+GLIBC_2.36 mbrtoc32 F
+GLIBC_2.36 mbrtoc8 F
+GLIBC_2.36 mbrtowc F
+GLIBC_2.36 mbsinit F
+GLIBC_2.36 mbsnrtowcs F
+GLIBC_2.36 mbsrtowcs F
+GLIBC_2.36 mbstowcs F
+GLIBC_2.36 mbtowc F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 memccpy F
+GLIBC_2.36 memchr F
+GLIBC_2.36 memcmp F
+GLIBC_2.36 memcpy F
+GLIBC_2.36 memfd_create F
+GLIBC_2.36 memfrob F
+GLIBC_2.36 memmem F
+GLIBC_2.36 memmove F
+GLIBC_2.36 mempcpy F
+GLIBC_2.36 memrchr F
+GLIBC_2.36 memset F
+GLIBC_2.36 mincore F
+GLIBC_2.36 mkdir F
+GLIBC_2.36 mkdirat F
+GLIBC_2.36 mkdtemp F
+GLIBC_2.36 mkfifo F
+GLIBC_2.36 mkfifoat F
+GLIBC_2.36 mknod F
+GLIBC_2.36 mknodat F
+GLIBC_2.36 mkostemp F
+GLIBC_2.36 mkostemp64 F
+GLIBC_2.36 mkostemps F
+GLIBC_2.36 mkostemps64 F
+GLIBC_2.36 mkstemp F
+GLIBC_2.36 mkstemp64 F
+GLIBC_2.36 mkstemps F
+GLIBC_2.36 mkstemps64 F
+GLIBC_2.36 mktemp F
+GLIBC_2.36 mktime F
+GLIBC_2.36 mlock F
+GLIBC_2.36 mlock2 F
+GLIBC_2.36 mlockall F
+GLIBC_2.36 mmap F
+GLIBC_2.36 mmap64 F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modfl F
+GLIBC_2.36 moncontrol F
+GLIBC_2.36 monstartup F
+GLIBC_2.36 mount F
+GLIBC_2.36 mount_setattr F
+GLIBC_2.36 move_mount F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mprotect F
+GLIBC_2.36 mq_close F
+GLIBC_2.36 mq_getattr F
+GLIBC_2.36 mq_notify F
+GLIBC_2.36 mq_open F
+GLIBC_2.36 mq_receive F
+GLIBC_2.36 mq_send F
+GLIBC_2.36 mq_setattr F
+GLIBC_2.36 mq_timedreceive F
+GLIBC_2.36 mq_timedsend F
+GLIBC_2.36 mq_unlink F
+GLIBC_2.36 mrand48 F
+GLIBC_2.36 mrand48_r F
+GLIBC_2.36 mremap F
+GLIBC_2.36 msgctl F
+GLIBC_2.36 msgget F
+GLIBC_2.36 msgrcv F
+GLIBC_2.36 msgsnd F
+GLIBC_2.36 msync F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 mtx_destroy F
+GLIBC_2.36 mtx_init F
+GLIBC_2.36 mtx_lock F
+GLIBC_2.36 mtx_timedlock F
+GLIBC_2.36 mtx_trylock F
+GLIBC_2.36 mtx_unlock F
+GLIBC_2.36 munlock F
+GLIBC_2.36 munlockall F
+GLIBC_2.36 munmap F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 name_to_handle_at F
+GLIBC_2.36 nanosleep F
+GLIBC_2.36 newlocale F
+GLIBC_2.36 nftw F
+GLIBC_2.36 nftw64 F
+GLIBC_2.36 ngettext F
+GLIBC_2.36 nice F
+GLIBC_2.36 nl_langinfo F
+GLIBC_2.36 nl_langinfo_l F
+GLIBC_2.36 nrand48 F
+GLIBC_2.36 nrand48_r F
+GLIBC_2.36 ns_name_compress F
+GLIBC_2.36 ns_name_ntop F
+GLIBC_2.36 ns_name_pack F
+GLIBC_2.36 ns_name_pton F
+GLIBC_2.36 ns_name_skip F
+GLIBC_2.36 ns_name_uncompress F
+GLIBC_2.36 ns_name_unpack F
+GLIBC_2.36 ntohl F
+GLIBC_2.36 ntohs F
+GLIBC_2.36 ntp_adjtime F
+GLIBC_2.36 ntp_gettime F
+GLIBC_2.36 ntp_gettimex F
+GLIBC_2.36 obstack_alloc_failed_handler D 0x8
+GLIBC_2.36 obstack_exit_failure D 0x4
+GLIBC_2.36 obstack_free F
+GLIBC_2.36 obstack_printf F
+GLIBC_2.36 obstack_vprintf F
+GLIBC_2.36 on_exit F
+GLIBC_2.36 open F
+GLIBC_2.36 open64 F
+GLIBC_2.36 open_by_handle_at F
+GLIBC_2.36 open_memstream F
+GLIBC_2.36 open_tree F
+GLIBC_2.36 open_wmemstream F
+GLIBC_2.36 openat F
+GLIBC_2.36 openat64 F
+GLIBC_2.36 opendir F
+GLIBC_2.36 openlog F
+GLIBC_2.36 openpty F
+GLIBC_2.36 optarg D 0x8
+GLIBC_2.36 opterr D 0x4
+GLIBC_2.36 optind D 0x4
+GLIBC_2.36 optopt D 0x4
+GLIBC_2.36 parse_printf_format F
+GLIBC_2.36 pathconf F
+GLIBC_2.36 pause F
+GLIBC_2.36 pclose F
+GLIBC_2.36 perror F
+GLIBC_2.36 personality F
+GLIBC_2.36 pidfd_getfd F
+GLIBC_2.36 pidfd_open F
+GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 pipe F
+GLIBC_2.36 pipe2 F
+GLIBC_2.36 pivot_root F
+GLIBC_2.36 pkey_alloc F
+GLIBC_2.36 pkey_free F
+GLIBC_2.36 pkey_get F
+GLIBC_2.36 pkey_mprotect F
+GLIBC_2.36 pkey_set F
+GLIBC_2.36 poll F
+GLIBC_2.36 popen F
+GLIBC_2.36 posix_fadvise F
+GLIBC_2.36 posix_fadvise64 F
+GLIBC_2.36 posix_fallocate F
+GLIBC_2.36 posix_fallocate64 F
+GLIBC_2.36 posix_madvise F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 posix_openpt F
+GLIBC_2.36 posix_spawn F
+GLIBC_2.36 posix_spawn_file_actions_addchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addclose F
+GLIBC_2.36 posix_spawn_file_actions_addclosefrom_np F
+GLIBC_2.36 posix_spawn_file_actions_adddup2 F
+GLIBC_2.36 posix_spawn_file_actions_addfchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addopen F
+GLIBC_2.36 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 posix_spawn_file_actions_destroy F
+GLIBC_2.36 posix_spawn_file_actions_init F
+GLIBC_2.36 posix_spawnattr_destroy F
+GLIBC_2.36 posix_spawnattr_getflags F
+GLIBC_2.36 posix_spawnattr_getpgroup F
+GLIBC_2.36 posix_spawnattr_getschedparam F
+GLIBC_2.36 posix_spawnattr_getschedpolicy F
+GLIBC_2.36 posix_spawnattr_getsigdefault F
+GLIBC_2.36 posix_spawnattr_getsigmask F
+GLIBC_2.36 posix_spawnattr_init F
+GLIBC_2.36 posix_spawnattr_setflags F
+GLIBC_2.36 posix_spawnattr_setpgroup F
+GLIBC_2.36 posix_spawnattr_setschedparam F
+GLIBC_2.36 posix_spawnattr_setschedpolicy F
+GLIBC_2.36 posix_spawnattr_setsigdefault F
+GLIBC_2.36 posix_spawnattr_setsigmask F
+GLIBC_2.36 posix_spawnp F
+GLIBC_2.36 ppoll F
+GLIBC_2.36 prctl F
+GLIBC_2.36 pread F
+GLIBC_2.36 pread64 F
+GLIBC_2.36 preadv F
+GLIBC_2.36 preadv2 F
+GLIBC_2.36 preadv64 F
+GLIBC_2.36 preadv64v2 F
+GLIBC_2.36 printf F
+GLIBC_2.36 printf_size F
+GLIBC_2.36 printf_size_info F
+GLIBC_2.36 prlimit F
+GLIBC_2.36 prlimit64 F
+GLIBC_2.36 process_madvise F
+GLIBC_2.36 process_mrelease F
+GLIBC_2.36 process_vm_readv F
+GLIBC_2.36 process_vm_writev F
+GLIBC_2.36 profil F
+GLIBC_2.36 program_invocation_name D 0x8
+GLIBC_2.36 program_invocation_short_name D 0x8
+GLIBC_2.36 pselect F
+GLIBC_2.36 psiginfo F
+GLIBC_2.36 psignal F
+GLIBC_2.36 pthread_attr_destroy F
+GLIBC_2.36 pthread_attr_getaffinity_np F
+GLIBC_2.36 pthread_attr_getdetachstate F
+GLIBC_2.36 pthread_attr_getguardsize F
+GLIBC_2.36 pthread_attr_getinheritsched F
+GLIBC_2.36 pthread_attr_getschedparam F
+GLIBC_2.36 pthread_attr_getschedpolicy F
+GLIBC_2.36 pthread_attr_getscope F
+GLIBC_2.36 pthread_attr_getsigmask_np F
+GLIBC_2.36 pthread_attr_getstack F
+GLIBC_2.36 pthread_attr_getstackaddr F
+GLIBC_2.36 pthread_attr_getstacksize F
+GLIBC_2.36 pthread_attr_init F
+GLIBC_2.36 pthread_attr_setaffinity_np F
+GLIBC_2.36 pthread_attr_setdetachstate F
+GLIBC_2.36 pthread_attr_setguardsize F
+GLIBC_2.36 pthread_attr_setinheritsched F
+GLIBC_2.36 pthread_attr_setschedparam F
+GLIBC_2.36 pthread_attr_setschedpolicy F
+GLIBC_2.36 pthread_attr_setscope F
+GLIBC_2.36 pthread_attr_setsigmask_np F
+GLIBC_2.36 pthread_attr_setstack F
+GLIBC_2.36 pthread_attr_setstackaddr F
+GLIBC_2.36 pthread_attr_setstacksize F
+GLIBC_2.36 pthread_barrier_destroy F
+GLIBC_2.36 pthread_barrier_init F
+GLIBC_2.36 pthread_barrier_wait F
+GLIBC_2.36 pthread_barrierattr_destroy F
+GLIBC_2.36 pthread_barrierattr_getpshared F
+GLIBC_2.36 pthread_barrierattr_init F
+GLIBC_2.36 pthread_barrierattr_setpshared F
+GLIBC_2.36 pthread_cancel F
+GLIBC_2.36 pthread_clockjoin_np F
+GLIBC_2.36 pthread_cond_broadcast F
+GLIBC_2.36 pthread_cond_clockwait F
+GLIBC_2.36 pthread_cond_destroy F
+GLIBC_2.36 pthread_cond_init F
+GLIBC_2.36 pthread_cond_signal F
+GLIBC_2.36 pthread_cond_timedwait F
+GLIBC_2.36 pthread_cond_wait F
+GLIBC_2.36 pthread_condattr_destroy F
+GLIBC_2.36 pthread_condattr_getclock F
+GLIBC_2.36 pthread_condattr_getpshared F
+GLIBC_2.36 pthread_condattr_init F
+GLIBC_2.36 pthread_condattr_setclock F
+GLIBC_2.36 pthread_condattr_setpshared F
+GLIBC_2.36 pthread_create F
+GLIBC_2.36 pthread_detach F
+GLIBC_2.36 pthread_equal F
+GLIBC_2.36 pthread_exit F
+GLIBC_2.36 pthread_getaffinity_np F
+GLIBC_2.36 pthread_getattr_default_np F
+GLIBC_2.36 pthread_getattr_np F
+GLIBC_2.36 pthread_getconcurrency F
+GLIBC_2.36 pthread_getcpuclockid F
+GLIBC_2.36 pthread_getname_np F
+GLIBC_2.36 pthread_getschedparam F
+GLIBC_2.36 pthread_getspecific F
+GLIBC_2.36 pthread_join F
+GLIBC_2.36 pthread_key_create F
+GLIBC_2.36 pthread_key_delete F
+GLIBC_2.36 pthread_kill F
+GLIBC_2.36 pthread_mutex_clocklock F
+GLIBC_2.36 pthread_mutex_consistent F
+GLIBC_2.36 pthread_mutex_destroy F
+GLIBC_2.36 pthread_mutex_getprioceiling F
+GLIBC_2.36 pthread_mutex_init F
+GLIBC_2.36 pthread_mutex_lock F
+GLIBC_2.36 pthread_mutex_setprioceiling F
+GLIBC_2.36 pthread_mutex_timedlock F
+GLIBC_2.36 pthread_mutex_trylock F
+GLIBC_2.36 pthread_mutex_unlock F
+GLIBC_2.36 pthread_mutexattr_destroy F
+GLIBC_2.36 pthread_mutexattr_getprioceiling F
+GLIBC_2.36 pthread_mutexattr_getprotocol F
+GLIBC_2.36 pthread_mutexattr_getpshared F
+GLIBC_2.36 pthread_mutexattr_getrobust F
+GLIBC_2.36 pthread_mutexattr_gettype F
+GLIBC_2.36 pthread_mutexattr_init F
+GLIBC_2.36 pthread_mutexattr_setprioceiling F
+GLIBC_2.36 pthread_mutexattr_setprotocol F
+GLIBC_2.36 pthread_mutexattr_setpshared F
+GLIBC_2.36 pthread_mutexattr_setrobust F
+GLIBC_2.36 pthread_mutexattr_settype F
+GLIBC_2.36 pthread_once F
+GLIBC_2.36 pthread_rwlock_clockrdlock F
+GLIBC_2.36 pthread_rwlock_clockwrlock F
+GLIBC_2.36 pthread_rwlock_destroy F
+GLIBC_2.36 pthread_rwlock_init F
+GLIBC_2.36 pthread_rwlock_rdlock F
+GLIBC_2.36 pthread_rwlock_timedrdlock F
+GLIBC_2.36 pthread_rwlock_timedwrlock F
+GLIBC_2.36 pthread_rwlock_tryrdlock F
+GLIBC_2.36 pthread_rwlock_trywrlock F
+GLIBC_2.36 pthread_rwlock_unlock F
+GLIBC_2.36 pthread_rwlock_wrlock F
+GLIBC_2.36 pthread_rwlockattr_destroy F
+GLIBC_2.36 pthread_rwlockattr_getkind_np F
+GLIBC_2.36 pthread_rwlockattr_getpshared F
+GLIBC_2.36 pthread_rwlockattr_init F
+GLIBC_2.36 pthread_rwlockattr_setkind_np F
+GLIBC_2.36 pthread_rwlockattr_setpshared F
+GLIBC_2.36 pthread_self F
+GLIBC_2.36 pthread_setaffinity_np F
+GLIBC_2.36 pthread_setattr_default_np F
+GLIBC_2.36 pthread_setcancelstate F
+GLIBC_2.36 pthread_setcanceltype F
+GLIBC_2.36 pthread_setconcurrency F
+GLIBC_2.36 pthread_setname_np F
+GLIBC_2.36 pthread_setschedparam F
+GLIBC_2.36 pthread_setschedprio F
+GLIBC_2.36 pthread_setspecific F
+GLIBC_2.36 pthread_sigmask F
+GLIBC_2.36 pthread_sigqueue F
+GLIBC_2.36 pthread_spin_destroy F
+GLIBC_2.36 pthread_spin_init F
+GLIBC_2.36 pthread_spin_lock F
+GLIBC_2.36 pthread_spin_trylock F
+GLIBC_2.36 pthread_spin_unlock F
+GLIBC_2.36 pthread_testcancel F
+GLIBC_2.36 pthread_timedjoin_np F
+GLIBC_2.36 pthread_tryjoin_np F
+GLIBC_2.36 ptrace F
+GLIBC_2.36 ptsname F
+GLIBC_2.36 ptsname_r F
+GLIBC_2.36 putc F
+GLIBC_2.36 putc_unlocked F
+GLIBC_2.36 putchar F
+GLIBC_2.36 putchar_unlocked F
+GLIBC_2.36 putenv F
+GLIBC_2.36 putgrent F
+GLIBC_2.36 putpwent F
+GLIBC_2.36 puts F
+GLIBC_2.36 putsgent F
+GLIBC_2.36 putspent F
+GLIBC_2.36 pututline F
+GLIBC_2.36 pututxline F
+GLIBC_2.36 putw F
+GLIBC_2.36 putwc F
+GLIBC_2.36 putwc_unlocked F
+GLIBC_2.36 putwchar F
+GLIBC_2.36 putwchar_unlocked F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 pwrite F
+GLIBC_2.36 pwrite64 F
+GLIBC_2.36 pwritev F
+GLIBC_2.36 pwritev2 F
+GLIBC_2.36 pwritev64 F
+GLIBC_2.36 pwritev64v2 F
+GLIBC_2.36 qecvt F
+GLIBC_2.36 qecvt_r F
+GLIBC_2.36 qfcvt F
+GLIBC_2.36 qfcvt_r F
+GLIBC_2.36 qgcvt F
+GLIBC_2.36 qsort F
+GLIBC_2.36 qsort_r F
+GLIBC_2.36 quick_exit F
+GLIBC_2.36 quotactl F
+GLIBC_2.36 raise F
+GLIBC_2.36 rand F
+GLIBC_2.36 rand_r F
+GLIBC_2.36 random F
+GLIBC_2.36 random_r F
+GLIBC_2.36 rawmemchr F
+GLIBC_2.36 rcmd F
+GLIBC_2.36 rcmd_af F
+GLIBC_2.36 re_comp F
+GLIBC_2.36 re_compile_fastmap F
+GLIBC_2.36 re_compile_pattern F
+GLIBC_2.36 re_exec F
+GLIBC_2.36 re_match F
+GLIBC_2.36 re_match_2 F
+GLIBC_2.36 re_search F
+GLIBC_2.36 re_search_2 F
+GLIBC_2.36 re_set_registers F
+GLIBC_2.36 re_set_syntax F
+GLIBC_2.36 re_syntax_options D 0x8
+GLIBC_2.36 read F
+GLIBC_2.36 readahead F
+GLIBC_2.36 readdir F
+GLIBC_2.36 readdir64 F
+GLIBC_2.36 readdir64_r F
+GLIBC_2.36 readdir_r F
+GLIBC_2.36 readlink F
+GLIBC_2.36 readlinkat F
+GLIBC_2.36 readv F
+GLIBC_2.36 realloc F
+GLIBC_2.36 reallocarray F
+GLIBC_2.36 realpath F
+GLIBC_2.36 reboot F
+GLIBC_2.36 recv F
+GLIBC_2.36 recvfrom F
+GLIBC_2.36 recvmmsg F
+GLIBC_2.36 recvmsg F
+GLIBC_2.36 regcomp F
+GLIBC_2.36 regerror F
+GLIBC_2.36 regexec F
+GLIBC_2.36 regfree F
+GLIBC_2.36 register_printf_function F
+GLIBC_2.36 register_printf_modifier F
+GLIBC_2.36 register_printf_specifier F
+GLIBC_2.36 register_printf_type F
+GLIBC_2.36 remap_file_pages F
+GLIBC_2.36 remove F
+GLIBC_2.36 removexattr F
+GLIBC_2.36 remque F
+GLIBC_2.36 rename F
+GLIBC_2.36 renameat F
+GLIBC_2.36 renameat2 F
+GLIBC_2.36 res_dnok F
+GLIBC_2.36 res_hnok F
+GLIBC_2.36 res_mailok F
+GLIBC_2.36 res_mkquery F
+GLIBC_2.36 res_nmkquery F
+GLIBC_2.36 res_nquery F
+GLIBC_2.36 res_nquerydomain F
+GLIBC_2.36 res_nsearch F
+GLIBC_2.36 res_nsend F
+GLIBC_2.36 res_ownok F
+GLIBC_2.36 res_query F
+GLIBC_2.36 res_querydomain F
+GLIBC_2.36 res_search F
+GLIBC_2.36 res_send F
+GLIBC_2.36 revoke F
+GLIBC_2.36 rewind F
+GLIBC_2.36 rewinddir F
+GLIBC_2.36 rexec F
+GLIBC_2.36 rexec_af F
+GLIBC_2.36 rexecoptions D 0x4
+GLIBC_2.36 rindex F
+GLIBC_2.36 rmdir F
+GLIBC_2.36 rpmatch F
+GLIBC_2.36 rresvport F
+GLIBC_2.36 rresvport_af F
+GLIBC_2.36 ruserok F
+GLIBC_2.36 ruserok_af F
+GLIBC_2.36 ruserpass F
+GLIBC_2.36 sbrk F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 scandir F
+GLIBC_2.36 scandir64 F
+GLIBC_2.36 scandirat F
+GLIBC_2.36 scandirat64 F
+GLIBC_2.36 scanf F
+GLIBC_2.36 sched_get_priority_max F
+GLIBC_2.36 sched_get_priority_min F
+GLIBC_2.36 sched_getaffinity F
+GLIBC_2.36 sched_getcpu F
+GLIBC_2.36 sched_getparam F
+GLIBC_2.36 sched_getscheduler F
+GLIBC_2.36 sched_rr_get_interval F
+GLIBC_2.36 sched_setaffinity F
+GLIBC_2.36 sched_setparam F
+GLIBC_2.36 sched_setscheduler F
+GLIBC_2.36 sched_yield F
+GLIBC_2.36 secure_getenv F
+GLIBC_2.36 seed48 F
+GLIBC_2.36 seed48_r F
+GLIBC_2.36 seekdir F
+GLIBC_2.36 select F
+GLIBC_2.36 sem_clockwait F
+GLIBC_2.36 sem_close F
+GLIBC_2.36 sem_destroy F
+GLIBC_2.36 sem_getvalue F
+GLIBC_2.36 sem_init F
+GLIBC_2.36 sem_open F
+GLIBC_2.36 sem_post F
+GLIBC_2.36 sem_timedwait F
+GLIBC_2.36 sem_trywait F
+GLIBC_2.36 sem_unlink F
+GLIBC_2.36 sem_wait F
+GLIBC_2.36 semctl F
+GLIBC_2.36 semget F
+GLIBC_2.36 semop F
+GLIBC_2.36 semtimedop F
+GLIBC_2.36 send F
+GLIBC_2.36 sendfile F
+GLIBC_2.36 sendfile64 F
+GLIBC_2.36 sendmmsg F
+GLIBC_2.36 sendmsg F
+GLIBC_2.36 sendto F
+GLIBC_2.36 setaliasent F
+GLIBC_2.36 setbuf F
+GLIBC_2.36 setbuffer F
+GLIBC_2.36 setcontext F
+GLIBC_2.36 setdomainname F
+GLIBC_2.36 setegid F
+GLIBC_2.36 setenv F
+GLIBC_2.36 seteuid F
+GLIBC_2.36 setfsent F
+GLIBC_2.36 setfsgid F
+GLIBC_2.36 setfsuid F
+GLIBC_2.36 setgid F
+GLIBC_2.36 setgrent F
+GLIBC_2.36 setgroups F
+GLIBC_2.36 sethostent F
+GLIBC_2.36 sethostid F
+GLIBC_2.36 sethostname F
+GLIBC_2.36 setipv4sourcefilter F
+GLIBC_2.36 setitimer F
+GLIBC_2.36 setjmp F
+GLIBC_2.36 setlinebuf F
+GLIBC_2.36 setlocale F
+GLIBC_2.36 setlogin F
+GLIBC_2.36 setlogmask F
+GLIBC_2.36 setmntent F
+GLIBC_2.36 setnetent F
+GLIBC_2.36 setnetgrent F
+GLIBC_2.36 setns F
+GLIBC_2.36 setpgid F
+GLIBC_2.36 setpgrp F
+GLIBC_2.36 setpriority F
+GLIBC_2.36 setprotoent F
+GLIBC_2.36 setpwent F
+GLIBC_2.36 setregid F
+GLIBC_2.36 setresgid F
+GLIBC_2.36 setresuid F
+GLIBC_2.36 setreuid F
+GLIBC_2.36 setrlimit F
+GLIBC_2.36 setrlimit64 F
+GLIBC_2.36 setrpcent F
+GLIBC_2.36 setservent F
+GLIBC_2.36 setsgent F
+GLIBC_2.36 setsid F
+GLIBC_2.36 setsockopt F
+GLIBC_2.36 setsourcefilter F
+GLIBC_2.36 setspent F
+GLIBC_2.36 setstate F
+GLIBC_2.36 setstate_r F
+GLIBC_2.36 settimeofday F
+GLIBC_2.36 setttyent F
+GLIBC_2.36 setuid F
+GLIBC_2.36 setusershell F
+GLIBC_2.36 setutent F
+GLIBC_2.36 setutxent F
+GLIBC_2.36 setvbuf F
+GLIBC_2.36 setxattr F
+GLIBC_2.36 sgetsgent F
+GLIBC_2.36 sgetsgent_r F
+GLIBC_2.36 sgetspent F
+GLIBC_2.36 sgetspent_r F
+GLIBC_2.36 shm_open F
+GLIBC_2.36 shm_unlink F
+GLIBC_2.36 shmat F
+GLIBC_2.36 shmctl F
+GLIBC_2.36 shmdt F
+GLIBC_2.36 shmget F
+GLIBC_2.36 shutdown F
+GLIBC_2.36 sigabbrev_np F
+GLIBC_2.36 sigaction F
+GLIBC_2.36 sigaddset F
+GLIBC_2.36 sigaltstack F
+GLIBC_2.36 sigandset F
+GLIBC_2.36 sigblock F
+GLIBC_2.36 sigdelset F
+GLIBC_2.36 sigdescr_np F
+GLIBC_2.36 sigemptyset F
+GLIBC_2.36 sigfillset F
+GLIBC_2.36 siggetmask F
+GLIBC_2.36 sighold F
+GLIBC_2.36 sigignore F
+GLIBC_2.36 siginterrupt F
+GLIBC_2.36 sigisemptyset F
+GLIBC_2.36 sigismember F
+GLIBC_2.36 siglongjmp F
+GLIBC_2.36 signal F
+GLIBC_2.36 signalfd F
+GLIBC_2.36 sigorset F
+GLIBC_2.36 sigpause F
+GLIBC_2.36 sigpending F
+GLIBC_2.36 sigprocmask F
+GLIBC_2.36 sigqueue F
+GLIBC_2.36 sigrelse F
+GLIBC_2.36 sigreturn F
+GLIBC_2.36 sigset F
+GLIBC_2.36 sigsetmask F
+GLIBC_2.36 sigstack F
+GLIBC_2.36 sigsuspend F
+GLIBC_2.36 sigtimedwait F
+GLIBC_2.36 sigwait F
+GLIBC_2.36 sigwaitinfo F
+GLIBC_2.36 sleep F
+GLIBC_2.36 snprintf F
+GLIBC_2.36 sockatmark F
+GLIBC_2.36 socket F
+GLIBC_2.36 socketpair F
+GLIBC_2.36 splice F
+GLIBC_2.36 sprintf F
+GLIBC_2.36 sprofil F
+GLIBC_2.36 srand F
+GLIBC_2.36 srand48 F
+GLIBC_2.36 srand48_r F
+GLIBC_2.36 srandom F
+GLIBC_2.36 srandom_r F
+GLIBC_2.36 sscanf F
+GLIBC_2.36 ssignal F
+GLIBC_2.36 stat F
+GLIBC_2.36 stat64 F
+GLIBC_2.36 statfs F
+GLIBC_2.36 statfs64 F
+GLIBC_2.36 statvfs F
+GLIBC_2.36 statvfs64 F
+GLIBC_2.36 statx F
+GLIBC_2.36 stderr D 0x8
+GLIBC_2.36 stdin D 0x8
+GLIBC_2.36 stdout D 0x8
+GLIBC_2.36 stpcpy F
+GLIBC_2.36 stpncpy F
+GLIBC_2.36 strcasecmp F
+GLIBC_2.36 strcasecmp_l F
+GLIBC_2.36 strcasestr F
+GLIBC_2.36 strcat F
+GLIBC_2.36 strchr F
+GLIBC_2.36 strchrnul F
+GLIBC_2.36 strcmp F
+GLIBC_2.36 strcoll F
+GLIBC_2.36 strcoll_l F
+GLIBC_2.36 strcpy F
+GLIBC_2.36 strcspn F
+GLIBC_2.36 strdup F
+GLIBC_2.36 strerror F
+GLIBC_2.36 strerror_l F
+GLIBC_2.36 strerror_r F
+GLIBC_2.36 strerrordesc_np F
+GLIBC_2.36 strerrorname_np F
+GLIBC_2.36 strfmon F
+GLIBC_2.36 strfmon_l F
+GLIBC_2.36 strfromd F
+GLIBC_2.36 strfromf F
+GLIBC_2.36 strfromf128 F
+GLIBC_2.36 strfromf32 F
+GLIBC_2.36 strfromf32x F
+GLIBC_2.36 strfromf64 F
+GLIBC_2.36 strfromf64x F
+GLIBC_2.36 strfroml F
+GLIBC_2.36 strfry F
+GLIBC_2.36 strftime F
+GLIBC_2.36 strftime_l F
+GLIBC_2.36 strlen F
+GLIBC_2.36 strncasecmp F
+GLIBC_2.36 strncasecmp_l F
+GLIBC_2.36 strncat F
+GLIBC_2.36 strncmp F
+GLIBC_2.36 strncpy F
+GLIBC_2.36 strndup F
+GLIBC_2.36 strnlen F
+GLIBC_2.36 strpbrk F
+GLIBC_2.36 strptime F
+GLIBC_2.36 strptime_l F
+GLIBC_2.36 strrchr F
+GLIBC_2.36 strsep F
+GLIBC_2.36 strsignal F
+GLIBC_2.36 strspn F
+GLIBC_2.36 strstr F
+GLIBC_2.36 strtod F
+GLIBC_2.36 strtod_l F
+GLIBC_2.36 strtof F
+GLIBC_2.36 strtof128 F
+GLIBC_2.36 strtof128_l F
+GLIBC_2.36 strtof32 F
+GLIBC_2.36 strtof32_l F
+GLIBC_2.36 strtof32x F
+GLIBC_2.36 strtof32x_l F
+GLIBC_2.36 strtof64 F
+GLIBC_2.36 strtof64_l F
+GLIBC_2.36 strtof64x F
+GLIBC_2.36 strtof64x_l F
+GLIBC_2.36 strtof_l F
+GLIBC_2.36 strtoimax F
+GLIBC_2.36 strtok F
+GLIBC_2.36 strtok_r F
+GLIBC_2.36 strtol F
+GLIBC_2.36 strtol_l F
+GLIBC_2.36 strtold F
+GLIBC_2.36 strtold_l F
+GLIBC_2.36 strtoll F
+GLIBC_2.36 strtoll_l F
+GLIBC_2.36 strtoq F
+GLIBC_2.36 strtoul F
+GLIBC_2.36 strtoul_l F
+GLIBC_2.36 strtoull F
+GLIBC_2.36 strtoull_l F
+GLIBC_2.36 strtoumax F
+GLIBC_2.36 strtouq F
+GLIBC_2.36 strverscmp F
+GLIBC_2.36 strxfrm F
+GLIBC_2.36 strxfrm_l F
+GLIBC_2.36 stty F
+GLIBC_2.36 swab F
+GLIBC_2.36 swapcontext F
+GLIBC_2.36 swapoff F
+GLIBC_2.36 swapon F
+GLIBC_2.36 swprintf F
+GLIBC_2.36 swscanf F
+GLIBC_2.36 symlink F
+GLIBC_2.36 symlinkat F
+GLIBC_2.36 sync F
+GLIBC_2.36 sync_file_range F
+GLIBC_2.36 syncfs F
+GLIBC_2.36 syscall F
+GLIBC_2.36 sysconf F
+GLIBC_2.36 sysinfo F
+GLIBC_2.36 syslog F
+GLIBC_2.36 system F
+GLIBC_2.36 sysv_signal F
+GLIBC_2.36 tcdrain F
+GLIBC_2.36 tcflow F
+GLIBC_2.36 tcflush F
+GLIBC_2.36 tcgetattr F
+GLIBC_2.36 tcgetpgrp F
+GLIBC_2.36 tcgetsid F
+GLIBC_2.36 tcsendbreak F
+GLIBC_2.36 tcsetattr F
+GLIBC_2.36 tcsetpgrp F
+GLIBC_2.36 tdelete F
+GLIBC_2.36 tdestroy F
+GLIBC_2.36 tee F
+GLIBC_2.36 telldir F
+GLIBC_2.36 tempnam F
+GLIBC_2.36 textdomain F
+GLIBC_2.36 tfind F
+GLIBC_2.36 tgkill F
+GLIBC_2.36 thrd_create F
+GLIBC_2.36 thrd_current F
+GLIBC_2.36 thrd_detach F
+GLIBC_2.36 thrd_equal F
+GLIBC_2.36 thrd_exit F
+GLIBC_2.36 thrd_join F
+GLIBC_2.36 thrd_sleep F
+GLIBC_2.36 thrd_yield F
+GLIBC_2.36 time F
+GLIBC_2.36 timegm F
+GLIBC_2.36 timelocal F
+GLIBC_2.36 timer_create F
+GLIBC_2.36 timer_delete F
+GLIBC_2.36 timer_getoverrun F
+GLIBC_2.36 timer_gettime F
+GLIBC_2.36 timer_settime F
+GLIBC_2.36 timerfd_create F
+GLIBC_2.36 timerfd_gettime F
+GLIBC_2.36 timerfd_settime F
+GLIBC_2.36 times F
+GLIBC_2.36 timespec_get F
+GLIBC_2.36 timespec_getres F
+GLIBC_2.36 timezone D 0x8
+GLIBC_2.36 tmpfile F
+GLIBC_2.36 tmpfile64 F
+GLIBC_2.36 tmpnam F
+GLIBC_2.36 tmpnam_r F
+GLIBC_2.36 toascii F
+GLIBC_2.36 tolower F
+GLIBC_2.36 tolower_l F
+GLIBC_2.36 toupper F
+GLIBC_2.36 toupper_l F
+GLIBC_2.36 towctrans F
+GLIBC_2.36 towctrans_l F
+GLIBC_2.36 towlower F
+GLIBC_2.36 towlower_l F
+GLIBC_2.36 towupper F
+GLIBC_2.36 towupper_l F
+GLIBC_2.36 truncate F
+GLIBC_2.36 truncate64 F
+GLIBC_2.36 tsearch F
+GLIBC_2.36 tss_create F
+GLIBC_2.36 tss_delete F
+GLIBC_2.36 tss_get F
+GLIBC_2.36 tss_set F
+GLIBC_2.36 ttyname F
+GLIBC_2.36 ttyname_r F
+GLIBC_2.36 ttyslot F
+GLIBC_2.36 twalk F
+GLIBC_2.36 twalk_r F
+GLIBC_2.36 tzname D 0x10
+GLIBC_2.36 tzset F
+GLIBC_2.36 ualarm F
+GLIBC_2.36 ulckpwdf F
+GLIBC_2.36 ulimit F
+GLIBC_2.36 umask F
+GLIBC_2.36 umount F
+GLIBC_2.36 umount2 F
+GLIBC_2.36 uname F
+GLIBC_2.36 ungetc F
+GLIBC_2.36 ungetwc F
+GLIBC_2.36 unlink F
+GLIBC_2.36 unlinkat F
+GLIBC_2.36 unlockpt F
+GLIBC_2.36 unsetenv F
+GLIBC_2.36 unshare F
+GLIBC_2.36 updwtmp F
+GLIBC_2.36 updwtmpx F
+GLIBC_2.36 uselocale F
+GLIBC_2.36 usleep F
+GLIBC_2.36 utime F
+GLIBC_2.36 utimensat F
+GLIBC_2.36 utimes F
+GLIBC_2.36 utmpname F
+GLIBC_2.36 utmpxname F
+GLIBC_2.36 valloc F
+GLIBC_2.36 vasprintf F
+GLIBC_2.36 vdprintf F
+GLIBC_2.36 verr F
+GLIBC_2.36 verrx F
+GLIBC_2.36 versionsort F
+GLIBC_2.36 versionsort64 F
+GLIBC_2.36 vfork F
+GLIBC_2.36 vfprintf F
+GLIBC_2.36 vfscanf F
+GLIBC_2.36 vfwprintf F
+GLIBC_2.36 vfwscanf F
+GLIBC_2.36 vhangup F
+GLIBC_2.36 vlimit F
+GLIBC_2.36 vmsplice F
+GLIBC_2.36 vprintf F
+GLIBC_2.36 vscanf F
+GLIBC_2.36 vsnprintf F
+GLIBC_2.36 vsprintf F
+GLIBC_2.36 vsscanf F
+GLIBC_2.36 vswprintf F
+GLIBC_2.36 vswscanf F
+GLIBC_2.36 vsyslog F
+GLIBC_2.36 vwarn F
+GLIBC_2.36 vwarnx F
+GLIBC_2.36 vwprintf F
+GLIBC_2.36 vwscanf F
+GLIBC_2.36 wait F
+GLIBC_2.36 wait3 F
+GLIBC_2.36 wait4 F
+GLIBC_2.36 waitid F
+GLIBC_2.36 waitpid F
+GLIBC_2.36 warn F
+GLIBC_2.36 warnx F
+GLIBC_2.36 wcpcpy F
+GLIBC_2.36 wcpncpy F
+GLIBC_2.36 wcrtomb F
+GLIBC_2.36 wcscasecmp F
+GLIBC_2.36 wcscasecmp_l F
+GLIBC_2.36 wcscat F
+GLIBC_2.36 wcschr F
+GLIBC_2.36 wcschrnul F
+GLIBC_2.36 wcscmp F
+GLIBC_2.36 wcscoll F
+GLIBC_2.36 wcscoll_l F
+GLIBC_2.36 wcscpy F
+GLIBC_2.36 wcscspn F
+GLIBC_2.36 wcsdup F
+GLIBC_2.36 wcsftime F
+GLIBC_2.36 wcsftime_l F
+GLIBC_2.36 wcslen F
+GLIBC_2.36 wcsncasecmp F
+GLIBC_2.36 wcsncasecmp_l F
+GLIBC_2.36 wcsncat F
+GLIBC_2.36 wcsncmp F
+GLIBC_2.36 wcsncpy F
+GLIBC_2.36 wcsnlen F
+GLIBC_2.36 wcsnrtombs F
+GLIBC_2.36 wcspbrk F
+GLIBC_2.36 wcsrchr F
+GLIBC_2.36 wcsrtombs F
+GLIBC_2.36 wcsspn F
+GLIBC_2.36 wcsstr F
+GLIBC_2.36 wcstod F
+GLIBC_2.36 wcstod_l F
+GLIBC_2.36 wcstof F
+GLIBC_2.36 wcstof128 F
+GLIBC_2.36 wcstof128_l F
+GLIBC_2.36 wcstof32 F
+GLIBC_2.36 wcstof32_l F
+GLIBC_2.36 wcstof32x F
+GLIBC_2.36 wcstof32x_l F
+GLIBC_2.36 wcstof64 F
+GLIBC_2.36 wcstof64_l F
+GLIBC_2.36 wcstof64x F
+GLIBC_2.36 wcstof64x_l F
+GLIBC_2.36 wcstof_l F
+GLIBC_2.36 wcstoimax F
+GLIBC_2.36 wcstok F
+GLIBC_2.36 wcstol F
+GLIBC_2.36 wcstol_l F
+GLIBC_2.36 wcstold F
+GLIBC_2.36 wcstold_l F
+GLIBC_2.36 wcstoll F
+GLIBC_2.36 wcstoll_l F
+GLIBC_2.36 wcstombs F
+GLIBC_2.36 wcstoq F
+GLIBC_2.36 wcstoul F
+GLIBC_2.36 wcstoul_l F
+GLIBC_2.36 wcstoull F
+GLIBC_2.36 wcstoull_l F
+GLIBC_2.36 wcstoumax F
+GLIBC_2.36 wcstouq F
+GLIBC_2.36 wcswcs F
+GLIBC_2.36 wcswidth F
+GLIBC_2.36 wcsxfrm F
+GLIBC_2.36 wcsxfrm_l F
+GLIBC_2.36 wctob F
+GLIBC_2.36 wctomb F
+GLIBC_2.36 wctrans F
+GLIBC_2.36 wctrans_l F
+GLIBC_2.36 wctype F
+GLIBC_2.36 wctype_l F
+GLIBC_2.36 wcwidth F
+GLIBC_2.36 wmemchr F
+GLIBC_2.36 wmemcmp F
+GLIBC_2.36 wmemcpy F
+GLIBC_2.36 wmemmove F
+GLIBC_2.36 wmempcpy F
+GLIBC_2.36 wmemset F
+GLIBC_2.36 wordexp F
+GLIBC_2.36 wordfree F
+GLIBC_2.36 wprintf F
+GLIBC_2.36 write F
+GLIBC_2.36 writev F
+GLIBC_2.36 wscanf F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
new file mode 100644
index 0000000000..6ddfd162b3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
@@ -0,0 +1,26 @@
+GLIBC_2.36 __free_hook D 0x8
+GLIBC_2.36 __malloc_hook D 0x8
+GLIBC_2.36 __memalign_hook D 0x8
+GLIBC_2.36 __realloc_hook D 0x8
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 calloc F
+GLIBC_2.36 free F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 realloc F
+GLIBC_2.36 valloc F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
new file mode 100644
index 0000000000..4d4332dab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.36 crypt F
+GLIBC_2.36 crypt_r F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
new file mode 100644
index 0000000000..b3dbd00001
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
@@ -0,0 +1,1030 @@
+GLIBC_2.36 __clog10 F
+GLIBC_2.36 __clog10f F
+GLIBC_2.36 __clog10l F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __fpclassify F
+GLIBC_2.36 __fpclassifyf F
+GLIBC_2.36 __fpclassifyl F
+GLIBC_2.36 __iseqsig F
+GLIBC_2.36 __iseqsigf F
+GLIBC_2.36 __iseqsigl F
+GLIBC_2.36 __issignaling F
+GLIBC_2.36 __issignalingf F
+GLIBC_2.36 __issignalingl F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __signgam D 0x4
+GLIBC_2.36 acos F
+GLIBC_2.36 acosf F
+GLIBC_2.36 acosf128 F
+GLIBC_2.36 acosf32 F
+GLIBC_2.36 acosf32x F
+GLIBC_2.36 acosf64 F
+GLIBC_2.36 acosf64x F
+GLIBC_2.36 acosh F
+GLIBC_2.36 acoshf F
+GLIBC_2.36 acoshf128 F
+GLIBC_2.36 acoshf32 F
+GLIBC_2.36 acoshf32x F
+GLIBC_2.36 acoshf64 F
+GLIBC_2.36 acoshf64x F
+GLIBC_2.36 acoshl F
+GLIBC_2.36 acosl F
+GLIBC_2.36 asin F
+GLIBC_2.36 asinf F
+GLIBC_2.36 asinf128 F
+GLIBC_2.36 asinf32 F
+GLIBC_2.36 asinf32x F
+GLIBC_2.36 asinf64 F
+GLIBC_2.36 asinf64x F
+GLIBC_2.36 asinh F
+GLIBC_2.36 asinhf F
+GLIBC_2.36 asinhf128 F
+GLIBC_2.36 asinhf32 F
+GLIBC_2.36 asinhf32x F
+GLIBC_2.36 asinhf64 F
+GLIBC_2.36 asinhf64x F
+GLIBC_2.36 asinhl F
+GLIBC_2.36 asinl F
+GLIBC_2.36 atan F
+GLIBC_2.36 atan2 F
+GLIBC_2.36 atan2f F
+GLIBC_2.36 atan2f128 F
+GLIBC_2.36 atan2f32 F
+GLIBC_2.36 atan2f32x F
+GLIBC_2.36 atan2f64 F
+GLIBC_2.36 atan2f64x F
+GLIBC_2.36 atan2l F
+GLIBC_2.36 atanf F
+GLIBC_2.36 atanf128 F
+GLIBC_2.36 atanf32 F
+GLIBC_2.36 atanf32x F
+GLIBC_2.36 atanf64 F
+GLIBC_2.36 atanf64x F
+GLIBC_2.36 atanh F
+GLIBC_2.36 atanhf F
+GLIBC_2.36 atanhf128 F
+GLIBC_2.36 atanhf32 F
+GLIBC_2.36 atanhf32x F
+GLIBC_2.36 atanhf64 F
+GLIBC_2.36 atanhf64x F
+GLIBC_2.36 atanhl F
+GLIBC_2.36 atanl F
+GLIBC_2.36 cabs F
+GLIBC_2.36 cabsf F
+GLIBC_2.36 cabsf128 F
+GLIBC_2.36 cabsf32 F
+GLIBC_2.36 cabsf32x F
+GLIBC_2.36 cabsf64 F
+GLIBC_2.36 cabsf64x F
+GLIBC_2.36 cabsl F
+GLIBC_2.36 cacos F
+GLIBC_2.36 cacosf F
+GLIBC_2.36 cacosf128 F
+GLIBC_2.36 cacosf32 F
+GLIBC_2.36 cacosf32x F
+GLIBC_2.36 cacosf64 F
+GLIBC_2.36 cacosf64x F
+GLIBC_2.36 cacosh F
+GLIBC_2.36 cacoshf F
+GLIBC_2.36 cacoshf128 F
+GLIBC_2.36 cacoshf32 F
+GLIBC_2.36 cacoshf32x F
+GLIBC_2.36 cacoshf64 F
+GLIBC_2.36 cacoshf64x F
+GLIBC_2.36 cacoshl F
+GLIBC_2.36 cacosl F
+GLIBC_2.36 canonicalize F
+GLIBC_2.36 canonicalizef F
+GLIBC_2.36 canonicalizef128 F
+GLIBC_2.36 canonicalizef32 F
+GLIBC_2.36 canonicalizef32x F
+GLIBC_2.36 canonicalizef64 F
+GLIBC_2.36 canonicalizef64x F
+GLIBC_2.36 canonicalizel F
+GLIBC_2.36 carg F
+GLIBC_2.36 cargf F
+GLIBC_2.36 cargf128 F
+GLIBC_2.36 cargf32 F
+GLIBC_2.36 cargf32x F
+GLIBC_2.36 cargf64 F
+GLIBC_2.36 cargf64x F
+GLIBC_2.36 cargl F
+GLIBC_2.36 casin F
+GLIBC_2.36 casinf F
+GLIBC_2.36 casinf128 F
+GLIBC_2.36 casinf32 F
+GLIBC_2.36 casinf32x F
+GLIBC_2.36 casinf64 F
+GLIBC_2.36 casinf64x F
+GLIBC_2.36 casinh F
+GLIBC_2.36 casinhf F
+GLIBC_2.36 casinhf128 F
+GLIBC_2.36 casinhf32 F
+GLIBC_2.36 casinhf32x F
+GLIBC_2.36 casinhf64 F
+GLIBC_2.36 casinhf64x F
+GLIBC_2.36 casinhl F
+GLIBC_2.36 casinl F
+GLIBC_2.36 catan F
+GLIBC_2.36 catanf F
+GLIBC_2.36 catanf128 F
+GLIBC_2.36 catanf32 F
+GLIBC_2.36 catanf32x F
+GLIBC_2.36 catanf64 F
+GLIBC_2.36 catanf64x F
+GLIBC_2.36 catanh F
+GLIBC_2.36 catanhf F
+GLIBC_2.36 catanhf128 F
+GLIBC_2.36 catanhf32 F
+GLIBC_2.36 catanhf32x F
+GLIBC_2.36 catanhf64 F
+GLIBC_2.36 catanhf64x F
+GLIBC_2.36 catanhl F
+GLIBC_2.36 catanl F
+GLIBC_2.36 cbrt F
+GLIBC_2.36 cbrtf F
+GLIBC_2.36 cbrtf128 F
+GLIBC_2.36 cbrtf32 F
+GLIBC_2.36 cbrtf32x F
+GLIBC_2.36 cbrtf64 F
+GLIBC_2.36 cbrtf64x F
+GLIBC_2.36 cbrtl F
+GLIBC_2.36 ccos F
+GLIBC_2.36 ccosf F
+GLIBC_2.36 ccosf128 F
+GLIBC_2.36 ccosf32 F
+GLIBC_2.36 ccosf32x F
+GLIBC_2.36 ccosf64 F
+GLIBC_2.36 ccosf64x F
+GLIBC_2.36 ccosh F
+GLIBC_2.36 ccoshf F
+GLIBC_2.36 ccoshf128 F
+GLIBC_2.36 ccoshf32 F
+GLIBC_2.36 ccoshf32x F
+GLIBC_2.36 ccoshf64 F
+GLIBC_2.36 ccoshf64x F
+GLIBC_2.36 ccoshl F
+GLIBC_2.36 ccosl F
+GLIBC_2.36 ceil F
+GLIBC_2.36 ceilf F
+GLIBC_2.36 ceilf128 F
+GLIBC_2.36 ceilf32 F
+GLIBC_2.36 ceilf32x F
+GLIBC_2.36 ceilf64 F
+GLIBC_2.36 ceilf64x F
+GLIBC_2.36 ceill F
+GLIBC_2.36 cexp F
+GLIBC_2.36 cexpf F
+GLIBC_2.36 cexpf128 F
+GLIBC_2.36 cexpf32 F
+GLIBC_2.36 cexpf32x F
+GLIBC_2.36 cexpf64 F
+GLIBC_2.36 cexpf64x F
+GLIBC_2.36 cexpl F
+GLIBC_2.36 cimag F
+GLIBC_2.36 cimagf F
+GLIBC_2.36 cimagf128 F
+GLIBC_2.36 cimagf32 F
+GLIBC_2.36 cimagf32x F
+GLIBC_2.36 cimagf64 F
+GLIBC_2.36 cimagf64x F
+GLIBC_2.36 cimagl F
+GLIBC_2.36 clog F
+GLIBC_2.36 clog10 F
+GLIBC_2.36 clog10f F
+GLIBC_2.36 clog10f128 F
+GLIBC_2.36 clog10f32 F
+GLIBC_2.36 clog10f32x F
+GLIBC_2.36 clog10f64 F
+GLIBC_2.36 clog10f64x F
+GLIBC_2.36 clog10l F
+GLIBC_2.36 clogf F
+GLIBC_2.36 clogf128 F
+GLIBC_2.36 clogf32 F
+GLIBC_2.36 clogf32x F
+GLIBC_2.36 clogf64 F
+GLIBC_2.36 clogf64x F
+GLIBC_2.36 clogl F
+GLIBC_2.36 conj F
+GLIBC_2.36 conjf F
+GLIBC_2.36 conjf128 F
+GLIBC_2.36 conjf32 F
+GLIBC_2.36 conjf32x F
+GLIBC_2.36 conjf64 F
+GLIBC_2.36 conjf64x F
+GLIBC_2.36 conjl F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignf128 F
+GLIBC_2.36 copysignf32 F
+GLIBC_2.36 copysignf32x F
+GLIBC_2.36 copysignf64 F
+GLIBC_2.36 copysignf64x F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 cos F
+GLIBC_2.36 cosf F
+GLIBC_2.36 cosf128 F
+GLIBC_2.36 cosf32 F
+GLIBC_2.36 cosf32x F
+GLIBC_2.36 cosf64 F
+GLIBC_2.36 cosf64x F
+GLIBC_2.36 cosh F
+GLIBC_2.36 coshf F
+GLIBC_2.36 coshf128 F
+GLIBC_2.36 coshf32 F
+GLIBC_2.36 coshf32x F
+GLIBC_2.36 coshf64 F
+GLIBC_2.36 coshf64x F
+GLIBC_2.36 coshl F
+GLIBC_2.36 cosl F
+GLIBC_2.36 cpow F
+GLIBC_2.36 cpowf F
+GLIBC_2.36 cpowf128 F
+GLIBC_2.36 cpowf32 F
+GLIBC_2.36 cpowf32x F
+GLIBC_2.36 cpowf64 F
+GLIBC_2.36 cpowf64x F
+GLIBC_2.36 cpowl F
+GLIBC_2.36 cproj F
+GLIBC_2.36 cprojf F
+GLIBC_2.36 cprojf128 F
+GLIBC_2.36 cprojf32 F
+GLIBC_2.36 cprojf32x F
+GLIBC_2.36 cprojf64 F
+GLIBC_2.36 cprojf64x F
+GLIBC_2.36 cprojl F
+GLIBC_2.36 creal F
+GLIBC_2.36 crealf F
+GLIBC_2.36 crealf128 F
+GLIBC_2.36 crealf32 F
+GLIBC_2.36 crealf32x F
+GLIBC_2.36 crealf64 F
+GLIBC_2.36 crealf64x F
+GLIBC_2.36 creall F
+GLIBC_2.36 csin F
+GLIBC_2.36 csinf F
+GLIBC_2.36 csinf128 F
+GLIBC_2.36 csinf32 F
+GLIBC_2.36 csinf32x F
+GLIBC_2.36 csinf64 F
+GLIBC_2.36 csinf64x F
+GLIBC_2.36 csinh F
+GLIBC_2.36 csinhf F
+GLIBC_2.36 csinhf128 F
+GLIBC_2.36 csinhf32 F
+GLIBC_2.36 csinhf32x F
+GLIBC_2.36 csinhf64 F
+GLIBC_2.36 csinhf64x F
+GLIBC_2.36 csinhl F
+GLIBC_2.36 csinl F
+GLIBC_2.36 csqrt F
+GLIBC_2.36 csqrtf F
+GLIBC_2.36 csqrtf128 F
+GLIBC_2.36 csqrtf32 F
+GLIBC_2.36 csqrtf32x F
+GLIBC_2.36 csqrtf64 F
+GLIBC_2.36 csqrtf64x F
+GLIBC_2.36 csqrtl F
+GLIBC_2.36 ctan F
+GLIBC_2.36 ctanf F
+GLIBC_2.36 ctanf128 F
+GLIBC_2.36 ctanf32 F
+GLIBC_2.36 ctanf32x F
+GLIBC_2.36 ctanf64 F
+GLIBC_2.36 ctanf64x F
+GLIBC_2.36 ctanh F
+GLIBC_2.36 ctanhf F
+GLIBC_2.36 ctanhf128 F
+GLIBC_2.36 ctanhf32 F
+GLIBC_2.36 ctanhf32x F
+GLIBC_2.36 ctanhf64 F
+GLIBC_2.36 ctanhf64x F
+GLIBC_2.36 ctanhl F
+GLIBC_2.36 ctanl F
+GLIBC_2.36 daddl F
+GLIBC_2.36 ddivl F
+GLIBC_2.36 dfmal F
+GLIBC_2.36 dmull F
+GLIBC_2.36 drem F
+GLIBC_2.36 dremf F
+GLIBC_2.36 dreml F
+GLIBC_2.36 dsqrtl F
+GLIBC_2.36 dsubl F
+GLIBC_2.36 erf F
+GLIBC_2.36 erfc F
+GLIBC_2.36 erfcf F
+GLIBC_2.36 erfcf128 F
+GLIBC_2.36 erfcf32 F
+GLIBC_2.36 erfcf32x F
+GLIBC_2.36 erfcf64 F
+GLIBC_2.36 erfcf64x F
+GLIBC_2.36 erfcl F
+GLIBC_2.36 erff F
+GLIBC_2.36 erff128 F
+GLIBC_2.36 erff32 F
+GLIBC_2.36 erff32x F
+GLIBC_2.36 erff64 F
+GLIBC_2.36 erff64x F
+GLIBC_2.36 erfl F
+GLIBC_2.36 exp F
+GLIBC_2.36 exp10 F
+GLIBC_2.36 exp10f F
+GLIBC_2.36 exp10f128 F
+GLIBC_2.36 exp10f32 F
+GLIBC_2.36 exp10f32x F
+GLIBC_2.36 exp10f64 F
+GLIBC_2.36 exp10f64x F
+GLIBC_2.36 exp10l F
+GLIBC_2.36 exp2 F
+GLIBC_2.36 exp2f F
+GLIBC_2.36 exp2f128 F
+GLIBC_2.36 exp2f32 F
+GLIBC_2.36 exp2f32x F
+GLIBC_2.36 exp2f64 F
+GLIBC_2.36 exp2f64x F
+GLIBC_2.36 exp2l F
+GLIBC_2.36 expf F
+GLIBC_2.36 expf128 F
+GLIBC_2.36 expf32 F
+GLIBC_2.36 expf32x F
+GLIBC_2.36 expf64 F
+GLIBC_2.36 expf64x F
+GLIBC_2.36 expl F
+GLIBC_2.36 expm1 F
+GLIBC_2.36 expm1f F
+GLIBC_2.36 expm1f128 F
+GLIBC_2.36 expm1f32 F
+GLIBC_2.36 expm1f32x F
+GLIBC_2.36 expm1f64 F
+GLIBC_2.36 expm1f64x F
+GLIBC_2.36 expm1l F
+GLIBC_2.36 f32addf128 F
+GLIBC_2.36 f32addf32x F
+GLIBC_2.36 f32addf64 F
+GLIBC_2.36 f32addf64x F
+GLIBC_2.36 f32divf128 F
+GLIBC_2.36 f32divf32x F
+GLIBC_2.36 f32divf64 F
+GLIBC_2.36 f32divf64x F
+GLIBC_2.36 f32fmaf128 F
+GLIBC_2.36 f32fmaf32x F
+GLIBC_2.36 f32fmaf64 F
+GLIBC_2.36 f32fmaf64x F
+GLIBC_2.36 f32mulf128 F
+GLIBC_2.36 f32mulf32x F
+GLIBC_2.36 f32mulf64 F
+GLIBC_2.36 f32mulf64x F
+GLIBC_2.36 f32sqrtf128 F
+GLIBC_2.36 f32sqrtf32x F
+GLIBC_2.36 f32sqrtf64 F
+GLIBC_2.36 f32sqrtf64x F
+GLIBC_2.36 f32subf128 F
+GLIBC_2.36 f32subf32x F
+GLIBC_2.36 f32subf64 F
+GLIBC_2.36 f32subf64x F
+GLIBC_2.36 f32xaddf128 F
+GLIBC_2.36 f32xaddf64 F
+GLIBC_2.36 f32xaddf64x F
+GLIBC_2.36 f32xdivf128 F
+GLIBC_2.36 f32xdivf64 F
+GLIBC_2.36 f32xdivf64x F
+GLIBC_2.36 f32xfmaf128 F
+GLIBC_2.36 f32xfmaf64 F
+GLIBC_2.36 f32xfmaf64x F
+GLIBC_2.36 f32xmulf128 F
+GLIBC_2.36 f32xmulf64 F
+GLIBC_2.36 f32xmulf64x F
+GLIBC_2.36 f32xsqrtf128 F
+GLIBC_2.36 f32xsqrtf64 F
+GLIBC_2.36 f32xsqrtf64x F
+GLIBC_2.36 f32xsubf128 F
+GLIBC_2.36 f32xsubf64 F
+GLIBC_2.36 f32xsubf64x F
+GLIBC_2.36 f64addf128 F
+GLIBC_2.36 f64addf64x F
+GLIBC_2.36 f64divf128 F
+GLIBC_2.36 f64divf64x F
+GLIBC_2.36 f64fmaf128 F
+GLIBC_2.36 f64fmaf64x F
+GLIBC_2.36 f64mulf128 F
+GLIBC_2.36 f64mulf64x F
+GLIBC_2.36 f64sqrtf128 F
+GLIBC_2.36 f64sqrtf64x F
+GLIBC_2.36 f64subf128 F
+GLIBC_2.36 f64subf64x F
+GLIBC_2.36 f64xaddf128 F
+GLIBC_2.36 f64xdivf128 F
+GLIBC_2.36 f64xfmaf128 F
+GLIBC_2.36 f64xmulf128 F
+GLIBC_2.36 f64xsqrtf128 F
+GLIBC_2.36 f64xsubf128 F
+GLIBC_2.36 fabs F
+GLIBC_2.36 fabsf F
+GLIBC_2.36 fabsf128 F
+GLIBC_2.36 fabsf32 F
+GLIBC_2.36 fabsf32x F
+GLIBC_2.36 fabsf64 F
+GLIBC_2.36 fabsf64x F
+GLIBC_2.36 fabsl F
+GLIBC_2.36 fadd F
+GLIBC_2.36 faddl F
+GLIBC_2.36 fdim F
+GLIBC_2.36 fdimf F
+GLIBC_2.36 fdimf128 F
+GLIBC_2.36 fdimf32 F
+GLIBC_2.36 fdimf32x F
+GLIBC_2.36 fdimf64 F
+GLIBC_2.36 fdimf64x F
+GLIBC_2.36 fdiml F
+GLIBC_2.36 fdiv F
+GLIBC_2.36 fdivl F
+GLIBC_2.36 feclearexcept F
+GLIBC_2.36 fedisableexcept F
+GLIBC_2.36 feenableexcept F
+GLIBC_2.36 fegetenv F
+GLIBC_2.36 fegetexcept F
+GLIBC_2.36 fegetexceptflag F
+GLIBC_2.36 fegetmode F
+GLIBC_2.36 fegetround F
+GLIBC_2.36 feholdexcept F
+GLIBC_2.36 feraiseexcept F
+GLIBC_2.36 fesetenv F
+GLIBC_2.36 fesetexcept F
+GLIBC_2.36 fesetexceptflag F
+GLIBC_2.36 fesetmode F
+GLIBC_2.36 fesetround F
+GLIBC_2.36 fetestexcept F
+GLIBC_2.36 fetestexceptflag F
+GLIBC_2.36 feupdateenv F
+GLIBC_2.36 ffma F
+GLIBC_2.36 ffmal F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 floor F
+GLIBC_2.36 floorf F
+GLIBC_2.36 floorf128 F
+GLIBC_2.36 floorf32 F
+GLIBC_2.36 floorf32x F
+GLIBC_2.36 floorf64 F
+GLIBC_2.36 floorf64x F
+GLIBC_2.36 floorl F
+GLIBC_2.36 fma F
+GLIBC_2.36 fmaf F
+GLIBC_2.36 fmaf128 F
+GLIBC_2.36 fmaf32 F
+GLIBC_2.36 fmaf32x F
+GLIBC_2.36 fmaf64 F
+GLIBC_2.36 fmaf64x F
+GLIBC_2.36 fmal F
+GLIBC_2.36 fmax F
+GLIBC_2.36 fmaxf F
+GLIBC_2.36 fmaxf128 F
+GLIBC_2.36 fmaxf32 F
+GLIBC_2.36 fmaxf32x F
+GLIBC_2.36 fmaxf64 F
+GLIBC_2.36 fmaxf64x F
+GLIBC_2.36 fmaximum F
+GLIBC_2.36 fmaximum_mag F
+GLIBC_2.36 fmaximum_mag_num F
+GLIBC_2.36 fmaximum_mag_numf F
+GLIBC_2.36 fmaximum_mag_numf128 F
+GLIBC_2.36 fmaximum_mag_numf32 F
+GLIBC_2.36 fmaximum_mag_numf32x F
+GLIBC_2.36 fmaximum_mag_numf64 F
+GLIBC_2.36 fmaximum_mag_numf64x F
+GLIBC_2.36 fmaximum_mag_numl F
+GLIBC_2.36 fmaximum_magf F
+GLIBC_2.36 fmaximum_magf128 F
+GLIBC_2.36 fmaximum_magf32 F
+GLIBC_2.36 fmaximum_magf32x F
+GLIBC_2.36 fmaximum_magf64 F
+GLIBC_2.36 fmaximum_magf64x F
+GLIBC_2.36 fmaximum_magl F
+GLIBC_2.36 fmaximum_num F
+GLIBC_2.36 fmaximum_numf F
+GLIBC_2.36 fmaximum_numf128 F
+GLIBC_2.36 fmaximum_numf32 F
+GLIBC_2.36 fmaximum_numf32x F
+GLIBC_2.36 fmaximum_numf64 F
+GLIBC_2.36 fmaximum_numf64x F
+GLIBC_2.36 fmaximum_numl F
+GLIBC_2.36 fmaximumf F
+GLIBC_2.36 fmaximumf128 F
+GLIBC_2.36 fmaximumf32 F
+GLIBC_2.36 fmaximumf32x F
+GLIBC_2.36 fmaximumf64 F
+GLIBC_2.36 fmaximumf64x F
+GLIBC_2.36 fmaximuml F
+GLIBC_2.36 fmaxl F
+GLIBC_2.36 fmaxmag F
+GLIBC_2.36 fmaxmagf F
+GLIBC_2.36 fmaxmagf128 F
+GLIBC_2.36 fmaxmagf32 F
+GLIBC_2.36 fmaxmagf32x F
+GLIBC_2.36 fmaxmagf64 F
+GLIBC_2.36 fmaxmagf64x F
+GLIBC_2.36 fmaxmagl F
+GLIBC_2.36 fmin F
+GLIBC_2.36 fminf F
+GLIBC_2.36 fminf128 F
+GLIBC_2.36 fminf32 F
+GLIBC_2.36 fminf32x F
+GLIBC_2.36 fminf64 F
+GLIBC_2.36 fminf64x F
+GLIBC_2.36 fminimum F
+GLIBC_2.36 fminimum_mag F
+GLIBC_2.36 fminimum_mag_num F
+GLIBC_2.36 fminimum_mag_numf F
+GLIBC_2.36 fminimum_mag_numf128 F
+GLIBC_2.36 fminimum_mag_numf32 F
+GLIBC_2.36 fminimum_mag_numf32x F
+GLIBC_2.36 fminimum_mag_numf64 F
+GLIBC_2.36 fminimum_mag_numf64x F
+GLIBC_2.36 fminimum_mag_numl F
+GLIBC_2.36 fminimum_magf F
+GLIBC_2.36 fminimum_magf128 F
+GLIBC_2.36 fminimum_magf32 F
+GLIBC_2.36 fminimum_magf32x F
+GLIBC_2.36 fminimum_magf64 F
+GLIBC_2.36 fminimum_magf64x F
+GLIBC_2.36 fminimum_magl F
+GLIBC_2.36 fminimum_num F
+GLIBC_2.36 fminimum_numf F
+GLIBC_2.36 fminimum_numf128 F
+GLIBC_2.36 fminimum_numf32 F
+GLIBC_2.36 fminimum_numf32x F
+GLIBC_2.36 fminimum_numf64 F
+GLIBC_2.36 fminimum_numf64x F
+GLIBC_2.36 fminimum_numl F
+GLIBC_2.36 fminimumf F
+GLIBC_2.36 fminimumf128 F
+GLIBC_2.36 fminimumf32 F
+GLIBC_2.36 fminimumf32x F
+GLIBC_2.36 fminimumf64 F
+GLIBC_2.36 fminimumf64x F
+GLIBC_2.36 fminimuml F
+GLIBC_2.36 fminl F
+GLIBC_2.36 fminmag F
+GLIBC_2.36 fminmagf F
+GLIBC_2.36 fminmagf128 F
+GLIBC_2.36 fminmagf32 F
+GLIBC_2.36 fminmagf32x F
+GLIBC_2.36 fminmagf64 F
+GLIBC_2.36 fminmagf64x F
+GLIBC_2.36 fminmagl F
+GLIBC_2.36 fmod F
+GLIBC_2.36 fmodf F
+GLIBC_2.36 fmodf128 F
+GLIBC_2.36 fmodf32 F
+GLIBC_2.36 fmodf32x F
+GLIBC_2.36 fmodf64 F
+GLIBC_2.36 fmodf64x F
+GLIBC_2.36 fmodl F
+GLIBC_2.36 fmul F
+GLIBC_2.36 fmull F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpf128 F
+GLIBC_2.36 frexpf32 F
+GLIBC_2.36 frexpf32x F
+GLIBC_2.36 frexpf64 F
+GLIBC_2.36 frexpf64x F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fromfp F
+GLIBC_2.36 fromfpf F
+GLIBC_2.36 fromfpf128 F
+GLIBC_2.36 fromfpf32 F
+GLIBC_2.36 fromfpf32x F
+GLIBC_2.36 fromfpf64 F
+GLIBC_2.36 fromfpf64x F
+GLIBC_2.36 fromfpl F
+GLIBC_2.36 fromfpx F
+GLIBC_2.36 fromfpxf F
+GLIBC_2.36 fromfpxf128 F
+GLIBC_2.36 fromfpxf32 F
+GLIBC_2.36 fromfpxf32x F
+GLIBC_2.36 fromfpxf64 F
+GLIBC_2.36 fromfpxf64x F
+GLIBC_2.36 fromfpxl F
+GLIBC_2.36 fsqrt F
+GLIBC_2.36 fsqrtl F
+GLIBC_2.36 fsub F
+GLIBC_2.36 fsubl F
+GLIBC_2.36 gamma F
+GLIBC_2.36 gammaf F
+GLIBC_2.36 gammal F
+GLIBC_2.36 getpayload F
+GLIBC_2.36 getpayloadf F
+GLIBC_2.36 getpayloadf128 F
+GLIBC_2.36 getpayloadf32 F
+GLIBC_2.36 getpayloadf32x F
+GLIBC_2.36 getpayloadf64 F
+GLIBC_2.36 getpayloadf64x F
+GLIBC_2.36 getpayloadl F
+GLIBC_2.36 hypot F
+GLIBC_2.36 hypotf F
+GLIBC_2.36 hypotf128 F
+GLIBC_2.36 hypotf32 F
+GLIBC_2.36 hypotf32x F
+GLIBC_2.36 hypotf64 F
+GLIBC_2.36 hypotf64x F
+GLIBC_2.36 hypotl F
+GLIBC_2.36 ilogb F
+GLIBC_2.36 ilogbf F
+GLIBC_2.36 ilogbf128 F
+GLIBC_2.36 ilogbf32 F
+GLIBC_2.36 ilogbf32x F
+GLIBC_2.36 ilogbf64 F
+GLIBC_2.36 ilogbf64x F
+GLIBC_2.36 ilogbl F
+GLIBC_2.36 j0 F
+GLIBC_2.36 j0f F
+GLIBC_2.36 j0f128 F
+GLIBC_2.36 j0f32 F
+GLIBC_2.36 j0f32x F
+GLIBC_2.36 j0f64 F
+GLIBC_2.36 j0f64x F
+GLIBC_2.36 j0l F
+GLIBC_2.36 j1 F
+GLIBC_2.36 j1f F
+GLIBC_2.36 j1f128 F
+GLIBC_2.36 j1f32 F
+GLIBC_2.36 j1f32x F
+GLIBC_2.36 j1f64 F
+GLIBC_2.36 j1f64x F
+GLIBC_2.36 j1l F
+GLIBC_2.36 jn F
+GLIBC_2.36 jnf F
+GLIBC_2.36 jnf128 F
+GLIBC_2.36 jnf32 F
+GLIBC_2.36 jnf32x F
+GLIBC_2.36 jnf64 F
+GLIBC_2.36 jnf64x F
+GLIBC_2.36 jnl F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpf128 F
+GLIBC_2.36 ldexpf32 F
+GLIBC_2.36 ldexpf32x F
+GLIBC_2.36 ldexpf64 F
+GLIBC_2.36 ldexpf64x F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 lgamma F
+GLIBC_2.36 lgamma_r F
+GLIBC_2.36 lgammaf F
+GLIBC_2.36 lgammaf128 F
+GLIBC_2.36 lgammaf128_r F
+GLIBC_2.36 lgammaf32 F
+GLIBC_2.36 lgammaf32_r F
+GLIBC_2.36 lgammaf32x F
+GLIBC_2.36 lgammaf32x_r F
+GLIBC_2.36 lgammaf64 F
+GLIBC_2.36 lgammaf64_r F
+GLIBC_2.36 lgammaf64x F
+GLIBC_2.36 lgammaf64x_r F
+GLIBC_2.36 lgammaf_r F
+GLIBC_2.36 lgammal F
+GLIBC_2.36 lgammal_r F
+GLIBC_2.36 llogb F
+GLIBC_2.36 llogbf F
+GLIBC_2.36 llogbf128 F
+GLIBC_2.36 llogbf32 F
+GLIBC_2.36 llogbf32x F
+GLIBC_2.36 llogbf64 F
+GLIBC_2.36 llogbf64x F
+GLIBC_2.36 llogbl F
+GLIBC_2.36 llrint F
+GLIBC_2.36 llrintf F
+GLIBC_2.36 llrintf128 F
+GLIBC_2.36 llrintf32 F
+GLIBC_2.36 llrintf32x F
+GLIBC_2.36 llrintf64 F
+GLIBC_2.36 llrintf64x F
+GLIBC_2.36 llrintl F
+GLIBC_2.36 llround F
+GLIBC_2.36 llroundf F
+GLIBC_2.36 llroundf128 F
+GLIBC_2.36 llroundf32 F
+GLIBC_2.36 llroundf32x F
+GLIBC_2.36 llroundf64 F
+GLIBC_2.36 llroundf64x F
+GLIBC_2.36 llroundl F
+GLIBC_2.36 log F
+GLIBC_2.36 log10 F
+GLIBC_2.36 log10f F
+GLIBC_2.36 log10f128 F
+GLIBC_2.36 log10f32 F
+GLIBC_2.36 log10f32x F
+GLIBC_2.36 log10f64 F
+GLIBC_2.36 log10f64x F
+GLIBC_2.36 log10l F
+GLIBC_2.36 log1p F
+GLIBC_2.36 log1pf F
+GLIBC_2.36 log1pf128 F
+GLIBC_2.36 log1pf32 F
+GLIBC_2.36 log1pf32x F
+GLIBC_2.36 log1pf64 F
+GLIBC_2.36 log1pf64x F
+GLIBC_2.36 log1pl F
+GLIBC_2.36 log2 F
+GLIBC_2.36 log2f F
+GLIBC_2.36 log2f128 F
+GLIBC_2.36 log2f32 F
+GLIBC_2.36 log2f32x F
+GLIBC_2.36 log2f64 F
+GLIBC_2.36 log2f64x F
+GLIBC_2.36 log2l F
+GLIBC_2.36 logb F
+GLIBC_2.36 logbf F
+GLIBC_2.36 logbf128 F
+GLIBC_2.36 logbf32 F
+GLIBC_2.36 logbf32x F
+GLIBC_2.36 logbf64 F
+GLIBC_2.36 logbf64x F
+GLIBC_2.36 logbl F
+GLIBC_2.36 logf F
+GLIBC_2.36 logf128 F
+GLIBC_2.36 logf32 F
+GLIBC_2.36 logf32x F
+GLIBC_2.36 logf64 F
+GLIBC_2.36 logf64x F
+GLIBC_2.36 logl F
+GLIBC_2.36 lrint F
+GLIBC_2.36 lrintf F
+GLIBC_2.36 lrintf128 F
+GLIBC_2.36 lrintf32 F
+GLIBC_2.36 lrintf32x F
+GLIBC_2.36 lrintf64 F
+GLIBC_2.36 lrintf64x F
+GLIBC_2.36 lrintl F
+GLIBC_2.36 lround F
+GLIBC_2.36 lroundf F
+GLIBC_2.36 lroundf128 F
+GLIBC_2.36 lroundf32 F
+GLIBC_2.36 lroundf32x F
+GLIBC_2.36 lroundf64 F
+GLIBC_2.36 lroundf64x F
+GLIBC_2.36 lroundl F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modff128 F
+GLIBC_2.36 modff32 F
+GLIBC_2.36 modff32x F
+GLIBC_2.36 modff64 F
+GLIBC_2.36 modff64x F
+GLIBC_2.36 modfl F
+GLIBC_2.36 nan F
+GLIBC_2.36 nanf F
+GLIBC_2.36 nanf128 F
+GLIBC_2.36 nanf32 F
+GLIBC_2.36 nanf32x F
+GLIBC_2.36 nanf64 F
+GLIBC_2.36 nanf64x F
+GLIBC_2.36 nanl F
+GLIBC_2.36 nearbyint F
+GLIBC_2.36 nearbyintf F
+GLIBC_2.36 nearbyintf128 F
+GLIBC_2.36 nearbyintf32 F
+GLIBC_2.36 nearbyintf32x F
+GLIBC_2.36 nearbyintf64 F
+GLIBC_2.36 nearbyintf64x F
+GLIBC_2.36 nearbyintl F
+GLIBC_2.36 nextafter F
+GLIBC_2.36 nextafterf F
+GLIBC_2.36 nextafterf128 F
+GLIBC_2.36 nextafterf32 F
+GLIBC_2.36 nextafterf32x F
+GLIBC_2.36 nextafterf64 F
+GLIBC_2.36 nextafterf64x F
+GLIBC_2.36 nextafterl F
+GLIBC_2.36 nextdown F
+GLIBC_2.36 nextdownf F
+GLIBC_2.36 nextdownf128 F
+GLIBC_2.36 nextdownf32 F
+GLIBC_2.36 nextdownf32x F
+GLIBC_2.36 nextdownf64 F
+GLIBC_2.36 nextdownf64x F
+GLIBC_2.36 nextdownl F
+GLIBC_2.36 nexttoward F
+GLIBC_2.36 nexttowardf F
+GLIBC_2.36 nexttowardl F
+GLIBC_2.36 nextup F
+GLIBC_2.36 nextupf F
+GLIBC_2.36 nextupf128 F
+GLIBC_2.36 nextupf32 F
+GLIBC_2.36 nextupf32x F
+GLIBC_2.36 nextupf64 F
+GLIBC_2.36 nextupf64x F
+GLIBC_2.36 nextupl F
+GLIBC_2.36 pow F
+GLIBC_2.36 powf F
+GLIBC_2.36 powf128 F
+GLIBC_2.36 powf32 F
+GLIBC_2.36 powf32x F
+GLIBC_2.36 powf64 F
+GLIBC_2.36 powf64x F
+GLIBC_2.36 powl F
+GLIBC_2.36 remainder F
+GLIBC_2.36 remainderf F
+GLIBC_2.36 remainderf128 F
+GLIBC_2.36 remainderf32 F
+GLIBC_2.36 remainderf32x F
+GLIBC_2.36 remainderf64 F
+GLIBC_2.36 remainderf64x F
+GLIBC_2.36 remainderl F
+GLIBC_2.36 remquo F
+GLIBC_2.36 remquof F
+GLIBC_2.36 remquof128 F
+GLIBC_2.36 remquof32 F
+GLIBC_2.36 remquof32x F
+GLIBC_2.36 remquof64 F
+GLIBC_2.36 remquof64x F
+GLIBC_2.36 remquol F
+GLIBC_2.36 rint F
+GLIBC_2.36 rintf F
+GLIBC_2.36 rintf128 F
+GLIBC_2.36 rintf32 F
+GLIBC_2.36 rintf32x F
+GLIBC_2.36 rintf64 F
+GLIBC_2.36 rintf64x F
+GLIBC_2.36 rintl F
+GLIBC_2.36 round F
+GLIBC_2.36 roundeven F
+GLIBC_2.36 roundevenf F
+GLIBC_2.36 roundevenf128 F
+GLIBC_2.36 roundevenf32 F
+GLIBC_2.36 roundevenf32x F
+GLIBC_2.36 roundevenf64 F
+GLIBC_2.36 roundevenf64x F
+GLIBC_2.36 roundevenl F
+GLIBC_2.36 roundf F
+GLIBC_2.36 roundf128 F
+GLIBC_2.36 roundf32 F
+GLIBC_2.36 roundf32x F
+GLIBC_2.36 roundf64 F
+GLIBC_2.36 roundf64x F
+GLIBC_2.36 roundl F
+GLIBC_2.36 scalb F
+GLIBC_2.36 scalbf F
+GLIBC_2.36 scalbl F
+GLIBC_2.36 scalbln F
+GLIBC_2.36 scalblnf F
+GLIBC_2.36 scalblnf128 F
+GLIBC_2.36 scalblnf32 F
+GLIBC_2.36 scalblnf32x F
+GLIBC_2.36 scalblnf64 F
+GLIBC_2.36 scalblnf64x F
+GLIBC_2.36 scalblnl F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnf128 F
+GLIBC_2.36 scalbnf32 F
+GLIBC_2.36 scalbnf32x F
+GLIBC_2.36 scalbnf64 F
+GLIBC_2.36 scalbnf64x F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 setpayload F
+GLIBC_2.36 setpayloadf F
+GLIBC_2.36 setpayloadf128 F
+GLIBC_2.36 setpayloadf32 F
+GLIBC_2.36 setpayloadf32x F
+GLIBC_2.36 setpayloadf64 F
+GLIBC_2.36 setpayloadf64x F
+GLIBC_2.36 setpayloadl F
+GLIBC_2.36 setpayloadsig F
+GLIBC_2.36 setpayloadsigf F
+GLIBC_2.36 setpayloadsigf128 F
+GLIBC_2.36 setpayloadsigf32 F
+GLIBC_2.36 setpayloadsigf32x F
+GLIBC_2.36 setpayloadsigf64 F
+GLIBC_2.36 setpayloadsigf64x F
+GLIBC_2.36 setpayloadsigl F
+GLIBC_2.36 signgam D 0x4
+GLIBC_2.36 significand F
+GLIBC_2.36 significandf F
+GLIBC_2.36 significandl F
+GLIBC_2.36 sin F
+GLIBC_2.36 sincos F
+GLIBC_2.36 sincosf F
+GLIBC_2.36 sincosf128 F
+GLIBC_2.36 sincosf32 F
+GLIBC_2.36 sincosf32x F
+GLIBC_2.36 sincosf64 F
+GLIBC_2.36 sincosf64x F
+GLIBC_2.36 sincosl F
+GLIBC_2.36 sinf F
+GLIBC_2.36 sinf128 F
+GLIBC_2.36 sinf32 F
+GLIBC_2.36 sinf32x F
+GLIBC_2.36 sinf64 F
+GLIBC_2.36 sinf64x F
+GLIBC_2.36 sinh F
+GLIBC_2.36 sinhf F
+GLIBC_2.36 sinhf128 F
+GLIBC_2.36 sinhf32 F
+GLIBC_2.36 sinhf32x F
+GLIBC_2.36 sinhf64 F
+GLIBC_2.36 sinhf64x F
+GLIBC_2.36 sinhl F
+GLIBC_2.36 sinl F
+GLIBC_2.36 sqrt F
+GLIBC_2.36 sqrtf F
+GLIBC_2.36 sqrtf128 F
+GLIBC_2.36 sqrtf32 F
+GLIBC_2.36 sqrtf32x F
+GLIBC_2.36 sqrtf64 F
+GLIBC_2.36 sqrtf64x F
+GLIBC_2.36 sqrtl F
+GLIBC_2.36 tan F
+GLIBC_2.36 tanf F
+GLIBC_2.36 tanf128 F
+GLIBC_2.36 tanf32 F
+GLIBC_2.36 tanf32x F
+GLIBC_2.36 tanf64 F
+GLIBC_2.36 tanf64x F
+GLIBC_2.36 tanh F
+GLIBC_2.36 tanhf F
+GLIBC_2.36 tanhf128 F
+GLIBC_2.36 tanhf32 F
+GLIBC_2.36 tanhf32x F
+GLIBC_2.36 tanhf64 F
+GLIBC_2.36 tanhf64x F
+GLIBC_2.36 tanhl F
+GLIBC_2.36 tanl F
+GLIBC_2.36 tgamma F
+GLIBC_2.36 tgammaf F
+GLIBC_2.36 tgammaf128 F
+GLIBC_2.36 tgammaf32 F
+GLIBC_2.36 tgammaf32x F
+GLIBC_2.36 tgammaf64 F
+GLIBC_2.36 tgammaf64x F
+GLIBC_2.36 tgammal F
+GLIBC_2.36 totalorder F
+GLIBC_2.36 totalorderf F
+GLIBC_2.36 totalorderf128 F
+GLIBC_2.36 totalorderf32 F
+GLIBC_2.36 totalorderf32x F
+GLIBC_2.36 totalorderf64 F
+GLIBC_2.36 totalorderf64x F
+GLIBC_2.36 totalorderl F
+GLIBC_2.36 totalordermag F
+GLIBC_2.36 totalordermagf F
+GLIBC_2.36 totalordermagf128 F
+GLIBC_2.36 totalordermagf32 F
+GLIBC_2.36 totalordermagf32x F
+GLIBC_2.36 totalordermagf64 F
+GLIBC_2.36 totalordermagf64x F
+GLIBC_2.36 totalordermagl F
+GLIBC_2.36 trunc F
+GLIBC_2.36 truncf F
+GLIBC_2.36 truncf128 F
+GLIBC_2.36 truncf32 F
+GLIBC_2.36 truncf32x F
+GLIBC_2.36 truncf64 F
+GLIBC_2.36 truncf64x F
+GLIBC_2.36 truncl F
+GLIBC_2.36 ufromfp F
+GLIBC_2.36 ufromfpf F
+GLIBC_2.36 ufromfpf128 F
+GLIBC_2.36 ufromfpf32 F
+GLIBC_2.36 ufromfpf32x F
+GLIBC_2.36 ufromfpf64 F
+GLIBC_2.36 ufromfpf64x F
+GLIBC_2.36 ufromfpl F
+GLIBC_2.36 ufromfpx F
+GLIBC_2.36 ufromfpxf F
+GLIBC_2.36 ufromfpxf128 F
+GLIBC_2.36 ufromfpxf32 F
+GLIBC_2.36 ufromfpxf32x F
+GLIBC_2.36 ufromfpxf64 F
+GLIBC_2.36 ufromfpxf64x F
+GLIBC_2.36 ufromfpxl F
+GLIBC_2.36 y0 F
+GLIBC_2.36 y0f F
+GLIBC_2.36 y0f128 F
+GLIBC_2.36 y0f32 F
+GLIBC_2.36 y0f32x F
+GLIBC_2.36 y0f64 F
+GLIBC_2.36 y0f64x F
+GLIBC_2.36 y0l F
+GLIBC_2.36 y1 F
+GLIBC_2.36 y1f F
+GLIBC_2.36 y1f128 F
+GLIBC_2.36 y1f32 F
+GLIBC_2.36 y1f32x F
+GLIBC_2.36 y1f64 F
+GLIBC_2.36 y1f64x F
+GLIBC_2.36 y1l F
+GLIBC_2.36 yn F
+GLIBC_2.36 ynf F
+GLIBC_2.36 ynf128 F
+GLIBC_2.36 ynf32 F
+GLIBC_2.36 ynf32x F
+GLIBC_2.36 ynf64 F
+GLIBC_2.36 ynf64x F
+GLIBC_2.36 ynl F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
new file mode 100644
index 0000000000..c30f54c0bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
@@ -0,0 +1,55 @@
+GLIBC_2.36 __b64_ntop F
+GLIBC_2.36 __b64_pton F
+GLIBC_2.36 __dn_count_labels F
+GLIBC_2.36 __fp_nquery F
+GLIBC_2.36 __fp_query F
+GLIBC_2.36 __fp_resstat F
+GLIBC_2.36 __hostalias F
+GLIBC_2.36 __loc_aton F
+GLIBC_2.36 __loc_ntoa F
+GLIBC_2.36 __p_cdname F
+GLIBC_2.36 __p_cdnname F
+GLIBC_2.36 __p_class F
+GLIBC_2.36 __p_class_syms D 0xa8
+GLIBC_2.36 __p_fqname F
+GLIBC_2.36 __p_fqnname F
+GLIBC_2.36 __p_option F
+GLIBC_2.36 __p_query F
+GLIBC_2.36 __p_rcode F
+GLIBC_2.36 __p_time F
+GLIBC_2.36 __p_type F
+GLIBC_2.36 __p_type_syms D 0x450
+GLIBC_2.36 __putlong F
+GLIBC_2.36 __putshort F
+GLIBC_2.36 __res_close F
+GLIBC_2.36 __res_hostalias F
+GLIBC_2.36 __res_isourserver F
+GLIBC_2.36 __res_nameinquery F
+GLIBC_2.36 __res_queriesmatch F
+GLIBC_2.36 __sym_ntop F
+GLIBC_2.36 __sym_ntos F
+GLIBC_2.36 __sym_ston F
+GLIBC_2.36 _getlong F
+GLIBC_2.36 _getshort F
+GLIBC_2.36 inet_net_ntop F
+GLIBC_2.36 inet_net_pton F
+GLIBC_2.36 inet_neta F
+GLIBC_2.36 ns_datetosecs F
+GLIBC_2.36 ns_format_ttl F
+GLIBC_2.36 ns_get16 F
+GLIBC_2.36 ns_get32 F
+GLIBC_2.36 ns_initparse F
+GLIBC_2.36 ns_makecanon F
+GLIBC_2.36 ns_msg_getflag F
+GLIBC_2.36 ns_name_ntol F
+GLIBC_2.36 ns_name_rollback F
+GLIBC_2.36 ns_parse_ttl F
+GLIBC_2.36 ns_parserr F
+GLIBC_2.36 ns_put16 F
+GLIBC_2.36 ns_put32 F
+GLIBC_2.36 ns_samedomain F
+GLIBC_2.36 ns_samename F
+GLIBC_2.36 ns_skiprr F
+GLIBC_2.36 ns_sprintrr F
+GLIBC_2.36 ns_sprintrrf F
+GLIBC_2.36 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
new file mode 100644
index 0000000000..8658803d38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
@@ -0,0 +1,40 @@
+GLIBC_2.36 td_init F
+GLIBC_2.36 td_log F
+GLIBC_2.36 td_symbol_list F
+GLIBC_2.36 td_ta_clear_event F
+GLIBC_2.36 td_ta_delete F
+GLIBC_2.36 td_ta_enable_stats F
+GLIBC_2.36 td_ta_event_addr F
+GLIBC_2.36 td_ta_event_getmsg F
+GLIBC_2.36 td_ta_get_nthreads F
+GLIBC_2.36 td_ta_get_ph F
+GLIBC_2.36 td_ta_get_stats F
+GLIBC_2.36 td_ta_map_id2thr F
+GLIBC_2.36 td_ta_map_lwp2thr F
+GLIBC_2.36 td_ta_new F
+GLIBC_2.36 td_ta_reset_stats F
+GLIBC_2.36 td_ta_set_event F
+GLIBC_2.36 td_ta_setconcurrency F
+GLIBC_2.36 td_ta_thr_iter F
+GLIBC_2.36 td_ta_tsd_iter F
+GLIBC_2.36 td_thr_clear_event F
+GLIBC_2.36 td_thr_dbresume F
+GLIBC_2.36 td_thr_dbsuspend F
+GLIBC_2.36 td_thr_event_enable F
+GLIBC_2.36 td_thr_event_getmsg F
+GLIBC_2.36 td_thr_get_info F
+GLIBC_2.36 td_thr_getfpregs F
+GLIBC_2.36 td_thr_getgregs F
+GLIBC_2.36 td_thr_getxregs F
+GLIBC_2.36 td_thr_getxregsize F
+GLIBC_2.36 td_thr_set_event F
+GLIBC_2.36 td_thr_setfpregs F
+GLIBC_2.36 td_thr_setgregs F
+GLIBC_2.36 td_thr_setprio F
+GLIBC_2.36 td_thr_setsigpending F
+GLIBC_2.36 td_thr_setxregs F
+GLIBC_2.36 td_thr_sigsetmask F
+GLIBC_2.36 td_thr_tls_get_addr F
+GLIBC_2.36 td_thr_tlsbase F
+GLIBC_2.36 td_thr_tsd F
+GLIBC_2.36 td_thr_validate F
-- 
2.31.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 10/13] LoongArch: Build Infastructure
  2022-07-19  1:22 [PATCH v7 09/13] LoongArch: Add ABI Lists caiyinyu
@ 2022-07-19  1:22 ` caiyinyu
  2022-07-20 17:14   ` Adhemerval Zanella Netto
  2022-07-19  1:22 ` [PATCH v7 11/13] LoongArch: Hard Float Support caiyinyu
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: caiyinyu @ 2022-07-19  1:22 UTC (permalink / raw)
  To: adhemerval.zanella, libc-alpha, joseph_myers, carlos, i.swmail; +Cc: caiyinyu

---
 sysdeps/loongarch/Implies                     |   3 +
 sysdeps/loongarch/Makefile                    |  15 ++
 sysdeps/loongarch/configure                   |   5 +
 sysdeps/loongarch/configure.ac                |   6 +
 sysdeps/loongarch/lp64/Implies-after          |   1 +
 sysdeps/loongarch/preconfigure                |  53 ++++++
 sysdeps/loongarch/preconfigure.ac             |  47 +++++
 sysdeps/loongarch/sys/regdef.h                |  93 ++++++++++
 sysdeps/unix/sysv/linux/loongarch/Implies     |   1 +
 sysdeps/unix/sysv/linux/loongarch/Makefile    |   4 +
 sysdeps/unix/sysv/linux/loongarch/configure   | 174 ++++++++++++++++++
 .../unix/sysv/linux/loongarch/configure.ac    |  22 +++
 .../unix/sysv/linux/loongarch/ldd-rewrite.sed |   1 +
 .../unix/sysv/linux/loongarch/lp64/Implies    |   3 +
 .../unix/sysv/linux/loongarch/shlib-versions  |   7 +
 15 files changed, 435 insertions(+)
 create mode 100644 sysdeps/loongarch/Implies
 create mode 100644 sysdeps/loongarch/Makefile
 create mode 100644 sysdeps/loongarch/configure
 create mode 100644 sysdeps/loongarch/configure.ac
 create mode 100644 sysdeps/loongarch/lp64/Implies-after
 create mode 100644 sysdeps/loongarch/preconfigure
 create mode 100644 sysdeps/loongarch/preconfigure.ac
 create mode 100644 sysdeps/loongarch/sys/regdef.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions

diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies
new file mode 100644
index 0000000000..1945b1f4bb
--- /dev/null
+++ b/sysdeps/loongarch/Implies
@@ -0,0 +1,3 @@
+ieee754/ldbl-128
+ieee754/dbl-64
+ieee754/flt-32
diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
new file mode 100644
index 0000000000..41c3449670
--- /dev/null
+++ b/sysdeps/loongarch/Makefile
@@ -0,0 +1,15 @@
+ifeq ($(subdir),misc)
+sysdep_headers += sys/asm.h
+endif
+
+# LoongArch's assembler also needs to know about PIC as it changes the
+# definition of some assembler macros.
+ASFLAGS-.os += $(pic-ccflag)
+
+abi-variants := lp64
+
+ifeq (,$(filter $(default-abi),$(abi-variants)))
+$(error Unknown ABI $(default-abi), must be one of $(abi-variants))
+endif
+
+abi-lp64-condition    := defined __loongarch_lp64
diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
new file mode 100644
index 0000000000..43b54d4965
--- /dev/null
+++ b/sysdeps/loongarch/configure
@@ -0,0 +1,5 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/loongarch/elf.
+
+$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
+
diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
new file mode 100644
index 0000000000..f744367bf3
--- /dev/null
+++ b/sysdeps/loongarch/configure.ac
@@ -0,0 +1,6 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/loongarch/elf.
+
+dnl It is always possible to access static and hidden symbols in an
+dnl position independent way.
+AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after
new file mode 100644
index 0000000000..a8cae95f9d
--- /dev/null
+++ b/sysdeps/loongarch/lp64/Implies-after
@@ -0,0 +1 @@
+wordsize-64
diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure
new file mode 100644
index 0000000000..118963cda6
--- /dev/null
+++ b/sysdeps/loongarch/preconfigure
@@ -0,0 +1,53 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+# Local preconfigure fragment for sysdeps/loongarch
+
+case "$machine" in
+loongarch*)
+
+    abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'`
+    float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'`
+
+    with_fp_cond="!defined __loongarch_soft_float"
+
+    case "$float_abi" in
+    soft)
+	abi_flen=0
+	as_fn_error 1 "loongarch does not yet support soft floating-point  ABI!!" "$LINENO" 5
+	;;
+    single)
+	as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5
+	;;
+    double)
+	abi_flen=64
+	;;
+    *)
+	as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5
+	;;
+    esac
+
+    case "$abi" in
+    ilp32)
+	as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5
+	;;
+    lp64)
+	grlen=64
+	machine=loongarch/lp64
+	;;
+    *)
+	as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5
+	;;
+    esac
+
+    cat >>confdefs.h <<_ACEOF
+#define LOONGARCH_ABI_GRLEN $grlen
+_ACEOF
+
+    cat >>confdefs.h <<_ACEOF
+#define LOONGARCH_ABI_FRLEN $abi_flen
+_ACEOF
+
+
+    base_machine=loongarch
+    ;;
+esac
+
diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac
new file mode 100644
index 0000000000..1aba743c15
--- /dev/null
+++ b/sysdeps/loongarch/preconfigure.ac
@@ -0,0 +1,47 @@
+GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory.
+# Local preconfigure fragment for sysdeps/loongarch
+
+case "$machine" in
+loongarch*)
+
+    abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'`
+    float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'`
+
+    with_fp_cond="!defined __loongarch_soft_float"
+
+    case "$float_abi" in
+    soft)
+	abi_flen=0
+	AC_MSG_ERROR([loongarch does not yet support soft floating-point  ABI!!], 1)
+	;;
+    single)
+	AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1)
+	;;
+    double)
+	abi_flen=64
+	;;
+    *)
+	AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1)
+	;;
+    esac
+
+    case "$abi" in
+    ilp32)
+	AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1)
+	;;
+    lp64)
+	grlen=64
+	machine=loongarch/lp64
+	;;
+    *)
+	AC_MSG_ERROR([Unable to determine GRLEN!!], 1)
+	;;
+    esac
+
+    AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen])
+    AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen])
+
+    base_machine=loongarch
+    ;;
+esac
+
diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h
new file mode 100644
index 0000000000..d266df372d
--- /dev/null
+++ b/sysdeps/loongarch/sys/regdef.h
@@ -0,0 +1,93 @@
+/* Register Macro definitions
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_REGDEF_H
+#define _SYS_REGDEF_H
+
+#define zero $r0
+#define ra $r1
+#define tp $r2
+#define sp $r3
+#define a0 $r4
+#define a1 $r5
+#define a2 $r6
+#define a3 $r7
+#define a4 $r8
+#define a5 $r9
+#define a6 $r10
+#define a7 $r11
+#define v0 $r4
+#define v1 $r5
+#define t0 $r12
+#define t1 $r13
+#define t2 $r14
+#define t3 $r15
+#define t4 $r16
+#define t5 $r17
+#define t6 $r18
+#define t7 $r19
+#define t8 $r20
+#define x $r21
+#define fp $r22
+#define s0 $r23
+#define s1 $r24
+#define s2 $r25
+#define s3 $r26
+#define s4 $r27
+#define s5 $r28
+#define s6 $r29
+#define s7 $r30
+#define s8 $r31
+
+#define fa0 $f0
+#define fa1 $f1
+#define fa2 $f2
+#define fa3 $f3
+#define fa4 $f4
+#define fa5 $f5
+#define fa6 $f6
+#define fa7 $f7
+#define fv0 $f0
+#define fv1 $f1
+#define ft0 $f8
+#define ft1 $f9
+#define ft2 $f10
+#define ft3 $f11
+#define ft4 $f12
+#define ft5 $f13
+#define ft6 $f14
+#define ft7 $f15
+#define ft8 $f16
+#define ft9 $f17
+#define ft10 $f18
+#define ft11 $f19
+#define ft12 $f20
+#define ft13 $f21
+#define ft14 $f22
+#define ft15 $f23
+#define fs0 $f24
+#define fs1 $f25
+#define fs2 $f26
+#define fs3 $f27
+#define fs4 $f28
+#define fs5 $f29
+#define fs6 $f30
+#define fs7 $f31
+
+#endif /* _SYS_REGDEF_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies
new file mode 100644
index 0000000000..e52b1ac310
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/Implies
@@ -0,0 +1 @@
+loongarch/nptl
diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile
new file mode 100644
index 0000000000..730bfa7465
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),stdlib)
+gen-as-const-headers += ucontext_i.sym
+endif
+
diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure
new file mode 100644
index 0000000000..60a410303e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/configure
@@ -0,0 +1,174 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
+
+arch_minimum_kernel=5.19.0
+
+libc_cv_loongarch_int_abi=no
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "4 8 8" >/dev/null 2>&1; then :
+  libc_cv_loongarch_int_abi=lp64
+fi
+rm -f conftest*
+
+if test $libc_cv_loongarch_int_abi = no; then
+  as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5
+fi
+
+config_vars="$config_vars
+default-abi = $libc_cv_loongarch_int_abi"
+
+case $libc_cv_loongarch_int_abi in
+lp64)
+  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib64'
+  libc_cv_rtlddir='/lib64'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib64';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+  ;;
+esac
+
+ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac
new file mode 100644
index 0000000000..7de1e95ff6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac
@@ -0,0 +1,22 @@
+sinclude(./aclocal.m4)dnl Autoconf lossage
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
+
+arch_minimum_kernel=5.19.0
+
+libc_cv_loongarch_int_abi=no
+AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
+  ], libc_cv_loongarch_int_abi=lp64)
+if test $libc_cv_loongarch_int_abi = no; then
+  AC_MSG_ERROR([Unable to determine integer ABI])
+fi
+
+LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi])
+
+case $libc_cv_loongarch_int_abi in
+lp64)
+  LIBC_SLIBDIR_RTLDDIR([lib64], [lib64])
+  ;;
+esac
+
+ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
new file mode 100644
index 0000000000..f8976fd239
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
@@ -0,0 +1 @@
+s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies
new file mode 100644
index 0000000000..117c2b8efe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies
@@ -0,0 +1,3 @@
+unix/sysv/linux/loongarch
+unix/sysv/linux/generic
+unix/sysv/linux/wordsize-64
diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
new file mode 100644
index 0000000000..dc2220b4be
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
@@ -0,0 +1,7 @@
+DEFAULT		GLIBC_2.36
+
+%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64
+ld=ld-linux-loongarch-lp64d.so.1
+%else
+%error cannot determine ABI
+%endif
-- 
2.31.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 11/13] LoongArch: Hard Float Support
  2022-07-19  1:22 [PATCH v7 09/13] LoongArch: Add ABI Lists caiyinyu
  2022-07-19  1:22 ` [PATCH v7 10/13] LoongArch: Build Infastructure caiyinyu
@ 2022-07-19  1:22 ` caiyinyu
  2022-07-21 21:03   ` Adhemerval Zanella Netto
  2022-07-19  1:22 ` [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
  2022-07-19  1:22 ` [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
  3 siblings, 1 reply; 9+ messages in thread
From: caiyinyu @ 2022-07-19  1:22 UTC (permalink / raw)
  To: adhemerval.zanella, libc-alpha, joseph_myers, carlos, i.swmail; +Cc: caiyinyu

---
 sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
 sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
 sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
 sysdeps/loongarch/fpu/fegetenv.c              |   31 +
 sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fegetmode.c             |   27 +
 sysdeps/loongarch/fpu/fegetround.c            |   33 +
 sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
 sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
 sysdeps/loongarch/fpu/fesetenv.c              |   42 +
 sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fesetmode.c             |   38 +
 sysdeps/loongarch/fpu/fesetround.c            |   44 +
 sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
 sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
 sysdeps/loongarch/fpu/fraiseexcpt.c           |   80 +
 sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
 sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
 .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
 sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
 sysdeps/loongarch/math_private.h              |  248 +++
 22 files changed, 2372 insertions(+)
 create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fegetround.c
 create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
 create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fesetround.c
 create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
 create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
 create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
 create mode 100644 sysdeps/loongarch/math_private.h

diff --git a/sysdeps/loongarch/fpu/fclrexcpt.c b/sysdeps/loongarch/fpu/fclrexcpt.c
new file mode 100644
index 0000000000..e9f33a1658
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fclrexcpt.c
@@ -0,0 +1,46 @@
+/* Clear given exceptions in current floating-point environment.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feclearexcept (int excepts)
+{
+  int cw;
+
+  /* Mask out unsupported bits/exceptions.  */
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Read the complete control word.  */
+  _FPU_GETCW (cw);
+
+  /* Clear exception flag bits and cause bits.  If the cause bit is not
+     cleared, the next CTC instruction (just below) will re-generate the
+     exception.  */
+
+  cw &= ~(excepts | (excepts << CAUSE_SHIFT));
+
+  /* Put the new data in effect.  */
+  _FPU_SETCW (cw);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (feclearexcept)
diff --git a/sysdeps/loongarch/fpu/fedisblxcpt.c b/sysdeps/loongarch/fpu/fedisblxcpt.c
new file mode 100644
index 0000000000..add62946fd
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fedisblxcpt.c
@@ -0,0 +1,39 @@
+/* Disable floating-point exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fedisableexcept (int excepts)
+{
+  unsigned int new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc &= ~(excepts >> ENABLE_SHIFT);
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/sysdeps/loongarch/fpu/feenablxcpt.c b/sysdeps/loongarch/fpu/feenablxcpt.c
new file mode 100644
index 0000000000..ed809341f6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feenablxcpt.c
@@ -0,0 +1,39 @@
+/* Enable floating-point exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feenableexcept (int excepts)
+{
+  unsigned int new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc |= excepts >> ENABLE_SHIFT;
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/sysdeps/loongarch/fpu/fegetenv.c b/sysdeps/loongarch/fpu/fegetenv.c
new file mode 100644
index 0000000000..5a2a3d34dc
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetenv.c
@@ -0,0 +1,31 @@
+/* Store current floating-point environment.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+  _FPU_GETCW (*envp);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (__fegetenv) weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
diff --git a/sysdeps/loongarch/fpu/fegetexcept.c b/sysdeps/loongarch/fpu/fegetexcept.c
new file mode 100644
index 0000000000..ba1c1466f4
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetexcept.c
@@ -0,0 +1,32 @@
+/* Get enabled floating-point exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fegetexcept (void)
+{
+  unsigned int exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (exc);
+
+  return (exc & ENABLE_MASK) << ENABLE_SHIFT;
+}
diff --git a/sysdeps/loongarch/fpu/fegetmode.c b/sysdeps/loongarch/fpu/fegetmode.c
new file mode 100644
index 0000000000..e3517e34f6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetmode.c
@@ -0,0 +1,27 @@
+/* Store current floating-point control modes.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetmode (femode_t *modep)
+{
+  _FPU_GETCW (*modep);
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fegetround.c b/sysdeps/loongarch/fpu/fegetround.c
new file mode 100644
index 0000000000..ff6113eb04
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetround.c
@@ -0,0 +1,33 @@
+/* Return current rounding direction.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetround (void)
+{
+  int cw;
+
+  /* Get control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & _FPU_RC_MASK;
+}
+libm_hidden_def (__fegetround) weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/loongarch/fpu/feholdexcpt.c b/sysdeps/loongarch/fpu/feholdexcpt.c
new file mode 100644
index 0000000000..e4f9f6a23b
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feholdexcpt.c
@@ -0,0 +1,40 @@
+/* Store current floating-point environment and clear exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__feholdexcept (fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I
+	  | FE_ALL_EXCEPT);
+  _FPU_SETCW (cw);
+
+  return 0;
+}
+
+libm_hidden_def (__feholdexcept) weak_alias (__feholdexcept, feholdexcept)
+libm_hidden_weak (feholdexcept)
diff --git a/sysdeps/loongarch/fpu/fenv_libc.h b/sysdeps/loongarch/fpu/fenv_libc.h
new file mode 100644
index 0000000000..8360ae0377
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fenv_libc.h
@@ -0,0 +1,30 @@
+/* Internal libc stuff for floating point environment routines.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H 1
+
+/* Mask for enabling exceptions and for the CAUSE bits.  */
+#define ENABLE_MASK 0x0000001FU
+#define CAUSE_MASK 0x1F000000U
+
+/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */
+#define ENABLE_SHIFT 16
+#define CAUSE_SHIFT 8
+
+#endif /* _FENV_LIBC_H */
diff --git a/sysdeps/loongarch/fpu/fesetenv.c b/sysdeps/loongarch/fpu/fesetenv.c
new file mode 100644
index 0000000000..c10bd11ef9
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetenv.c
@@ -0,0 +1,42 @@
+/* Install given floating-point environment.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Read first current state to flush fpu pipeline.  */
+  _FPU_GETCW (cw);
+
+  if (envp == FE_DFL_ENV)
+    _FPU_SETCW (_FPU_DEFAULT);
+  else if (envp == FE_NOMASK_ENV)
+    _FPU_SETCW (_FPU_IEEE);
+  else
+    _FPU_SETCW (envp->__fp_control_register);
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_def (__fesetenv) weak_alias (__fesetenv, fesetenv)
+libm_hidden_weak (fesetenv)
diff --git a/sysdeps/loongarch/fpu/fesetexcept.c b/sysdeps/loongarch/fpu/fesetexcept.c
new file mode 100644
index 0000000000..ad76d52d9e
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetexcept.c
@@ -0,0 +1,32 @@
+/* Set given exception flags.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t temp;
+
+  _FPU_GETCW (temp);
+  temp |= excepts & FE_ALL_EXCEPT;
+  _FPU_SETCW (temp);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fesetmode.c b/sysdeps/loongarch/fpu/fesetmode.c
new file mode 100644
index 0000000000..fc52fc114b
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetmode.c
@@ -0,0 +1,38 @@
+/* Install given floating-point control modes.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#define FCSR_STATUS 0x1f1f0000
+
+int
+fesetmode (const femode_t *modep)
+{
+  fpu_control_t cw;
+
+  _FPU_GETCW (cw);
+  cw &= FCSR_STATUS;
+  if (modep == FE_DFL_MODE)
+    cw |= _FPU_DEFAULT;
+  else
+    cw |= *modep & ~FCSR_STATUS;
+  _FPU_SETCW (cw);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fesetround.c b/sysdeps/loongarch/fpu/fesetround.c
new file mode 100644
index 0000000000..32acac5f96
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetround.c
@@ -0,0 +1,44 @@
+/* Set current rounding direction.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetround (int round)
+{
+  fpu_control_t cw;
+
+  if ((round & ~_FPU_RC_MASK) != 0)
+    /* ROUND is no valid rounding mode.  */
+    return 1;
+
+  /* Get current state.  */
+  _FPU_GETCW (cw);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+
+  return 0;
+}
+
+libm_hidden_def (__fesetround) weak_alias (__fesetround, fesetround)
+libm_hidden_weak (fesetround)
diff --git a/sysdeps/loongarch/fpu/feupdateenv.c b/sysdeps/loongarch/fpu/feupdateenv.c
new file mode 100644
index 0000000000..5ad862a61d
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feupdateenv.c
@@ -0,0 +1,43 @@
+/* Install given floating-point environment and raise exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__feupdateenv (const fenv_t *envp)
+{
+  int temp;
+
+  /* Save current exceptions.  */
+  _FPU_GETCW (temp);
+  temp &= FE_ALL_EXCEPT;
+
+  /* Install new environment.  */
+  __fesetenv (envp);
+
+  /* Raise the safed exception.  Incidently for us the implementation
+     defined format of the values in objects of type fexcept_t is the
+     same as the ones specified using the FE_* constants.  */
+  __feraiseexcept (temp);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (__feupdateenv) weak_alias (__feupdateenv, feupdateenv)
+libm_hidden_weak (feupdateenv)
diff --git a/sysdeps/loongarch/fpu/fgetexcptflg.c b/sysdeps/loongarch/fpu/fgetexcptflg.c
new file mode 100644
index 0000000000..6130c632c9
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fgetexcptflg.c
@@ -0,0 +1,38 @@
+/* Store current representation for exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+  fpu_control_t temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (temp);
+
+  /* We only save the relevant bits here.  In particular, care has to be
+     taken with the CAUSE bits, as an inadvertent restore later on could
+     generate unexpected exceptions.  */
+
+  *flagp = temp & excepts & FE_ALL_EXCEPT;
+
+  /* Success.  */
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fraiseexcpt.c b/sysdeps/loongarch/fpu/fraiseexcpt.c
new file mode 100644
index 0000000000..c1c612242f
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fraiseexcpt.c
@@ -0,0 +1,80 @@
+/* Raise given exceptions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <float.h>
+
+int
+__feraiseexcept (int excepts)
+{
+  const float fp_zero = 0.0f;
+  const float fp_one = 1.0f;
+  const float fp_max = FLT_MAX;
+  const float fp_min = FLT_MIN;
+  const float fp_1e32 = 1.0e32f;
+  const float fp_two = 2.0f;
+  const float fp_three = 3.0f;
+
+  /* Raise exceptions represented by EXPECTS.  But we must raise only
+     one signal at a time.  It is important that if the overflow/underflow
+     exception and the inexact exception are given at the same time,
+     the overflow/underflow exception follows the inexact exception.  */
+
+  /* First: invalid exception.  */
+  if (FE_INVALID & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%0\n\t"
+			 :
+			 : "f"(fp_zero)
+			 : "$f0");
+
+  /* Next: division by zero.  */
+  if (FE_DIVBYZERO & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_one), "f"(fp_zero)
+			 : "$f0");
+
+  /* Next: overflow.  */
+  if (FE_OVERFLOW & excepts)
+    /* There's no way to raise overflow without also raising inexact.  */
+    __asm__ __volatile__("fadd.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_max), "f"(fp_1e32)
+			 : "$f0");
+
+  /* Next: underflow.  */
+  if (FE_UNDERFLOW & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_min), "f"(fp_three)
+			 : "$f0");
+
+  /* Last: inexact.  */
+  if (FE_INEXACT & excepts)
+    __asm__ __volatile__("fdiv.s $f0, %0, %1\n\t"
+			 :
+			 : "f"(fp_two), "f"(fp_three)
+			 : "$f0");
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_def (__feraiseexcept) weak_alias (__feraiseexcept, feraiseexcept)
+libm_hidden_weak (feraiseexcept)
diff --git a/sysdeps/loongarch/fpu/fsetexcptflg.c b/sysdeps/loongarch/fpu/fsetexcptflg.c
new file mode 100644
index 0000000000..9c135a663d
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fsetexcptflg.c
@@ -0,0 +1,41 @@
+/* Set floating-point environment exception handling.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+  fpu_control_t temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (temp);
+
+  /* Make sure the flags we want restored are legal.  */
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Now clear the bits called for, and copy them in from flagp.  Note that
+     we ignore all non-flag bits from *flagp, so they don't matter.  */
+  temp = (temp & ~excepts) | (*flagp & excepts);
+
+  _FPU_SETCW (temp);
+
+  /* Success.  */
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/ftestexcept.c b/sysdeps/loongarch/fpu/ftestexcept.c
new file mode 100644
index 0000000000..b9563b7ae1
--- /dev/null
+++ b/sysdeps/loongarch/fpu/ftestexcept.c
@@ -0,0 +1,32 @@
+/* Test exception in current environment.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fetestexcept (int excepts)
+{
+  int cw;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+libm_hidden_def (fetestexcept)
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
new file mode 100644
index 0000000000..e94c915ba6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
@@ -0,0 +1,4 @@
+#define USE_SQRT_BUILTIN 1
+#define USE_SQRTF_BUILTIN 1
+#define USE_SQRTL_BUILTIN 0
+#define USE_SQRTF128_BUILTIN 0
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
new file mode 100644
index 0000000000..c711531eec
--- /dev/null
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -0,0 +1,1412 @@
+# Begin of automatic generation
+
+# Maximal error of functions:
+Function: "acos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_downward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_upward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acosh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "acosh_downward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "acosh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "acosh_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "asin":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "asin_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "asin_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "asin_upward":
+double: 2
+float: 1
+ldouble: 2
+
+Function: "asinh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "asinh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "asinh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "asinh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "atan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "atan2":
+float: 2
+ldouble: 2
+
+Function: "atan2_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atan2_towardzero":
+double: 1
+float: 2
+ldouble: 3
+
+Function: "atan2_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atan_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atan_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "atan_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atanh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "atanh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "atanh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "atanh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "cabs":
+double: 1
+ldouble: 1
+
+Function: "cabs_downward":
+double: 1
+ldouble: 1
+
+Function: "cabs_towardzero":
+double: 1
+ldouble: 1
+
+Function: "cabs_upward":
+double: 1
+ldouble: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cacos":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "cacos_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Real part of "cacos_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Real part of "cacos_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_upward":
+double: 5
+float: 7
+ldouble: 7
+
+Function: Real part of "cacosh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cacosh_downward":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "cacosh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: Real part of "cacosh_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "cacosh_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "cacosh_upward":
+double: 4
+float: 3
+ldouble: 6
+
+Function: Imaginary part of "cacosh_upward":
+double: 3
+float: 2
+ldouble: 4
+
+Function: "carg":
+float: 1
+ldouble: 2
+
+Function: "carg_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "carg_towardzero":
+double: 1
+float: 2
+ldouble: 3
+
+Function: "carg_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "casin":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "casin":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "casin_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "casin_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Real part of "casin_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "casin_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Real part of "casin_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "casin_upward":
+double: 5
+float: 7
+ldouble: 7
+
+Function: Real part of "casinh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "casinh":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "casinh_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Imaginary part of "casinh_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "casinh_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "casinh_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: Real part of "casinh_upward":
+double: 5
+float: 7
+ldouble: 7
+
+Function: Imaginary part of "casinh_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "catan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "catan_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catan_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "catan_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catan_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "catan_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "catan_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "catanh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "catanh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "catanh_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catanh_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "catanh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catanh_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "catanh_upward":
+double: 4
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "catanh_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cbrt":
+double: 4
+float: 1
+ldouble: 1
+
+Function: "cbrt_downward":
+double: 4
+float: 1
+ldouble: 1
+
+Function: "cbrt_towardzero":
+double: 3
+float: 1
+ldouble: 1
+
+Function: "cbrt_upward":
+double: 5
+float: 1
+ldouble: 1
+
+Function: Real part of "ccos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "ccos_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "ccos_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccos_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "ccos_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccos_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ccos_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "ccosh_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "ccosh_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccosh_towardzero":
+double: 2
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "ccosh_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccosh_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ccosh_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "cexp":
+double: 2
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "cexp":
+double: 1
+float: 2
+ldouble: 1
+
+Function: Real part of "cexp_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cexp_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "cexp_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cexp_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "cexp_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cexp_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "clog":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "clog":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "clog10":
+double: 3
+float: 4
+ldouble: 2
+
+Function: Imaginary part of "clog10":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "clog10_downward":
+double: 5
+float: 5
+ldouble: 3
+
+Function: Imaginary part of "clog10_downward":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog10_towardzero":
+double: 5
+float: 6
+ldouble: 4
+
+Function: Imaginary part of "clog10_towardzero":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog10_upward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "clog10_upward":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog_downward":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Imaginary part of "clog_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "clog_towardzero":
+double: 4
+float: 4
+ldouble: 3
+
+Function: Imaginary part of "clog_towardzero":
+double: 1
+float: 3
+ldouble: 2
+
+Function: Real part of "clog_upward":
+double: 4
+float: 3
+ldouble: 4
+
+Function: Imaginary part of "clog_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "cos":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cos_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "cos_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "cos_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cosh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "cosh_downward":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "cosh_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "cosh_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "cpow":
+double: 2
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "cpow":
+float: 2
+ldouble: 1
+
+Function: Real part of "cpow_downward":
+double: 5
+float: 8
+ldouble: 6
+
+Function: Imaginary part of "cpow_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cpow_towardzero":
+double: 5
+float: 8
+ldouble: 6
+
+Function: Imaginary part of "cpow_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cpow_upward":
+double: 4
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "cpow_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "csin":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "csin":
+ldouble: 1
+
+Function: Real part of "csin_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "csin_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "csin_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "csin_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "csin_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csin_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Real part of "csinh":
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "csinh_downward":
+double: 2
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "csinh_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "csinh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csinh_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "csinh_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "csinh_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "csqrt":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csqrt":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "csqrt_downward":
+double: 5
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "csqrt_downward":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Real part of "csqrt_towardzero":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Imaginary part of "csqrt_towardzero":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Real part of "csqrt_upward":
+double: 5
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "csqrt_upward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: Real part of "ctan":
+double: 2
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "ctan":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "ctan_downward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "ctan_downward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctan_towardzero":
+double: 5
+float: 3
+ldouble: 4
+
+Function: Imaginary part of "ctan_towardzero":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctan_upward":
+double: 2
+float: 4
+ldouble: 5
+
+Function: Imaginary part of "ctan_upward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctanh":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "ctanh_downward":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_downward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Real part of "ctanh_towardzero":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_towardzero":
+double: 5
+float: 3
+ldouble: 3
+
+Function: Real part of "ctanh_upward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_upward":
+double: 2
+float: 3
+ldouble: 5
+
+Function: "erf":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "erf_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "erf_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "erf_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "erfc":
+double: 5
+float: 3
+ldouble: 4
+
+Function: "erfc_downward":
+double: 5
+float: 6
+ldouble: 5
+
+Function: "erfc_towardzero":
+double: 3
+float: 4
+ldouble: 4
+
+Function: "erfc_upward":
+double: 5
+float: 6
+ldouble: 5
+
+Function: "exp":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "exp10":
+double: 2
+ldouble: 2
+
+Function: "exp10_downward":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "exp10_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "exp10_upward":
+double: 2
+float: 1
+ldouble: 3
+
+Function: "exp2":
+double: 1
+ldouble: 1
+
+Function: "exp2_downward":
+double: 1
+ldouble: 1
+
+Function: "exp2_towardzero":
+double: 1
+ldouble: 1
+
+Function: "exp2_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "exp_downward":
+double: 1
+float: 1
+
+Function: "exp_towardzero":
+double: 1
+float: 1
+
+Function: "exp_upward":
+double: 1
+float: 1
+
+Function: "expm1":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "expm1_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "expm1_towardzero":
+double: 1
+float: 2
+ldouble: 4
+
+Function: "expm1_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "gamma":
+double: 4
+float: 7
+ldouble: 5
+
+Function: "gamma_downward":
+double: 5
+float: 7
+ldouble: 8
+
+Function: "gamma_towardzero":
+double: 5
+float: 6
+ldouble: 5
+
+Function: "gamma_upward":
+double: 5
+float: 6
+ldouble: 8
+
+Function: "hypot":
+double: 1
+ldouble: 1
+
+Function: "hypot_downward":
+double: 1
+ldouble: 1
+
+Function: "hypot_towardzero":
+double: 1
+ldouble: 1
+
+Function: "hypot_upward":
+double: 1
+ldouble: 1
+
+Function: "j0":
+double: 3
+float: 9
+ldouble: 2
+
+Function: "j0_downward":
+double: 6
+float: 9
+ldouble: 9
+
+Function: "j0_towardzero":
+double: 7
+float: 9
+ldouble: 9
+
+Function: "j0_upward":
+double: 9
+float: 9
+ldouble: 7
+
+Function: "j1":
+double: 4
+float: 9
+ldouble: 4
+
+Function: "j1_downward":
+double: 5
+float: 8
+ldouble: 4
+
+Function: "j1_towardzero":
+double: 4
+float: 8
+ldouble: 4
+
+Function: "j1_upward":
+double: 9
+float: 9
+ldouble: 3
+
+Function: "jn":
+double: 4
+float: 4
+ldouble: 7
+
+Function: "jn_downward":
+double: 5
+float: 5
+ldouble: 8
+
+Function: "jn_towardzero":
+double: 5
+float: 5
+ldouble: 8
+
+Function: "jn_upward":
+double: 5
+float: 4
+ldouble: 7
+
+Function: "lgamma":
+double: 4
+float: 7
+ldouble: 5
+
+Function: "lgamma_downward":
+double: 5
+float: 7
+ldouble: 8
+
+Function: "lgamma_towardzero":
+double: 5
+float: 6
+ldouble: 5
+
+Function: "lgamma_upward":
+double: 5
+float: 6
+ldouble: 8
+
+Function: "log":
+double: 1
+ldouble: 1
+
+Function: "log10":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "log10_downward":
+double: 2
+float: 3
+ldouble: 1
+
+Function: "log10_towardzero":
+double: 2
+float: 1
+ldouble: 1
+
+Function: "log10_upward":
+double: 2
+float: 2
+ldouble: 1
+
+Function: "log1p":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "log1p_downward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "log1p_towardzero":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "log1p_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "log2":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "log2_downward":
+double: 3
+ldouble: 3
+
+Function: "log2_towardzero":
+double: 2
+ldouble: 1
+
+Function: "log2_upward":
+double: 3
+ldouble: 1
+
+Function: "log_downward":
+ldouble: 1
+
+Function: "log_towardzero":
+ldouble: 2
+
+Function: "log_upward":
+double: 1
+ldouble: 2
+
+Function: "pow":
+double: 1
+ldouble: 2
+
+Function: "pow_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "pow_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "pow_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sin_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sincos":
+double: 1
+ldouble: 1
+
+Function: "sincos_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sincos_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sincos_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sinh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "sinh_downward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: "sinh_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: "sinh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "tan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tan_downward":
+double: 1
+float: 2
+ldouble: 1
+
+Function: "tan_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tan_upward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tanh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "tanh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "tanh_towardzero":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "tanh_upward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: "tgamma":
+double: 9
+float: 8
+ldouble: 4
+
+Function: "tgamma_downward":
+double: 9
+float: 7
+ldouble: 5
+
+Function: "tgamma_towardzero":
+double: 9
+float: 7
+ldouble: 5
+
+Function: "tgamma_upward":
+double: 9
+float: 8
+ldouble: 4
+
+Function: "y0":
+double: 3
+float: 9
+ldouble: 3
+
+Function: "y0_downward":
+double: 3
+float: 9
+ldouble: 7
+
+Function: "y0_towardzero":
+double: 4
+float: 9
+ldouble: 3
+
+Function: "y0_upward":
+double: 3
+float: 9
+ldouble: 4
+
+Function: "y1":
+double: 3
+float: 9
+ldouble: 5
+
+Function: "y1_downward":
+double: 6
+float: 9
+ldouble: 5
+
+Function: "y1_towardzero":
+double: 3
+float: 9
+ldouble: 2
+
+Function: "y1_upward":
+double: 7
+float: 9
+ldouble: 5
+
+Function: "yn":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "yn_downward":
+double: 3
+float: 4
+ldouble: 5
+
+Function: "yn_towardzero":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "yn_upward":
+double: 4
+float: 5
+ldouble: 5
+
+# end of automatic generation
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps-name b/sysdeps/loongarch/lp64/libm-test-ulps-name
new file mode 100644
index 0000000000..ce02281eab
--- /dev/null
+++ b/sysdeps/loongarch/lp64/libm-test-ulps-name
@@ -0,0 +1 @@
+LoongArch 64-bit
diff --git a/sysdeps/loongarch/math_private.h b/sysdeps/loongarch/math_private.h
new file mode 100644
index 0000000000..cdf26a78dd
--- /dev/null
+++ b/sysdeps/loongarch/math_private.h
@@ -0,0 +1,248 @@
+/* Internal math stuff.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef LOONGARCH_MATH_PRIVATE_H
+#define LOONGARCH_MATH_PRIVATE_H 1
+
+/* Inline functions to speed up the math library implementation.  The
+   default versions of these routines are in generic/math_private.h
+   and call fesetround, feholdexcept, etc.  These routines use inlined
+   code instead.  */
+
+#ifdef __loongarch_hard_float
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+#define _FPU_MASK_ALL \
+  (_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I \
+   | FE_ALL_EXCEPT)
+
+static __always_inline void
+libc_feholdexcept_loongarch (fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_ALL);
+  _FPU_SETCW (cw);
+}
+#define libc_feholdexcept libc_feholdexcept_loongarch
+#define libc_feholdexceptf libc_feholdexcept_loongarch
+#define libc_feholdexceptl libc_feholdexcept_loongarch
+
+static __always_inline void
+libc_fesetround_loongarch (int round)
+{
+  fpu_control_t cw;
+
+  /* Get current state.  */
+  _FPU_GETCW (cw);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+}
+#define libc_fesetround libc_fesetround_loongarch
+#define libc_fesetroundf libc_fesetround_loongarch
+#define libc_fesetroundl libc_fesetround_loongarch
+
+static __always_inline void
+libc_feholdexcept_setround_loongarch (fenv_t *envp, int round)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_ALL);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+}
+#define libc_feholdexcept_setround libc_feholdexcept_setround_loongarch
+#define libc_feholdexcept_setroundf libc_feholdexcept_setround_loongarch
+#define libc_feholdexcept_setroundl libc_feholdexcept_setround_loongarch
+
+#define libc_feholdsetround libc_feholdexcept_setround_loongarch
+#define libc_feholdsetroundf libc_feholdexcept_setround_loongarch
+#define libc_feholdsetroundl libc_feholdexcept_setround_loongarch
+
+static __always_inline void
+libc_fesetenv_loongarch (fenv_t *envp)
+{
+  fpu_control_t cw __attribute__ ((unused));
+
+  /* Read current state to flush fpu pipeline.  */
+  _FPU_GETCW (cw);
+
+  _FPU_SETCW (envp->__fp_control_register);
+}
+#define libc_fesetenv libc_fesetenv_loongarch
+#define libc_fesetenvf libc_fesetenv_loongarch
+#define libc_fesetenvl libc_fesetenv_loongarch
+
+static __always_inline int
+libc_feupdateenv_test_loongarch (fenv_t *envp, int excepts)
+{
+  /* int ret = fetestexcept (excepts); feupdateenv (envp); return ret; */
+  int cw, temp;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  /* Set flag bits (which are accumulative), and *also* set the
+     cause bits.  The setting of the cause bits is what actually causes
+     the hardware to generate the exception, if the corresponding enable
+     bit is set as well.  */
+  temp = cw & FE_ALL_EXCEPT;
+  temp |= envp->__fp_control_register | (temp << CAUSE_SHIFT);
+
+  /* Set new state.  */
+  _FPU_SETCW (temp);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+#define libc_feupdateenv_test libc_feupdateenv_test_loongarch
+#define libc_feupdateenv_testf libc_feupdateenv_test_loongarch
+#define libc_feupdateenv_testl libc_feupdateenv_test_loongarch
+
+static __always_inline void
+libc_feupdateenv_loongarch (fenv_t *envp)
+{
+  libc_feupdateenv_test_loongarch (envp, 0);
+}
+#define libc_feupdateenv libc_feupdateenv_loongarch
+#define libc_feupdateenvf libc_feupdateenv_loongarch
+#define libc_feupdateenvl libc_feupdateenv_loongarch
+
+#define libc_feresetround libc_feupdateenv_loongarch
+#define libc_feresetroundf libc_feupdateenv_loongarch
+#define libc_feresetroundl libc_feupdateenv_loongarch
+
+static __always_inline int
+libc_fetestexcept_loongarch (int excepts)
+{
+  int cw;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+#define libc_fetestexcept libc_fetestexcept_loongarch
+#define libc_fetestexceptf libc_fetestexcept_loongarch
+#define libc_fetestexceptl libc_fetestexcept_loongarch
+
+/*  Enable support for rounding mode context.  */
+#define HAVE_RM_CTX 1
+
+static __always_inline void
+libc_feholdexcept_setround_loongarch_ctx (struct rm_ctx *ctx, int round)
+{
+  fpu_control_t old, new;
+
+  /* Save the current state.  */
+  _FPU_GETCW (old);
+  ctx->env.__fp_control_register = old;
+
+  /* Clear all exception enable bits and flags.  */
+  new = old & ~(_FPU_MASK_ALL);
+
+  /* Set rounding bits.  */
+  new = (new & ~_FPU_RC_MASK) | round;
+
+  if (__glibc_unlikely (new != old))
+    {
+      _FPU_SETCW (new);
+      ctx->updated_status = true;
+    }
+  else
+    ctx->updated_status = false;
+}
+#define libc_feholdexcept_setround_ctx libc_feholdexcept_setround_loongarch_ctx
+#define libc_feholdexcept_setroundf_ctx \
+  libc_feholdexcept_setround_loongarch_ctx
+#define libc_feholdexcept_setroundl_ctx \
+  libc_feholdexcept_setround_loongarch_ctx
+
+static __always_inline void
+libc_fesetenv_loongarch_ctx (struct rm_ctx *ctx)
+{
+  libc_fesetenv_loongarch (&ctx->env);
+}
+#define libc_fesetenv_ctx libc_fesetenv_loongarch_ctx
+#define libc_fesetenvf_ctx libc_fesetenv_loongarch_ctx
+#define libc_fesetenvl_ctx libc_fesetenv_loongarch_ctx
+
+static __always_inline void
+libc_feupdateenv_loongarch_ctx (struct rm_ctx *ctx)
+{
+  if (__glibc_unlikely (ctx->updated_status))
+    libc_feupdateenv_test_loongarch (&ctx->env, 0);
+}
+#define libc_feupdateenv_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feupdateenvf_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feupdateenvl_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetround_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetroundf_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetroundl_ctx libc_feupdateenv_loongarch_ctx
+
+static __always_inline void
+libc_feholdsetround_loongarch_ctx (struct rm_ctx *ctx, int round)
+{
+  fpu_control_t old, new;
+
+  /* Save the current state.  */
+  _FPU_GETCW (old);
+  ctx->env.__fp_control_register = old;
+
+  /* Set rounding bits.  */
+  new = (old & ~_FPU_RC_MASK) | round;
+
+  if (__glibc_unlikely (new != old))
+    {
+      _FPU_SETCW (new);
+      ctx->updated_status = true;
+    }
+  else
+    ctx->updated_status = false;
+}
+#define libc_feholdsetround_ctx libc_feholdsetround_loongarch_ctx
+#define libc_feholdsetroundf_ctx libc_feholdsetround_loongarch_ctx
+#define libc_feholdsetroundl_ctx libc_feholdsetround_loongarch_ctx
+
+#endif
+
+#include_next <math_private.h>
+
+#endif
-- 
2.31.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port.
  2022-07-19  1:22 [PATCH v7 09/13] LoongArch: Add ABI Lists caiyinyu
  2022-07-19  1:22 ` [PATCH v7 10/13] LoongArch: Build Infastructure caiyinyu
  2022-07-19  1:22 ` [PATCH v7 11/13] LoongArch: Hard Float Support caiyinyu
@ 2022-07-19  1:22 ` caiyinyu
  2022-07-20 17:16   ` Adhemerval Zanella Netto
  2022-07-19  1:22 ` [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
  3 siblings, 1 reply; 9+ messages in thread
From: caiyinyu @ 2022-07-19  1:22 UTC (permalink / raw)
  To: adhemerval.zanella, libc-alpha, joseph_myers, carlos, i.swmail; +Cc: caiyinyu

---
 scripts/build-many-glibcs.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
index cc058e115c..da9b905900 100755
--- a/scripts/build-many-glibcs.py
+++ b/scripts/build-many-glibcs.py
@@ -218,6 +218,10 @@ class Context(object):
                         os_name='linux-gnu',
                         first_gcc_cfg=['--with-system-libunwind'],
                         binutils_cfg=['--enable-obsolete'])
+        self.add_config(arch='loongarch64',
+                        os_name='linux-gnu',
+                        variant='lp64d',
+                        gcc_cfg=['--with-abi=lp64d','--disable-multilib'])
         self.add_config(arch='m68k',
                         os_name='linux-gnu',
                         gcc_cfg=['--disable-multilib'])
@@ -1271,6 +1275,7 @@ def install_linux_headers(policy, cmdlist):
                 'i686': 'x86',
                 'i786': 'x86',
                 'ia64': 'ia64',
+                'loongarch64': 'loongarch',
                 'm68k': 'm68k',
                 'microblaze': 'microblaze',
                 'mips': 'mips',
-- 
2.31.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-07-19  1:22 [PATCH v7 09/13] LoongArch: Add ABI Lists caiyinyu
                   ` (2 preceding siblings ...)
  2022-07-19  1:22 ` [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
@ 2022-07-19  1:22 ` caiyinyu
  2022-07-20 17:16   ` Adhemerval Zanella Netto
  3 siblings, 1 reply; 9+ messages in thread
From: caiyinyu @ 2022-07-19  1:22 UTC (permalink / raw)
  To: adhemerval.zanella, libc-alpha, joseph_myers, carlos, i.swmail; +Cc: caiyinyu

---
 NEWS             | 8 ++++++++
 README           | 1 +
 manual/math.texi | 2 +-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index df882ec243..d2f913da06 100644
--- a/NEWS
+++ b/NEWS
@@ -60,6 +60,14 @@ Major new features:
   _GNU_SOURCE macro is defined and the C++20 __cpp_char8_t feature test macro
   is not defined (if __cpp_char8_t is defined, then char8_t is a builtin type).
 
+* Support for LoongArch running on Linux has been added.  This port requires
+  as least binutils 2.38, GCC 12, and Linux 5.19.  Currently only hard-float
+  ABI is supported:
+
+    - loongarch64-linux-gnu
+
+  The LoongArch ABI is 64-bit little-endian.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * Support for prelink will be removed in the next release; this includes
diff --git a/README b/README
index 3d5a78ccff..63f3a1bebf 100644
--- a/README
+++ b/README
@@ -31,6 +31,7 @@ The GNU C Library supports these configurations for using Linux kernels:
 	i[4567]86-*-linux-gnu
 	x86_64-*-linux-gnu	Can build either x86_64 or x32
 	ia64-*-linux-gnu
+	loongarch64-*-linux-gnu Hardware floating point, LE only.
 	m68k-*-linux-gnu
 	microblaze*-*-linux-gnu
 	mips-*-linux-gnu
diff --git a/manual/math.texi b/manual/math.texi
index 477a18b6d1..105d6122df 100644
--- a/manual/math.texi
+++ b/manual/math.texi
@@ -70,7 +70,7 @@ provided for @code{_Float32}, @code{_Float64} and @code{_Float32x} on
 all platforms.
 It is also provided for @code{_Float128} and @code{_Float64x} on
 powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64,
-aarch64, alpha, mips64, riscv, s390 and sparc.
+aarch64, alpha, loongarch, mips64, riscv, s390 and sparc.
 
 @menu
 * Mathematical Constants::      Precise numeric values for often-used
-- 
2.31.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 10/13] LoongArch: Build Infastructure
  2022-07-19  1:22 ` [PATCH v7 10/13] LoongArch: Build Infastructure caiyinyu
@ 2022-07-20 17:14   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 9+ messages in thread
From: Adhemerval Zanella Netto @ 2022-07-20 17:14 UTC (permalink / raw)
  To: caiyinyu, libc-alpha, joseph_myers, carlos, i.swmail

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

On 18/07/22 22:22, caiyinyu wrote:
> ---
>  sysdeps/loongarch/Implies                     |   3 +
>  sysdeps/loongarch/Makefile                    |  15 ++
>  sysdeps/loongarch/configure                   |   5 +
>  sysdeps/loongarch/configure.ac                |   6 +
>  sysdeps/loongarch/lp64/Implies-after          |   1 +
>  sysdeps/loongarch/preconfigure                |  53 ++++++
>  sysdeps/loongarch/preconfigure.ac             |  47 +++++
>  sysdeps/loongarch/sys/regdef.h                |  93 ++++++++++
>  sysdeps/unix/sysv/linux/loongarch/Implies     |   1 +
>  sysdeps/unix/sysv/linux/loongarch/Makefile    |   4 +
>  sysdeps/unix/sysv/linux/loongarch/configure   | 174 ++++++++++++++++++
>  .../unix/sysv/linux/loongarch/configure.ac    |  22 +++
>  .../unix/sysv/linux/loongarch/ldd-rewrite.sed |   1 +
>  .../unix/sysv/linux/loongarch/lp64/Implies    |   3 +
>  .../unix/sysv/linux/loongarch/shlib-versions  |   7 +
>  15 files changed, 435 insertions(+)
>  create mode 100644 sysdeps/loongarch/Implies
>  create mode 100644 sysdeps/loongarch/Makefile
>  create mode 100644 sysdeps/loongarch/configure
>  create mode 100644 sysdeps/loongarch/configure.ac
>  create mode 100644 sysdeps/loongarch/lp64/Implies-after
>  create mode 100644 sysdeps/loongarch/preconfigure
>  create mode 100644 sysdeps/loongarch/preconfigure.ac
>  create mode 100644 sysdeps/loongarch/sys/regdef.h
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions
> 
> diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies
> new file mode 100644
> index 0000000000..1945b1f4bb
> --- /dev/null
> +++ b/sysdeps/loongarch/Implies
> @@ -0,0 +1,3 @@
> +ieee754/ldbl-128
> +ieee754/dbl-64
> +ieee754/flt-32
> diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
> new file mode 100644
> index 0000000000..41c3449670
> --- /dev/null
> +++ b/sysdeps/loongarch/Makefile
> @@ -0,0 +1,15 @@
> +ifeq ($(subdir),misc)
> +sysdep_headers += sys/asm.h
> +endif
> +
> +# LoongArch's assembler also needs to know about PIC as it changes the
> +# definition of some assembler macros.
> +ASFLAGS-.os += $(pic-ccflag)
> +
> +abi-variants := lp64
> +
> +ifeq (,$(filter $(default-abi),$(abi-variants)))
> +$(error Unknown ABI $(default-abi), must be one of $(abi-variants))
> +endif
> +
> +abi-lp64-condition    := defined __loongarch_lp64
> diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
> new file mode 100644
> index 0000000000..43b54d4965
> --- /dev/null
> +++ b/sysdeps/loongarch/configure
> @@ -0,0 +1,5 @@
> +# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
> + # Local configure fragment for sysdeps/loongarch/elf.
> +
> +$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
> +
> diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
> new file mode 100644
> index 0000000000..f744367bf3
> --- /dev/null
> +++ b/sysdeps/loongarch/configure.ac
> @@ -0,0 +1,6 @@
> +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> +# Local configure fragment for sysdeps/loongarch/elf.
> +
> +dnl It is always possible to access static and hidden symbols in an
> +dnl position independent way.
> +AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
> diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after
> new file mode 100644
> index 0000000000..a8cae95f9d
> --- /dev/null
> +++ b/sysdeps/loongarch/lp64/Implies-after
> @@ -0,0 +1 @@
> +wordsize-64
> diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure
> new file mode 100644
> index 0000000000..118963cda6
> --- /dev/null
> +++ b/sysdeps/loongarch/preconfigure
> @@ -0,0 +1,53 @@
> +# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
> +# Local preconfigure fragment for sysdeps/loongarch
> +
> +case "$machine" in
> +loongarch*)
> +
> +    abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'`
> +    float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'`
> +
> +    with_fp_cond="!defined __loongarch_soft_float"
> +
> +    case "$float_abi" in
> +    soft)
> +	abi_flen=0
> +	as_fn_error 1 "loongarch does not yet support soft floating-point  ABI!!" "$LINENO" 5
> +	;;
> +    single)
> +	as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5
> +	;;
> +    double)
> +	abi_flen=64
> +	;;
> +    *)
> +	as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5
> +	;;
> +    esac
> +
> +    case "$abi" in
> +    ilp32)
> +	as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5
> +	;;
> +    lp64)
> +	grlen=64
> +	machine=loongarch/lp64
> +	;;
> +    *)
> +	as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5
> +	;;
> +    esac
> +
> +    cat >>confdefs.h <<_ACEOF
> +#define LOONGARCH_ABI_GRLEN $grlen
> +_ACEOF
> +
> +    cat >>confdefs.h <<_ACEOF
> +#define LOONGARCH_ABI_FRLEN $abi_flen
> +_ACEOF
> +
> +
> +    base_machine=loongarch
> +    ;;
> +esac
> +
> diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac
> new file mode 100644
> index 0000000000..1aba743c15
> --- /dev/null
> +++ b/sysdeps/loongarch/preconfigure.ac
> @@ -0,0 +1,47 @@
> +GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory.
> +# Local preconfigure fragment for sysdeps/loongarch
> +
> +case "$machine" in
> +loongarch*)
> +
> +    abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'`
> +    float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'`
> +
> +    with_fp_cond="!defined __loongarch_soft_float"
> +
> +    case "$float_abi" in
> +    soft)
> +	abi_flen=0
> +	AC_MSG_ERROR([loongarch does not yet support soft floating-point  ABI!!], 1)
> +	;;
> +    single)
> +	AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1)
> +	;;
> +    double)
> +	abi_flen=64
> +	;;
> +    *)
> +	AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1)
> +	;;
> +    esac
> +
> +    case "$abi" in
> +    ilp32)
> +	AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1)
> +	;;
> +    lp64)
> +	grlen=64
> +	machine=loongarch/lp64
> +	;;
> +    *)
> +	AC_MSG_ERROR([Unable to determine GRLEN!!], 1)
> +	;;
> +    esac
> +
> +    AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen])
> +    AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen])
> +
> +    base_machine=loongarch
> +    ;;
> +esac
> +

Ok.

> diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h
> new file mode 100644
> index 0000000000..d266df372d
> --- /dev/null
> +++ b/sysdeps/loongarch/sys/regdef.h
> @@ -0,0 +1,93 @@
> +/* Register Macro definitions
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_REGDEF_H
> +#define _SYS_REGDEF_H
> +
> +#define zero $r0
> +#define ra $r1
> +#define tp $r2
> +#define sp $r3
> +#define a0 $r4
> +#define a1 $r5
> +#define a2 $r6
> +#define a3 $r7
> +#define a4 $r8
> +#define a5 $r9
> +#define a6 $r10
> +#define a7 $r11
> +#define v0 $r4
> +#define v1 $r5
> +#define t0 $r12
> +#define t1 $r13
> +#define t2 $r14
> +#define t3 $r15
> +#define t4 $r16
> +#define t5 $r17
> +#define t6 $r18
> +#define t7 $r19
> +#define t8 $r20
> +#define x $r21
> +#define fp $r22
> +#define s0 $r23
> +#define s1 $r24
> +#define s2 $r25
> +#define s3 $r26
> +#define s4 $r27
> +#define s5 $r28
> +#define s6 $r29
> +#define s7 $r30
> +#define s8 $r31
> +
> +#define fa0 $f0
> +#define fa1 $f1
> +#define fa2 $f2
> +#define fa3 $f3
> +#define fa4 $f4
> +#define fa5 $f5
> +#define fa6 $f6
> +#define fa7 $f7
> +#define fv0 $f0
> +#define fv1 $f1
> +#define ft0 $f8
> +#define ft1 $f9
> +#define ft2 $f10
> +#define ft3 $f11
> +#define ft4 $f12
> +#define ft5 $f13
> +#define ft6 $f14
> +#define ft7 $f15
> +#define ft8 $f16
> +#define ft9 $f17
> +#define ft10 $f18
> +#define ft11 $f19
> +#define ft12 $f20
> +#define ft13 $f21
> +#define ft14 $f22
> +#define ft15 $f23
> +#define fs0 $f24
> +#define fs1 $f25
> +#define fs2 $f26
> +#define fs3 $f27
> +#define fs4 $f28
> +#define fs5 $f29
> +#define fs6 $f30
> +#define fs7 $f31
> +
> +#endif /* _SYS_REGDEF_H */
> diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies
> new file mode 100644
> index 0000000000..e52b1ac310
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/Implies
> @@ -0,0 +1 @@
> +loongarch/nptl
> diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile
> new file mode 100644
> index 0000000000..730bfa7465
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile
> @@ -0,0 +1,4 @@
> +ifeq ($(subdir),stdlib)
> +gen-as-const-headers += ucontext_i.sym
> +endif
> +
> diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure
> new file mode 100644
> index 0000000000..60a410303e
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/configure
> @@ -0,0 +1,174 @@
> +# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
> + # Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
> +
> +arch_minimum_kernel=5.19.0
> +
> +libc_cv_loongarch_int_abi=no
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
> +$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
> +if ${ac_cv_path_GREP+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if test -z "$GREP"; then
> +  ac_path_GREP_found=false
> +  # Loop through the user's path and test for each of PROGNAME-LIST
> +  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
> +do
> +  IFS=$as_save_IFS
> +  test -z "$as_dir" && as_dir=.
> +    for ac_prog in grep ggrep; do
> +    for ac_exec_ext in '' $ac_executable_extensions; do
> +      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
> +      as_fn_executable_p "$ac_path_GREP" || continue
> +# Check for GNU ac_path_GREP and select it if it is found.
> +  # Check for GNU $ac_path_GREP
> +case `"$ac_path_GREP" --version 2>&1` in
> +*GNU*)
> +  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
> +*)
> +  ac_count=0
> +  $as_echo_n 0123456789 >"conftest.in"
> +  while :
> +  do
> +    cat "conftest.in" "conftest.in" >"conftest.tmp"
> +    mv "conftest.tmp" "conftest.in"
> +    cp "conftest.in" "conftest.nl"
> +    $as_echo 'GREP' >> "conftest.nl"
> +    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
> +    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
> +    as_fn_arith $ac_count + 1 && ac_count=$as_val
> +    if test $ac_count -gt ${ac_path_GREP_max-0}; then
> +      # Best one so far, save it but keep looking for a better one
> +      ac_cv_path_GREP="$ac_path_GREP"
> +      ac_path_GREP_max=$ac_count
> +    fi
> +    # 10*(2^10) chars as input seems more than enough
> +    test $ac_count -gt 10 && break
> +  done
> +  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
> +esac
> +
> +      $ac_path_GREP_found && break 3
> +    done
> +  done
> +  done
> +IFS=$as_save_IFS
> +  if test -z "$ac_cv_path_GREP"; then
> +    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
> +  fi
> +else
> +  ac_cv_path_GREP=$GREP
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
> +$as_echo "$ac_cv_path_GREP" >&6; }
> + GREP="$ac_cv_path_GREP"
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
> +$as_echo_n "checking for egrep... " >&6; }
> +if ${ac_cv_path_EGREP+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
> +   then ac_cv_path_EGREP="$GREP -E"
> +   else
> +     if test -z "$EGREP"; then
> +  ac_path_EGREP_found=false
> +  # Loop through the user's path and test for each of PROGNAME-LIST
> +  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
> +do
> +  IFS=$as_save_IFS
> +  test -z "$as_dir" && as_dir=.
> +    for ac_prog in egrep; do
> +    for ac_exec_ext in '' $ac_executable_extensions; do
> +      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
> +      as_fn_executable_p "$ac_path_EGREP" || continue
> +# Check for GNU ac_path_EGREP and select it if it is found.
> +  # Check for GNU $ac_path_EGREP
> +case `"$ac_path_EGREP" --version 2>&1` in
> +*GNU*)
> +  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
> +*)
> +  ac_count=0
> +  $as_echo_n 0123456789 >"conftest.in"
> +  while :
> +  do
> +    cat "conftest.in" "conftest.in" >"conftest.tmp"
> +    mv "conftest.tmp" "conftest.in"
> +    cp "conftest.in" "conftest.nl"
> +    $as_echo 'EGREP' >> "conftest.nl"
> +    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
> +    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
> +    as_fn_arith $ac_count + 1 && ac_count=$as_val
> +    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
> +      # Best one so far, save it but keep looking for a better one
> +      ac_cv_path_EGREP="$ac_path_EGREP"
> +      ac_path_EGREP_max=$ac_count
> +    fi
> +    # 10*(2^10) chars as input seems more than enough
> +    test $ac_count -gt 10 && break
> +  done
> +  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
> +esac
> +
> +      $ac_path_EGREP_found && break 3
> +    done
> +  done
> +  done
> +IFS=$as_save_IFS
> +  if test -z "$ac_cv_path_EGREP"; then
> +    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
> +  fi
> +else
> +  ac_cv_path_EGREP=$EGREP
> +fi
> +
> +   fi
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
> +$as_echo "$ac_cv_path_EGREP" >&6; }
> + EGREP="$ac_cv_path_EGREP"
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
> +
> +_ACEOF
> +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
> +  $EGREP "4 8 8" >/dev/null 2>&1; then :
> +  libc_cv_loongarch_int_abi=lp64
> +fi
> +rm -f conftest*
> +
> +if test $libc_cv_loongarch_int_abi = no; then
> +  as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5
> +fi
> +
> +config_vars="$config_vars
> +default-abi = $libc_cv_loongarch_int_abi"
> +
> +case $libc_cv_loongarch_int_abi in
> +lp64)
> +  test -n "$libc_cv_slibdir" ||
> +case "$prefix" in
> +/usr | /usr/)
> +  libc_cv_slibdir='/lib64'
> +  libc_cv_rtlddir='/lib64'
> +  if test "$libdir" = '${exec_prefix}/lib'; then
> +    libdir='${exec_prefix}/lib64';
> +    # Locale data can be shared between 32-bit and 64-bit libraries.
> +    libc_cv_complocaledir='${exec_prefix}/lib/locale'
> +  fi
> +  ;;
> +esac
> +  ;;
> +esac
> +
> +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
> diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac
> new file mode 100644
> index 0000000000..7de1e95ff6
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac
> @@ -0,0 +1,22 @@
> +sinclude(./aclocal.m4)dnl Autoconf lossage
> +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> +# Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
> +
> +arch_minimum_kernel=5.19.0
> +
> +libc_cv_loongarch_int_abi=no
> +AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
> +  ], libc_cv_loongarch_int_abi=lp64)
> +if test $libc_cv_loongarch_int_abi = no; then
> +  AC_MSG_ERROR([Unable to determine integer ABI])
> +fi
> +
> +LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi])
> +
> +case $libc_cv_loongarch_int_abi in
> +lp64)
> +  LIBC_SLIBDIR_RTLDDIR([lib64], [lib64])
> +  ;;
> +esac
> +
> +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
> diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
> new file mode 100644
> index 0000000000..f8976fd239
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
> @@ -0,0 +1 @@
> +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_

Ok.

> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies
> new file mode 100644
> index 0000000000..117c2b8efe
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies
> @@ -0,0 +1,3 @@
> +unix/sysv/linux/loongarch
> +unix/sysv/linux/generic
> +unix/sysv/linux/wordsize-64
> diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
> new file mode 100644
> index 0000000000..dc2220b4be
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
> @@ -0,0 +1,7 @@
> +DEFAULT		GLIBC_2.36
> +
> +%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64
> +ld=ld-linux-loongarch-lp64d.so.1
> +%else
> +%error cannot determine ABI
> +%endif

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port.
  2022-07-19  1:22 ` [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
@ 2022-07-20 17:16   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 9+ messages in thread
From: Adhemerval Zanella Netto @ 2022-07-20 17:16 UTC (permalink / raw)
  To: caiyinyu, libc-alpha, joseph_myers, carlos, i.swmail

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

On 18/07/22 22:22, caiyinyu wrote:
> ---
>  scripts/build-many-glibcs.py | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
> index cc058e115c..da9b905900 100755
> --- a/scripts/build-many-glibcs.py
> +++ b/scripts/build-many-glibcs.py
> @@ -218,6 +218,10 @@ class Context(object):
>                          os_name='linux-gnu',
>                          first_gcc_cfg=['--with-system-libunwind'],
>                          binutils_cfg=['--enable-obsolete'])
> +        self.add_config(arch='loongarch64',
> +                        os_name='linux-gnu',
> +                        variant='lp64d',
> +                        gcc_cfg=['--with-abi=lp64d','--disable-multilib'])
>          self.add_config(arch='m68k',
>                          os_name='linux-gnu',
>                          gcc_cfg=['--disable-multilib'])
> @@ -1271,6 +1275,7 @@ def install_linux_headers(policy, cmdlist):
>                  'i686': 'x86',
>                  'i786': 'x86',
>                  'ia64': 'ia64',
> +                'loongarch64': 'loongarch',
>                  'm68k': 'm68k',
>                  'microblaze': 'microblaze',
>                  'mips': 'mips',

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-07-19  1:22 ` [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
@ 2022-07-20 17:16   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 9+ messages in thread
From: Adhemerval Zanella Netto @ 2022-07-20 17:16 UTC (permalink / raw)
  To: caiyinyu, libc-alpha, joseph_myers, carlos, i.swmail

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

On 18/07/22 22:22, caiyinyu wrote:
> ---
>  NEWS             | 8 ++++++++
>  README           | 1 +
>  manual/math.texi | 2 +-
>  3 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/NEWS b/NEWS
> index df882ec243..d2f913da06 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -60,6 +60,14 @@ Major new features:
>    _GNU_SOURCE macro is defined and the C++20 __cpp_char8_t feature test macro
>    is not defined (if __cpp_char8_t is defined, then char8_t is a builtin type).
>  
> +* Support for LoongArch running on Linux has been added.  This port requires
> +  as least binutils 2.38, GCC 12, and Linux 5.19.  Currently only hard-float
> +  ABI is supported:
> +
> +    - loongarch64-linux-gnu
> +
> +  The LoongArch ABI is 64-bit little-endian.
> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * Support for prelink will be removed in the next release; this includes
> diff --git a/README b/README
> index 3d5a78ccff..63f3a1bebf 100644
> --- a/README
> +++ b/README
> @@ -31,6 +31,7 @@ The GNU C Library supports these configurations for using Linux kernels:
>  	i[4567]86-*-linux-gnu
>  	x86_64-*-linux-gnu	Can build either x86_64 or x32
>  	ia64-*-linux-gnu
> +	loongarch64-*-linux-gnu Hardware floating point, LE only.
>  	m68k-*-linux-gnu
>  	microblaze*-*-linux-gnu
>  	mips-*-linux-gnu
> diff --git a/manual/math.texi b/manual/math.texi
> index 477a18b6d1..105d6122df 100644
> --- a/manual/math.texi
> +++ b/manual/math.texi
> @@ -70,7 +70,7 @@ provided for @code{_Float32}, @code{_Float64} and @code{_Float32x} on
>  all platforms.
>  It is also provided for @code{_Float128} and @code{_Float64x} on
>  powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64,
> -aarch64, alpha, mips64, riscv, s390 and sparc.
> +aarch64, alpha, loongarch, mips64, riscv, s390 and sparc.
>  
>  @menu
>  * Mathematical Constants::      Precise numeric values for often-used

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 11/13] LoongArch: Hard Float Support
  2022-07-19  1:22 ` [PATCH v7 11/13] LoongArch: Hard Float Support caiyinyu
@ 2022-07-21 21:03   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 9+ messages in thread
From: Adhemerval Zanella Netto @ 2022-07-21 21:03 UTC (permalink / raw)
  To: caiyinyu, libc-alpha, joseph_myers, carlos, i.swmail

LGTM, as for v6.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

On 18/07/22 22:22, caiyinyu wrote:
> ---
>  sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
>  sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
>  sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
>  sysdeps/loongarch/fpu/fegetenv.c              |   31 +
>  sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
>  sysdeps/loongarch/fpu/fegetmode.c             |   27 +
>  sysdeps/loongarch/fpu/fegetround.c            |   33 +
>  sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
>  sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
>  sysdeps/loongarch/fpu/fesetenv.c              |   42 +
>  sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
>  sysdeps/loongarch/fpu/fesetmode.c             |   38 +
>  sysdeps/loongarch/fpu/fesetround.c            |   44 +
>  sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
>  sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
>  sysdeps/loongarch/fpu/fraiseexcpt.c           |   80 +
>  sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
>  sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
>  .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
>  sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++++++++
>  sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
>  sysdeps/loongarch/math_private.h              |  248 +++
>  22 files changed, 2372 insertions(+)
>  create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
>  create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
>  create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
>  create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
>  create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
>  create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
>  create mode 100644 sysdeps/loongarch/fpu/fegetround.c
>  create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
>  create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
>  create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
>  create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
>  create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
>  create mode 100644 sysdeps/loongarch/fpu/fesetround.c
>  create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
>  create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
>  create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
>  create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
>  create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
>  create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
>  create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
>  create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
>  create mode 100644 sysdeps/loongarch/math_private.h
> 
> diff --git a/sysdeps/loongarch/fpu/fclrexcpt.c b/sysdeps/loongarch/fpu/fclrexcpt.c
> new file mode 100644
> index 0000000000..e9f33a1658
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fclrexcpt.c
> @@ -0,0 +1,46 @@
> +/* Clear given exceptions in current floating-point environment.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feclearexcept (int excepts)
> +{
> +  int cw;
> +
> +  /* Mask out unsupported bits/exceptions.  */
> +  excepts &= FE_ALL_EXCEPT;
> +
> +  /* Read the complete control word.  */
> +  _FPU_GETCW (cw);
> +
> +  /* Clear exception flag bits and cause bits.  If the cause bit is not
> +     cleared, the next CTC instruction (just below) will re-generate the
> +     exception.  */
> +
> +  cw &= ~(excepts | (excepts << CAUSE_SHIFT));
> +
> +  /* Put the new data in effect.  */
> +  _FPU_SETCW (cw);
> +
> +  /* Success.  */
> +  return 0;
> +}
> +libm_hidden_def (feclearexcept)
> diff --git a/sysdeps/loongarch/fpu/fedisblxcpt.c b/sysdeps/loongarch/fpu/fedisblxcpt.c
> new file mode 100644
> index 0000000000..add62946fd
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fedisblxcpt.c
> @@ -0,0 +1,39 @@
> +/* Disable floating-point exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fedisableexcept (int excepts)
> +{
> +  unsigned int new_exc, old_exc;
> +
> +  /* Get the current control word.  */
> +  _FPU_GETCW (new_exc);
> +
> +  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
> +
> +  excepts &= FE_ALL_EXCEPT;
> +
> +  new_exc &= ~(excepts >> ENABLE_SHIFT);
> +  _FPU_SETCW (new_exc);
> +
> +  return old_exc;
> +}
> diff --git a/sysdeps/loongarch/fpu/feenablxcpt.c b/sysdeps/loongarch/fpu/feenablxcpt.c
> new file mode 100644
> index 0000000000..ed809341f6
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/feenablxcpt.c
> @@ -0,0 +1,39 @@
> +/* Enable floating-point exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feenableexcept (int excepts)
> +{
> +  unsigned int new_exc, old_exc;
> +
> +  /* Get the current control word.  */
> +  _FPU_GETCW (new_exc);
> +
> +  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
> +
> +  excepts &= FE_ALL_EXCEPT;
> +
> +  new_exc |= excepts >> ENABLE_SHIFT;
> +  _FPU_SETCW (new_exc);
> +
> +  return old_exc;
> +}
> diff --git a/sysdeps/loongarch/fpu/fegetenv.c b/sysdeps/loongarch/fpu/fegetenv.c
> new file mode 100644
> index 0000000000..5a2a3d34dc
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fegetenv.c
> @@ -0,0 +1,31 @@
> +/* Store current floating-point environment.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetenv (fenv_t *envp)
> +{
> +  _FPU_GETCW (*envp);
> +
> +  /* Success.  */
> +  return 0;
> +}
> +libm_hidden_def (__fegetenv) weak_alias (__fegetenv, fegetenv)
> +libm_hidden_weak (fegetenv)
> diff --git a/sysdeps/loongarch/fpu/fegetexcept.c b/sysdeps/loongarch/fpu/fegetexcept.c
> new file mode 100644
> index 0000000000..ba1c1466f4
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fegetexcept.c
> @@ -0,0 +1,32 @@
> +/* Get enabled floating-point exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetexcept (void)
> +{
> +  unsigned int exc;
> +
> +  /* Get the current control word.  */
> +  _FPU_GETCW (exc);
> +
> +  return (exc & ENABLE_MASK) << ENABLE_SHIFT;
> +}
> diff --git a/sysdeps/loongarch/fpu/fegetmode.c b/sysdeps/loongarch/fpu/fegetmode.c
> new file mode 100644
> index 0000000000..e3517e34f6
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fegetmode.c
> @@ -0,0 +1,27 @@
> +/* Store current floating-point control modes.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetmode (femode_t *modep)
> +{
> +  _FPU_GETCW (*modep);
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/fpu/fegetround.c b/sysdeps/loongarch/fpu/fegetround.c
> new file mode 100644
> index 0000000000..ff6113eb04
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fegetround.c
> @@ -0,0 +1,33 @@
> +/* Return current rounding direction.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetround (void)
> +{
> +  int cw;
> +
> +  /* Get control word.  */
> +  _FPU_GETCW (cw);
> +
> +  return cw & _FPU_RC_MASK;
> +}
> +libm_hidden_def (__fegetround) weak_alias (__fegetround, fegetround)
> +libm_hidden_weak (fegetround)
> diff --git a/sysdeps/loongarch/fpu/feholdexcpt.c b/sysdeps/loongarch/fpu/feholdexcpt.c
> new file mode 100644
> index 0000000000..e4f9f6a23b
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/feholdexcpt.c
> @@ -0,0 +1,40 @@
> +/* Store current floating-point environment and clear exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__feholdexcept (fenv_t *envp)
> +{
> +  fpu_control_t cw;
> +
> +  /* Save the current state.  */
> +  _FPU_GETCW (cw);
> +  envp->__fp_control_register = cw;
> +
> +  /* Clear all exception enable bits and flags.  */
> +  cw &= ~(_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I
> +	  | FE_ALL_EXCEPT);
> +  _FPU_SETCW (cw);
> +
> +  return 0;
> +}
> +
> +libm_hidden_def (__feholdexcept) weak_alias (__feholdexcept, feholdexcept)
> +libm_hidden_weak (feholdexcept)
> diff --git a/sysdeps/loongarch/fpu/fenv_libc.h b/sysdeps/loongarch/fpu/fenv_libc.h
> new file mode 100644
> index 0000000000..8360ae0377
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fenv_libc.h
> @@ -0,0 +1,30 @@
> +/* Internal libc stuff for floating point environment routines.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _FENV_LIBC_H
> +#define _FENV_LIBC_H 1
> +
> +/* Mask for enabling exceptions and for the CAUSE bits.  */
> +#define ENABLE_MASK 0x0000001FU
> +#define CAUSE_MASK 0x1F000000U
> +
> +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */
> +#define ENABLE_SHIFT 16
> +#define CAUSE_SHIFT 8
> +
> +#endif /* _FENV_LIBC_H */
> diff --git a/sysdeps/loongarch/fpu/fesetenv.c b/sysdeps/loongarch/fpu/fesetenv.c
> new file mode 100644
> index 0000000000..c10bd11ef9
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fesetenv.c
> @@ -0,0 +1,42 @@
> +/* Install given floating-point environment.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fesetenv (const fenv_t *envp)
> +{
> +  fpu_control_t cw;
> +
> +  /* Read first current state to flush fpu pipeline.  */
> +  _FPU_GETCW (cw);
> +
> +  if (envp == FE_DFL_ENV)
> +    _FPU_SETCW (_FPU_DEFAULT);
> +  else if (envp == FE_NOMASK_ENV)
> +    _FPU_SETCW (_FPU_IEEE);
> +  else
> +    _FPU_SETCW (envp->__fp_control_register);
> +
> +  /* Success.  */
> +  return 0;
> +}
> +
> +libm_hidden_def (__fesetenv) weak_alias (__fesetenv, fesetenv)
> +libm_hidden_weak (fesetenv)
> diff --git a/sysdeps/loongarch/fpu/fesetexcept.c b/sysdeps/loongarch/fpu/fesetexcept.c
> new file mode 100644
> index 0000000000..ad76d52d9e
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fesetexcept.c
> @@ -0,0 +1,32 @@
> +/* Set given exception flags.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fesetexcept (int excepts)
> +{
> +  fpu_control_t temp;
> +
> +  _FPU_GETCW (temp);
> +  temp |= excepts & FE_ALL_EXCEPT;
> +  _FPU_SETCW (temp);
> +
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/fpu/fesetmode.c b/sysdeps/loongarch/fpu/fesetmode.c
> new file mode 100644
> index 0000000000..fc52fc114b
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fesetmode.c
> @@ -0,0 +1,38 @@
> +/* Install given floating-point control modes.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +#define FCSR_STATUS 0x1f1f0000
> +
> +int
> +fesetmode (const femode_t *modep)
> +{
> +  fpu_control_t cw;
> +
> +  _FPU_GETCW (cw);
> +  cw &= FCSR_STATUS;
> +  if (modep == FE_DFL_MODE)
> +    cw |= _FPU_DEFAULT;
> +  else
> +    cw |= *modep & ~FCSR_STATUS;
> +  _FPU_SETCW (cw);
> +
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/fpu/fesetround.c b/sysdeps/loongarch/fpu/fesetround.c
> new file mode 100644
> index 0000000000..32acac5f96
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fesetround.c
> @@ -0,0 +1,44 @@
> +/* Set current rounding direction.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fesetround (int round)
> +{
> +  fpu_control_t cw;
> +
> +  if ((round & ~_FPU_RC_MASK) != 0)
> +    /* ROUND is no valid rounding mode.  */
> +    return 1;
> +
> +  /* Get current state.  */
> +  _FPU_GETCW (cw);
> +
> +  /* Set rounding bits.  */
> +  cw &= ~_FPU_RC_MASK;
> +  cw |= round;
> +  /* Set new state.  */
> +  _FPU_SETCW (cw);
> +
> +  return 0;
> +}
> +
> +libm_hidden_def (__fesetround) weak_alias (__fesetround, fesetround)
> +libm_hidden_weak (fesetround)
> diff --git a/sysdeps/loongarch/fpu/feupdateenv.c b/sysdeps/loongarch/fpu/feupdateenv.c
> new file mode 100644
> index 0000000000..5ad862a61d
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/feupdateenv.c
> @@ -0,0 +1,43 @@
> +/* Install given floating-point environment and raise exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__feupdateenv (const fenv_t *envp)
> +{
> +  int temp;
> +
> +  /* Save current exceptions.  */
> +  _FPU_GETCW (temp);
> +  temp &= FE_ALL_EXCEPT;
> +
> +  /* Install new environment.  */
> +  __fesetenv (envp);
> +
> +  /* Raise the safed exception.  Incidently for us the implementation
> +     defined format of the values in objects of type fexcept_t is the
> +     same as the ones specified using the FE_* constants.  */
> +  __feraiseexcept (temp);
> +
> +  /* Success.  */
> +  return 0;
> +}
> +libm_hidden_def (__feupdateenv) weak_alias (__feupdateenv, feupdateenv)
> +libm_hidden_weak (feupdateenv)
> diff --git a/sysdeps/loongarch/fpu/fgetexcptflg.c b/sysdeps/loongarch/fpu/fgetexcptflg.c
> new file mode 100644
> index 0000000000..6130c632c9
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fgetexcptflg.c
> @@ -0,0 +1,38 @@
> +/* Store current representation for exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetexceptflag (fexcept_t *flagp, int excepts)
> +{
> +  fpu_control_t temp;
> +
> +  /* Get the current exceptions.  */
> +  _FPU_GETCW (temp);
> +
> +  /* We only save the relevant bits here.  In particular, care has to be
> +     taken with the CAUSE bits, as an inadvertent restore later on could
> +     generate unexpected exceptions.  */
> +
> +  *flagp = temp & excepts & FE_ALL_EXCEPT;
> +
> +  /* Success.  */
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/fpu/fraiseexcpt.c b/sysdeps/loongarch/fpu/fraiseexcpt.c
> new file mode 100644
> index 0000000000..c1c612242f
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fraiseexcpt.c
> @@ -0,0 +1,80 @@
> +/* Raise given exceptions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +#include <float.h>
> +
> +int
> +__feraiseexcept (int excepts)
> +{
> +  const float fp_zero = 0.0f;
> +  const float fp_one = 1.0f;
> +  const float fp_max = FLT_MAX;
> +  const float fp_min = FLT_MIN;
> +  const float fp_1e32 = 1.0e32f;
> +  const float fp_two = 2.0f;
> +  const float fp_three = 3.0f;
> +
> +  /* Raise exceptions represented by EXPECTS.  But we must raise only
> +     one signal at a time.  It is important that if the overflow/underflow
> +     exception and the inexact exception are given at the same time,
> +     the overflow/underflow exception follows the inexact exception.  */
> +
> +  /* First: invalid exception.  */
> +  if (FE_INVALID & excepts)
> +    __asm__ __volatile__("fdiv.s $f0,%0,%0\n\t"
> +			 :
> +			 : "f"(fp_zero)
> +			 : "$f0");
> +
> +  /* Next: division by zero.  */
> +  if (FE_DIVBYZERO & excepts)
> +    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
> +			 :
> +			 : "f"(fp_one), "f"(fp_zero)
> +			 : "$f0");
> +
> +  /* Next: overflow.  */
> +  if (FE_OVERFLOW & excepts)
> +    /* There's no way to raise overflow without also raising inexact.  */
> +    __asm__ __volatile__("fadd.s $f0,%0,%1\n\t"
> +			 :
> +			 : "f"(fp_max), "f"(fp_1e32)
> +			 : "$f0");
> +
> +  /* Next: underflow.  */
> +  if (FE_UNDERFLOW & excepts)
> +    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
> +			 :
> +			 : "f"(fp_min), "f"(fp_three)
> +			 : "$f0");
> +
> +  /* Last: inexact.  */
> +  if (FE_INEXACT & excepts)
> +    __asm__ __volatile__("fdiv.s $f0, %0, %1\n\t"
> +			 :
> +			 : "f"(fp_two), "f"(fp_three)
> +			 : "$f0");
> +
> +  /* Success.  */
> +  return 0;
> +}
> +
> +libm_hidden_def (__feraiseexcept) weak_alias (__feraiseexcept, feraiseexcept)
> +libm_hidden_weak (feraiseexcept)
> diff --git a/sysdeps/loongarch/fpu/fsetexcptflg.c b/sysdeps/loongarch/fpu/fsetexcptflg.c
> new file mode 100644
> index 0000000000..9c135a663d
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/fsetexcptflg.c
> @@ -0,0 +1,41 @@
> +/* Set floating-point environment exception handling.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fesetexceptflag (const fexcept_t *flagp, int excepts)
> +{
> +  fpu_control_t temp;
> +
> +  /* Get the current exceptions.  */
> +  _FPU_GETCW (temp);
> +
> +  /* Make sure the flags we want restored are legal.  */
> +  excepts &= FE_ALL_EXCEPT;
> +
> +  /* Now clear the bits called for, and copy them in from flagp.  Note that
> +     we ignore all non-flag bits from *flagp, so they don't matter.  */
> +  temp = (temp & ~excepts) | (*flagp & excepts);
> +
> +  _FPU_SETCW (temp);
> +
> +  /* Success.  */
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/fpu/ftestexcept.c b/sysdeps/loongarch/fpu/ftestexcept.c
> new file mode 100644
> index 0000000000..b9563b7ae1
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/ftestexcept.c
> @@ -0,0 +1,32 @@
> +/* Test exception in current environment.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fetestexcept (int excepts)
> +{
> +  int cw;
> +
> +  /* Get current control word.  */
> +  _FPU_GETCW (cw);
> +
> +  return cw & excepts & FE_ALL_EXCEPT;
> +}
> +libm_hidden_def (fetestexcept)
> diff --git a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
> new file mode 100644
> index 0000000000..e94c915ba6
> --- /dev/null
> +++ b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
> @@ -0,0 +1,4 @@
> +#define USE_SQRT_BUILTIN 1
> +#define USE_SQRTF_BUILTIN 1
> +#define USE_SQRTL_BUILTIN 0
> +#define USE_SQRTF128_BUILTIN 0
> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> new file mode 100644
> index 0000000000..c711531eec
> --- /dev/null
> +++ b/sysdeps/loongarch/lp64/libm-test-ulps
> @@ -0,0 +1,1412 @@
> +# Begin of automatic generation
> +
> +# Maximal error of functions:
> +Function: "acos":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "acos_downward":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "acos_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "acos_upward":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "acosh":
> +double: 2
> +float: 2
> +ldouble: 4
> +
> +Function: "acosh_downward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: "acosh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "acosh_upward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: "asin":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "asin_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "asin_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "asin_upward":
> +double: 2
> +float: 1
> +ldouble: 2
> +
> +Function: "asinh":
> +double: 2
> +float: 2
> +ldouble: 4
> +
> +Function: "asinh_downward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "asinh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "asinh_upward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "atan":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "atan2":
> +float: 2
> +ldouble: 2
> +
> +Function: "atan2_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "atan2_towardzero":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: "atan2_upward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "atan_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "atan_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "atan_upward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "atanh":
> +double: 2
> +float: 2
> +ldouble: 4
> +
> +Function: "atanh_downward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "atanh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "atanh_upward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "cabs":
> +double: 1
> +ldouble: 1
> +
> +Function: "cabs_downward":
> +double: 1
> +ldouble: 1
> +
> +Function: "cabs_towardzero":
> +double: 1
> +ldouble: 1
> +
> +Function: "cabs_upward":
> +double: 1
> +ldouble: 1
> +
> +Function: Real part of "cacos":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "cacos":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "cacos_downward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "cacos_downward":
> +double: 5
> +float: 3
> +ldouble: 6
> +
> +Function: Real part of "cacos_towardzero":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "cacos_towardzero":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Real part of "cacos_upward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "cacos_upward":
> +double: 5
> +float: 7
> +ldouble: 7
> +
> +Function: Real part of "cacosh":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "cacosh":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "cacosh_downward":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "cacosh_downward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: Real part of "cacosh_towardzero":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "cacosh_towardzero":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "cacosh_upward":
> +double: 4
> +float: 3
> +ldouble: 6
> +
> +Function: Imaginary part of "cacosh_upward":
> +double: 3
> +float: 2
> +ldouble: 4
> +
> +Function: "carg":
> +float: 1
> +ldouble: 2
> +
> +Function: "carg_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "carg_towardzero":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: "carg_upward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "casin":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Imaginary part of "casin":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "casin_downward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "casin_downward":
> +double: 5
> +float: 3
> +ldouble: 6
> +
> +Function: Real part of "casin_towardzero":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: Imaginary part of "casin_towardzero":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Real part of "casin_upward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "casin_upward":
> +double: 5
> +float: 7
> +ldouble: 7
> +
> +Function: Real part of "casinh":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "casinh":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Real part of "casinh_downward":
> +double: 5
> +float: 3
> +ldouble: 6
> +
> +Function: Imaginary part of "casinh_downward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "casinh_towardzero":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "casinh_towardzero":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: Real part of "casinh_upward":
> +double: 5
> +float: 7
> +ldouble: 7
> +
> +Function: Imaginary part of "casinh_upward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "catan":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "catan":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "catan_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "catan_downward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "catan_towardzero":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "catan_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "catan_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Imaginary part of "catan_upward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "catanh":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "catanh":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "catanh_downward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "catanh_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "catanh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "catanh_towardzero":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "catanh_upward":
> +double: 4
> +float: 4
> +ldouble: 4
> +
> +Function: Imaginary part of "catanh_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "cbrt":
> +double: 4
> +float: 1
> +ldouble: 1
> +
> +Function: "cbrt_downward":
> +double: 4
> +float: 1
> +ldouble: 1
> +
> +Function: "cbrt_towardzero":
> +double: 3
> +float: 1
> +ldouble: 1
> +
> +Function: "cbrt_upward":
> +double: 5
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "ccos":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "ccos":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "ccos_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Imaginary part of "ccos_downward":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "ccos_towardzero":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "ccos_towardzero":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "ccos_upward":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "ccos_upward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "ccosh":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "ccosh":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "ccosh_downward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "ccosh_downward":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "ccosh_towardzero":
> +double: 2
> +float: 3
> +ldouble: 2
> +
> +Function: Imaginary part of "ccosh_towardzero":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "ccosh_upward":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "ccosh_upward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "cexp":
> +double: 2
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "cexp":
> +double: 1
> +float: 2
> +ldouble: 1
> +
> +Function: Real part of "cexp_downward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "cexp_downward":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "cexp_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "cexp_towardzero":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "cexp_upward":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "cexp_upward":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "clog":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Imaginary part of "clog":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "clog10":
> +double: 3
> +float: 4
> +ldouble: 2
> +
> +Function: Imaginary part of "clog10":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "clog10_downward":
> +double: 5
> +float: 5
> +ldouble: 3
> +
> +Function: Imaginary part of "clog10_downward":
> +double: 2
> +float: 4
> +ldouble: 3
> +
> +Function: Real part of "clog10_towardzero":
> +double: 5
> +float: 6
> +ldouble: 4
> +
> +Function: Imaginary part of "clog10_towardzero":
> +double: 2
> +float: 4
> +ldouble: 3
> +
> +Function: Real part of "clog10_upward":
> +double: 6
> +float: 5
> +ldouble: 4
> +
> +Function: Imaginary part of "clog10_upward":
> +double: 2
> +float: 4
> +ldouble: 3
> +
> +Function: Real part of "clog_downward":
> +double: 4
> +float: 3
> +ldouble: 3
> +
> +Function: Imaginary part of "clog_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "clog_towardzero":
> +double: 4
> +float: 4
> +ldouble: 3
> +
> +Function: Imaginary part of "clog_towardzero":
> +double: 1
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "clog_upward":
> +double: 4
> +float: 3
> +ldouble: 4
> +
> +Function: Imaginary part of "clog_upward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: "cos":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "cos_downward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "cos_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "cos_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "cosh":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "cosh_downward":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: "cosh_towardzero":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: "cosh_upward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "cpow":
> +double: 2
> +float: 5
> +ldouble: 4
> +
> +Function: Imaginary part of "cpow":
> +float: 2
> +ldouble: 1
> +
> +Function: Real part of "cpow_downward":
> +double: 5
> +float: 8
> +ldouble: 6
> +
> +Function: Imaginary part of "cpow_downward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "cpow_towardzero":
> +double: 5
> +float: 8
> +ldouble: 6
> +
> +Function: Imaginary part of "cpow_towardzero":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "cpow_upward":
> +double: 4
> +float: 1
> +ldouble: 3
> +
> +Function: Imaginary part of "cpow_upward":
> +double: 1
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "csin":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "csin":
> +ldouble: 1
> +
> +Function: Real part of "csin_downward":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Imaginary part of "csin_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Real part of "csin_towardzero":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Imaginary part of "csin_towardzero":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: Real part of "csin_upward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "csin_upward":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "csinh":
> +float: 1
> +ldouble: 1
> +
> +Function: Imaginary part of "csinh":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: Real part of "csinh_downward":
> +double: 2
> +float: 1
> +ldouble: 2
> +
> +Function: Imaginary part of "csinh_downward":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "csinh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "csinh_towardzero":
> +double: 3
> +float: 3
> +ldouble: 2
> +
> +Function: Real part of "csinh_upward":
> +double: 1
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "csinh_upward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "csqrt":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Imaginary part of "csqrt":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: Real part of "csqrt_downward":
> +double: 5
> +float: 4
> +ldouble: 4
> +
> +Function: Imaginary part of "csqrt_downward":
> +double: 4
> +float: 3
> +ldouble: 3
> +
> +Function: Real part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +ldouble: 3
> +
> +Function: Imaginary part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +ldouble: 3
> +
> +Function: Real part of "csqrt_upward":
> +double: 5
> +float: 4
> +ldouble: 4
> +
> +Function: Imaginary part of "csqrt_upward":
> +double: 3
> +float: 3
> +ldouble: 3
> +
> +Function: Real part of "ctan":
> +double: 2
> +float: 1
> +ldouble: 3
> +
> +Function: Imaginary part of "ctan":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "ctan_downward":
> +double: 6
> +float: 5
> +ldouble: 4
> +
> +Function: Imaginary part of "ctan_downward":
> +double: 2
> +float: 2
> +ldouble: 5
> +
> +Function: Real part of "ctan_towardzero":
> +double: 5
> +float: 3
> +ldouble: 4
> +
> +Function: Imaginary part of "ctan_towardzero":
> +double: 2
> +float: 2
> +ldouble: 5
> +
> +Function: Real part of "ctan_upward":
> +double: 2
> +float: 4
> +ldouble: 5
> +
> +Function: Imaginary part of "ctan_upward":
> +double: 2
> +float: 2
> +ldouble: 5
> +
> +Function: Real part of "ctanh":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Imaginary part of "ctanh":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: Real part of "ctanh_downward":
> +double: 4
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "ctanh_downward":
> +double: 6
> +float: 5
> +ldouble: 4
> +
> +Function: Real part of "ctanh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "ctanh_towardzero":
> +double: 5
> +float: 3
> +ldouble: 3
> +
> +Function: Real part of "ctanh_upward":
> +double: 2
> +float: 2
> +ldouble: 5
> +
> +Function: Imaginary part of "ctanh_upward":
> +double: 2
> +float: 3
> +ldouble: 5
> +
> +Function: "erf":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "erf_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "erf_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "erf_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "erfc":
> +double: 5
> +float: 3
> +ldouble: 4
> +
> +Function: "erfc_downward":
> +double: 5
> +float: 6
> +ldouble: 5
> +
> +Function: "erfc_towardzero":
> +double: 3
> +float: 4
> +ldouble: 4
> +
> +Function: "erfc_upward":
> +double: 5
> +float: 6
> +ldouble: 5
> +
> +Function: "exp":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "exp10":
> +double: 2
> +ldouble: 2
> +
> +Function: "exp10_downward":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: "exp10_towardzero":
> +double: 3
> +float: 1
> +ldouble: 3
> +
> +Function: "exp10_upward":
> +double: 2
> +float: 1
> +ldouble: 3
> +
> +Function: "exp2":
> +double: 1
> +ldouble: 1
> +
> +Function: "exp2_downward":
> +double: 1
> +ldouble: 1
> +
> +Function: "exp2_towardzero":
> +double: 1
> +ldouble: 1
> +
> +Function: "exp2_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "exp_downward":
> +double: 1
> +float: 1
> +
> +Function: "exp_towardzero":
> +double: 1
> +float: 1
> +
> +Function: "exp_upward":
> +double: 1
> +float: 1
> +
> +Function: "expm1":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "expm1_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "expm1_towardzero":
> +double: 1
> +float: 2
> +ldouble: 4
> +
> +Function: "expm1_upward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "gamma":
> +double: 4
> +float: 7
> +ldouble: 5
> +
> +Function: "gamma_downward":
> +double: 5
> +float: 7
> +ldouble: 8
> +
> +Function: "gamma_towardzero":
> +double: 5
> +float: 6
> +ldouble: 5
> +
> +Function: "gamma_upward":
> +double: 5
> +float: 6
> +ldouble: 8
> +
> +Function: "hypot":
> +double: 1
> +ldouble: 1
> +
> +Function: "hypot_downward":
> +double: 1
> +ldouble: 1
> +
> +Function: "hypot_towardzero":
> +double: 1
> +ldouble: 1
> +
> +Function: "hypot_upward":
> +double: 1
> +ldouble: 1
> +
> +Function: "j0":
> +double: 3
> +float: 9
> +ldouble: 2
> +
> +Function: "j0_downward":
> +double: 6
> +float: 9
> +ldouble: 9
> +
> +Function: "j0_towardzero":
> +double: 7
> +float: 9
> +ldouble: 9
> +
> +Function: "j0_upward":
> +double: 9
> +float: 9
> +ldouble: 7
> +
> +Function: "j1":
> +double: 4
> +float: 9
> +ldouble: 4
> +
> +Function: "j1_downward":
> +double: 5
> +float: 8
> +ldouble: 4
> +
> +Function: "j1_towardzero":
> +double: 4
> +float: 8
> +ldouble: 4
> +
> +Function: "j1_upward":
> +double: 9
> +float: 9
> +ldouble: 3
> +
> +Function: "jn":
> +double: 4
> +float: 4
> +ldouble: 7
> +
> +Function: "jn_downward":
> +double: 5
> +float: 5
> +ldouble: 8
> +
> +Function: "jn_towardzero":
> +double: 5
> +float: 5
> +ldouble: 8
> +
> +Function: "jn_upward":
> +double: 5
> +float: 4
> +ldouble: 7
> +
> +Function: "lgamma":
> +double: 4
> +float: 7
> +ldouble: 5
> +
> +Function: "lgamma_downward":
> +double: 5
> +float: 7
> +ldouble: 8
> +
> +Function: "lgamma_towardzero":
> +double: 5
> +float: 6
> +ldouble: 5
> +
> +Function: "lgamma_upward":
> +double: 5
> +float: 6
> +ldouble: 8
> +
> +Function: "log":
> +double: 1
> +ldouble: 1
> +
> +Function: "log10":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "log10_downward":
> +double: 2
> +float: 3
> +ldouble: 1
> +
> +Function: "log10_towardzero":
> +double: 2
> +float: 1
> +ldouble: 1
> +
> +Function: "log10_upward":
> +double: 2
> +float: 2
> +ldouble: 1
> +
> +Function: "log1p":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "log1p_downward":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: "log1p_towardzero":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: "log1p_upward":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "log2":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "log2_downward":
> +double: 3
> +ldouble: 3
> +
> +Function: "log2_towardzero":
> +double: 2
> +ldouble: 1
> +
> +Function: "log2_upward":
> +double: 3
> +ldouble: 1
> +
> +Function: "log_downward":
> +ldouble: 1
> +
> +Function: "log_towardzero":
> +ldouble: 2
> +
> +Function: "log_upward":
> +double: 1
> +ldouble: 2
> +
> +Function: "pow":
> +double: 1
> +ldouble: 2
> +
> +Function: "pow_downward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "pow_towardzero":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "pow_upward":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "sin":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "sin_downward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "sin_towardzero":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "sin_upward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "sincos":
> +double: 1
> +ldouble: 1
> +
> +Function: "sincos_downward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "sincos_towardzero":
> +double: 1
> +float: 1
> +ldouble: 2
> +
> +Function: "sincos_upward":
> +double: 1
> +float: 1
> +ldouble: 3
> +
> +Function: "sinh":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "sinh_downward":
> +double: 3
> +float: 3
> +ldouble: 3
> +
> +Function: "sinh_towardzero":
> +double: 3
> +float: 2
> +ldouble: 3
> +
> +Function: "sinh_upward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "tan":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "tan_downward":
> +double: 1
> +float: 2
> +ldouble: 1
> +
> +Function: "tan_towardzero":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "tan_upward":
> +double: 1
> +float: 1
> +ldouble: 1
> +
> +Function: "tanh":
> +double: 2
> +float: 2
> +ldouble: 2
> +
> +Function: "tanh_downward":
> +double: 3
> +float: 3
> +ldouble: 4
> +
> +Function: "tanh_towardzero":
> +double: 2
> +float: 2
> +ldouble: 3
> +
> +Function: "tanh_upward":
> +double: 3
> +float: 3
> +ldouble: 3
> +
> +Function: "tgamma":
> +double: 9
> +float: 8
> +ldouble: 4
> +
> +Function: "tgamma_downward":
> +double: 9
> +float: 7
> +ldouble: 5
> +
> +Function: "tgamma_towardzero":
> +double: 9
> +float: 7
> +ldouble: 5
> +
> +Function: "tgamma_upward":
> +double: 9
> +float: 8
> +ldouble: 4
> +
> +Function: "y0":
> +double: 3
> +float: 9
> +ldouble: 3
> +
> +Function: "y0_downward":
> +double: 3
> +float: 9
> +ldouble: 7
> +
> +Function: "y0_towardzero":
> +double: 4
> +float: 9
> +ldouble: 3
> +
> +Function: "y0_upward":
> +double: 3
> +float: 9
> +ldouble: 4
> +
> +Function: "y1":
> +double: 3
> +float: 9
> +ldouble: 5
> +
> +Function: "y1_downward":
> +double: 6
> +float: 9
> +ldouble: 5
> +
> +Function: "y1_towardzero":
> +double: 3
> +float: 9
> +ldouble: 2
> +
> +Function: "y1_upward":
> +double: 7
> +float: 9
> +ldouble: 5
> +
> +Function: "yn":
> +double: 3
> +float: 3
> +ldouble: 5
> +
> +Function: "yn_downward":
> +double: 3
> +float: 4
> +ldouble: 5
> +
> +Function: "yn_towardzero":
> +double: 3
> +float: 3
> +ldouble: 5
> +
> +Function: "yn_upward":
> +double: 4
> +float: 5
> +ldouble: 5
> +
> +# end of automatic generation
> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps-name b/sysdeps/loongarch/lp64/libm-test-ulps-name
> new file mode 100644
> index 0000000000..ce02281eab
> --- /dev/null
> +++ b/sysdeps/loongarch/lp64/libm-test-ulps-name
> @@ -0,0 +1 @@
> +LoongArch 64-bit
> diff --git a/sysdeps/loongarch/math_private.h b/sysdeps/loongarch/math_private.h
> new file mode 100644
> index 0000000000..cdf26a78dd
> --- /dev/null
> +++ b/sysdeps/loongarch/math_private.h
> @@ -0,0 +1,248 @@
> +/* Internal math stuff.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef LOONGARCH_MATH_PRIVATE_H
> +#define LOONGARCH_MATH_PRIVATE_H 1
> +
> +/* Inline functions to speed up the math library implementation.  The
> +   default versions of these routines are in generic/math_private.h
> +   and call fesetround, feholdexcept, etc.  These routines use inlined
> +   code instead.  */
> +
> +#ifdef __loongarch_hard_float
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +#define _FPU_MASK_ALL \
> +  (_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I \
> +   | FE_ALL_EXCEPT)
> +
> +static __always_inline void
> +libc_feholdexcept_loongarch (fenv_t *envp)
> +{
> +  fpu_control_t cw;
> +
> +  /* Save the current state.  */
> +  _FPU_GETCW (cw);
> +  envp->__fp_control_register = cw;
> +
> +  /* Clear all exception enable bits and flags.  */
> +  cw &= ~(_FPU_MASK_ALL);
> +  _FPU_SETCW (cw);
> +}
> +#define libc_feholdexcept libc_feholdexcept_loongarch
> +#define libc_feholdexceptf libc_feholdexcept_loongarch
> +#define libc_feholdexceptl libc_feholdexcept_loongarch
> +
> +static __always_inline void
> +libc_fesetround_loongarch (int round)
> +{
> +  fpu_control_t cw;
> +
> +  /* Get current state.  */
> +  _FPU_GETCW (cw);
> +
> +  /* Set rounding bits.  */
> +  cw &= ~_FPU_RC_MASK;
> +  cw |= round;
> +
> +  /* Set new state.  */
> +  _FPU_SETCW (cw);
> +}
> +#define libc_fesetround libc_fesetround_loongarch
> +#define libc_fesetroundf libc_fesetround_loongarch
> +#define libc_fesetroundl libc_fesetround_loongarch
> +
> +static __always_inline void
> +libc_feholdexcept_setround_loongarch (fenv_t *envp, int round)
> +{
> +  fpu_control_t cw;
> +
> +  /* Save the current state.  */
> +  _FPU_GETCW (cw);
> +  envp->__fp_control_register = cw;
> +
> +  /* Clear all exception enable bits and flags.  */
> +  cw &= ~(_FPU_MASK_ALL);
> +
> +  /* Set rounding bits.  */
> +  cw &= ~_FPU_RC_MASK;
> +  cw |= round;
> +
> +  /* Set new state.  */
> +  _FPU_SETCW (cw);
> +}
> +#define libc_feholdexcept_setround libc_feholdexcept_setround_loongarch
> +#define libc_feholdexcept_setroundf libc_feholdexcept_setround_loongarch
> +#define libc_feholdexcept_setroundl libc_feholdexcept_setround_loongarch
> +
> +#define libc_feholdsetround libc_feholdexcept_setround_loongarch
> +#define libc_feholdsetroundf libc_feholdexcept_setround_loongarch
> +#define libc_feholdsetroundl libc_feholdexcept_setround_loongarch
> +
> +static __always_inline void
> +libc_fesetenv_loongarch (fenv_t *envp)
> +{
> +  fpu_control_t cw __attribute__ ((unused));
> +
> +  /* Read current state to flush fpu pipeline.  */
> +  _FPU_GETCW (cw);
> +
> +  _FPU_SETCW (envp->__fp_control_register);
> +}
> +#define libc_fesetenv libc_fesetenv_loongarch
> +#define libc_fesetenvf libc_fesetenv_loongarch
> +#define libc_fesetenvl libc_fesetenv_loongarch
> +
> +static __always_inline int
> +libc_feupdateenv_test_loongarch (fenv_t *envp, int excepts)
> +{
> +  /* int ret = fetestexcept (excepts); feupdateenv (envp); return ret; */
> +  int cw, temp;
> +
> +  /* Get current control word.  */
> +  _FPU_GETCW (cw);
> +
> +  /* Set flag bits (which are accumulative), and *also* set the
> +     cause bits.  The setting of the cause bits is what actually causes
> +     the hardware to generate the exception, if the corresponding enable
> +     bit is set as well.  */
> +  temp = cw & FE_ALL_EXCEPT;
> +  temp |= envp->__fp_control_register | (temp << CAUSE_SHIFT);
> +
> +  /* Set new state.  */
> +  _FPU_SETCW (temp);
> +
> +  return cw & excepts & FE_ALL_EXCEPT;
> +}
> +#define libc_feupdateenv_test libc_feupdateenv_test_loongarch
> +#define libc_feupdateenv_testf libc_feupdateenv_test_loongarch
> +#define libc_feupdateenv_testl libc_feupdateenv_test_loongarch
> +
> +static __always_inline void
> +libc_feupdateenv_loongarch (fenv_t *envp)
> +{
> +  libc_feupdateenv_test_loongarch (envp, 0);
> +}
> +#define libc_feupdateenv libc_feupdateenv_loongarch
> +#define libc_feupdateenvf libc_feupdateenv_loongarch
> +#define libc_feupdateenvl libc_feupdateenv_loongarch
> +
> +#define libc_feresetround libc_feupdateenv_loongarch
> +#define libc_feresetroundf libc_feupdateenv_loongarch
> +#define libc_feresetroundl libc_feupdateenv_loongarch
> +
> +static __always_inline int
> +libc_fetestexcept_loongarch (int excepts)
> +{
> +  int cw;
> +
> +  /* Get current control word.  */
> +  _FPU_GETCW (cw);
> +
> +  return cw & excepts & FE_ALL_EXCEPT;
> +}
> +#define libc_fetestexcept libc_fetestexcept_loongarch
> +#define libc_fetestexceptf libc_fetestexcept_loongarch
> +#define libc_fetestexceptl libc_fetestexcept_loongarch
> +
> +/*  Enable support for rounding mode context.  */
> +#define HAVE_RM_CTX 1
> +
> +static __always_inline void
> +libc_feholdexcept_setround_loongarch_ctx (struct rm_ctx *ctx, int round)
> +{
> +  fpu_control_t old, new;
> +
> +  /* Save the current state.  */
> +  _FPU_GETCW (old);
> +  ctx->env.__fp_control_register = old;
> +
> +  /* Clear all exception enable bits and flags.  */
> +  new = old & ~(_FPU_MASK_ALL);
> +
> +  /* Set rounding bits.  */
> +  new = (new & ~_FPU_RC_MASK) | round;
> +
> +  if (__glibc_unlikely (new != old))
> +    {
> +      _FPU_SETCW (new);
> +      ctx->updated_status = true;
> +    }
> +  else
> +    ctx->updated_status = false;
> +}
> +#define libc_feholdexcept_setround_ctx libc_feholdexcept_setround_loongarch_ctx
> +#define libc_feholdexcept_setroundf_ctx \
> +  libc_feholdexcept_setround_loongarch_ctx
> +#define libc_feholdexcept_setroundl_ctx \
> +  libc_feholdexcept_setround_loongarch_ctx
> +
> +static __always_inline void
> +libc_fesetenv_loongarch_ctx (struct rm_ctx *ctx)
> +{
> +  libc_fesetenv_loongarch (&ctx->env);
> +}
> +#define libc_fesetenv_ctx libc_fesetenv_loongarch_ctx
> +#define libc_fesetenvf_ctx libc_fesetenv_loongarch_ctx
> +#define libc_fesetenvl_ctx libc_fesetenv_loongarch_ctx
> +
> +static __always_inline void
> +libc_feupdateenv_loongarch_ctx (struct rm_ctx *ctx)
> +{
> +  if (__glibc_unlikely (ctx->updated_status))
> +    libc_feupdateenv_test_loongarch (&ctx->env, 0);
> +}
> +#define libc_feupdateenv_ctx libc_feupdateenv_loongarch_ctx
> +#define libc_feupdateenvf_ctx libc_feupdateenv_loongarch_ctx
> +#define libc_feupdateenvl_ctx libc_feupdateenv_loongarch_ctx
> +#define libc_feresetround_ctx libc_feupdateenv_loongarch_ctx
> +#define libc_feresetroundf_ctx libc_feupdateenv_loongarch_ctx
> +#define libc_feresetroundl_ctx libc_feupdateenv_loongarch_ctx
> +
> +static __always_inline void
> +libc_feholdsetround_loongarch_ctx (struct rm_ctx *ctx, int round)
> +{
> +  fpu_control_t old, new;
> +
> +  /* Save the current state.  */
> +  _FPU_GETCW (old);
> +  ctx->env.__fp_control_register = old;
> +
> +  /* Set rounding bits.  */
> +  new = (old & ~_FPU_RC_MASK) | round;
> +
> +  if (__glibc_unlikely (new != old))
> +    {
> +      _FPU_SETCW (new);
> +      ctx->updated_status = true;
> +    }
> +  else
> +    ctx->updated_status = false;
> +}
> +#define libc_feholdsetround_ctx libc_feholdsetround_loongarch_ctx
> +#define libc_feholdsetroundf_ctx libc_feholdsetround_loongarch_ctx
> +#define libc_feholdsetroundl_ctx libc_feholdsetround_loongarch_ctx
> +
> +#endif
> +
> +#include_next <math_private.h>
> +
> +#endif

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-07-21 21:03 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-19  1:22 [PATCH v7 09/13] LoongArch: Add ABI Lists caiyinyu
2022-07-19  1:22 ` [PATCH v7 10/13] LoongArch: Build Infastructure caiyinyu
2022-07-20 17:14   ` Adhemerval Zanella Netto
2022-07-19  1:22 ` [PATCH v7 11/13] LoongArch: Hard Float Support caiyinyu
2022-07-21 21:03   ` Adhemerval Zanella Netto
2022-07-19  1:22 ` [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
2022-07-20 17:16   ` Adhemerval Zanella Netto
2022-07-19  1:22 ` [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
2022-07-20 17:16   ` Adhemerval Zanella Netto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).