diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2014-02-10 10:54:47 -0500 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2014-02-10 11:04:39 -0500 |
commit | 4372980f5881e7d537a52e3c49588ce116088061 (patch) | |
tree | 138fbc88313c8cb0cabee393e0c08afd67dac6f1 /ports/sysdeps/tile | |
parent | a1ffb40e32741f992c743e7b16c061fefa3747ac (diff) | |
download | glibc-4372980f5881e7d537a52e3c49588ce116088061.tar.gz glibc-4372980f5881e7d537a52e3c49588ce116088061.tar.xz glibc-4372980f5881e7d537a52e3c49588ce116088061.zip |
Move tilegx, tilepro, and linux-generic from ports to libc.
I've moved the TILE-Gx and TILEPro ports to the main sysdeps hierarchy, along with the linux-generic ports infrastructure. Beyond the README update, the move was just git mv ports/sysdeps/tile sysdeps/tile git mv ports/sysdeps/unix/sysv/linux/tile \ sysdeps/unix/sysv/linux/tile git mv ports/sysdeps/unix/sysv/linux/generic \ sysdeps/unix/sysv/linux/generic I updated the relevant ChangeLogs along the lines of the ARM move in commit c6bfe5c4d75 and tested the 64-bit tilegx build to confirm that there were no changes in "objdump -dr" output in the shared objects.
Diffstat (limited to 'ports/sysdeps/tile')
87 files changed, 0 insertions, 11677 deletions
diff --git a/ports/sysdeps/tile/Implies b/ports/sysdeps/tile/Implies deleted file mode 100644 index 5b29b26128..0000000000 --- a/ports/sysdeps/tile/Implies +++ /dev/null @@ -1,2 +0,0 @@ -ieee754/dbl-64 -ieee754/flt-32 diff --git a/ports/sysdeps/tile/Makefile b/ports/sysdeps/tile/Makefile deleted file mode 100644 index 3cd4d1e752..0000000000 --- a/ports/sysdeps/tile/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# We don't support long doubles as a distinct type. We don't need to set -# this variable; it's here mostly for documentational purposes. - -long-double-fcts = no - -ifeq ($(subdir),gmon) -sysdep_routines += _mcount -endif - -ifeq ($(subdir),elf) -# Extra shared linker files to link only into dl-allobjs.so. -sysdep-rtld-routines += dl-start __tls_get_addr -endif diff --git a/ports/sysdeps/tile/Versions b/ports/sysdeps/tile/Versions deleted file mode 100644 index b275d7ff3b..0000000000 --- a/ports/sysdeps/tile/Versions +++ /dev/null @@ -1,6 +0,0 @@ -libc { - GLIBC_2.12 { - # name requested by gcc community. - __mcount; - } -} diff --git a/ports/sysdeps/tile/__longjmp.S b/ports/sysdeps/tile/__longjmp.S deleted file mode 100644 index 2edcecc777..0000000000 --- a/ports/sysdeps/tile/__longjmp.S +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <jmpbuf-offsets.h> -#include <asm-syntax.h> -#include <arch/spr_def.h> - -/* PL to return to via iret in longjmp */ -#define RETURN_PL 0 - - .text -ENTRY (__longjmp) - FEEDBACK_ENTER(__longjmp) - -#define RESTORE(r) { LD r, r0 ; ADDI_PTR r0, r0, REGSIZE } - FOR_EACH_CALLEE_SAVED_REG(RESTORE) - - /* Make longjmp(buf, 0) return "1" instead. - At the same time, construct our iret context; we set ICS so - we can validly load EX_CONTEXT for iret without being - interrupted halfway through. */ - { - LD r2, r0 /* retrieve ICS bit from jmp_buf */ - movei r3, 1 - CMPEQI r0, r1, 0 - } - { - mtspr INTERRUPT_CRITICAL_SECTION, r3 - shli r2, r2, SPR_EX_CONTEXT_0_1__ICS_SHIFT - } - { - mtspr EX_CONTEXT_0_0, lr - ori r2, r2, RETURN_PL - } - { - or r0, r1, r0 - mtspr EX_CONTEXT_0_1, r2 - } - iret - jrp lr /* Keep the backtracer happy. */ -END (__longjmp) diff --git a/ports/sysdeps/tile/__tls_get_addr.S b/ports/sysdeps/tile/__tls_get_addr.S deleted file mode 100644 index e624fbcd56..0000000000 --- a/ports/sysdeps/tile/__tls_get_addr.S +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <tls.h> -#include <bits/wordsize.h> - -#if __WORDSIZE == 64 -#define LOG_SIZEOF_DTV_T 4 -#else -#define LOG_SIZEOF_DTV_T 3 -#endif - -/* On entry, r0 points to two words, the module and the offset. - On return, r0 holds the pointer to the relevant TLS memory. - Only registers r25..r29 are clobbered by the call. */ - - .text -ENTRY (__tls_get_addr) - { - lnk r25 - ADDI_PTR r27, tp, DTV_OFFSET - } -.Llnk: -#ifdef __tilegx__ - { - LD_PTR r27, r27 /* r27 = THREAD_DTV() */ - moveli r26, hw1_last(_rtld_local + TLS_GENERATION_OFFSET - .Llnk) - } - shl16insli r26, r26, hw0(_rtld_local + TLS_GENERATION_OFFSET - .Llnk) - { - ADD_PTR r25, r25, r26 - LD_PTR r26, r0 /* r26 = ti_module */ - } -#else - { - LD_PTR r27, r27 /* r27 = THREAD_DTV() */ - addli r25, r25, lo16(_rtld_local + TLS_GENERATION_OFFSET - .Llnk) - } - { - auli r25, r25, ha16(_rtld_local + TLS_GENERATION_OFFSET - .Llnk) - LD_PTR r26, r0 /* r26 = ti_module */ - } -#endif - LD_PTR r25, r25 /* r25 = DL(dl_tls_generation) */ - { - LD_PTR r28, r27 /* r28 = THREAD_DTV()->counter */ - ADDI_PTR r29, r0, __SIZEOF_POINTER__ - } - { - LD_PTR r29, r29 /* r29 = ti_offset */ - CMPEQ r25, r28, r25 /* r25 nonzero if generation OK */ - shli r28, r26, LOG_SIZEOF_DTV_T /* byte index into dtv array */ - } - { - BEQZ r25, .Lslowpath - CMPEQI r25, r26, -1 /* r25 nonzero if ti_module invalid */ - } - { - BNEZ r25, .Lslowpath - ADD_PTR r28, r28, r27 /* pointer into module array */ - } - LD_PTR r26, r28 /* r26 = module TLS pointer */ - CMPEQI r25, r26, -1 /* check r26 == TLS_DTV_UNALLOCATED */ - BNEZ r25, .Lslowpath - { - ADD_PTR r0, r26, r29 - jrp lr - } - -.Lslowpath: - { - ST sp, lr - ADDLI_PTR r29, sp, - (25 * REGSIZE) - } - cfi_offset (lr, 0) - { - ST r29, sp - ADDLI_PTR sp, sp, - (26 * REGSIZE) - } - cfi_def_cfa_offset (26 * REGSIZE) - ADDI_PTR r29, sp, (2 * REGSIZE) - { ST r29, r1; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r2; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r3; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r4; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r5; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r6; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r7; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r8; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r9; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r10; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r11; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r12; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r13; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r14; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r15; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r16; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r17; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r18; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r19; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r20; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r21; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r22; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r23; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r24; ADDI_PTR r29, r29, REGSIZE } - .hidden __tls_get_addr_slow - jal __tls_get_addr_slow - ADDI_PTR r29, sp, (2 * REGSIZE) - { LD r1, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r2, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r3, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r4, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r5, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r6, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r7, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r8, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r9, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r10, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r11, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r12, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r13, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r14, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r15, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r16, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r17, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r18, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r19, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r20, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r21, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r22, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r23, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r24, r29; ADDLI_PTR sp, sp, (26 * REGSIZE) } - cfi_def_cfa_offset (0) - LD lr, sp - jrp lr -END (__tls_get_addr) diff --git a/ports/sysdeps/tile/_mcount.S b/ports/sysdeps/tile/_mcount.S deleted file mode 100644 index c3648afec0..0000000000 --- a/ports/sysdeps/tile/_mcount.S +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - Based on work contributed by David Mosberger (davidm@cs.arizona.edu). - - 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 - <http://www.gnu.org/licenses/>. */ - -/* Assembly stub to invoke __mcount_internal(). Compiler-generated - code calls mcount after executing a function's prologue, placing - the "lr" register in "r10" for the call. As a result "lr" is the - function that invoked mcount, and "r10" is mcount's caller's - caller. However, we have to save all the parameter registers here - before invoking _mcount_internal. Callee-save and temporary - registers need no special attention. We save r10 and restore it to - lr on the way out, to properly handle the case of ENTRY() in - assembly code, before lr is saved. We use the name __mcount since - the gcc community prefers using the reserved namespace. */ - -#include <sysdep.h> - - .text -ENTRY(__mcount) - { - ST sp, lr - ADDI_PTR r29, sp, - (12 * REGSIZE) - } - cfi_offset (lr, 0) - { - ADDI_PTR sp, sp, - (13 * REGSIZE) - ST r29, sp - ADDI_PTR r29, r29, REGSIZE - } - cfi_def_cfa_offset (13 * REGSIZE) - { ST r29, r0; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r1; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r2; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r3; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r4; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r5; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r6; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r7; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r8; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r9; ADDI_PTR r29, r29, REGSIZE } - { ST r29, r10; ADDI_PTR r29, r29, REGSIZE; move r0, r10 } - { - move r1, lr - jal __mcount_internal - } - { - ADDI_PTR r29, sp, (2 * REGSIZE) - } - { LD r0, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r1, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r2, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r3, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r4, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r5, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r6, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r7, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r8, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r9, r29; ADDI_PTR r29, r29, REGSIZE } - { LD r10, r29; ADDI_PTR sp, sp, (13 * REGSIZE) } - cfi_def_cfa_offset (0) - { - LD lr, sp - } - { - move lr, r10 - jrp lr - } -END(__mcount) - -#undef mcount -weak_alias (__mcount, _mcount) /* exported in gmon/Versions */ -weak_alias (__mcount, mcount) /* exported in stdlib/Versions */ diff --git a/ports/sysdeps/tile/abort-instr.h b/ports/sysdeps/tile/abort-instr.h deleted file mode 100644 index 0f57da5198..0000000000 --- a/ports/sysdeps/tile/abort-instr.h +++ /dev/null @@ -1,2 +0,0 @@ -/* An instruction which should crash any program is `hlt'. */ -#define ABORT_INSTRUCTION asm ("ill") diff --git a/ports/sysdeps/tile/backtrace.c b/ports/sysdeps/tile/backtrace.c deleted file mode 100644 index 27ce597b39..0000000000 --- a/ports/sysdeps/tile/backtrace.c +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/x86_64/backtrace.c> diff --git a/ports/sysdeps/tile/bits/atomic.h b/ports/sysdeps/tile/bits/atomic.h deleted file mode 100644 index 2cbb086069..0000000000 --- a/ports/sysdeps/tile/bits/atomic.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* The sub-architecture headers provide definitions for these macros - that work for "int" and "long" size values only: - - atomic_compare_and_exchange_val_acq() - atomic_exchange_acq() - atomic_exchange_and_add() - atomic_and_val() - atomic_or_val() - atomic_decrement_if_positive() [tilegx only] - - Here we provide generic definitions true for all Tilera chips. */ - -#include <stdint.h> -#include <features.h> - -typedef int32_t atomic32_t; -typedef uint32_t uatomic32_t; -typedef int_fast32_t atomic_fast32_t; -typedef uint_fast32_t uatomic_fast32_t; - -typedef int64_t atomic64_t; -typedef uint64_t uatomic64_t; -typedef int_fast64_t atomic_fast64_t; -typedef uint_fast64_t uatomic_fast64_t; - -typedef intptr_t atomicptr_t; -typedef uintptr_t uatomicptr_t; -typedef intmax_t atomic_max_t; -typedef uintmax_t uatomic_max_t; - -/* Barrier macro. */ -#define atomic_full_barrier() __sync_synchronize() - -/* APIs with "release" semantics. */ -#define atomic_compare_and_exchange_val_rel(mem, n, o) \ - ({ \ - atomic_full_barrier (); \ - atomic_compare_and_exchange_val_acq ((mem), (n), (o)); \ - }) -#define atomic_compare_and_exchange_bool_rel(mem, n, o) \ - ({ \ - atomic_full_barrier (); \ - atomic_compare_and_exchange_bool_acq ((mem), (n), (o)); \ - }) -#define atomic_exchange_rel(mem, n) \ - ({ \ - atomic_full_barrier (); \ - atomic_exchange_acq ((mem), (n)); \ - }) - -/* Various macros that should just be synonyms. */ -#define catomic_exchange_and_add atomic_exchange_and_add -#define atomic_and(mem, mask) ((void) atomic_and_val ((mem), (mask))) -#define catomic_and atomic_and -#define atomic_or(mem, mask) ((void) atomic_or_val ((mem), (mask))) -#define catomic_or atomic_or - -/* atomic_bit_test_set in terms of atomic_or_val. */ -#define atomic_bit_test_set(mem, bit) \ - ({ __typeof (*(mem)) __att0_mask = ((__typeof (*(mem))) 1 << (bit)); \ - atomic_or_val ((mem), __att0_mask) & __att0_mask; }) - -/* - * This non-existent symbol is called for unsupporrted sizes, - * indicating a bug in the caller. - */ -extern int __atomic_error_bad_argument_size(void) - __attribute__ ((warning ("bad sizeof atomic argument"))); diff --git a/ports/sysdeps/tile/bits/byteswap.h b/ports/sysdeps/tile/bits/byteswap.h deleted file mode 100644 index 1e1007708b..0000000000 --- a/ports/sysdeps/tile/bits/byteswap.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead." -#endif - -#ifndef _BITS_BYTESWAP_H -#define _BITS_BYTESWAP_H 1 - -#include <bits/types.h> - -/* gcc __builtin_bswap64() can constant-fold, etc, so always use it. */ -#define __bswap_16(x) ((unsigned short)(__builtin_bswap32(x) >> 16)) -#define __bswap_32(x) ((unsigned int)__builtin_bswap32(x)) -#define __bswap_64(x) ((__uint64_t)__builtin_bswap64(x)) - -#define __bswap_constant_16(x) __bswap_16(x) -#define __bswap_constant_32(x) __bswap_32(x) -#define __bswap_constant_64(x) __bswap_64(x) - -#endif /* _BITS_BYTESWAP_H */ diff --git a/ports/sysdeps/tile/bits/endian.h b/ports/sysdeps/tile/bits/endian.h deleted file mode 100644 index 835042a7ac..0000000000 --- a/ports/sysdeps/tile/bits/endian.h +++ /dev/null @@ -1,11 +0,0 @@ -/* Set endianness for tile. */ - -#ifndef _ENDIAN_H -# error "Never use <bits/endian.h> directly; include <endian.h> instead." -#endif - -#if defined __BIG_ENDIAN__ -# define __BYTE_ORDER __BIG_ENDIAN -#else -# define __BYTE_ORDER __LITTLE_ENDIAN -#endif diff --git a/ports/sysdeps/tile/bits/fenv.h b/ports/sysdeps/tile/bits/fenv.h deleted file mode 100644 index b5092c5039..0000000000 --- a/ports/sysdeps/tile/bits/fenv.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _FENV_H -# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." -#endif - -/* The TILE-Gx hardware does not provide floating-point exception - handling, and TILEPro does not support any floating-point operations. */ -#define FE_ALL_EXCEPT 0 - -/* TILE-Gx supports only round-to-nearest. The software - floating-point support also acts this way. */ -enum - { - __FE_UNDEFINED = 0, - - FE_TONEAREST = -#define FE_TONEAREST 1 - FE_TONEAREST, - }; - -/* Type representing exception flags (if there were any). */ -typedef unsigned int fexcept_t; - -/* Type representing floating-point environment. */ -typedef unsigned int fenv_t; - -/* If the default argument is used we use this value. */ -#define FE_DFL_ENV ((const fenv_t *) -1l) diff --git a/ports/sysdeps/tile/bits/link.h b/ports/sysdeps/tile/bits/link.h deleted file mode 100644 index abc3496030..0000000000 --- a/ports/sysdeps/tile/bits/link.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _LINK_H -# error "Never include <bits/link.h> directly; use <link.h> instead." -#endif - -#define __need_int_reg_t -#include <arch/abi.h> - - -/* Registers for entry into PLT. */ -typedef struct La_tile_regs -{ - __uint_reg_t lr_reg[10]; -} La_tile_regs; - -/* Return values for calls from PLT. */ -typedef struct La_tile_retval -{ - /* Up to ten registers can be used for a return value (e.g. small struct). */ - __uint_reg_t lrv_reg[10]; -} La_tile_retval; - - -__BEGIN_DECLS - -extern ElfW(Addr) la_tile_gnu_pltenter (ElfW(Sym) *__sym, unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - La_tile_regs *__regs, - unsigned int *__flags, - const char *__symname, - long int *__framesizep); -extern unsigned int la_tile_gnu_pltexit (ElfW(Sym) *__sym, unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - const La_tile_regs *__inregs, - La_tile_retval *__outregs, - const char *__symname); - -__END_DECLS diff --git a/ports/sysdeps/tile/bits/mathdef.h b/ports/sysdeps/tile/bits/mathdef.h deleted file mode 100644 index d043b4af5f..0000000000 --- a/ports/sysdeps/tile/bits/mathdef.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#if !defined _MATH_H && !defined _COMPLEX_H -# error "Never use <bits/mathdef.h> directly; include <math.h> instead" -#endif - -#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF -# define _MATH_H_MATHDEF 1 - -/* "float" and "double" expressions evaluated as "float" and "double". */ -typedef float float_t; -typedef double double_t; - -/* The values returned by `ilogb' for 0 and NaN respectively. */ -# define FP_ILOGB0 (-2147483647) -# define FP_ILOGBNAN (2147483647) - -/* The GCC 4.6 compiler will define __FP_FAST_FMA{,F,L} if the fma{,f,l} - builtins are supported. */ -# if __FP_FAST_FMA -# define FP_FAST_FMA 1 -# endif - -# if __FP_FAST_FMAF -# define FP_FAST_FMAF 1 -# endif - -# if __FP_FAST_FMAL -# define FP_FAST_FMAL 1 -# endif - -#endif /* ISO C99 */ diff --git a/ports/sysdeps/tile/bits/mathinline.h b/ports/sysdeps/tile/bits/mathinline.h deleted file mode 100644 index f6f9102a98..0000000000 --- a/ports/sysdeps/tile/bits/mathinline.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _MATH_H -# error "Never use <bits/mathinline.h> directly; include <math.h> instead." -#endif - -#ifndef __extern_always_inline -# define __MATH_INLINE __inline -#else -# define __MATH_INLINE __extern_always_inline -#endif - - -#if defined __USE_ISOC99 && defined __GNUC__ - -/* Test for negative number. Used in the signbit() macro. */ -__MATH_INLINE int -__NTH (__signbitf (float __x)) -{ - return __builtin_signbitf (__x); -} -__MATH_INLINE int -__NTH (__signbit (double __x)) -{ - return __builtin_signbit (__x); -} - -#endif diff --git a/ports/sysdeps/tile/bits/setjmp.h b/ports/sysdeps/tile/bits/setjmp.h deleted file mode 100644 index a9ba3b986f..0000000000 --- a/ports/sysdeps/tile/bits/setjmp.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* Define the machine-dependent type `jmp_buf'. TILE version. */ -#ifndef _BITS_SETJMP_H -#define _BITS_SETJMP_H 1 - -#if !defined _SETJMP_H && !defined _PTHREAD_H -# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." -#endif - -#ifndef _ASM - -#define __need_int_reg_t -#include <arch/abi.h> - -typedef __uint_reg_t __jmp_buf[32]; - -#endif - -#endif /* bits/setjmp.h */ diff --git a/ports/sysdeps/tile/bsd-_setjmp.S b/ports/sysdeps/tile/bsd-_setjmp.S deleted file mode 100644 index 4e6a2da560..0000000000 --- a/ports/sysdeps/tile/bsd-_setjmp.S +++ /dev/null @@ -1 +0,0 @@ -/* _setjmp is in setjmp.S */ diff --git a/ports/sysdeps/tile/bsd-setjmp.S b/ports/sysdeps/tile/bsd-setjmp.S deleted file mode 100644 index 1da848d2f1..0000000000 --- a/ports/sysdeps/tile/bsd-setjmp.S +++ /dev/null @@ -1 +0,0 @@ -/* setjmp is in setjmp.S */ diff --git a/ports/sysdeps/tile/bzero.S b/ports/sysdeps/tile/bzero.S deleted file mode 100644 index 584c955746..0000000000 --- a/ports/sysdeps/tile/bzero.S +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - - .text -ENTRY(__bzero) - FEEDBACK_ENTER(__bzero) - { - move r2, r1 - move r1, zero - } - j __memset -END(__bzero) -weak_alias (__bzero, bzero) diff --git a/ports/sysdeps/tile/crti.S b/ports/sysdeps/tile/crti.S deleted file mode 100644 index 55eb238866..0000000000 --- a/ports/sysdeps/tile/crti.S +++ /dev/null @@ -1,124 +0,0 @@ -/* Special .init and .fini section support for tile. - Copyright (C) 2012-2014 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. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The GNU Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - Note that people who make modified versions of this file are not - obligated to grant this special exception for their modified - versions; it is their choice whether to do so. The GNU Lesser - General Public License gives permission to release a modified - version without this exception; this exception also makes it - possible to release a modified version which carries forward this - exception. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* crti.S puts a function prologue at the beginning of the .init and - .fini sections and defines global symbols for those addresses, so - they can be called as functions. The symbols _init and _fini are - magic and cause the linker to emit DT_INIT and DT_FINI. */ - -#include <libc-symbols.h> -#include <sysdep.h> - -#ifndef PREINIT_FUNCTION -# define PREINIT_FUNCTION __gmon_start__ -#endif - -#ifndef PREINIT_FUNCTION_WEAK -# define PREINIT_FUNCTION_WEAK 1 -#endif - -#if PREINIT_FUNCTION_WEAK - weak_extern (PREINIT_FUNCTION) -#else - .hidden PREINIT_FUNCTION -#endif - - .section .init,"ax",@progbits - .align 8 - .globl _init - .type _init, @function -_init: - { - move r29, sp - ADDI_PTR r28, sp, -REGSIZE - ST sp, lr - } - ADDI_PTR sp, sp, -(2 * REGSIZE) - ST r28, r29 -#if PREINIT_FUNCTION_WEAK - lnk r2 -0: -# ifdef __tilegx__ - moveli r1, hw2_last(_GLOBAL_OFFSET_TABLE_ - 0b) - { - shl16insli r1, r1, hw1(_GLOBAL_OFFSET_TABLE_ - 0b) - moveli r0, hw1_last_got(PREINIT_FUNCTION) - } - { - shl16insli r1, r1, hw0(_GLOBAL_OFFSET_TABLE_ - 0b) - shl16insli r0, r0, hw0_got(PREINIT_FUNCTION) - } -# else - { - moveli r1, lo16(_GLOBAL_OFFSET_TABLE_ - 0b) - moveli r0, got_lo16(PREINIT_FUNCTION) - } - { - auli r1, r1, ha16(_GLOBAL_OFFSET_TABLE_ - 0b) - auli r0, r0, got_ha16(PREINIT_FUNCTION) - } -# endif - ADD_PTR r0, r0, r1 - ADD_PTR r0, r0, r2 - LD_PTR r0, r0 - BEQZ r0, .Lno_weak_fn - jalr r0 -#elif defined(__tilegx__) && !defined(NO_PLT_PCREL) - /* Since we are calling from the start of the object to the PLT, - call by loading the full address into a register. */ - lnk r2 -0: - moveli r0, hw2_last_plt(PREINIT_FUNCTION - 0b) - shl16insli r0, r0, hw1_plt(PREINIT_FUNCTION - 0b) - shl16insli r0, r0, hw0_plt(PREINIT_FUNCTION - 0b) - add r0, r0, r2 - jalr r0 -#else - jal plt(PREINIT_FUNCTION) -#endif -.Lno_weak_fn: - - .section .fini,"ax",@progbits - .align 8 - .globl _fini - .type _fini, @function -_fini: - { - move r29, sp - ADDI_PTR r28, sp, -REGSIZE - ST sp, lr - } - ADDI_PTR sp, sp, -(2 * REGSIZE) - ST r28, r29 diff --git a/ports/sysdeps/tile/crtn.S b/ports/sysdeps/tile/crtn.S deleted file mode 100644 index 184ef8a665..0000000000 --- a/ports/sysdeps/tile/crtn.S +++ /dev/null @@ -1,55 +0,0 @@ -/* Special .init and .fini section support for tile. - Copyright (C) 2012-2014 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. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The GNU Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - Note that people who make modified versions of this file are not - obligated to grant this special exception for their modified - versions; it is their choice whether to do so. The GNU Lesser - General Public License gives permission to release a modified - version without this exception; this exception also makes it - possible to release a modified version which carries forward this - exception. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* crtn.S puts function epilogues in the .init and .fini sections - corresponding to the prologues in crti.S. */ - -#include <sysdep.h> - - .section .init,"ax",@progbits - ADDI_PTR r29, sp, (2 * REGSIZE) - { - ADDI_PTR sp, sp, (2 * REGSIZE) - LD lr, r29 - } - jrp lr - - .section .fini,"ax",@progbits - ADDI_PTR r29, sp, (2 * REGSIZE) - { - ADDI_PTR sp, sp, (2 * REGSIZE) - LD lr, r29 - } - jrp lr diff --git a/ports/sysdeps/tile/dl-lookupcfg.h b/ports/sysdeps/tile/dl-lookupcfg.h deleted file mode 100644 index 16c7cd849b..0000000000 --- a/ports/sysdeps/tile/dl-lookupcfg.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DL_UNMAP_IS_SPECIAL - -#include_next <dl-lookupcfg.h> - -struct link_map; - -void internal_function _dl_unmap (struct link_map *map); - -#define DL_UNMAP(map) _dl_unmap (map) diff --git a/ports/sysdeps/tile/dl-machine.h b/ports/sysdeps/tile/dl-machine.h deleted file mode 100644 index 8a24a92184..0000000000 --- a/ports/sysdeps/tile/dl-machine.h +++ /dev/null @@ -1,913 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - Based on work contributed by by Carl Pederson & Martin Schwidefsky. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef dl_machine_h -#define dl_machine_h - -#ifdef __tilegx__ -#define ELF_MACHINE_NAME "tilegx" -#else -#define ELF_MACHINE_NAME "tilepro" -#endif - -#include <sys/param.h> -#include <string.h> -#include <link.h> -#include <bits/wordsize.h> -#include <arch/icache.h> -#include <arch/opcode.h> - -/* Return nonzero iff ELF header is compatible with the running host. */ -static inline int -elf_machine_matches_host (const ElfW(Ehdr) *ehdr) -{ -#if defined __tilegx__ - if (ehdr->e_machine != EM_TILEGX) - return 0; -# if __WORDSIZE == 32 - return (ehdr->e_ident[EI_CLASS] == ELFCLASS32); -# else - return (ehdr->e_ident[EI_CLASS] == ELFCLASS64); -# endif -#elif defined __tilepro__ - return ehdr->e_machine == EM_TILEPRO; -#else -# error "Unknown tile architecture." -#endif -} - - -/* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ - -static inline ElfW(Addr) -elf_machine_dynamic (void) -{ - ElfW(Addr) *got; - -#ifdef __tilegx__ - ElfW(Addr) tmp; - asm( " { lnk %0; moveli %1, hw2_last(_GLOBAL_OFFSET_TABLE_ - 1f) }\n" - "1: shl16insli %1, %1, hw1(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " shl16insli %1, %1, hw0(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " add %0, %0, %1" - : "=r" (got), "=r" (tmp)); -#else - asm( " lnk %0\n" - "1: addli %0, %0, lo16(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " auli %0, %0, ha16(_GLOBAL_OFFSET_TABLE_ - 1b)" - : "=r" (got)); -#endif - - return *got; -} - - -/* Return the run-time load address of the shared object. */ -static inline ElfW(Addr) -elf_machine_load_address (void) -{ - ElfW(Addr) *got; - ElfW(Addr) dynamic; - -#ifdef __tilegx__ - ElfW(Addr) tmp; - asm( " lnk %2\n" - "1: {\n" - " moveli %0, hw2_last(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " moveli %1, hw2_last(_DYNAMIC - 1b)\n" - " }\n" - " {\n" - " shl16insli %0, %0, hw1(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " shl16insli %1, %1, hw1(_DYNAMIC - 1b)\n" - " }\n" - " {\n" - " shl16insli %0, %0, hw0(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " shl16insli %1, %1, hw0(_DYNAMIC - 1b)\n" - " }\n" - " {\n" - " add %0, %0, %2\n" - " add %1, %1, %2\n" - " }" - : "=r" (got), "=r" (dynamic), "=r" (tmp)); -#else - asm( " lnk %0\n" - "1: {\n" - " addli %0, %0, lo16(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " addli %1, %0, lo16(_DYNAMIC - 1b)\n" - " }\n" - " {\n" - " auli %0, %0, ha16(_GLOBAL_OFFSET_TABLE_ - 1b)\n" - " auli %1, %1, ha16(_DYNAMIC - 1b)\n" - " }\n" - : "=r" (got), "=r" (dynamic)); -#endif - - return dynamic - *got; -} - -/* Flush some range of the instruction cache. If invoked prior to - actually setting dl_pagesize, we conservatively use 4KB, which - is the smallest page size we could plausibly be running with. */ -static inline void -_dl_flush_icache (const void *addr, unsigned long size) -{ - invalidate_icache (addr, size, GLRO(dl_pagesize) ? : 4096); -} - -/* Set up the loaded object described by L so its unrelocated PLT - entries will jump to the on-demand fixup code in dl-runtime.c. */ - -static inline int __attribute__ ((unused)) -elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) -{ - ElfW(Addr) *gotplt; - extern void _dl_runtime_resolve (ElfW(Word)); - extern void _dl_runtime_profile (ElfW(Word)); - - if (l->l_info[DT_JMPREL] && lazy) - { - gotplt = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); - - /* The GOT entries for functions in the PLT have not yet been filled - in. Their initial contents will arrange when called to put in - registers an offset into the .rel.plt section, and gotplt[0], then - jump to gotplt[1]. */ - - /* Identify this shared object. */ - gotplt[0] = (ElfW(Addr)) l; - - /* The gotplt[1] entry contains the address of a function which gets - called to get the address of a so far unresolved function and jump - to it. The profiling extension of the dynamic linker allows to - intercept the calls to collect information. In this case we don't - store the address in the GOTPLT so that all future calls also end - in this function. */ - if (__builtin_expect (profile, 0)) - { - gotplt[1] = (ElfW(Addr)) &_dl_runtime_profile; - - if (GLRO(dl_profile) != NULL - && _dl_name_match_p (GLRO(dl_profile), l)) - /* This is the object we are looking for. Say that we really - want profiling and the timers are started. */ - GL(dl_profile_map) = l; - } - else - /* This function will get called to fix up the GOTPLT entry - indicated by the offset on the stack, and then jump to the - resolved address. */ - gotplt[1] = (ElfW(Addr)) &_dl_runtime_resolve; - } - - return lazy; -} - -#if __WORDSIZE == 32 -/* Mask identifying addresses reserved for the user program, - where the dynamic linker should not map anything. */ -#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL -#endif - -/* Initial entry point code for the dynamic linker. - The C function `_dl_start' is the real entry point; - its return value is the user program's entry point. */ - -#define RTLD_START asm (".globl _dl_start"); - -#ifndef RTLD_START_SPECIAL_INIT -#define RTLD_START_SPECIAL_INIT /* nothing */ -#endif - -/* Wrap a generic Tilera relocation type. */ -#ifdef __tilegx__ -#define R_TILE(x) R_TILEGX_##x -#define __R_TILE_TLS(x,c) R_TILEGX_TLS_##x##c -#define _R_TILE_TLS(x,c) __R_TILE_TLS(x,c) -#define R_TILE_TLS(x) _R_TILE_TLS(x,__ELF_NATIVE_CLASS) -#else -#define R_TILE(x) R_TILEPRO_##x -#define R_TILE_TLS(x) R_TILEPRO_TLS_##x##32 -#endif - -/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or - TLS variable, so undefined references should not be allowed to - define the value. - ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one - of the main executable's symbols, as for a COPY reloc. */ -#define elf_machine_type_class(type) \ - ((((type) == R_TILE(JMP_SLOT) || (type) == R_TILE_TLS(DTPMOD) \ - || (type) == R_TILE_TLS(DTPOFF) || (type) == R_TILE_TLS(TPOFF)) \ - * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_TILE(COPY)) * ELF_RTYPE_CLASS_COPY)) - -/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ -#define ELF_MACHINE_JMP_SLOT R_TILE(JMP_SLOT) - -/* TILE never uses Elf32_Rel relocations. */ -#define ELF_MACHINE_NO_REL 1 - -/* We define an initialization functions. This is called very early in - _dl_sysdep_start. */ -#define DL_PLATFORM_INIT dl_platform_init () - -static inline void __attribute__ ((unused)) -dl_platform_init (void) -{ - if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') - /* Avoid an empty string which would disturb us. */ - GLRO(dl_platform) = NULL; -} - -static inline ElfW(Addr) -elf_machine_fixup_plt (struct link_map *map, lookup_t t, - const ElfW(Rela) *reloc, - ElfW(Addr) *reloc_addr, ElfW(Addr) value) -{ - return *reloc_addr = value; -} - -/* Return the final value of a plt relocation. */ -static inline ElfW(Addr) -elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc, - ElfW(Addr) value) -{ - return value; -} - -/* Support notifying the simulator about new objects. */ -void internal_function _dl_after_load (struct link_map *l); -#define DL_AFTER_LOAD _dl_after_load - -/* Names of the architecture-specific auditing callback functions. */ -#define ARCH_LA_PLTENTER tile_gnu_pltenter -#define ARCH_LA_PLTEXIT tile_gnu_pltexit - -#endif /* !dl_machine_h */ - - -#ifdef RESOLVE_MAP - -struct reloc_howto -{ - /* Right shift operand by this number of bits. */ - unsigned char right_shift; - -#ifdef __tilegx__ - /* If nonzero, this is updating a code bundle. */ - unsigned char is_bundle_update; -#else - /* If nonzero, add 0x8000 to the value. */ - unsigned char add_0x8000; -#endif - - /* If nonzero, subtract the containing address from the address. */ - unsigned char is_pcrel; - - /* Size in bytes, or 0 if this table entry should be ignored. */ - unsigned char byte_size; -}; - -/* Relocation information. Cannot contain create_* function pointers - because then the table would not be position-independent. */ -static const struct reloc_howto howto[] = -{ -#ifdef __tilegx__ - -# if __WORDSIZE == 32 - /* The GX -m32 loader only handles 32-bit types, so it will be confused - by shifts larger than that. We convert them to just sign-extend; - they usually indicate a program bug or missed optimization, but we - have to handle them correctly anyway. */ -# define S32 31 -# define S48 31 -# else -# define S32 32 -# define S48 48 -# endif - - /* R_TILEGX_NONE */ { 0, 0, 0, 0 }, - /* R_TILEGX_64 */ { 0, 0, 0, 8 }, - /* R_TILEGX_32 */ { 0, 0, 0, 4 }, - /* R_TILEGX_16 */ { 0, 0, 0, 2 }, - /* R_TILEGX_8 */ { 0, 0, 0, 1 }, - /* R_TILEGX_64_PCREL */ { 0, 0, 1, 8 }, - /* R_TILEGX_32_PCREL */ { 0, 0, 1, 4 }, - /* R_TILEGX_16_PCREL */ { 0, 0, 1, 2 }, - /* R_TILEGX_8_PCREL */ { 0, 0, 1, 1 }, - /* R_TILEGX_HW0 */ { 0, 0, 0, 0 }, - /* R_TILEGX_HW1 */ { 16, 0, 0, 0 }, - /* R_TILEGX_HW2 */ { S32, 0, 0, 0 }, - /* R_TILEGX_HW3 */ { S48, 0, 0, 0 }, - /* R_TILEGX_HW0_LAST */ { 0, 0, 0, 0 }, - /* R_TILEGX_HW1_LAST */ { 16, 0, 0, 0 }, - /* R_TILEGX_HW2_LAST */ { S32, 0, 0, 0 }, - /* R_TILEGX_COPY */ { 0, 0, 0, 0 }, - /* R_TILEGX_GLOB_DAT */ { 0, 0, 0, 8 }, - /* R_TILEGX_JMP_SLOT */ { 0, 0, 0, 0 }, - /* R_TILEGX_RELATIVE */ { 0, 0, 0, 0 }, - /* R_TILEGX_BROFF_X1 */ { 3, 1, 1, 8 }, - /* R_TILEGX_JUMPOFF_X1 */ { 3, 1, 1, 8 }, - /* R_TILEGX_JUMPOFF_X1_PLT */ { 3, 1, 1, 8 }, - /* R_TILEGX_IMM8_X0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM8_Y0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM8_X1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM8_Y1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_DEST_IMM8_X1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_MT_IMM14_X1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_MF_IMM14_X1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_MMSTART_X0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_MMEND_X0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_SHAMT_X0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_SHAMT_X1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_SHAMT_Y0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_SHAMT_Y1 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0 */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1 */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1 */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2 */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2 */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW3 */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW3 */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0_LAST */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0_LAST */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1_LAST */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1_LAST */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2_LAST */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2_LAST */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0_PCREL */ { 0, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW0_PCREL */ { 0, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW1_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW1_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW2_PCREL */ { S32, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW2_PCREL */ { S32, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW3_PCREL */ { S48, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW3_PCREL */ { S48, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW0_LAST_PCREL */ { 0, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW0_LAST_PCREL */ { 0, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW1_LAST_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW1_LAST_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW2_LAST_PCREL */ { S32, 1, 1, 8 }, - /* R_TILEGX_IMM16_X1_HW2_LAST_PCREL */ { S32, 1, 1, 8 }, - /* R_TILEGX_IMM16_X0_HW0_GOT */ { 0, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW0_GOT */ { 0, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW1_GOT */ { 16, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW1_GOT */ { 16, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW2_GOT */ { S32, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW2_GOT */ { S32, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW3_GOT */ { S48, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW3_GOT */ { S48, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW0_LAST_GOT */ { 0, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW0_LAST_GOT */ { 0, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW1_LAST_GOT */ { 16, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW1_LAST_GOT */ { 16, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW2_LAST_GOT */ { S32, 1, 0, 0 }, - /* R_TILEGX_IMM16_X1_HW2_LAST_GOT */ { S32, 1, 0, 0 }, - /* R_TILEGX_IMM16_X0_HW0_TLS_GD */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0_TLS_GD */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1_TLS_GD */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1_TLS_GD */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2_TLS_GD */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2_TLS_GD */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW3_TLS_GD */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW3_TLS_GD */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD */{ 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD */{ 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD */{ 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD */{ 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD */{ S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD */{ S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0_TLS_IE */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0_TLS_IE */ { 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1_TLS_IE */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1_TLS_IE */ { 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2_TLS_IE */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2_TLS_IE */ { S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW3_TLS_IE */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW3_TLS_IE */ { S48, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE */{ 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE */{ 0, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE */{ 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE */{ 16, 1, 0, 8 }, - /* R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE */{ S32, 1, 0, 8 }, - /* R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE */{ S32, 1, 0, 8 }, - /* R_TILEGX_TLS_DTPMOD64 */ { 0, 0, 0, 0 }, - /* R_TILEGX_TLS_DTPOFF64 */ { 0, 0, 0, 0 }, - /* R_TILEGX_TLS_TPOFF64 */ { 0, 0, 0, 0 }, - /* R_TILEGX_TLS_DTPMOD32 */ { 0, 0, 0, 0 }, - /* R_TILEGX_TLS_DTPOFF32 */ { 0, 0, 0, 0 }, - /* R_TILEGX_TLS_TPOFF32 */ { 0, 0, 0, 0 } -#else - /* R_TILEPRO_NONE */ { 0, 0, 0, 0 }, - /* R_TILEPRO_32 */ { 0, 0, 0, 4 }, - /* R_TILEPRO_16 */ { 0, 0, 0, 2 }, - /* R_TILEPRO_8 */ { 0, 0, 0, 1 }, - /* R_TILEPRO_32_PCREL */ { 0, 0, 1, 4 }, - /* R_TILEPRO_16_PCREL */ { 0, 0, 1, 2 }, - /* R_TILEPRO_8_PCREL */ { 0, 0, 1, 1 }, - /* R_TILEPRO_LO16 */ { 0, 0, 0, 2 }, - /* R_TILEPRO_HI16 */ { 16, 0, 0, 2 }, - /* R_TILEPRO_HA16 */ { 16, 1, 0, 2 }, - /* R_TILEPRO_COPY */ { 0, 0, 0, 0 }, - /* R_TILEPRO_GLOB_DAT */ { 0, 0, 0, 4 }, - /* R_TILEPRO_JMP_SLOT */ { 0, 0, 0, 0 }, - /* R_TILEPRO_RELATIVE */ { 0, 0, 0, 0 }, - /* R_TILEPRO_BROFF_X1 */ { 3, 0, 1, 8 }, - /* R_TILEPRO_JOFFLONG_X1 */ { 3, 0, 1, 8 }, - /* R_TILEPRO_JOFFLONG_X1_PLT */ { 3, 0, 1, 8 }, - /* R_TILEPRO_IMM8_X0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM8_Y0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM8_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM8_Y1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_MT_IMM15_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_MF_IMM15_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_IMM16_X1_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_IMM16_X0_PCREL */ { 0, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X1_PCREL */ { 0, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X0_LO_PCREL */ { 0, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X1_LO_PCREL */ { 0, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X0_HI_PCREL */ { 16, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X1_HI_PCREL */ { 16, 0, 1, 8 }, - /* R_TILEPRO_IMM16_X0_HA_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEPRO_IMM16_X1_HA_PCREL */ { 16, 1, 1, 8 }, - /* R_TILEPRO_IMM16_X0_GOT */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X1_GOT */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X0_GOT_LO */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X1_GOT_LO */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X0_GOT_HI */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X1_GOT_HI */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X0_GOT_HA */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X1_GOT_HA */ { 0, 0, 0, 0 }, - /* R_TILEPRO_MMSTART_X0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_MMEND_X0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_MMSTART_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_MMEND_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_SHAMT_X0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_SHAMT_X1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_SHAMT_Y0 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_SHAMT_Y1 */ { 0, 0, 0, 8 }, - /* R_TILEPRO_SN_BROFF */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_IMM8 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_UIMM8 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_BYTE0 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_BYTE1 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_BYTE2 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_BYTE3 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_SPCREL0 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_SPCREL1 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_SPCREL2 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_SN_SPCREL3 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_IMM16_X0_TLS_GD */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_GD */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_GD_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_GD_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_GD_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_GD_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_GD_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_GD_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_IE */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_IE */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_IE_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_IE_LO */ { 0, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_IE_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_IE_HI */ { 16, 0, 0, 8 }, - /* R_TILEPRO_IMM16_X0_TLS_IE_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_IMM16_X1_TLS_IE_HA */ { 16, 1, 0, 8 }, - /* R_TILEPRO_TLS_DTPMOD32 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_TLS_DTPOFF32 */ { 0, 0, 0, 0 }, - /* R_TILEPRO_TLS_TPOFF32 */ { 0, 0, 0, 0 }, -#endif -}; - -#if __ELF_NATIVE_CLASS == 32 -#define ELFW_R_TYPE ELF32_R_TYPE -#define ELFW_ST_TYPE ELF32_ST_TYPE -#else -#define ELFW_R_TYPE ELF64_R_TYPE -#define ELFW_ST_TYPE ELF64_ST_TYPE -#endif - -/* Perform the relocation specified by RELOC and SYM (which is fully resolved). - MAP is the object containing the reloc. */ - -auto inline void __attribute__ ((always_inline)) -elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, - const ElfW(Sym) *sym, const struct r_found_version *version, - void *const reloc_addr_arg, int skip_ifunc) -{ - ElfW(Addr) *const reloc_addr = reloc_addr_arg; - const unsigned int r_type = ELFW_R_TYPE (reloc->r_info); - -#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC - if (__builtin_expect (r_type == R_TILE(RELATIVE), 0)) - { -# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC - /* This is defined in rtld.c, but nowhere in the static libc.a; - make the reference weak so static programs can still link. - This declaration cannot be done when compiling rtld.c - (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the - common defn for _dl_rtld_map, which is incompatible with a - weak decl in the same file. */ -# ifndef SHARED - weak_extern (GL(dl_rtld_map)); -# endif - if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */ -# endif - *reloc_addr = map->l_addr + reloc->r_addend; - return; - } -#endif - - if (__builtin_expect (r_type == R_TILE(NONE), 0)) - return; - -#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP - const ElfW(Sym) *const refsym = sym; -#endif - struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); - ElfW(Addr) value; - - if (sym == NULL) - value = 0; - else if (ELFW_ST_TYPE (sym->st_info) == STT_SECTION) - value = map->l_addr; /* like a RELATIVE reloc */ - else - value = sym_map->l_addr + sym->st_value; - - if (sym != NULL - && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) - && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1) - && __builtin_expect (!skip_ifunc, 1)) - value = ((Elf64_Addr (*) (void)) value) (); - - switch (r_type) - { - case R_TILE(JMP_SLOT): - elf_machine_fixup_plt (map, 0, reloc, reloc_addr, - value + reloc->r_addend); - return; - -#ifndef RESOLVE_CONFLICT_FIND_MAP - case R_TILE_TLS(DTPMOD): -# ifdef RTLD_BOOTSTRAP - /* During startup the dynamic linker is always the module - with index 1. - XXX If this relocation is necessary move before RESOLVE - call. */ - *reloc_addr = 1; -# else - /* Get the information from the link map returned by the - resolv function. */ - if (sym_map != NULL) - *reloc_addr = sym_map->l_tls_modid; -# endif - return; - case R_TILE_TLS(DTPOFF): -# ifndef RTLD_BOOTSTRAP - /* During relocation all TLS symbols are defined and used. - Therefore the offset is already correct. */ - if (sym != NULL) - *reloc_addr = sym->st_value + reloc->r_addend; -# endif - return; - case R_TILE_TLS(TPOFF): -# ifdef RTLD_BOOTSTRAP - *reloc_addr = sym->st_value + reloc->r_addend + map->l_tls_offset; -# else - if (sym != NULL) - { - CHECK_STATIC_TLS (map, sym_map); - *reloc_addr = (sym->st_value + reloc->r_addend - + sym_map->l_tls_offset); - } -#endif - return; -#endif /* use TLS */ - -#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP - /* Not needed in dl-conflict.c. */ - case R_TILE(COPY): - if (sym == NULL) - /* This can happen in trace mode if an object could not be found. */ - return; - if (__builtin_expect (sym->st_size > refsym->st_size, 0) - || (__builtin_expect (sym->st_size < refsym->st_size, 0) - && __builtin_expect (GLRO(dl_verbose), 0))) - { - const char *strtab; - - strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]); - _dl_error_printf ("%s: Symbol `%s' has different size in shared" - " object, consider re-linking\n", - RTLD_PROGNAME, strtab + refsym->st_name); - } - memcpy (reloc_addr_arg, (void *) value, - MIN (sym->st_size, refsym->st_size)); - return; -#endif - } - - /* All remaining relocations must be in the lookup table. */ - const struct reloc_howto *h = &howto[r_type]; - if ((unsigned int) r_type >= sizeof howto / sizeof howto[0] || - h->byte_size == 0) - { -#if !defined RTLD_BOOTSTRAP || defined _NDEBUG - /* We add these checks in the version to relocate ld.so only - if we are still debugging. */ - _dl_reloc_bad_type (map, r_type, 0); -#endif - return; - } - - value += reloc->r_addend; - - /* The lookup table entry knows how to perform this reloc. */ - if (h->is_pcrel) - value -= (ElfW(Addr)) reloc_addr; - -#ifndef __tilegx__ - if (h->add_0x8000) - value += 0x8000; -#endif - - value >>= h->right_shift; - - switch (h->byte_size) - { - case 1: - *(char *) reloc_addr = value; - return; - case 2: - *(short *) reloc_addr = value; - return; - case 4: - *(int *) reloc_addr = value; - return; -#ifdef __tilegx__ - case 8: - if (!h->is_bundle_update) - { - *(ElfW(Addr) *) reloc_addr = value; - return; - } -#endif - } - - /* We are updating a bundle, so use the function pointer that - swizzles the operand bits into the right location. */ - - tile_bundle_bits *p = (tile_bundle_bits *) reloc_addr; - tile_bundle_bits bits = *p; - -#define MUNGE(func) do { \ - bits = ((bits & ~create_##func (-1)) | create_##func (value)); \ - if (get_##func (bits) != value) \ - _dl_signal_error (0, map->l_name, NULL, \ - "relocation value too large for " #func); \ - } while (0) - -#define MUNGE_NOCHECK(func) \ - bits = ((bits & ~create_##func (-1)) | create_##func (value)) - - switch (r_type) - { -#ifdef __tilegx__ - case R_TILEGX_BROFF_X1: - MUNGE (BrOff_X1); - break; - case R_TILEGX_JUMPOFF_X1: - case R_TILEGX_JUMPOFF_X1_PLT: - MUNGE (JumpOff_X1); - break; - case R_TILEGX_IMM8_X0: - MUNGE (Imm8_X0); - break; - case R_TILEGX_IMM8_Y0: - MUNGE (Imm8_Y0); - break; - case R_TILEGX_IMM8_X1: - MUNGE (Imm8_X1); - break; - case R_TILEGX_IMM8_Y1: - MUNGE (Imm8_Y1); - break; - case R_TILEGX_MT_IMM14_X1: - MUNGE (MT_Imm14_X1); - break; - case R_TILEGX_MF_IMM14_X1: - MUNGE (MF_Imm14_X1); - break; - case R_TILEGX_IMM16_X0_HW0: - case R_TILEGX_IMM16_X0_HW1: - case R_TILEGX_IMM16_X0_HW2: - case R_TILEGX_IMM16_X0_HW3: - case R_TILEGX_IMM16_X0_HW0_PCREL: - case R_TILEGX_IMM16_X0_HW1_PCREL: - case R_TILEGX_IMM16_X0_HW2_PCREL: - case R_TILEGX_IMM16_X0_HW3_PCREL: - case R_TILEGX_IMM16_X0_HW0_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_TLS_IE: - MUNGE_NOCHECK (Imm16_X0); - break; - case R_TILEGX_IMM16_X0_HW0_LAST: - case R_TILEGX_IMM16_X0_HW1_LAST: - case R_TILEGX_IMM16_X0_HW2_LAST: - case R_TILEGX_IMM16_X0_HW0_LAST_PCREL: - case R_TILEGX_IMM16_X0_HW1_LAST_PCREL: - case R_TILEGX_IMM16_X0_HW2_LAST_PCREL: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: - MUNGE (Imm16_X0); - break; - case R_TILEGX_IMM16_X1_HW0: - case R_TILEGX_IMM16_X1_HW1: - case R_TILEGX_IMM16_X1_HW2: - case R_TILEGX_IMM16_X1_HW3: - case R_TILEGX_IMM16_X1_HW0_PCREL: - case R_TILEGX_IMM16_X1_HW1_PCREL: - case R_TILEGX_IMM16_X1_HW2_PCREL: - case R_TILEGX_IMM16_X1_HW3_PCREL: - case R_TILEGX_IMM16_X1_HW0_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_TLS_IE: - MUNGE_NOCHECK (Imm16_X1); - break; - case R_TILEGX_IMM16_X1_HW0_LAST: - case R_TILEGX_IMM16_X1_HW1_LAST: - case R_TILEGX_IMM16_X1_HW2_LAST: - case R_TILEGX_IMM16_X1_HW0_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW1_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW2_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: - MUNGE (Imm16_X1); - break; - case R_TILEGX_MMSTART_X0: - MUNGE (BFStart_X0); - break; - case R_TILEGX_MMEND_X0: - MUNGE (BFEnd_X0); - break; - case R_TILEGX_SHAMT_X0: - MUNGE (ShAmt_X0); - break; - case R_TILEGX_SHAMT_X1: - MUNGE (ShAmt_X1); - break; - case R_TILEGX_SHAMT_Y0: - MUNGE (ShAmt_Y0); - break; - case R_TILEGX_SHAMT_Y1: - MUNGE (ShAmt_Y1); - break; -#else - case R_TILEPRO_BROFF_X1: - MUNGE (BrOff_X1); - break; - case R_TILEPRO_JOFFLONG_X1: - case R_TILEPRO_JOFFLONG_X1_PLT: - MUNGE_NOCHECK (JOffLong_X1); /* holds full 32-bit value */ - break; - case R_TILEPRO_IMM8_X0: - MUNGE (Imm8_X0); - break; - case R_TILEPRO_IMM8_Y0: - MUNGE (Imm8_Y0); - break; - case R_TILEPRO_IMM8_X1: - MUNGE (Imm8_X1); - break; - case R_TILEPRO_IMM8_Y1: - MUNGE (Imm8_Y1); - break; - case R_TILEPRO_MT_IMM15_X1: - MUNGE (MT_Imm15_X1); - break; - case R_TILEPRO_MF_IMM15_X1: - MUNGE (MF_Imm15_X1); - break; - case R_TILEPRO_IMM16_X0_LO: - case R_TILEPRO_IMM16_X0_HI: - case R_TILEPRO_IMM16_X0_HA: - case R_TILEPRO_IMM16_X0_LO_PCREL: - case R_TILEPRO_IMM16_X0_HI_PCREL: - case R_TILEPRO_IMM16_X0_HA_PCREL: - case R_TILEPRO_IMM16_X0_TLS_GD_LO: - case R_TILEPRO_IMM16_X0_TLS_GD_HI: - case R_TILEPRO_IMM16_X0_TLS_GD_HA: - case R_TILEPRO_IMM16_X0_TLS_IE_LO: - case R_TILEPRO_IMM16_X0_TLS_IE_HI: - case R_TILEPRO_IMM16_X0_TLS_IE_HA: - MUNGE_NOCHECK (Imm16_X0); - break; - case R_TILEPRO_IMM16_X0: - case R_TILEPRO_IMM16_X0_PCREL: - case R_TILEPRO_IMM16_X0_TLS_GD: - case R_TILEPRO_IMM16_X0_TLS_IE: - MUNGE (Imm16_X0); - break; - case R_TILEPRO_IMM16_X1_LO: - case R_TILEPRO_IMM16_X1_HI: - case R_TILEPRO_IMM16_X1_HA: - case R_TILEPRO_IMM16_X1_LO_PCREL: - case R_TILEPRO_IMM16_X1_HI_PCREL: - case R_TILEPRO_IMM16_X1_HA_PCREL: - case R_TILEPRO_IMM16_X1_TLS_GD_LO: - case R_TILEPRO_IMM16_X1_TLS_GD_HI: - case R_TILEPRO_IMM16_X1_TLS_GD_HA: - case R_TILEPRO_IMM16_X1_TLS_IE_LO: - case R_TILEPRO_IMM16_X1_TLS_IE_HI: - case R_TILEPRO_IMM16_X1_TLS_IE_HA: - MUNGE_NOCHECK (Imm16_X1); - break; - case R_TILEPRO_IMM16_X1: - case R_TILEPRO_IMM16_X1_PCREL: - case R_TILEPRO_IMM16_X1_TLS_GD: - case R_TILEPRO_IMM16_X1_TLS_IE: - MUNGE (Imm16_X1); - break; - case R_TILEPRO_MMSTART_X0: - MUNGE (MMStart_X0); - break; - case R_TILEPRO_MMEND_X0: - MUNGE (MMEnd_X0); - break; - case R_TILEPRO_MMSTART_X1: - MUNGE (MMStart_X1); - break; - case R_TILEPRO_MMEND_X1: - MUNGE (MMEnd_X1); - break; - case R_TILEPRO_SHAMT_X0: - MUNGE (ShAmt_X0); - break; - case R_TILEPRO_SHAMT_X1: - MUNGE (ShAmt_X1); - break; - case R_TILEPRO_SHAMT_Y0: - MUNGE (ShAmt_Y0); - break; - case R_TILEPRO_SHAMT_Y1: - MUNGE (ShAmt_Y1); - break; -#endif - } -#undef MUNGE - *p = bits; - _dl_flush_icache (p, sizeof (*p)); -} - -auto inline void __attribute__ ((always_inline)) -elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, - void *const reloc_addr_arg) -{ - ElfW(Addr) *const reloc_addr = reloc_addr_arg; - *reloc_addr = l_addr + reloc->r_addend; -} - -auto inline void __attribute__ ((always_inline)) -elf_machine_lazy_rel (struct link_map *map, - ElfW(Addr) l_addr, const ElfW(Rela) *reloc, - int skip_ifunc) -{ - const unsigned int r_type = ELF32_R_TYPE (reloc->r_info); - - /* Check for unexpected PLT reloc type. */ - if (__builtin_expect (r_type == R_TILE(JMP_SLOT), 1)) - { - *(ElfW(Addr) *) (l_addr + reloc->r_offset) += l_addr; - } - else - _dl_reloc_bad_type (map, r_type, 1); -} - -#endif /* RESOLVE_MAP */ diff --git a/ports/sysdeps/tile/dl-runtime.c b/ports/sysdeps/tile/dl-runtime.c deleted file mode 100644 index 3bfb830320..0000000000 --- a/ports/sysdeps/tile/dl-runtime.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* Like x86_64, we pass the index of the relocation and not its offset. - In _dl_profile_fixup and _dl_call_pltexit we also use the index. - Therefore it is wasteful to compute the offset in the trampoline - just to reverse the operation immediately afterwards. */ -#define reloc_offset reloc_arg * sizeof (PLTREL) -#define reloc_index reloc_arg - -#include <elf/dl-runtime.c> - -#include <sys/mman.h> -#include <arch/sim.h> - -/* Like realpath(), but simplified: no dynamic memory use, no lstat(), - no set_errno(), no valid "rpath" on error, etc. This handles some - simple cases where the simulator might not have a valid entry for - a loaded Elf object, in particular dlopen() with a relative path. - For this relatively rare case, one could also imagine using - link_map.l_origin to avoid the getcwd() here, but the simpler code - here seems like a better solution. */ -static char * -dl_realpath (const char *name, char *rpath) -{ - char *dest; - const char *start, *end; - - if (name[0] != '/') - { - if (!__getcwd (rpath, PATH_MAX)) - return NULL; - dest = __rawmemchr (rpath, '\0'); - } - else - { - rpath[0] = '/'; - dest = rpath + 1; - } - - for (start = end = name; *start; start = end) - { - /* Skip sequence of multiple path-separators. */ - while (*start == '/') - ++start; - - /* Find end of path component. */ - for (end = start; *end && *end != '/'; ++end) - /* Nothing. */; - - if (end - start == 0) - break; - else if (end - start == 1 && start[0] == '.') - /* nothing */; - else if (end - start == 2 && start[0] == '.' && start[1] == '.') - { - /* Back up to previous component, ignore if at root already. */ - if (dest > rpath + 1) - while ((--dest)[-1] != '/'); - } - else - { - if (dest[-1] != '/') - *dest++ = '/'; - - if (dest + (end - start) >= rpath + PATH_MAX) - return NULL; - - dest = __mempcpy (dest, start, end - start); - *dest = '\0'; - } - } - if (dest > rpath + 1 && dest[-1] == '/') - --dest; - *dest = '\0'; - - return rpath; -} - -/* Support notifying the simulator about new objects. */ -void internal_function -_dl_after_load (struct link_map *l) -{ - int shift; - char pathbuf[PATH_MAX]; - char *path; - - /* Don't bother if not in the simulator. */ - if (__insn_mfspr (SPR_SIM_CONTROL) == 0) - return; - -#define DLPUTC(c) __insn_mtspr (SPR_SIM_CONTROL, \ - (SIM_CONTROL_DLOPEN \ - | ((c) << _SIM_CONTROL_OPERATOR_BITS))) - - /* Write the library address in hex. */ - DLPUTC ('0'); - DLPUTC ('x'); - for (shift = (int) sizeof (unsigned long) * 8 - 4; shift >= 0; shift -= 4) - DLPUTC ("0123456789abcdef"[(l->l_map_start >> shift) & 0xF]); - DLPUTC (':'); - - /* Write the library path, including the terminating '\0'. */ - path = dl_realpath (l->l_name, pathbuf) ?: l->l_name; - for (size_t i = 0;; i++) - { - DLPUTC (path[i]); - if (path[i] == '\0') - break; - } -#undef DLPUTC -} - -/* Support notifying the simulator about removed objects prior to munmap(). */ -static void -sim_dlclose (ElfW(Addr) map_start) -{ - int shift; - - /* Don't bother if not in the simulator. */ - if (__insn_mfspr (SPR_SIM_CONTROL) == 0) - return; - -#define DLPUTC(c) __insn_mtspr (SPR_SIM_CONTROL, \ - (SIM_CONTROL_DLCLOSE \ - | ((c) << _SIM_CONTROL_OPERATOR_BITS))) - - /* Write the library address in hex. */ - DLPUTC ('0'); - DLPUTC ('x'); - for (shift = (int) sizeof (unsigned long) * 8 - 4; shift >= 0; shift -= 4) - DLPUTC ("0123456789abcdef"[(map_start >> shift) & 0xF]); - DLPUTC ('\0'); - -#undef DLPUTC -} - -void internal_function -_dl_unmap (struct link_map *l) -{ - sim_dlclose (l->l_map_start); - __munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start); -} diff --git a/ports/sysdeps/tile/dl-start.S b/ports/sysdeps/tile/dl-start.S deleted file mode 100644 index d13f6096dc..0000000000 --- a/ports/sysdeps/tile/dl-start.S +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - - /* Get address of "sym" in "reg" assuming r51 holds ".Llink". */ - .macro pic_addr reg, sym -#ifdef __tilegx__ - moveli \reg, hw1_last(\sym - .Llink) - shl16insli \reg, \reg, hw0(\sym - .Llink) - ADD_PTR \reg, r51, \reg -#else - ADDLI_PTR \reg, r51, lo16(\sym - .Llink) - auli \reg, \reg, ha16(\sym - .Llink) -#endif - .endm - - .text -ENTRY (_start) - /* Linux starts us with sp pointing at the conventional Elf layout, - but we need to allow two 'caller' words for our ABI convention. */ - { - move r52, sp - andi sp, sp, -8 - } - cfi_def_cfa_register (r52) - { - /* Point sp at base of ABI area; point r4 to the caller-sp word. */ - ADDI_PTR sp, sp, -(2 * REGSIZE) - ADDI_PTR r4, sp, -REGSIZE - } - { - /* Save zero for caller sp in our 'caller' save area, and make - sure lr has a zero value, to limit backtraces. */ - move lr, zero - ST r4, zero - } - { - move r0, r52 - jal _dl_start - } - /* Save returned start of user program address for later. */ - move r50, r0 - - /* See if we were invoked explicitly with the dynamic loader, - in which case we have to adjust the argument vector. */ - lnk r51; .Llink: - pic_addr r4, _dl_skip_args - LD4U r4, r4 - BEQZT r4, .Lno_skip - - /* Load the argc word at the initial sp and adjust it. - We basically jump "sp" up over the first few argv entries - and write "argc" a little higher up in memory, to be the - base of the new kernel-initialized stack area. */ - LD_PTR r0, r52 - { - sub r0, r0, r4 - SHL_PTR_ADD r52, r4, r52 - } - { - ST_PTR r52, r0 - SHL_PTR_ADD sp, r4, sp - } - andi sp, sp, -8 - -.Lno_skip: - /* Call_dl_init (_dl_loaded, argc, argv, envp). See elf/start.s - for the layout of memory here; r52 is pointing to "+0". */ - pic_addr r0, _rtld_local - { - LD_PTR r1, r52 /* load argc in r1 */ - ADDLI_PTR r2, r52, __SIZEOF_POINTER__ /* point r2 at argv */ - } - { - LD_PTR r0, r0 /* yields _rtld_global._ns_loaded */ - addi r3, r1, 1 - move lr, zero - } - { - SHL_PTR_ADD r3, r3, r2 /* point r3 at envp */ - jal _dl_init_internal - } - - /* Call user program whose address we saved in r50. - We invoke it just like a static binary, but with _dl_fini - in r0 so we can distinguish. */ - - pic_addr r0, _dl_fini - move lr, zero - { - move sp, r52 - jr r50 - } - - /* Tell backtracer to give up (_start has no caller). */ - info 2 /* INFO_OP_CANNOT_BACKTRACE */ - -END (_start) diff --git a/ports/sysdeps/tile/dl-tls.c b/ports/sysdeps/tile/dl-tls.c deleted file mode 100644 index c98527def8..0000000000 --- a/ports/sysdeps/tile/dl-tls.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifdef SHARED -/* We provide a fast-path version of __tls_get_addr to allow for - the normal case to be fast, both by coding the function tightly, - and more importantly by fixing its register clobber API so the - compiler can avoid having to set up frames, etc., unnecessarily. */ -#define __tls_get_addr __tls_get_addr_slow -#endif - -#include <elf/dl-tls.c> diff --git a/ports/sysdeps/tile/dl-tls.h b/ports/sysdeps/tile/dl-tls.h deleted file mode 100644 index 03b9433ad6..0000000000 --- a/ports/sysdeps/tile/dl-tls.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - - -/* Type used for the representation of TLS information in the GOT. */ -typedef struct -{ - unsigned long int ti_module; - unsigned long int ti_offset; -} tls_index; - -/* Fast-path function to get a TLS pointer. */ -extern void *__tls_get_addr (tls_index *ti); - -/* The thread pointer points to the first static TLS block. */ -#define TLS_TP_OFFSET 0 - -/* Dynamic thread vector pointers at the start of each TLS block. */ -#define TLS_DTV_OFFSET 0 - -/* Compute the value for a GOTTPREL reloc. */ -#define TLS_TPREL_VALUE(sym_map, sym) \ - ((sym_map)->l_tls_offset + (sym)->st_value - TLS_TP_OFFSET) - -/* Compute the value for a DTPREL reloc. */ -#define TLS_DTPREL_VALUE(sym) \ - ((sym)->st_value - TLS_DTV_OFFSET) - -/* Value used for dtv entries for which the allocation is delayed. */ -#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/ports/sysdeps/tile/dl-trampoline.S b/ports/sysdeps/tile/dl-trampoline.S deleted file mode 100644 index 7a4914ef6e..0000000000 --- a/ports/sysdeps/tile/dl-trampoline.S +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <arch/abi.h> - -/* This function is called via the PLT header, which is called - from an individual PLT entry. - - At this point we have several values passed in: - - lr: return address to original user code - r28: the tpnt value to pass to _dl_runtime_resolver - r29: the PLT index of the invoked jump table entry. - - We set up a frame entry that looks like this (in int_reg_t units): - - +57: r25 return values from function... - +56: r24 - [...] - +33: r1 - +32: r0 - +31: PLT index - +30: tpnt - +29: stackframe - +28: caller lr - +27: r25 arguments to function... - +26: r24 - [...] - +3: r1 - +2: r0 - +1: standard ABI slot (sp) - +0: standard ABI slot (callee lr) - - The entries from "stackframe" up are only used in _dl_profile_resolve. - We save and restore r0 through r25, rather than the strictly - architected r0 through r9, to support unusual calling conventions; - for example, __tls_get_addr takes r0 and returns r0, but promises - not to clobber r1 through r24 to support its usual fast path. */ - -#define FRAME_SP (1 * REGSIZE) -#define FRAME_REGS (2 * REGSIZE) -#define FRAME_LR (28 * REGSIZE) /* Must follow FRAME_REGS */ -#define FRAME_STACKFRAME (29 * REGSIZE) -#define FRAME_TPNT (30 * REGSIZE) -#define FRAME_INDEX (31 * REGSIZE) -#define FRAME_RETVAL (32 * REGSIZE) - -#define FRAME_SIZE_SMALL (30 * REGSIZE) -#define FRAME_SIZE_LARGE (58 * REGSIZE) - -#define FOR_EACH_REG(f) \ - f(r0); f(r1); f(r2); f(r3); \ - f(r4); f(r5); f(r6); f(r7); \ - f(r8); f(r9); f(r10); f(r11); \ - f(r12); f(r13); f(r14); f(r15); \ - f(r16); f(r17); f(r18); f(r19); \ - f(r20); f(r21); f(r22); f(r23); \ - f(r24); f(r25) - -#define SAVE(REG) { ST r27, REG; ADDI_PTR r27, r27, REGSIZE } -#define RESTORE(REG) { LD REG, r27; ADDI_PTR r27, r27, REGSIZE } - - .macro dl_resolve, name, profile, framesize -.text -.global \name -.hidden \name -/* Note that cpp expands ENTRY(\name) incorrectly. */ -.type \name,@function -.align 8 -\name: - cfi_startproc - { - ST sp, lr - move r26, sp - } - { - ADDLI_PTR sp, sp, -\framesize - ADDLI_PTR r27, sp, FRAME_SP - \framesize - } - cfi_def_cfa_offset (\framesize) - { - ST r27, r26 - ADDI_PTR r27, r27, FRAME_REGS - FRAME_SP - } - FOR_EACH_REG(SAVE) - { - ST r27, lr - ADDLI_PTR r27, sp, FRAME_TPNT - } - cfi_offset (lr, FRAME_LR - \framesize) - .if \profile - { - move r0, r28 /* tpnt value */ - ST r27, r28 - ADDI_PTR r27, r27, FRAME_INDEX - FRAME_TPNT - } - { - move r1, r29 /* PLT index */ - ST r27, r29 - } - { - move r2, lr /* retaddr */ - ADDI_PTR r3, sp, FRAME_REGS /* La_tile_regs pointer */ - } - { - ADDLI_PTR r4, sp, FRAME_STACKFRAME /* framesize pointer */ - jal _dl_profile_fixup - } - ADDLI_PTR r28, sp, FRAME_STACKFRAME - LD_PTR r28, r28 - BGTZ r28, 1f - .else - { - move r0, r28 /* tpnt value 1 */ - move r1, r29 /* PLT index 2 */ - } - jal _dl_fixup - .endif - { - /* Copy aside the return value so we can restore r0 below. */ - move r29, r0 - /* Set up r27 to let us start restoring registers. */ - ADDLI_PTR r27, sp, FRAME_REGS - } - FOR_EACH_REG(RESTORE) - .if \profile - ADDLI_PTR r28, sp, FRAME_STACKFRAME - LD r28, r28 - BGTZ r28, 1f - .endif - { - /* Restore original user return address. */ - LD lr, r27 - /* Pop off our stack frame. */ - ADDLI_PTR sp, sp, \framesize - } - cfi_def_cfa_offset (0) - jr r29 /* Transfer control to freshly loaded code. */ - jrp lr /* Keep backtracer happy. */ - - .if \profile -1: jalr r29 /* Call resolved function. */ - { - ADDLI_PTR r28, sp, FRAME_TPNT - ADDLI_PTR r27, sp, FRAME_RETVAL - } - FOR_EACH_REG(SAVE) - { - LD r0, r28 - ADDI_PTR r28, r28, FRAME_INDEX - FRAME_TPNT - } - { - LD r1, r28 - ADDLI_PTR r2, sp, FRAME_REGS - } - { - ADDLI_PTR r3, sp, FRAME_RETVAL - jal _dl_call_pltexit - } - { - ADDLI_PTR lr, sp, FRAME_LR - ADDLI_PTR r27, sp, FRAME_RETVAL - } - FOR_EACH_REG(RESTORE) - { - LD lr, lr - ADDLI_PTR sp, sp, \framesize - } - jrp lr - .endif -END (\name) - .endm - - dl_resolve _dl_runtime_resolve, 0, FRAME_SIZE_SMALL -#ifndef PROF - dl_resolve _dl_runtime_profile, 1, FRAME_SIZE_LARGE -#endif diff --git a/ports/sysdeps/tile/ffs.c b/ports/sysdeps/tile/ffs.c deleted file mode 100644 index 3e52f8c6ef..0000000000 --- a/ports/sysdeps/tile/ffs.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#define ffsl __something_else -#include <string.h> - -#undef ffs -int -__ffs (int x) -{ - return __builtin_ffs (x); -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) - -#undef ffsll -int -ffsll (long long x) -{ - return __builtin_ffsll (x); -} - -#undef ffsl -#if ULONG_MAX == UINT_MAX -weak_alias (__ffs, ffsl) -#else -weak_alias (ffsll, ffsl) -#endif diff --git a/ports/sysdeps/tile/ffsll.c b/ports/sysdeps/tile/ffsll.c deleted file mode 100644 index 180eaa8c23..0000000000 --- a/ports/sysdeps/tile/ffsll.c +++ /dev/null @@ -1 +0,0 @@ -/* This function is defined in ffs.c. */ diff --git a/ports/sysdeps/tile/gccframe.h b/ports/sysdeps/tile/gccframe.h deleted file mode 100644 index 22a5463eb6..0000000000 --- a/ports/sysdeps/tile/gccframe.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define FIRST_PSEUDO_REGISTER 64 - -#include <sysdeps/generic/gccframe.h> diff --git a/ports/sysdeps/tile/jmpbuf-offsets.h b/ports/sysdeps/tile/jmpbuf-offsets.h deleted file mode 100644 index c16175f370..0000000000 --- a/ports/sysdeps/tile/jmpbuf-offsets.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* We don't use most of these symbols; they are here for documentation. */ -#define JB_R30 0 -#define JB_R31 1 -#define JB_R32 2 -#define JB_R33 3 -#define JB_R34 4 -#define JB_R35 5 -#define JB_R36 6 -#define JB_R37 7 -#define JB_R38 8 -#define JB_R39 9 -#define JB_R40 10 -#define JB_R41 11 -#define JB_R42 12 -#define JB_R43 13 -#define JB_R44 14 -#define JB_R45 15 -#define JB_R46 16 -#define JB_R47 17 -#define JB_R48 18 -#define JB_R49 19 -#define JB_R50 20 -#define JB_R51 21 -#define JB_FP 22 /* r52 */ -#define JB_TP 23 /* r53 */ -#define JB_SP 24 /* r54 */ -#define JB_PC 25 /* normally LR, r55 */ -#define JB_ICS 26 /* interrupt critical section bit */ - -/* We save space for some extra state to accommodate future changes. */ -#define JB_LEN 32 /* number of words */ - -#define JB_SIZE (JB_LEN * REGSIZE) - -/* Helper macro used by all the setjmp/longjmp assembly code. */ -#define FOR_EACH_CALLEE_SAVED_REG(f) \ - .no_require_canonical_reg_names; f(r30); f(r31); \ - f(r32); f(r33); f(r34); f(r35); f(r36); f(r37); f(r38); f(r39); \ - f(r40); f(r41); f(r42); f(r43); f(r44); f(r45); f(r46); f(r47); \ - f(r48); f(r49); f(r50); f(r51); f(r52); f(r53); f(r54); f(r55) - -/* Helper for generic ____longjmp_chk(). */ -#define JB_FRAME_ADDRESS(buf) \ - ((void *) (unsigned long) (buf[JB_SP])) diff --git a/ports/sysdeps/tile/jmpbuf-unwind.h b/ports/sysdeps/tile/jmpbuf-unwind.h deleted file mode 100644 index 3925e905b1..0000000000 --- a/ports/sysdeps/tile/jmpbuf-unwind.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - Based on work contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <jmpbuf-offsets.h> -#include <stdint.h> -#include <unwind.h> -#include <sysdep.h> - -/* Test if longjmp to JMPBUF would unwind the frame - containing a local variable at ADDRESS. */ -#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ - ((void *) (address) < (void *) demangle ((jmpbuf)[JB_SP])) - -#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ - _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) - -static inline uintptr_t __attribute__ ((unused)) -_jmpbuf_sp (__jmp_buf regs) -{ - uintptr_t sp = regs[JB_SP]; -#ifdef PTR_DEMANGLE - PTR_DEMANGLE (sp); -#endif - return sp; -} - -#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ - ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) - -/* We use the normal longjmp for unwinding. */ -#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) diff --git a/ports/sysdeps/tile/ldsodefs.h b/ports/sysdeps/tile/ldsodefs.h deleted file mode 100644 index 682d4f2893..0000000000 --- a/ports/sysdeps/tile/ldsodefs.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _TILE_LDSODEFS_H -#define _TILE_LDSODEFS_H 1 - -#include <elf.h> - -struct La_tile_regs; -struct La_tile_retval; - -#define ARCH_PLTENTER_MEMBERS \ - ElfW(Addr) (*tile_gnu_pltenter) (ElfW(Sym) *, unsigned int, uintptr_t *, \ - uintptr_t *, struct La_tile_regs *, \ - unsigned int *, const char *, \ - long int *) - -#define ARCH_PLTEXIT_MEMBERS \ - ElfW(Addr) (*tile_gnu_pltexit) (ElfW(Sym) *, unsigned int, uintptr_t *, \ - uintptr_t *, const struct La_tile_regs *, \ - struct La_tile_retval *, const char *) - -#include_next <ldsodefs.h> - -#endif diff --git a/ports/sysdeps/tile/libm-test-ulps b/ports/sysdeps/tile/libm-test-ulps deleted file mode 100644 index 60bdc4758d..0000000000 --- a/ports/sysdeps/tile/libm-test-ulps +++ /dev/null @@ -1,5460 +0,0 @@ -# Begin of automatic generation - -# acosh -Test "acosh (0x6.4p+4)": -double: 1 -idouble: 1 -Test "acosh (0xf.ffffffffffff8p+1020)": -double: 1 - -# asinh -Test "asinh (-0xf.ffffffffffff8p+1020)": -double: 1 -Test "asinh (0xap+0)": -float: 1 -ifloat: 1 -Test "asinh (0xf.ffffffffffff8p+1020)": -double: 1 - -# atan2 -Test "atan2 (-0x1.effe82p-8, -0x7.57d1d8p-12)": -float: 1 -ifloat: 1 -Test "atan2 (-0xcp-4, -0x1p+0)": -float: 1 -ifloat: 1 -Test "atan2 (-0xf.fffffp+124, -0x4p-128)": -float: 1 -ifloat: 1 -Test "atan2 (-0xf.fffffp+124, -0x8p-152)": -float: 1 -ifloat: 1 -Test "atan2 (0x1.64p+0, 0xe.ep-4)": -float: 1 -ifloat: 1 -Test "atan2 (0xcp-4, -0x1p+0)": -float: 1 -ifloat: 1 -Test "atan2 (0xf.fffffp+124, -0x4p-128)": -float: 1 -ifloat: 1 -Test "atan2 (0xf.fffffp+124, -0x8p-152)": -float: 1 -ifloat: 1 - -# atanh -Test "atanh (-0xcp-4)": -float: 1 -ifloat: 1 -Test "atanh (0xcp-4)": -float: 1 -ifloat: 1 - -# cacos -Test "Imaginary part of: cacos (+0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (+0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (+0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (+0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (+0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (+0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0.25 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0.25 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (-0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (-0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1.fp-100 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-100 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (-0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 0x0.ffffffp0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 + 1.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 0x0.ffffffp0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-129 - 1.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1.fp-30 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1.fp-30 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 + 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-105 - 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 + 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-112 - 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1p-23 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (-0x1p-23 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-23 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 + 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-52 - 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 + 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-0x1p-63 - 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-1.0 + 0x1p50 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (-1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-1.0 - 0x1p50 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (-2 - 3 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0.5 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 0x1p-63 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 0x1p-63 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0x0.ffffffp0 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0x0.ffffffp0 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacos (0x0.ffffffp0 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0x0.ffffffp0 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacos (0x1.0000000000001p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0x1.0000000000001p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (0x1.000002p0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (0x1.000002p0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacos (0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (1.0 + 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (1.0 + 0x1.fp-10 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (1.0 - 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: cacos (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacos (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacos (1.0 - 0x1.fp-10 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacos (1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 - -# cacosh -Test "Real part of: cacosh (+0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (+0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (+0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (+0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (+0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (+0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (-0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (-0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0.25 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (-0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0.25 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (-0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacosh (-0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacosh (-0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-100 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-100 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (-0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x0.ffffffp0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 + 1.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x0.ffffffp0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0x1.fp-129 - 1.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-30 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1.fp-30 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 + 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-105 - 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 + 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-112 - 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0x1p-23 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (-0x1p-23 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-23 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 + 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-52 - 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 + 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-0x1p-63 - 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-1.0 + 0x1p50 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (-1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-1.0 - 0x1p50 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (-2 - 3 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0.5 + +0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 0x1p-63 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0.5 - 0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 0x1p-63 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0x0.ffffffp0 + 0.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0x0.ffffffp0 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacosh (0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacosh (0x0.ffffffp0 - 0.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0x0.ffffffp0 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacosh (0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacosh (0x1.0000000000001p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cacosh (0x1.0000000000001p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0x1.000002p0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacosh (0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (0x1.000002p0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Real part of: cacosh (0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (1.0 + 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (1.0 + 0x1.fp-10 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cacosh (1.0 - 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: cacosh (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: cacosh (1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cacosh (1.0 - 0x1.fp-10 i)": -float: 2 -ifloat: 2 - -# casin -Test "Imaginary part of: casin (+0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (+0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (+0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (+0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (+0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (+0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: casin (-0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: casin (-0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (-0x1.fp-10 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (-0x1.fp-10 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (-0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (-0x1p-23 + 0.5 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (-0x1p-23 + 0x1.000002p0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casin (-0x1p-23 - 0.5 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (-0x1p-23 - 0x1.000002p0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (-1.0 + 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (-1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (-1.0 - 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (-1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (-1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0.25 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0.25 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 + 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 + 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 - 0x1p-105 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 - 0x1p-112 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0.5 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (0.75 + 1.25 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x0.fffffffffffff8p0 + 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x0.fffffffffffff8p0 - 0x1p-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x0.ffffffp0 + 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: casin (0x0.ffffffp0 - 0x1p-23 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: casin (0x1.000002p0 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.000002p0 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (0x1.fp-10 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-10 + 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (0x1.fp-10 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-10 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-100 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-100 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-1000 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-1000 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-1025 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-1025 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-1025 - 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-1025 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-129 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-129 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-129 + 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-129 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-129 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-129 - 1.5 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp-30 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp-30 - 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casin (0x1p-105 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-105 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-112 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-112 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (0x1p-23 + 0.5 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-23 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-23 + 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (0x1p-23 + 0x1.000002p0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casin (0x1p-23 - 0.5 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-23 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-23 - 0x0.ffffffp0 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (0x1p-23 - 0x1.000002p0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-52 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-52 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-63 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (0x1p-63 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (1.0 + 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (1.0 + 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casin (1.0 - 0.25 i)": -double: 1 -idouble: 1 -Test "Real part of: casin (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (1.0 - 0.5 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casin (1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 - -# casinh -Test "Imaginary part of: casinh (-0.25 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (-0.25 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0.5 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (-0.5 + 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (-0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (-0.5 - 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (-0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0x0.ffffffp0 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x0.ffffffp0 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (-0x1.000002p0 + 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casinh (-0x1.000002p0 - 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-0x1.fp-10 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0x1.fp-10 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0x1.fp-129 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1.fp-129 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-105 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-105 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-112 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-112 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-23 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-23 + 0x0.ffffffp0 i)": -float: 2 -ifloat: 2 -Test "Real part of: casinh (-0x1p-23 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0x1p-23 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-23 - 0x0.ffffffp0 i)": -float: 2 -ifloat: 2 -Test "Real part of: casinh (-0x1p-23 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-0x1p-52 + 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-0x1p-52 - 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 + +0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 + 0.25 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (-1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-100 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-129 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 + 0x1.fp-30 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0.25 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (-1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-100 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-129 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.0 - 0x1.fp-30 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (-1.5 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.5 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.5 - 0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.5 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (-1.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (0.25 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (0.25 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0.5 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0.5 + 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0.5 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1.fp-129 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1p-105 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1p-112 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1p-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0.5 - 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1p-52 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 0x1p-63 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0.5 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0.75 + 1.25 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0.75 + 1.25 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (0x0.ffffffp0 + 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x0.ffffffp0 - 0x1p-23 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (0x1.000002p0 + 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: casinh (0x1.000002p0 - 0x1p-23 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (0x1.fp-10 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0x1.fp-10 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0x1.fp-129 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1.fp-129 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-105 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-105 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-112 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-112 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-23 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-23 + 0x0.ffffffp0 i)": -float: 2 -ifloat: 2 -Test "Real part of: casinh (0x1p-23 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0x1p-23 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-23 - 0x0.ffffffp0 i)": -float: 2 -ifloat: 2 -Test "Real part of: casinh (0x1p-23 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (0x1p-52 + 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (0x1p-52 - 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 + +0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 + 0.25 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 + 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (1.0 + 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-100 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-129 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 + 0x1.fp-30 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0.25 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0.5 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: casinh (1.0 - 0x1.fp-10 i)": -float: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-100 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-129 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.0 - 0x1.fp-30 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: casinh (1.5 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.5 + 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.5 + 0x1.fp-129 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.5 - 0 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.5 - 0x1.fp-1025 i)": -double: 1 -idouble: 1 -Test "Real part of: casinh (1.5 - 0x1.fp-129 i)": -double: 1 -idouble: 1 - -# catan -Test "Imaginary part of: catan (-0x0.fffffffffffff8p0 + 0x1p-27 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x0.ffffffp0 + 0x1p-13 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1.0000000000001p0 - 0x1p-27 i)": -double: 1 -idouble: 1 -Test "Real part of: catan (-0x1.000002p0 + 0x1p-126 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1.000002p0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1.000002p0 - 0x1p-126 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1.000002p0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1.000002p0 - 0x1p-13 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1.fp1023 - 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1.fp127 - 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1p-1020 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (-0x1p-1020 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: catan (-0x1p-13 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1p-13 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-0x1p-13 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1p-54 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1p-54 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1p-57 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-0x1p-57 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-1.0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (-1.0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (-2 - 3 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x0.fffffffffffff8p0 + 0x1p-27 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x0.ffffffp0 + 0x1p-13 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1.0000000000001p0 - 0x1p-27 i)": -double: 1 -idouble: 1 -Test "Real part of: catan (0x1.000002p0 + 0x1p-126 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1.000002p0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1.000002p0 - 0x1p-126 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1.000002p0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1.000002p0 - 0x1p-13 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1.fp1023 - 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1.fp127 - 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1p-1020 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catan (0x1p-1020 - 1.0 i)": -double: 1 -idouble: 1 -Test "Real part of: catan (0x1p-13 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1p-13 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (0x1p-13 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1p-54 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1p-54 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1p-57 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catan (0x1p-57 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (1.0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catan (1.0 - 0x1p-13 i)": -float: 1 -ifloat: 1 - -# catanh -Test "Real part of: catanh (-0x1.000002p0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (-0x1.000002p0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-0x1.000002p0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (-0x1.000002p0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (-0x1.fp1023 - 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (-0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (-0x1.fp127 - 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (-0x1p-126 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (-0x1p-126 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-0x1p-13 + 0x1.000002p0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (-0x1p-13 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (-0x1p-13 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-0x1p-13 - 0x1.000002p0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (-0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (-0x1p-13 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-0x1p-27 + 0x1.0000000000001p0 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (-0x1p-27 - 0x1.0000000000001p0 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (-1.0 + 0x1p-1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (-1.0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-1.0 + 0x1p-54 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-1.0 + 0x1p-57 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-1.0 - 0x1p-1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (-1.0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-1.0 - 0x1p-54 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-1.0 - 0x1p-57 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (-2 - 3 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (0x1.000002p0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1.000002p0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (0x1.fp1023 + 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (0x1.fp1023 - 0x1.fp1023 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (0x1.fp127 + 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (0x1.fp127 - 0x1.fp127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (0x1p-126 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1p-126 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (0x1p-13 + 0x0.ffffffp0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1p-13 + 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1p-13 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (0x1p-13 - 0x0.ffffffp0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1p-13 - 0x1.000002p0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: catanh (0x1p-13 - 1.0 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (0x1p-27 + 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (0x1p-27 - 0x0.fffffffffffff8p0 i)": -double: 1 -idouble: 1 -Test "Real part of: catanh (1.0 + 0x1p-1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (1.0 + 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (1.0 + 0x1p-54 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (1.0 + 0x1p-57 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (1.0 - 0x1p-1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: catanh (1.0 - 0x1p-13 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (1.0 - 0x1p-54 i)": -float: 1 -ifloat: 1 -Test "Real part of: catanh (1.0 - 0x1p-57 i)": -float: 1 -ifloat: 1 - -# cbrt -Test "cbrt (-0x1.bp+4)": -double: 1 -idouble: 1 -Test "cbrt (-0x4.18937p-12)": -float: 1 -ifloat: 1 -Test "cbrt (0xcp-4)": -double: 1 -idouble: 1 -Test "cbrt (0xf.ep-4)": -double: 1 -idouble: 1 - -# ccos -Test "Imaginary part of: ccos (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccos (-0xcp-4 + 0x2.c68p+8 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccos (-0xcp-4 + 0x5.98p+4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccos (-0xcp-4 - 0x2.c68p+8 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccos (-0xcp-4 - 0x5.98p+4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccos (0x4p-1076 + 0x5.ap+8 i)": -double: 1 -idouble: 1 -Test "Real part of: ccos (0xcp-4 + 0x1.4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ccos (0xcp-4 + 0x1.4p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccos (0xcp-4 + 0x2.c68p+8 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccos (0xcp-4 + 0x5.98p+4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccos (0xcp-4 - 0x2.c68p+8 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccos (0xcp-4 - 0x5.98p+4 i)": -float: 1 -ifloat: 1 - -# ccosh -Test "Imaginary part of: ccosh (-0x2.c68p+8 + 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccosh (-0x2.c68p+8 - 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: ccosh (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (-0x5.98p+4 + 0xcp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (-0x5.98p+4 - 0xcp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (0x2.c68p+8 + 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccosh (0x2.c68p+8 - 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ccosh (0x5.98p+4 + 0xcp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (0x5.98p+4 - 0xcp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (0x5.ap+8 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Real part of: ccosh (0xcp-4 + 0x1.4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ccosh (0xcp-4 + 0x1.4p+0 i)": -float: 1 -ifloat: 1 - -# cexp -Test "Imaginary part of: cexp (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cexp (-0x5.fp+4 + 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: cexp (0x1.f4p+8 + 0x8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: cexp (0x2.c5dp+8 + 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: cexp (0x2.c5dp+8 + 0xcp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: cexp (0x3.2p+4 + 0x8p+124 i)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "Imaginary part of: cexp (0x3.2p+4 + 0x8p+124 i)": -double: 1 -idouble: 1 -Test "Real part of: cexp (0x5.8cp+4 + 0xcp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: cexp (0x5.8cp+4 + 0xcp-4 i)": -float: 2 -ifloat: 2 -Test "Imaginary part of: cexp (0x5.ap+8 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Real part of: cexp (0xcp-4 + 0x1.4p+0 i)": -float: 1 -ifloat: 1 - -# clog -Test "Real part of: clog (+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.0000000123456p+0 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.0000000123456p+0 + 0x1.2345678p-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.0000000123456p+0 + 0x4.8d1598p-32 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.0000000123456p+0 + 0x4.8d159ep-32 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.0000000123456p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.000002p+0 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (-0x1.000002p+0 + 0x4.8d1598p-32 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog (-0x1.000002p+0 + 0x4.8d159ep-32 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (-0x1.000002p+0 + 0x4.8d15ap-32 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog (-0x1.000002p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (-0x1.234566p-40 - 0x1p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (-0x8p-152 + 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (-0x8p-152 + 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (-0x8p-152 + 0xf.fffffp+124 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (-0x8p-152 - 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (-0x8p-152 - 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (-0x8p-152 - 0xf.fffffp+124 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (-0xf.8p+124 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (-0xf.8p+124 - 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + 0x1.234566p-60 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + 0x1.23456789p-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + 0x1.23456789p-60 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + 0x1.234568p-60 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.0000000000001p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.000002p+0 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.000002p+0 + 0x1.234566p-60 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.000002p+0 + 0x1.234568p-60 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.000002p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.000566p+0 + 0x4.8dp-12 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.48e45e3268d8p-4 + 0xf.f2c64p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.48e45ep-4 + 0xf.f2c63p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.48e45ep-4 + 0xf.f2c64p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.8907bc3694fd4p-4 + 0xf.ed1990460bdf8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.8907bc3694fd5p-4 + 0xf.ed1990460bdf8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.c67eccp-4 + 0xf.e6b4d1d7a6e08p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.c67eccp-4 + 0xf.e6b4d1d7a6e1p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.c67eccp-4 + 0xf.e6b4ep-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x1.c67ecd92a8594p-4 + 0xf.e6b4dp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.c67ecd92a8594p-4 + 0xf.e6b4ep-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1.c67ecep-4 + 0xf.e6b4d1d7a6e1p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x1p+0 + 0x4.8d1598p-12 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x2.0ce7ba1e4902p-4 + 0xf.de3a3p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x2.82b794p-4 + 0xf.cd42a15bf9a38p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x2.82b795e420b28p-4 + 0xf.cd42a15bf9a3p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x2p-148 + 0x2p-148 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.3b8f94p-4 + 0xf.ab873p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.6e17119fb8aacp-4 + 0xf.a0c58p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x3.6e1714p-4 + 0xf.a0c58a83e57cp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x3.6e1714p-4 + 0xf.a0c58p-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x3.6e1714p-4 + 0xf.a0c58p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.6e1714p-4 + 0xf.a0c59p-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x3.6e1714p-4 + 0xf.a0c59p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.bea2bcp-4 + 0xf.8e3d619a8d118p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x3.bea2bd62e35p-4 + 0xf.8e3d6p-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0x3.bea2cp-4 + 0xf.8e3d6p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.bea2cp-4 + 0xf.8e3d7p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x3.e1d0a105ac4eap-4 + 0xf.859b3d1b06d08p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x3.e1d0ap-4 + 0xf.859b3d1b06d08p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x3.e1d0ap-4 + 0xf.859b3p-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x3.e1d0ap-4 + 0xf.859b4p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x4.0dbf7d40fe1acp-4 + 0xf.7a5c1af8e3ce8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4.0dbf7d40fe1acp-4 + 0xf.7a5c1p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4.7017a2e36807cp-4 + 0xf.5f4a550c9d758p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4.7017a8p-4 + 0xf.5f4a550c9d76p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4.7017a8p-4 + 0xf.5f4a6p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x4.d9e8c8p-4 + 0xf.3f303p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x4.d9e8cp-4 + 0xf.3f30281507d8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4p-1076 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x4p-1076 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0x5.03p-4 + 0xf.31ep-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x5.318c596a8cb1p-4 + 0xf.22364p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x5.b06b68p-4 + 0xe.f452b965da9fp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x5.b06b68p-4 + 0xe.f452bp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x5.b06b7p-4 + 0xe.f452b965da9fp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0x5.b06b7p-4 + 0xe.f452bp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x6.02fd5037c479p-4 + 0xe.d3e21p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.02fd5037c479p-4 + 0xe.d3e2p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.02fd58p-4 + 0xe.d3e2086dcca8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.02fd58p-4 + 0xe.d3e21p-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x6.02fd5p-4 + 0xe.d3e21p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x6.1c643068cd128p-4 + 0xe.c97c2p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.1c6438p-4 + 0xe.c97c2018b4288p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.1c6438p-4 + 0xe.c97c2018b428p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.1c6438p-4 + 0xe.c97c3p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x6.2aff83ae6467cp-4 + 0xe.c36a6p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.2aff83ae6468p-4 + 0xe.c36a599a86ba8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.2aff83ae6468p-4 + 0xe.c36a5p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.2aff88p-4 + 0xe.c36a599a86ba8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.b10b48p-4 + 0xe.8893cbb44925p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.b10b4f3520218p-4 + 0xe.8893dp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.b10b5p-4 + 0xe.8893cbb449258p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x6.b10b5p-4 + 0xe.8893cbb44925p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.eca921b40e028p-4 + 0xd.e655fp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.eca928p-4 + 0xd.e655e694e5108p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.eca928p-4 + 0xd.e655fp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x7.f2c8d20a1eca4p-4 + 0xd.e2d66p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.f2c8d20a1ecap-4 + 0xd.e2d65p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.f2c8d8p-4 + 0xd.e2d65939160b8p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.f2c8dp-4 + 0xd.e2d65939160bp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x7.f4b088p-4 + 0xd.e1bf04f3688p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x8.88faep-4 + 0xd.888bdp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x8.88faep-4 + 0xd.888bdp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x8.88fafp-4 + 0xd.888bdp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x8.ecbf810c4ae6p-4 + 0xd.47946p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x8.ecbf8p-4 + 0xd.479468b09a37p-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0x8.ecbf8p-4 + 0xd.47946p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x8.ecbf9p-4 + 0xd.479468b09a37p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x8p-152 + 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x8p-152 - 0xf.8p+124 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x9.b386fp-4 + 0xc.b9317p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0x9.c1b6ac509a248p-4 + 0xc.ae53de1d5a7dp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x9.c1b6ac509a248p-4 + 0xc.ae53ep-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x9.c1b6ac509a24p-4 + 0xc.ae53dp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x9.c1b6ac509a24p-4 + 0xc.ae53ep-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x9.c1b6ap-4 + 0xc.ae53de1d5a7dp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0x9.c1b6ap-4 + 0xc.ae53dp-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0x9.c1b6ap-4 + 0xc.ae53ep-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.47c0c65bd4928p-4 + 0xc.42a51p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.47c0cp-4 + 0xc.42a51p-4 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog (0xa.47c0cp-4 + 0xc.42a51p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.afc57p-4 + 0xb.e867932966df8p-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0xa.afc58p-4 + 0xb.e867ap-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.b96da19075eap-8 + 0xf.fc679p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.b96dap-8 + 0xf.fc67818f89d2p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.b96dap-8 + 0xf.fc678p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.b96dap-8 + 0xf.fc679p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.e7de8cc868ff8p-4 + 0xb.b51cbp-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.e7de8p-4 + 0xb.b51cbp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.e7de9p-4 + 0xb.b51cb9f04d4dp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog (0xa.e7de9p-4 + 0xb.b51cbp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xa.ec55b7682e528p-4 + 0xb.b0f24p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.ec55cp-4 + 0xb.b0f2405504a68p-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xa.ec55cp-4 + 0xb.b0f25p-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xb.263a77543bp-4 + 0xb.79c9ap-4 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xb.263a8p-4 + 0xb.79c9bp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xf.8p+124 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xf.8p+124 - 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xf.fffffp+124 + 0x8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: clog (0xf.fffffp-4 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xf.fffffp-4 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog (0xf.fffffp-4 + 0xf.fffffp-104 i)": -float: 1 -ifloat: 1 - -# clog10 -Test "Imaginary part of: clog10 (-0 + inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-0 - inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog10 (-0x1.0000000123456p0 + 0x1.2345678p-1000 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: clog10 (-0x1.0000000123456p0 + 0x1.2345678p-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (-0x1.0000000123456p0 + 0x1.2345678p-30 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: clog10 (-0x1.0000000123456p0 + 0x1.2345678p-30 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1.fp+1023 + 0x1p-1074 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1.fp+1023 - 0x1p-1074 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1.fp+127 + 0x1p-149 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-0x1.fp+127 - 0x1p-149 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-0x1p-1074 + 0x1.fp+1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1p-1074 - 0x1.fp+1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1p-149 + 0x1.fp+127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-0x1p-149 - 0x1.fp+127 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-1.0 + 0x1.234566p-20 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-2 - 3 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-3 + inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-3 - inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-inf + 0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-inf + 1 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-inf + inf i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (-inf - 0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (-inf - 1 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0 + inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0 - inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog10 (0x0.fffffffffffff8p0 + 0x0.fffffffffffff8p-1000 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x0.ffffffp0 + 0x0.ffffffp-100 i)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "Real part of: clog10 (0x1.000566p0 + 0x1.234p-10 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.000566p0 + 0x1.234p-10 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x1.000566p0 + 0x1.234p-100 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.234566p-30 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.234566p-50 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.234566p-60 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.fffffep+127 + 0x1.fffffep+127 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog10 (0x1.fffffep+127 + 1.0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1.fffffffffffffp+1023 + 0x1.fffffffffffffp+1023 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x10673dd0f2481p-51 + 0x7ef1d17cefbd2p-51 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x1367a310575591p-54 + 0x3cfcc0a0541f60p-54 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1367a310575591p-54 + 0x3cfcc0a0541f60p-54 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x164c74eea876p-45 + 0x16f393482f77p-45 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1a6p-10 + 0x3a5p-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-1073 + 0x1p-1073 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-1074 + 0x1.fp+1023 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x1p-1074 + 0x1p-1074 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-1074 + 0x1p-1074 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-1074 - 0x1.fp+1023 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-147 + 0x1p-147 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-149 + 0x1.fp+127 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-149 + 0x1p-149 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-149 - 0x1.fp+127 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-509 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-510 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-511 + 1.0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x1p-61 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-62 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x1p-63 + 1.0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: clog10 (0x2818p-15 + 0x798fp-15 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x2818p-15 + 0x798fp-15 i)": -float: 1 -ifloat: 1 -Test "Real part of: clog10 (0x2dd46725bp-35 + 0x7783a1284p-35 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x2ede88p-23 + 0x771c3fp-23 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (0x2ede88p-23 + 0x771c3fp-23 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0x4447d7175p-35 + 0x6c445e00ap-35 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x5b06b680ea2ccp-52 + 0xef452b965da9fp-52 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0x9b57bp-20 + 0xcb7b4p-20 i)": -double: 1 -idouble: 1 -Test "Real part of: clog10 (0xf2p-10 + 0x3e3p-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0xf2p-10 + 0x3e3p-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (0xfe961079616p-45 + 0x1bc37e09e6d1p-45 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (1.0 + 0x1.234566p-10 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: clog10 (3 + inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (3 - inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (inf + inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: clog10 (inf - inf i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# cos -Test "cos (0x1p+120)": -float: 1 -ifloat: 1 -Test "cos (0x7p+0)": -float: 1 -ifloat: 1 -Test "cos (0x8p+124)": -float: 1 -ifloat: 1 -Test "cos (0xc.d4967p-4)": -float: 1 -ifloat: 1 - -# cos_tonearest -Test "cos_tonearest (0x1p+120)": -float: 1 -ifloat: 1 -Test "cos_tonearest (0x7p+0)": -float: 1 -ifloat: 1 -Test "cos_tonearest (0x8p+124)": -float: 1 -ifloat: 1 -Test "cos_tonearest (0xc.d4967p-4)": -float: 1 -ifloat: 1 - -# cosh -Test "cosh (-0x1p+0)": -float: 1 -ifloat: 1 -Test "cosh (-0x2.c5e3acp+8)": -double: 1 -idouble: 1 -Test "cosh (-0x2.c679dp+8)": -double: 1 -idouble: 1 -Test "cosh (0x2.c5e3acp+8)": -double: 1 -idouble: 1 -Test "cosh (0x2.c679dp+8)": -double: 1 -idouble: 1 - -# cosh_tonearest -Test "cosh_tonearest (-0x1p+0)": -float: 1 -ifloat: 1 -Test "cosh_tonearest (-0x2.c5e3acp+8)": -double: 1 -idouble: 1 -Test "cosh_tonearest (-0x2.c679dp+8)": -double: 1 -idouble: 1 -Test "cosh_tonearest (0x2.c5e3acp+8)": -double: 1 -idouble: 1 -Test "cosh_tonearest (0x2.c679dp+8)": -double: 1 -idouble: 1 - -# cpow -Test "Real part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)": -double: 1 -float: 4 -idouble: 1 -ifloat: 4 -Test "Imaginary part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)": -float: 2 -ifloat: 2 -Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, +0 + 0x1p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + 0x1p+0 i)": -double: 2 -float: 3 -idouble: 2 -ifloat: 3 -Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0xcp-4 + 0x1.4p+0 i)": -double: 1 -float: 4 -idouble: 1 -ifloat: 4 - -# csin -Test "Real part of: csin (-0.75 + 710.5 i)": -double: 1 -idouble: 1 -Test "Real part of: csin (-0.75 + 89.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: csin (-0.75 - 710.5 i)": -double: 1 -idouble: 1 -Test "Real part of: csin (-0.75 - 89.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: csin (0.75 + 710.5 i)": -double: 1 -idouble: 1 -Test "Real part of: csin (0.75 + 89.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: csin (0.75 - 710.5 i)": -double: 1 -idouble: 1 -Test "Real part of: csin (0.75 - 89.5 i)": -float: 1 -ifloat: 1 -Test "Real part of: csin (0x1p-1074 + 1440 i)": -double: 1 -idouble: 1 - -# csinh -Test "Imaginary part of: csinh (-2 - 3 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (-710.5 + 0.75 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (-710.5 - 0.75 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (-89.5 + 0.75 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: csinh (-89.5 - 0.75 i)": -float: 1 -ifloat: 1 -Test "Real part of: csinh (0.75 + 1.25 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: csinh (0.75 + 1.25 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: csinh (1440 + 0x1p-1074 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (710.5 + 0.75 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (710.5 - 0.75 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csinh (89.5 + 0.75 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: csinh (89.5 - 0.75 i)": -float: 1 -ifloat: 1 - -# csqrt -Test "Real part of: csqrt (-0x2p+0 + 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: csqrt (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: csqrt (-0x4.000008p-128 - 0x4.000008p-128 i)": -double: 1 -idouble: 1 -Test "Real part of: csqrt (-0x8p-152 - 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x4.000008p-128 + 0x4.000008p-128 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x4p-1076 + 0xf.fffffp+124 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x8p+1020 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x8p+124 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x8p-152 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x8p-152 + 0x8p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0x8p-152 + 0xf.fffffp+124 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0xf.ffffffffffff8p+1020 + 0x8p+1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0xf.ffffffffffff8p+1020 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Real part of: csqrt (0xf.ffffffffffff8p+1020 + 0xf.ffffffffffff8p+1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0xf.ffffffffffff8p+1020 + 0xf.ffffffffffff8p+1020 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0xf.ffffffffffff8p+1020 + 0xf.fffffp+124 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: csqrt (0xf.fffffp+124 + 0x1p+0 i)": -float: 1 -ifloat: 1 - -# ctan -Test "Real part of: ctan (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctan (-0x2p+0 - 0x3p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0x1.921fb4p+0 + +0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: ctan (0x1.921fb4p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0x1.921fb4p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0x1.921fb4p+0 + 0x8p-152 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctan (0x1.921fb4p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0x1.921fb54442d19p+0 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0x1.921fb54442d19p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0x1.921fb54442d19p+0 + 0x4p-1076 i)": -double: 2 -idouble: 2 -Test "Real part of: ctan (0x1.921fb54442d19p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0x1.921fb54442d19p+0 + 0x8p-152 i)": -double: 2 -idouble: 2 -Test "Real part of: ctan (0x1.921fb6p+0 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctan (0x1.921fb6p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctan (0x1.921fb6p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctan (0x8p+1020 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0x8p+124 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0xcp-4 + 0x1.4p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0xf.ffffffffffff8p+1020 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan (0xf.fffffp+124 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan (0xf.fffffp+124 + 0x1p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# ctan_tonearest -Test "Real part of: ctan_tonearest (-0x2p+0 - 0x3p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctan_tonearest (-0x2p+0 - 0x3p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0x1.921fb4p+0 + +0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: ctan_tonearest (0x1.921fb4p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0x1.921fb4p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0x1.921fb4p+0 + 0x8p-152 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctan_tonearest (0x1.921fb4p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0x1.921fb54442d19p+0 + +0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0x1.921fb54442d19p+0 + 0x4p-1076 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0x1.921fb54442d19p+0 + 0x4p-1076 i)": -double: 2 -idouble: 2 -Test "Real part of: ctan_tonearest (0x1.921fb54442d19p+0 + 0x8p-152 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0x1.921fb54442d19p+0 + 0x8p-152 i)": -double: 2 -idouble: 2 -Test "Real part of: ctan_tonearest (0x1.921fb6p+0 + +0 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctan_tonearest (0x1.921fb6p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctan_tonearest (0x1.921fb6p+0 + 0x8p-152 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctan_tonearest (0x8p+1020 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0x8p+124 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0xcp-4 + 0x1.4p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0xf.ffffffffffff8p+1020 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctan_tonearest (0xf.fffffp+124 + 0x1p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctan_tonearest (0xf.fffffp+124 + 0x1p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# ctanh -Test "Imaginary part of: ctanh (+0 + 0x1.921fb4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (+0 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh (+0 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (+0 + 0xc.90fdaa22168cp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh (+0 + 0xc.90fdap-4 i)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "Imaginary part of: ctanh (+0 + 0xc.90fdbp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctanh (-0x2p+0 - 0x3p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (-0x2p+0 - 0x3p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (0x1p+0 + 0x8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x1p+0 + 0x8p+124 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh (0x1p+0 + 0xf.ffffffffffff8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x1p+0 + 0xf.fffffp+124 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (0x1p+0 + 0xf.fffffp+124 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x4p-1076 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh (0x4p-1076 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x4p-1076 + 0x1.921fb54442d19p+0 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: ctanh (0x4p-1076 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x8p-152 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh (0x8p-152 + 0x1.921fb4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: ctanh (0x8p-152 + 0x1.921fb54442d19p+0 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: ctanh (0x8p-152 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh (0x8p-152 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (0x8p-152 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctanh (0xcp-4 + 0x1.4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh (0xcp-4 + 0x1.4p+0 i)": -float: 2 -ifloat: 2 - -# ctanh_tonearest -Test "Imaginary part of: ctanh_tonearest (+0 + 0x1.921fb4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (+0 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh_tonearest (+0 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (+0 + 0xc.90fdaa22168cp-4 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh_tonearest (+0 + 0xc.90fdap-4 i)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (+0 + 0xc.90fdbp-4 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctanh_tonearest (-0x2p+0 - 0x3p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (-0x2p+0 - 0x3p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (0x1p+0 + 0x8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x1p+0 + 0x8p+124 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh_tonearest (0x1p+0 + 0xf.ffffffffffff8p+1020 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x1p+0 + 0xf.fffffp+124 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (0x1p+0 + 0xf.fffffp+124 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x4p-1076 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh_tonearest (0x4p-1076 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x4p-1076 + 0x1.921fb54442d19p+0 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: ctanh_tonearest (0x4p-1076 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x8p-152 + 0x1.921fb4p+0 i)": -double: 1 -idouble: 1 -Test "Imaginary part of: ctanh_tonearest (0x8p-152 + 0x1.921fb4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Real part of: ctanh_tonearest (0x8p-152 + 0x1.921fb54442d19p+0 i)": -double: 2 -idouble: 2 -Test "Imaginary part of: ctanh_tonearest (0x8p-152 + 0x1.921fb54442d19p+0 i)": -double: 1 -idouble: 1 -Test "Real part of: ctanh_tonearest (0x8p-152 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (0x8p-152 + 0x1.921fb6p+0 i)": -float: 1 -ifloat: 1 -Test "Real part of: ctanh_tonearest (0xcp-4 + 0x1.4p+0 i)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "Imaginary part of: ctanh_tonearest (0xcp-4 + 0x1.4p+0 i)": -float: 2 -ifloat: 2 - -# erf -Test "erf (0x1.4p+0)": -double: 1 -idouble: 1 - -# erfc -Test "erfc (-0x8p-4)": -float: 1 -ifloat: 1 -Test "erfc (0x2p+0)": -double: 1 -idouble: 1 -Test "erfc (0x3.ee6078p+0)": -double: 1 -idouble: 1 -Test "erfc (0x4.2p+0)": -double: 1 -idouble: 1 -Test "erfc (0x7.fe8008p+0)": -float: 1 -ifloat: 1 -Test "erfc (0x7.fffd6p+0)": -float: 1 -ifloat: 1 - -# exp10 -Test "exp10 (-0x1.31p+8)": -double: 1 -idouble: 1 -Test "exp10 (-0x1p+0)": -double: 1 -idouble: 1 -Test "exp10 (-0x2.4p+4)": -double: 1 -idouble: 1 -Test "exp10 (0x2.4p+4)": -double: 1 -idouble: 1 -Test "exp10 (0x3p+0)": -double: 1 -idouble: 1 - -# exp10_tonearest -Test "exp10_tonearest (-0x1.31p+8)": -double: 1 -idouble: 1 -Test "exp10_tonearest (-0x1p+0)": -double: 1 -idouble: 1 -Test "exp10_tonearest (-0x2.4p+4)": -double: 1 -idouble: 1 -Test "exp10_tonearest (0x2.4p+4)": -double: 1 -idouble: 1 -Test "exp10_tonearest (0x3p+0)": -double: 1 -idouble: 1 - -# expm1 -Test "expm1 (0x1.f4p+8)": -double: 1 -idouble: 1 -Test "expm1 (0x1p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "expm1 (0xcp-4)": -double: 1 -idouble: 1 - -# expm1_tonearest -Test "expm1_tonearest (0x1.f4p+8)": -double: 1 -idouble: 1 -Test "expm1_tonearest (0x1p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "expm1_tonearest (0xcp-4)": -double: 1 -idouble: 1 - -# gamma -Test "gamma (-0x1p-20)": -double: 1 -idouble: 1 -Test "gamma (-0x2p-16)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "gamma (-0x4p-12)": -double: 1 -idouble: 1 -Test "gamma (-0x8p-8)": -double: 1 -idouble: 1 -Test "gamma (0x4p-12)": -float: 1 -ifloat: 1 -Test "gamma (0x4p-32)": -double: 1 -idouble: 1 -Test "gamma (0xb.333333333333p-4)": -double: 1 -idouble: 1 -Test "gamma (0xb.33333p-4)": -double: 1 -idouble: 1 - -# hypot -Test "hypot (-0xb.33334p-4, -0xc.6666666666668p+0)": -double: 1 -idouble: 1 -Test "hypot (-0xb.33334p-4, 0xc.6666666666668p+0)": -double: 1 -idouble: 1 -Test "hypot (-0xc.6666666666668p+0, -0xb.33334p-4)": -double: 1 -idouble: 1 -Test "hypot (-0xc.6666666666668p+0, 0xb.33334p-4)": -double: 1 -idouble: 1 -Test "hypot (0xb.33334p-4, -0xc.6666666666668p+0)": -double: 1 -idouble: 1 -Test "hypot (0xb.33334p-4, 0xc.6666666666668p+0)": -double: 1 -idouble: 1 -Test "hypot (0xc.6666666666668p+0, -0xb.33334p-4)": -double: 1 -idouble: 1 -Test "hypot (0xc.6666666666668p+0, 0xb.33334p-4)": -double: 1 -idouble: 1 - -# j0 -Test "j0 (-0x4p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "j0 (-0xf.fffffp+124)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 -Test "j0 (0x2p+0)": -float: 2 -ifloat: 2 -Test "j0 (0x4p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "j0 (0x8p+0)": -float: 1 -ifloat: 1 -Test "j0 (0xap+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "j0 (0xcp-4)": -float: 1 -ifloat: 1 -Test "j0 (0xe.be71dp+104)": -float: 2 -ifloat: 2 -Test "j0 (0xf.fffffp+124)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -# j1 -Test "j1 (0x1.ff00000000002p+840)": -double: 1 -idouble: 1 -Test "j1 (0x2p+0)": -double: 1 -idouble: 1 -Test "j1 (0x4.ffcp+72)": -double: 1 -idouble: 1 -Test "j1 (0x8p+0)": -double: 1 -idouble: 1 -Test "j1 (0xap+0)": -float: 2 -ifloat: 2 -Test "j1 (0xf.ffffffffffff8p+1020)": -double: 1 -idouble: 1 -Test "j1 (0xf.fffffp+124)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# jn -Test "jn (0, -0x4p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (0, 0x2p+0)": -float: 2 -ifloat: 2 -Test "jn (0, 0x4p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (0, 0x8p+0)": -float: 1 -ifloat: 1 -Test "jn (0, 0xap+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "jn (0, 0xcp-4)": -float: 1 -ifloat: 1 -Test "jn (1, 0x2p+0)": -double: 1 -idouble: 1 -Test "jn (1, 0x8p+0)": -double: 1 -idouble: 1 -Test "jn (1, 0xap+0)": -float: 2 -ifloat: 2 -Test "jn (10, 0x2p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "jn (10, 0x2p-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (10, 0xap+0)": -double: 4 -float: 2 -idouble: 4 -ifloat: 2 -Test "jn (10, 0xcp-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (2, 0x2.67a2a4p+0)": -float: 1 -ifloat: 1 -Test "jn (2, 0x2.67a2a5d2e3682p+0)": -double: 1 -idouble: 1 -Test "jn (2, 0x2.67a2a5d2e368p+0)": -double: 2 -idouble: 2 -Test "jn (2, 0x2.67a2a8p+0)": -double: 1 -float: 3 -idouble: 1 -ifloat: 3 -Test "jn (2, 0x8p+124)": -double: 1 -idouble: 1 -Test "jn (2, 0xf.fffb1p+96)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 -Test "jn (2, 0xf.fffffp+124)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 -Test "jn (3, 0x2.67a2a4p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "jn (3, 0x2.67a2a5d2e3682p+0)": -double: 1 -idouble: 1 -Test "jn (3, 0x2.67a2a5d2e368p+0)": -double: 3 -idouble: 3 -Test "jn (3, 0x2.67a2a8p+0)": -double: 1 -float: 3 -idouble: 1 -ifloat: 3 -Test "jn (3, 0x2p+0)": -float: 1 -ifloat: 1 -Test "jn (3, 0x2p-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (3, 0xap+0)": -double: 3 -idouble: 3 -Test "jn (3, 0xcp-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (4, 0x2.67a2a4p+0)": -float: 1 -ifloat: 1 -Test "jn (4, 0x2.67a2a5d2e3682p+0)": -double: 1 -idouble: 1 -Test "jn (4, 0x2.67a2a5d2e368p+0)": -double: 1 -idouble: 1 -Test "jn (4, 0x2.67a2a8p+0)": -float: 1 -ifloat: 1 -Test "jn (5, 0x2.67a2a4p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "jn (5, 0x2.67a2a5d2e3682p+0)": -double: 1 -idouble: 1 -Test "jn (5, 0x2.67a2a5d2e368p+0)": -double: 2 -idouble: 2 -Test "jn (5, 0x2.67a2a8p+0)": -float: 2 -ifloat: 2 -Test "jn (6, 0x2.67a2a4p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "jn (6, 0x2.67a2a5d2e3682p+0)": -double: 2 -idouble: 2 -Test "jn (6, 0x2.67a2a5d2e368p+0)": -double: 4 -idouble: 4 -Test "jn (6, 0x2.67a2a8p+0)": -double: 2 -float: 3 -idouble: 2 -ifloat: 3 -Test "jn (7, 0x2.67a2a4p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "jn (7, 0x2.67a2a5d2e368p+0)": -double: 3 -idouble: 3 -Test "jn (7, 0x2.67a2a8p+0)": -double: 2 -float: 3 -idouble: 2 -ifloat: 3 -Test "jn (8, 0x2.67a2a4p+0)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 -Test "jn (8, 0x2.67a2a5d2e3682p+0)": -double: 1 -idouble: 1 -Test "jn (8, 0x2.67a2a5d2e368p+0)": -double: 3 -idouble: 3 -Test "jn (8, 0x2.67a2a8p+0)": -double: 2 -float: 4 -idouble: 2 -ifloat: 4 -Test "jn (9, 0x2.67a2a4p+0)": -double: 3 -float: 3 -idouble: 3 -ifloat: 3 -Test "jn (9, 0x2.67a2a5d2e3682p+0)": -double: 4 -idouble: 4 -Test "jn (9, 0x2.67a2a5d2e368p+0)": -double: 1 -idouble: 1 -Test "jn (9, 0x2.67a2a8p+0)": -double: 3 -float: 3 -idouble: 3 -ifloat: 3 - -# lgamma -Test "lgamma (-0x1p-20)": -double: 1 -idouble: 1 -Test "lgamma (-0x2p-16)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "lgamma (-0x4p-12)": -double: 1 -idouble: 1 -Test "lgamma (-0x8p-8)": -double: 1 -idouble: 1 -Test "lgamma (0x4p-12)": -float: 1 -ifloat: 1 -Test "lgamma (0x4p-32)": -double: 1 -idouble: 1 -Test "lgamma (0xb.333333333333p-4)": -double: 1 -idouble: 1 -Test "lgamma (0xb.33333p-4)": -double: 1 -idouble: 1 - -# log -Test "log (0x2.b7e15p+0)": -float: 1 -ifloat: 1 - -# log10 -Test "log10 (0x2.b7e154p+0)": -float: 1 -ifloat: 1 -Test "log10 (0xcp-4)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -# log1p -Test "log1p (-0x4p-4)": -float: 1 -ifloat: 1 -Test "log1p (0x1.b7e15p+0)": -float: 1 -ifloat: 1 - -# pow -Test "pow (0x1.000002p+0, 0x1p+24)": -float: 1 -ifloat: 1 -Test "pow (0xf.fffffp-4, -0x1p+24)": -float: 1 -ifloat: 1 -Test "pow (0xf.fffffp-4, 0x1p+24)": -float: 1 -ifloat: 1 - -# pow10 -Test "pow10 (-0x1.31p+8)": -double: 1 -idouble: 1 -Test "pow10 (-0x1p+0)": -double: 1 -idouble: 1 -Test "pow10 (-0x2.4p+4)": -double: 1 -idouble: 1 -Test "pow10 (0x2.4p+4)": -double: 1 -idouble: 1 -Test "pow10 (0x3p+0)": -double: 1 -idouble: 1 - -# pow_tonearest -Test "pow_tonearest (0x1.000002p+0, 0x1p+24)": -float: 1 -ifloat: 1 -Test "pow_tonearest (0xf.fffffp-4, -0x1p+24)": -float: 1 -ifloat: 1 -Test "pow_tonearest (0xf.fffffp-4, 0x1p+24)": -float: 1 -ifloat: 1 - -# sin -Test "sin (0x1p+0)": -float: 1 -ifloat: 1 - -# sin_tonearest -Test "sin_tonearest (0x1p+0)": -float: 1 -ifloat: 1 - -# sincos -Test "sincos (0x1.0c1522p+0) extra output 1": -float: 1 -ifloat: 1 -Test "sincos (0x1p+120) extra output 2": -float: 1 -ifloat: 1 -Test "sincos (0x8.60a92p-4) extra output 2": -float: 1 -ifloat: 1 -Test "sincos (0x8p+124) extra output 2": -float: 1 -ifloat: 1 -Test "sincos (0xc.d4967p-4) extra output 2": -float: 1 -ifloat: 1 - -# tgamma -Test "tgamma (-0x1.000002p+0)": -double: 2 -idouble: 2 -Test "tgamma (-0x1.3ffffep+4)": -float: 2 -ifloat: 2 -Test "tgamma (-0x1.4000000000001p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x1.400002p+4)": -float: 1 -ifloat: 1 -Test "tgamma (-0x1.dffffep+4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x1.e000000000001p+4)": -double: 3 -idouble: 3 -Test "tgamma (-0x1.e00002p+4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x2.0000000000002p+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x2.000004p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (-0x2.146544p+4)": -float: 2 -ifloat: 2 -Test "tgamma (-0x2.7fffffffffffep+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x2.8000000000002p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x2.800004p+4)": -double: 2 -idouble: 2 -Test "tgamma (-0x2.8p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "tgamma (-0x2.900004p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x2.9ffffcp+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x2.fffffcp+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x3.000004p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (-0x3.1ffffcp+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x3.1fffffffffffep+4)": -double: 3 -idouble: 3 -Test "tgamma (-0x3.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x3.fffffcp+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x3.ffffffffffffep+0)": -double: 2 -idouble: 2 -Test "tgamma (-0x4.000008p+0)": -float: 1 -ifloat: 1 -Test "tgamma (-0x4.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x4.fffff8p+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x4.ffffffffffffcp+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x5.000008p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x5.8p+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x5.ffffffffffffcp+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x6.000008p+0)": -float: 2 -ifloat: 2 -Test "tgamma (-0x6.3fffffffffffcp+4)": -double: 2 -idouble: 2 -Test "tgamma (-0x6.4000000000004p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x6.400008p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x6.8p+0)": -float: 1 -ifloat: 1 -Test "tgamma (-0x6.fffff8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (-0x6.ffffffffffffcp+0)": -double: 4 -idouble: 4 -Test "tgamma (-0x7.0000000000004p+0)": -double: 3 -idouble: 3 -Test "tgamma (-0x7.000008p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x7.8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (-0x7.fffff8p+0)": -double: 3 -float: 1 -idouble: 3 -ifloat: 1 -Test "tgamma (-0x7.ffffffffffffcp+0)": -double: 3 -idouble: 3 -Test "tgamma (-0x8.00001p+0)": -double: 2 -idouble: 2 -Test "tgamma (-0x8.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x8p-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x9.6000000000008p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x9.60001p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0x9.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (-0x9.ffffffffffff8p+0)": -double: 1 -idouble: 1 -Test "tgamma (-0x9.fffffp+0)": -float: 1 -ifloat: 1 -Test "tgamma (-0xa.00001p+0)": -double: 1 -idouble: 1 -Test "tgamma (-0xa.c0001p+4)": -double: 1 -idouble: 1 -Test "tgamma (-0xf.ffffffffffff8p-4)": -double: 1 -idouble: 1 -Test "tgamma (-0xf.fffffp-4)": -float: 1 -ifloat: 1 -Test "tgamma (0x1.28p+4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x1.38p+4)": -double: 2 -idouble: 2 -Test "tgamma (0x1.78p+4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x1.d8p+4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x1.e8p+4)": -float: 1 -ifloat: 1 -Test "tgamma (0x1.fffffep+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x1.fffffffffffffp+0)": -double: 1 -idouble: 1 -Test "tgamma (0x1p-24)": -float: 1 -ifloat: 1 -Test "tgamma (0x2.18p+4)": -float: 1 -ifloat: 1 -Test "tgamma (0x2.28p+4)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "tgamma (0x2.30a43cp+4)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "tgamma (0x2.8p+0)": -float: 2 -ifloat: 2 -Test "tgamma (0x2.fffffcp+0)": -float: 3 -ifloat: 3 -Test "tgamma (0x3.8p+0)": -float: 2 -ifloat: 2 -Test "tgamma (0x3.fffffcp+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x3.ffffffffffffep+0)": -double: 1 -idouble: 1 -Test "tgamma (0x3p+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x4.0000000000004p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x4.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x4.ffffffffffffcp+0)": -double: 1 -idouble: 1 -Test "tgamma (0x4p+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x5.0000000000004p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x5.000008p+0)": -float: 2 -ifloat: 2 -Test "tgamma (0x5.fffff8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x6.0000000000004p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x6.000008p+0)": -float: 2 -ifloat: 2 -Test "tgamma (0x6.8p+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x6.fffff8p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x6.ffffffffffffcp+0)": -double: 4 -idouble: 4 -Test "tgamma (0x6p+0)": -float: 1 -ifloat: 1 -Test "tgamma (0x7.0000000000004p+0)": -double: 4 -idouble: 4 -Test "tgamma (0x7.000008p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x7.8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (0x7.fffff8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "tgamma (0x7.ffffffffffffcp+0)": -double: 2 -idouble: 2 -Test "tgamma (0x7p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x8.00001p+0)": -double: 2 -idouble: 2 -Test "tgamma (0x8.8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "tgamma (0x8p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x8p-4)": -float: 1 -ifloat: 1 -Test "tgamma (0x8p-56)": -double: 1 -idouble: 1 -Test "tgamma (0x9.8p+0)": -double: 1 -idouble: 1 -Test "tgamma (0x9p+0)": -double: 1 -idouble: 1 -Test "tgamma (0xa.b9fd72b0fb238p+4)": -double: 1 -idouble: 1 -Test "tgamma (0xa.b9fd7p+4)": -double: 2 -idouble: 2 -Test "tgamma (0xap+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# y0 -Test "y0 (0x1.8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "y0 (0x1.ff00000000002p+840)": -double: 1 -idouble: 1 -Test "y0 (0x1p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "y0 (0x1p-20)": -float: 1 -ifloat: 1 -Test "y0 (0x1p-40)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "y0 (0x1p-80)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "y0 (0x4.ffcp+72)": -double: 1 -idouble: 1 -Test "y0 (0x4p-112)": -double: 1 -idouble: 1 -Test "y0 (0x4p-12)": -double: 1 -idouble: 1 -Test "y0 (0x4p-32)": -float: 1 -ifloat: 1 -Test "y0 (0x4p-52)": -float: 1 -ifloat: 1 -Test "y0 (0x4p-72)": -double: 1 -idouble: 1 -Test "y0 (0x8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "y0 (0xap+0)": -float: 1 -ifloat: 1 -Test "y0 (0xf.ffffffffffff8p+1020)": -double: 1 -idouble: 1 -Test "y0 (0xf.fffffp+124)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -# y1 -Test "y1 (0x1.8p+0)": -float: 1 -ifloat: 1 -Test "y1 (0x2p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "y1 (0x2p-4)": -double: 1 -idouble: 1 -Test "y1 (0x4p-12)": -double: 1 -idouble: 1 -Test "y1 (0x8p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "y1 (0x9.3f102p+96)": -double: 1 -idouble: 1 -Test "y1 (0xap+0)": -double: 3 -float: 1 -idouble: 3 -ifloat: 1 -Test "y1 (0xf.fffffp+124)": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -# yn -Test "yn (-10, 0x1p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "yn (0, 0x1.8p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "yn (0, 0x1p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "yn (0, 0x8p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (0, 0xap+0)": -float: 1 -ifloat: 1 -Test "yn (1, 0x1.8p+0)": -float: 1 -ifloat: 1 -Test "yn (1, 0x2p+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (1, 0x2p-4)": -double: 1 -idouble: 1 -Test "yn (1, 0x8p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "yn (1, 0xap+0)": -double: 3 -float: 1 -idouble: 3 -ifloat: 1 -Test "yn (10, 0x1p+0)": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 -Test "yn (10, 0x2p+0)": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 -Test "yn (10, 0x2p-4)": -double: 1 -idouble: 1 -Test "yn (10, 0xap+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (10, 0xcp-4)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (2, 0x8p+124)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (2, 0xf.fffb1p+96)": -double: 1 -idouble: 1 -Test "yn (2, 0xf.ffffffffffff8p+1020)": -double: 1 -idouble: 1 -Test "yn (2, 0xf.fffffp+124)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (3, 0x2p+0)": -double: 1 -idouble: 1 -Test "yn (3, 0x2p-4)": -double: 1 -idouble: 1 -Test "yn (3, 0xap+0)": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 -Test "yn (3, 0xcp-4)": -double: 1 -idouble: 1 - -# Maximal error of functions: -Function: "acosh": -double: 1 -idouble: 1 - -Function: "asinh": -double: 1 -float: 1 -ifloat: 1 - -Function: "atan2": -float: 1 -ifloat: 1 - -Function: "atanh": -float: 1 -ifloat: 1 - -Function: Real part of "cacos": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Imaginary part of "cacos": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Real part of "cacosh": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Imaginary part of "cacosh": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Real part of "casin": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "casin": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Real part of "casinh": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Imaginary part of "casinh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "catan": -float: 1 -ifloat: 1 - -Function: Imaginary part of "catan": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "catanh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "catanh": -float: 1 -ifloat: 1 - -Function: "cbrt": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "ccos": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "ccos": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "ccosh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "ccosh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "cexp": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: Imaginary part of "cexp": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: Real part of "clog": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "clog": -float: 1 -ifloat: 1 - -Function: Real part of "clog10": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -Function: Imaginary part of "clog10": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "cos": -float: 1 -ifloat: 1 - -Function: "cos_tonearest": -float: 1 -ifloat: 1 - -Function: "cosh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "cosh_tonearest": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "cpow": -double: 2 -float: 4 -idouble: 2 -ifloat: 4 - -Function: Imaginary part of "cpow": -float: 2 -ifloat: 2 - -Function: Real part of "csin": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "csinh": -float: 1 -ifloat: 1 - -Function: Imaginary part of "csinh": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "csqrt": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "csqrt": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Real part of "ctan": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "ctan": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: Real part of "ctan_tonearest": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: Imaginary part of "ctan_tonearest": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: Real part of "ctanh": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: Imaginary part of "ctanh": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -Function: Real part of "ctanh_tonearest": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: Imaginary part of "ctanh_tonearest": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -Function: "erf": -double: 1 -idouble: 1 - -Function: "erfc": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "exp10": -double: 1 -idouble: 1 - -Function: "exp10_tonearest": -double: 1 -idouble: 1 - -Function: "expm1": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "expm1_tonearest": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "gamma": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "hypot": -double: 1 -idouble: 1 - -Function: "j0": -double: 2 -float: 2 -idouble: 2 -ifloat: 2 - -Function: "j1": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: "jn": -double: 4 -float: 4 -idouble: 4 -ifloat: 4 - -Function: "lgamma": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 - -Function: "log": -float: 1 -ifloat: 1 - -Function: "log10": -double: 1 -float: 2 -idouble: 1 -ifloat: 2 - -Function: "log1p": -float: 1 -ifloat: 1 - -Function: "pow": -float: 1 -ifloat: 1 - -Function: "pow10": -double: 1 -idouble: 1 - -Function: "pow_tonearest": -float: 1 -ifloat: 1 - -Function: "sin": -float: 1 -ifloat: 1 - -Function: "sin_tonearest": -float: 1 -ifloat: 1 - -Function: "sincos": -float: 1 -ifloat: 1 - -Function: "tgamma": -double: 4 -float: 3 -idouble: 4 -ifloat: 3 - -Function: "y0": -double: 2 -float: 1 -idouble: 2 -ifloat: 1 - -Function: "y1": -double: 3 -float: 2 -idouble: 3 -ifloat: 2 - -Function: "yn": -double: 3 -float: 2 -idouble: 3 -ifloat: 2 - -# end of automatic generation diff --git a/ports/sysdeps/tile/machine-gmon.h b/ports/sysdeps/tile/machine-gmon.h deleted file mode 100644 index 39ea9f472c..0000000000 --- a/ports/sysdeps/tile/machine-gmon.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define _MCOUNT_DECL(from, self) \ - void __mcount_internal (u_long from, u_long self) - -/* Call __mcount_internal with our the return PC for our caller, and - the return PC our caller will return to. Empty since we use an - assembly stub instead. */ -#define MCOUNT diff --git a/ports/sysdeps/tile/math_private.h b/ports/sysdeps/tile/math_private.h deleted file mode 100644 index 90dcc3f866..0000000000 --- a/ports/sysdeps/tile/math_private.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _MATH_PRIVATE_H - -/* Internally, we suppress any use of exception or rounding other - than what is supported by the hardware. This does mean that some - code will silently fail to report exceptions, set rounding mode - as expected, etc., but it allows math code to compile that otherwise - wouldn't (such as math/s_fma.c) and so is valuable. - - We intentionally ignore the "exception" arguments of functions that - take an exception, since we can't even evaluate the argument - without causing a build failure. The extra level of statement - expression wrapping avoids "statement with no effect" warnings. - Since the callers don't check for errors anyway, we just claim - success in every case. - - The overrides for libc_ functions must happen before we include - the generic math_private.h, and the overrides for regular - <fenv.h> functions must happen afterwards, to avoid clashing with - the declarations of those functions. */ - -#define libc_fesetround(rnd) ({ 0; }) -#define libc_fetestexcept(exc) ({ 0; }) -#define libc_feholdexcept_setround(env, exc) ({ (void) (env); 0; }) -#define libc_feupdateenv_test(env, exc) ({ (void) (env); 0; }) - -#include_next <math_private.h> - -#define feraiseexcept(excepts) ({ 0; }) -#define feclearexcept(exc) ({ 0; }) - -#endif diff --git a/ports/sysdeps/tile/memcopy.h b/ports/sysdeps/tile/memcopy.h deleted file mode 100644 index e8326eee66..0000000000 --- a/ports/sysdeps/tile/memcopy.h +++ /dev/null @@ -1,27 +0,0 @@ -/* memcopy.h -- definitions for memory copy functions. Tile version. - Copyright (C) 2012-2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdeps/generic/memcopy.h> -#include <bits/wordsize.h> - -/* Support more efficient copying on tilegx32, which supports - long long as a native 64-bit type. */ -#if defined (__tilegx__) && __WORDSIZE == 32 -# undef op_t -# define op_t unsigned long long int -#endif diff --git a/ports/sysdeps/tile/nptl/Makefile b/ports/sysdeps/tile/nptl/Makefile deleted file mode 100644 index 0dea187cf5..0000000000 --- a/ports/sysdeps/tile/nptl/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) 2002-2014 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 -# <http://www.gnu.org/licenses/>. - -ifeq ($(subdir),csu) -gen-as-const-headers += tcb-offsets.sym -endif diff --git a/ports/sysdeps/tile/nptl/pthread_spin_lock.c b/ports/sysdeps/tile/nptl/pthread_spin_lock.c deleted file mode 100644 index 9414121fb7..0000000000 --- a/ports/sysdeps/tile/nptl/pthread_spin_lock.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <arch/spr_def.h> -#include <atomic.h> - -/* Bound point for bounded exponential backoff */ -#define BACKOFF_MAX 2048 - -/* Initial cycle delay for exponential backoff */ -#define BACKOFF_START 32 - -#ifdef __tilegx__ -/* Use cmpexch() after the initial fast-path exch to avoid - invalidating the cache line of the lock holder. */ -# define TNS(p) atomic_exchange_acq((p), 1) -# define CMPTNS(p) atomic_compare_and_exchange_val_acq((p), 1, 0) -#else -# define TNS(p) __insn_tns(p) -# define CMPTNS(p) __insn_tns(p) -# define SPR_CYCLE SPR_CYCLE_LOW /* The low 32 bits are sufficient. */ -#endif - -int -pthread_spin_lock (pthread_spinlock_t *lock) -{ - if (__builtin_expect (TNS (lock) != 0, 0)) - { - unsigned int backoff = BACKOFF_START; - while (CMPTNS (lock) != 0) - { - unsigned int start = __insn_mfspr (SPR_CYCLE); - while (__insn_mfspr (SPR_CYCLE) - start < backoff) - ; - if (backoff < BACKOFF_MAX) - backoff *= 2; - } - } - return 0; -} diff --git a/ports/sysdeps/tile/nptl/pthread_spin_trylock.c b/ports/sysdeps/tile/nptl/pthread_spin_trylock.c deleted file mode 100644 index bf96e61a96..0000000000 --- a/ports/sysdeps/tile/nptl/pthread_spin_trylock.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <errno.h> - -#ifdef __tilegx__ -#define TNS(p) __insn_exch4((p), 1) -#else -#define TNS(p) __insn_tns(p) -#endif - -int -pthread_spin_trylock (pthread_spinlock_t *lock) -{ - return (TNS (lock) == 0) ? 0 : EBUSY; -} diff --git a/ports/sysdeps/tile/nptl/pthread_spin_unlock.c b/ports/sysdeps/tile/nptl/pthread_spin_unlock.c deleted file mode 100644 index 0c4ac073c9..0000000000 --- a/ports/sysdeps/tile/nptl/pthread_spin_unlock.c +++ /dev/null @@ -1,33 +0,0 @@ -/* pthread_spin_unlock -- unlock a spin lock. Tile version. - Copyright (C) 2012-2014 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 - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <atomic.h> - -int -pthread_spin_unlock (pthread_spinlock_t *lock) -{ -#ifdef __tilegx__ - /* Use exchange() to bypass the write buffer. */ - atomic_exchange_rel (lock, 0); -#else - atomic_full_barrier (); - *lock = 0; -#endif - return 0; -} diff --git a/ports/sysdeps/tile/nptl/pthreaddef.h b/ports/sysdeps/tile/nptl/pthreaddef.h deleted file mode 100644 index f3997250d2..0000000000 --- a/ports/sysdeps/tile/nptl/pthreaddef.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include <string.h> - -/* Default stack size. */ -#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) - -/* Required stack pointer alignment at beginning. */ -#define STACK_ALIGN 16 - -/* Minimal stack size after allocating thread descriptor and guard size. */ -#define MINIMAL_REST_STACK 2048 - -/* Alignment requirement for TCB. */ -#define TCB_ALIGNMENT 16 - - -/* Location of current stack frame. */ -#define CURRENT_STACK_FRAME __builtin_frame_address (0) - -/* XXX Until we have a better place keep the definitions here. */ - -#define __exit_thread_inline(val) \ - INLINE_SYSCALL (exit, 1, (val)) diff --git a/ports/sysdeps/tile/nptl/tcb-offsets.sym b/ports/sysdeps/tile/nptl/tcb-offsets.sym deleted file mode 100644 index 6740bc976f..0000000000 --- a/ports/sysdeps/tile/nptl/tcb-offsets.sym +++ /dev/null @@ -1,17 +0,0 @@ -#define SHARED /* needed to get struct rtld_global from <ldsodefs.h> */ -#include <sysdep.h> -#include <tls.h> -#include <ldsodefs.h> - --- - --- Abuse tls.h macros to derive offsets relative to the thread register. -#define thread_offsetof(mem) (long)(offsetof(struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) - -MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads) -PID_OFFSET thread_offsetof (pid) -TID_OFFSET thread_offsetof (tid) -POINTER_GUARD (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) -FEEDBACK_DATA_OFFSET (offsetof (tcbhead_t, feedback_data) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) -DTV_OFFSET (offsetof (tcbhead_t, dtv) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) -TLS_GENERATION_OFFSET offsetof (struct rtld_global, _dl_tls_generation) diff --git a/ports/sysdeps/tile/nptl/tls.h b/ports/sysdeps/tile/nptl/tls.h deleted file mode 100644 index d226188fea..0000000000 --- a/ports/sysdeps/tile/nptl/tls.h +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _TLS_H -#define _TLS_H 1 - -# include <dl-sysdep.h> - -#ifndef __ASSEMBLER__ -# include <stdbool.h> -# include <stddef.h> -# include <stdint.h> - -/* Type for the dtv. */ -typedef union dtv -{ - size_t counter; - struct - { - void *val; - bool is_static; - } pointer; -} dtv_t; - -#else /* __ASSEMBLER__ */ -# include <tcb-offsets.h> -#endif /* __ASSEMBLER__ */ - - -#ifndef __ASSEMBLER__ - -/* Get system call information. */ -# include <sysdep.h> - -/* The TP points to the start of the thread blocks. */ -# define TLS_DTV_AT_TP 1 - -/* We use the multiple_threads field in the pthread struct */ -#define TLS_MULTIPLE_THREADS_IN_TCB 1 - -/* Get the thread descriptor definition. */ -# include <nptl/descr.h> - -/* The stack_guard is accessed directly by GCC -fstack-protector code, - so it is a part of public ABI. The dtv and pointer_guard fields - are private. */ -typedef struct -{ - void *feedback_data; - uintptr_t pointer_guard; - uintptr_t stack_guard; - dtv_t *dtv; -} tcbhead_t; - -/* This is the size of the initial TCB. Because our TCB is before the thread - pointer, we don't need this. */ -# define TLS_INIT_TCB_SIZE 0 - -/* Alignment requirements for the initial TCB. */ -# define TLS_INIT_TCB_ALIGN __alignof__ (struct pthread) - -/* This is the size of the TCB. Because our TCB is before the thread - pointer, we don't need this. */ -# define TLS_TCB_SIZE 0 - -/* Alignment requirements for the TCB. */ -# define TLS_TCB_ALIGN __alignof__ (struct pthread) - -/* This is the size we need before TCB - actually, it includes the TCB. */ -# define TLS_PRE_TCB_SIZE \ - (sizeof (struct pthread) \ - + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1))) - -/* Return the thread descriptor (tp) for the current thread. */ -register void *__thread_pointer asm ("tp"); - -/* The thread pointer (in hardware register tp) points to the end of - the TCB. The pthread_descr structure is immediately in front of the TCB. */ -# define TLS_TCB_OFFSET 0 - -/* Install the dtv pointer. The pointer passed is to the element with - index -1 which contain the length. */ -# define INSTALL_DTV(tcbp, dtvp) \ - (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1) - -/* Install new dtv for current thread. */ -# define INSTALL_NEW_DTV(dtv) (THREAD_DTV() = (dtv)) - -/* Return dtv of given thread descriptor. */ -# define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv) - -/* Code to initially initialize the thread pointer (tp). */ -# define TLS_INIT_TP(tcbp, secondcall) \ - (__thread_pointer = (char *)(tcbp) + TLS_TCB_OFFSET, NULL) - -/* Return the address of the dtv for the current thread. */ -# define THREAD_DTV() \ - (((tcbhead_t *) (__thread_pointer - TLS_TCB_OFFSET))[-1].dtv) - -/* Return the thread descriptor for the current thread. */ -# define THREAD_SELF \ - ((struct pthread *) (__thread_pointer \ - - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) - -/* Magic for libthread_db to know how to do THREAD_SELF. */ -#ifdef __tilegx__ -# define DB_THREAD_SELF \ - REGISTER (64, 64, REG_TP * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) -#else -# define DB_THREAD_SELF \ - REGISTER (32, 32, REG_TP * 4, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) -#endif - -/* Read member of the thread descriptor directly. */ -# define THREAD_GETMEM(descr, member) (descr->member) - -/* Same as THREAD_GETMEM, but the member offset can be non-constant. */ -# define THREAD_GETMEM_NC(descr, member, idx) \ - (descr->member[idx]) - -/* Set member of the thread descriptor directly. */ -# define THREAD_SETMEM(descr, member, value) \ - (descr->member = (value)) - -/* Same as THREAD_SETMEM, but the member offset can be non-constant. */ -# define THREAD_SETMEM_NC(descr, member, idx, value) \ - (descr->member[idx] = (value)) - -/* Set the stack guard field in TCB head. */ -# define THREAD_SET_STACK_GUARD(value) \ - (((tcbhead_t *) ((char *) __thread_pointer \ - - TLS_TCB_OFFSET))[-1].stack_guard = (value)) -# define THREAD_COPY_STACK_GUARD(descr) \ - (((tcbhead_t *) ((char *) (descr) \ - + TLS_PRE_TCB_SIZE))[-1].stack_guard \ - = ((tcbhead_t *) ((char *) __thread_pointer \ - - TLS_TCB_OFFSET))[-1].stack_guard) - -/* Set the pointer guard field in TCB head. */ -# define THREAD_GET_POINTER_GUARD() \ - (((tcbhead_t *) ((char *) __thread_pointer \ - - TLS_TCB_OFFSET))[-1].pointer_guard) -# define THREAD_SET_POINTER_GUARD(value) \ - (THREAD_GET_POINTER_GUARD () = (value)) -# define THREAD_COPY_POINTER_GUARD(descr) \ - (((tcbhead_t *) ((char *) (descr) \ - + TLS_PRE_TCB_SIZE))[-1].pointer_guard \ - = THREAD_GET_POINTER_GUARD()) - -/* l_tls_offset == 0 is perfectly valid on Tile, so we have to use some - different value to mean unset l_tls_offset. */ -# define NO_TLS_OFFSET -1 - -/* Get and set the global scope generation counter in struct pthread. */ -#define THREAD_GSCOPE_FLAG_UNUSED 0 -#define THREAD_GSCOPE_FLAG_USED 1 -#define THREAD_GSCOPE_FLAG_WAIT 2 -#define THREAD_GSCOPE_RESET_FLAG() \ - do \ - { int __res \ - = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ - THREAD_GSCOPE_FLAG_UNUSED); \ - if (__res == THREAD_GSCOPE_FLAG_WAIT) \ - lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \ - } \ - while (0) -#define THREAD_GSCOPE_SET_FLAG() \ - do \ - { \ - THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ - atomic_write_barrier (); \ - } \ - while (0) -#define THREAD_GSCOPE_WAIT() \ - GL(dl_wait_lookup_done) () - -#endif /* __ASSEMBLER__ */ - -#endif /* tls.h */ diff --git a/ports/sysdeps/tile/preconfigure b/ports/sysdeps/tile/preconfigure deleted file mode 100644 index 9dba5b1040..0000000000 --- a/ports/sysdeps/tile/preconfigure +++ /dev/null @@ -1,17 +0,0 @@ -# This is a -*- sh -*- -case "$machine" in - tilepro) - base_machine=tile machine=tile/tilepro ;; - tilegx) - base_machine=tile - if $CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | grep -q __LP64__; then - machine=tile/tilegx/tilegx64 - else - machine=tile/tilegx/tilegx32 - fi ;; -esac -case "$machine" in - tile*) - libc_commonpagesize=0x10000 - libc_relro_required=yes ;; -esac diff --git a/ports/sysdeps/tile/s_fma.c b/ports/sysdeps/tile/s_fma.c deleted file mode 100644 index d9613fa67c..0000000000 --- a/ports/sysdeps/tile/s_fma.c +++ /dev/null @@ -1 +0,0 @@ -#include <soft-fp/fmadf4.c> diff --git a/ports/sysdeps/tile/s_fmaf.c b/ports/sysdeps/tile/s_fmaf.c deleted file mode 100644 index aa5c9b2d91..0000000000 --- a/ports/sysdeps/tile/s_fmaf.c +++ /dev/null @@ -1 +0,0 @@ -#include <soft-fp/fmasf4.c> diff --git a/ports/sysdeps/tile/setjmp.S b/ports/sysdeps/tile/setjmp.S deleted file mode 100644 index a2f34251a0..0000000000 --- a/ports/sysdeps/tile/setjmp.S +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <jmpbuf-offsets.h> - - .text - - /* Keep traditional entry points in with sigsetjmp(). */ -ENTRY(setjmp) - { movei r1, 1; j 1f } -END(setjmp) - -ENTRY(_setjmp) - { movei r1, 0; j 1f } -END(_setjmp) -libc_hidden_def (_setjmp) - -ENTRY(__sigsetjmp) - FEEDBACK_ENTER(__sigsetjmp) -1: - move r2, r0 - -#define SAVE(r) { ST r2, r ; ADDI_PTR r2, r2, REGSIZE } - FOR_EACH_CALLEE_SAVED_REG(SAVE) - - mfspr r3, INTERRUPT_CRITICAL_SECTION - ST r2, r3 - j plt(__sigjmp_save) - jrp lr /* Keep the backtracer happy. */ -END(__sigsetjmp) diff --git a/ports/sysdeps/tile/sfp-machine.h b/ports/sysdeps/tile/sfp-machine.h deleted file mode 100644 index ff8beeffa7..0000000000 --- a/ports/sysdeps/tile/sfp-machine.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Machine-dependent software floating-point definitions, tile version. - Copyright (C) 2013-2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <bits/wordsize.h> - -#define _FP_W_TYPE_SIZE __WORDSIZE -#define _FP_W_TYPE unsigned long -#define _FP_WS_TYPE signed long -#define _FP_I_TYPE long - -#if _FP_W_TYPE_SIZE == 64 - -#define _FP_MUL_MEAT_S(R,X,Y) \ - _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y) -#define _FP_MUL_MEAT_D(R,X,Y) \ - _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_Q(R,X,Y) \ - _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) - -#define _FP_MUL_MEAT_DW_S(R,X,Y) \ - _FP_MUL_MEAT_DW_1_imm(_FP_WFRACBITS_S,R,X,Y) -#define _FP_MUL_MEAT_DW_D(R,X,Y) \ - _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_DW_Q(R,X,Y) \ - _FP_MUL_MEAT_DW_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) - -#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) -#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) -#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y) - -#define _FP_NANFRAC_S _FP_QNANBIT_S -#define _FP_NANFRAC_D _FP_QNANBIT_D -#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0 - -#else /* _FP_W_TYPE_SIZE == 32 */ - -#define _FP_MUL_MEAT_S(R,X,Y) \ - _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_D(R,X,Y) \ - _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_Q(R,X,Y) \ - _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) - -#define _FP_MUL_MEAT_DW_S(R,X,Y) \ - _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_DW_D(R,X,Y) \ - _FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) -#define _FP_MUL_MEAT_DW_Q(R,X,Y) \ - _FP_MUL_MEAT_DW_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) - -#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y) -#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) -#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y) - -#define _FP_NANFRAC_S _FP_QNANBIT_S -#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 -#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 - -#endif - -#define _FP_NANSIGN_S 1 -#define _FP_NANSIGN_D 1 -#define _FP_NANSIGN_Q 1 - -#define _FP_KEEPNANFRACP 1 -#define _FP_QNANNEGATEDP 0 - -#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ - do { \ - if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \ - && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \ - { \ - R##_s = Y##_s; \ - _FP_FRAC_COPY_##wc(R,Y); \ - } \ - else \ - { \ - R##_s = X##_s; \ - _FP_FRAC_COPY_##wc(R,X); \ - } \ - R##_c = FP_CLS_NAN; \ - } while (0) diff --git a/ports/sysdeps/tile/shlib-versions b/ports/sysdeps/tile/shlib-versions deleted file mode 100644 index f50868ff64..0000000000 --- a/ports/sysdeps/tile/shlib-versions +++ /dev/null @@ -1,2 +0,0 @@ -# glibc 2.12 was released to customers; 2.15 was the first community version. -tile.*-.*-linux-gnu DEFAULT GLIBC_2.12 GLIBC_2.15 diff --git a/ports/sysdeps/tile/sotruss-lib.c b/ports/sysdeps/tile/sotruss-lib.c deleted file mode 100644 index 6681770ec5..0000000000 --- a/ports/sysdeps/tile/sotruss-lib.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Override generic sotruss-lib.c to define actual functions for tile. - Copyright (C) 2012-2014 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 - <http://www.gnu.org/licenses/>. */ - -#define HAVE_ARCH_PLTENTER -#define HAVE_ARCH_PLTEXIT - -#include <elf/sotruss-lib.c> - -ElfW(Addr) -la_tile_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)), - unsigned int ndx __attribute__ ((unused)), - uintptr_t *refcook, uintptr_t *defcook, - La_tile_regs *regs, unsigned int *flags, - const char *symname, long int *framesizep) -{ - print_enter (refcook, defcook, symname, - regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2], - *flags); - - /* No need to copy anything, we will not need the parameters in any case. */ - *framesizep = 0; - - return sym->st_value; -} - -unsigned int -la_tile_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook, - uintptr_t *defcook, const struct La_tile_regs *inregs, - struct La_tile_retval *outregs, const char *symname) -{ - print_exit (refcook, defcook, symname, outregs->lrv_reg[0]); - - return 0; -} diff --git a/ports/sysdeps/tile/stackguard-macros.h b/ports/sysdeps/tile/stackguard-macros.h deleted file mode 100644 index f2e041b99b..0000000000 --- a/ports/sysdeps/tile/stackguard-macros.h +++ /dev/null @@ -1,20 +0,0 @@ -#include <bits/wordsize.h> - -#ifdef __tilegx__ -# if __WORDSIZE == 64 -# define STACK_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -16; ld %0, %0" : "=r" (x)); x; }) -# define POINTER_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -24; ld %0, %0" : "=r" (x)); x; }) -# else -# define STACK_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -8; ld4s %0, %0" : "=r" (x)); x; }) -# define POINTER_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -12; ld4s %0, %0" : "=r" (x)); x; }) -# endif -#else -# define STACK_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -8; lw %0, %0" : "=r" (x)); x; }) -# define POINTER_CHK_GUARD \ - ({ uintptr_t x; asm ("addi %0, tp, -12; lw %0, %0" : "=r" (x)); x; }) -#endif diff --git a/ports/sysdeps/tile/stackinfo.h b/ports/sysdeps/tile/stackinfo.h deleted file mode 100644 index 45c28a757b..0000000000 --- a/ports/sysdeps/tile/stackinfo.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* This file contains a bit of information about the stack allocation - of the processor. */ - -#ifndef _STACKINFO_H -#define _STACKINFO_H 1 - -#include <elf.h> - -/* On tile the stack grows down. */ -#define _STACK_GROWS_DOWN 1 - -/* Default to a non-executable stack. */ -#define DEFAULT_STACK_PERMS (PF_R|PF_W) - -/* Access to the stack pointer. The macros are used in alloca_account - for which they need to act as barriers as well, hence the additional - (unnecessary) parameters. */ -#define stackinfo_get_sp() \ - ({ void *p__; asm volatile ("move %0, sp" : "=r" (p__)); p__; }) -#if defined __tilegx__ && __WORDSIZE == 32 -#define __stackinfo_sub "subx" -#else -#define __stackinfo_sub "sub" -#endif -#define stackinfo_sub_sp(ptr) \ - ({ ptrdiff_t d__; \ - asm volatile (__stackinfo_sub " %0, %0, sp" : "=r" (d__) : "0" (ptr)); \ - d__; }) - -#endif /* stackinfo.h */ diff --git a/ports/sysdeps/tile/start.S b/ports/sysdeps/tile/start.S deleted file mode 100644 index 49661f21d8..0000000000 --- a/ports/sysdeps/tile/start.S +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The GNU Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - Note that people who make modified versions of this file are not - obligated to grant this special exception for their modified - versions; it is their choice whether to do so. The GNU Lesser - General Public License gives permission to release a modified - version without this exception; this exception also makes it - possible to release a modified version which carries forward this - exception. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* This is the canonical entry point, usually the first thing in the text - segment. The ELF standard tells us that the stack is set up like this on - entry (the left side is the offset from "sp"), in units of - __SIZEOF_POINTER__ entries: - - +0 argc - +1 argv[0] - ... - +(argc+1) NULL - +(argc+2) envp[0] - ... - NULL - ... ElfInfo - - The ElfInfo is pairs of key/value long words following the envp - pointers and terminated by a zero-valued key. - - Although not mandated by the standard, it happens to be the case - that we store the actual argv and envp strings immediately after - the ElfInfo data on the stack. - - On entry r0 points to the shared library termination function, or 0 - if there isn't one. -*/ - -#include <features.h> -#include <sysdep.h> -#include <arch/abi.h> - -/* Just create no-ops if we don't support PC-relative PLT relocations. */ -#ifdef NO_PLT_PCREL -# define hw2_last_plt(x) 0 -# define hw1_plt(x) 0 -# define hw0_plt(x) 0 -#endif - - .text - .global _start - .type _start,@function - .align 8 -_start: - /* Linux starts us with sp pointing at the conventional Elf layout, - but we need to allow two "caller" words for our ABI convention. */ - { - /* Load argc (stored as a "long", equivalent to a pointer type). */ - LD_PTR r1, sp - - /* Save incoming 'sp', which points to the Elf argument block. */ - move r52, sp - } - - { - /* Allocate stack frame callee space for __libc_start_main. */ - ADDI_PTR r12, sp, -(2 * REGSIZE) - } - - { - /* Get our PC. */ - lnk r13 - - /* sp is not necessarily properly aligned on startup because - of the way ld.so pops off leading argv elements. So align it. */ - andi sp, r12, -8 - } -.Lmy_pc: - - { - /* Pass the address of the shared library termination function. */ - move r5, r0 - - /* Compute location where __libc_start_main's caller is supposed to - store its frame pointer. */ - ADDI_PTR r12, sp, REGSIZE - - /* Zero out callee space for return address. Unnecessary but free. - This is just paranoia to help backtracing not go awry. */ - ST sp, zero - } - { - /* Zero out our frame pointer for __libc_start_main. */ - ST r12, zero - - /* Zero out lr to make __libc_start_main the end of backtrace. */ - move lr, zero - - /* Compute a pointer to argv. envp will be determined - later in __libc_start_main. We set up the first argument - (the address of main) below. */ - ADDI_PTR r2, r52, __SIZEOF_POINTER__ - } - { - /* Pass the highest stack address to user code. */ - ADDI_PTR r6, sp, (2 * REGSIZE) - - /* Pass address of main() in r0, and of our own entry - points to .fini and .init in r3 and r4. */ -#ifdef __tilegx__ - moveli r0, hw2_last(main - .Lmy_pc) - } - { - shl16insli r0, r0, hw1(main - .Lmy_pc) - moveli r3, hw2_last(__libc_csu_init - .Lmy_pc) - } - { - shl16insli r0, r0, hw0(main - .Lmy_pc) - shl16insli r3, r3, hw1(__libc_csu_init - .Lmy_pc) - } - { - ADD_PTR r0, r0, r13 - shl16insli r3, r3, hw0(__libc_csu_init - .Lmy_pc) - } - { - moveli r12, hw2_last_plt(__libc_start_main - .Lmy_pc) - ADD_PTR r3, r3, r13 - } - { - shl16insli r12, r12, hw1_plt(__libc_start_main - .Lmy_pc) - moveli r4, hw2_last(__libc_csu_fini - .Lmy_pc) - } - { - shl16insli r12, r12, hw0_plt(__libc_start_main - .Lmy_pc) - shl16insli r4, r4, hw1(__libc_csu_fini - .Lmy_pc) - } - { - ADD_PTR r12, r12, r13 - shl16insli r4, r4, hw0(__libc_csu_fini - .Lmy_pc) - } - { - ADD_PTR r4, r4, r13 -# ifdef NO_PLT_PCREL - j plt(__libc_start_main) -# else - jr r12 -# endif - } -#else - addli r0, r13, lo16(main - .Lmy_pc) - } - { - auli r0, r0, ha16(main - .Lmy_pc) - addli r3, r13, lo16(__libc_csu_init - .Lmy_pc) - } - { - auli r3, r3, ha16(__libc_csu_init - .Lmy_pc) - addli r4, r13, lo16(__libc_csu_fini - .Lmy_pc) - } - { - auli r4, r4, ha16(__libc_csu_fini - .Lmy_pc) - /* Call the user's main function, and exit with its value. - But let the libc call main. */ - j plt(__libc_start_main) - } -#endif - - { - /* Tell backtracer to give up (_start has no caller). */ - info INFO_OP_CANNOT_BACKTRACE - } -.size _start, .-_start - -/* Define a symbol for the first piece of initialized data. */ - .data - .global __data_start - .align 8 -__data_start: - .long 0 - .weak data_start - data_start = __data_start diff --git a/ports/sysdeps/tile/sysdep.h b/ports/sysdeps/tile/sysdep.h deleted file mode 100644 index 32aca49ff1..0000000000 --- a/ports/sysdeps/tile/sysdep.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sysdeps/generic/sysdep.h> -#include <bits/wordsize.h> -#include <arch/abi.h> - -#if defined __ASSEMBLER__ || defined REQUEST_ASSEMBLER_MACROS - -#include <feedback.h> - -/* Make use of .size directive. */ -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name; - -/* Define an entry point visible from C. */ -#define ENTRY(name) \ - .globl C_SYMBOL_NAME(name); \ - .type C_SYMBOL_NAME(name),@function; \ - .align 8; \ - C_LABEL(name) \ - cfi_startproc; \ - CALL_MCOUNT - -#undef END -#define END(name) \ - cfi_endproc; \ - ASM_SIZE_DIRECTIVE(name) - -/* Since C identifiers are not normally prefixed with an underscore - on this system, the asm identifier `syscall_error' intrudes on the - C name space. Make sure we use an innocuous name. */ -#define syscall_error __syscall_error -#define mcount __mcount - -/* If compiled for profiling, call `mcount' at the start of each function. - The mcount code requires the caller PC in r10. The `mcount' function - sets lr back to the value r10 had on entry when it returns. */ -#ifdef PROF -#define CALL_MCOUNT { move r10, lr; jal mcount } -#else -#define CALL_MCOUNT /* Do nothing. */ -#endif - -/* Local label name for asm code. */ -#define L(name) .L##name - -/* Specify the size in bytes of a machine register. */ -#ifdef __tilegx__ -#define REGSIZE 8 -#else -#define REGSIZE 4 -#endif - -/* Support a limited form of shared assembly between tilepro and tilegx. - The presumption is that LD/ST are used for manipulating registers. - Since opcode parsing is case-insensitive, we don't need to provide - definitions for these on tilegx. */ -#ifndef __tilegx__ -#define LD lw -#define LD4U lw -#define ST sw -#define ST4 sw -#define BNEZ bnz -#define BEQZ bz -#define BEQZT bzt -#define BGTZ bgz -#define CMPEQI seqi -#define CMPEQ seq -#define CMOVEQZ mvz -#define CMOVNEZ mvnz -#endif - -/* Provide "pointer-oriented" instruction variants. These differ not - just for tilepro vs tilegx, but also for tilegx -m64 vs -m32. */ -#if defined __tilegx__ && __WORDSIZE == 32 -#define ADD_PTR addx -#define ADDI_PTR addxi -#define ADDLI_PTR addxli -#define LD_PTR ld4s -#define ST_PTR st4 -#define SHL_PTR_ADD shl2add -#else -#define ADD_PTR add -#define ADDI_PTR addi -#define ADDLI_PTR addli -#define LD_PTR LD -#define ST_PTR ST -#ifdef __tilegx__ -#define SHL_PTR_ADD shl3add -#else -#define SHL_PTR_ADD s2a -#endif -#endif - -#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/tile/tilegx/Makefile b/ports/sysdeps/tile/tilegx/Makefile deleted file mode 100644 index 4281dd98fc..0000000000 --- a/ports/sysdeps/tile/tilegx/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -include $(common-objpfx)cflags-mcmodel-large.mk - -# Check for gcc to support the command-line switch, and for -# binutils to support the hwN_plt() assembly operators and relocations. -$(common-objpfx)cflags-mcmodel-large.mk: $(common-objpfx)config.make - mcmodel=no; \ - (echo 'int main() { return getuid(); }' | \ - $(CC) -o /dev/null -xc - -mcmodel=large -fpic) && mcmodel=yes; \ - echo "cflags-mcmodel-large = $$mcmodel" > $@ - -ifeq (yes,$(cflags-mcmodel-large)) - -ifeq ($(subdir),csu) -# elf-init.c is in libc_nonshared.o (the end of the shared object) but -# must reach the _init symbol at the very start of the shared object. -CFLAGS-elf-init.c += -mcmodel=large - -# __gmon_start__ is at the very start of the shared object when linked -# with profiling, but calls to libc.so via the PLT at the very end. -CFLAGS-gmon-start.c += -mcmodel=large -endif - -else - -# Don't try to compile assembly code with hwN_plt() directives if the -# toolchain doesn't support -mcmodel=large. -ifeq ($(subdir),csu) -CPPFLAGS-start.S += -DNO_PLT_PCREL -CPPFLAGS-crti.S += -DNO_PLT_PCREL -endif -ifeq ($(subdir),nptl) -CPPFLAGS-pt-crti.S += -DNO_PLT_PCREL -endif - -endif diff --git a/ports/sysdeps/tile/tilegx/bits/atomic.h b/ports/sysdeps/tile/tilegx/bits/atomic.h deleted file mode 100644 index ce12db0216..0000000000 --- a/ports/sysdeps/tile/tilegx/bits/atomic.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _BITS_ATOMIC_H -#define _BITS_ATOMIC_H 1 - -#include <arch/spr_def.h> - -/* Pick appropriate 8- or 4-byte instruction. */ -#define __atomic_update(mem, v, op) \ - ((__typeof (*(mem))) (__typeof (*(mem) - *(mem))) \ - ((sizeof (*(mem)) == 8) ? \ - __insn_##op ((void *) (mem), (int64_t) (__typeof((v) - (v))) (v)) : \ - (sizeof (*(mem)) == 4) ? \ - __insn_##op##4 ((void *) (mem), (int32_t) (__typeof ((v) - (v))) (v)) : \ - __atomic_error_bad_argument_size())) - -#define atomic_compare_and_exchange_val_acq(mem, n, o) \ - ({ __insn_mtspr (SPR_CMPEXCH_VALUE, (int64_t) (__typeof ((o) - (o))) (o)); \ - __atomic_update (mem, n, cmpexch); }) -#define atomic_exchange_acq(mem, newvalue) \ - __atomic_update (mem, newvalue, exch) -#define atomic_exchange_and_add(mem, value) \ - __atomic_update (mem, value, fetchadd) -#define atomic_and_val(mem, mask) \ - __atomic_update (mem, mask, fetchand) -#define atomic_or_val(mem, mask) \ - __atomic_update (mem, mask, fetchor) -#define atomic_decrement_if_positive(mem) \ - __atomic_update (mem, -1, fetchaddgez) - -#include <sysdeps/tile/bits/atomic.h> - -#endif /* bits/atomic.h */ diff --git a/ports/sysdeps/tile/tilegx/bits/wordsize.h b/ports/sysdeps/tile/tilegx/bits/wordsize.h deleted file mode 100644 index 5d4e4b4470..0000000000 --- a/ports/sysdeps/tile/tilegx/bits/wordsize.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Determine the wordsize from the preprocessor defines. */ - -#ifdef __LP64__ -# define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 -#else -# define __WORDSIZE 32 -#endif diff --git a/ports/sysdeps/tile/tilegx/memchr.c b/ports/sysdeps/tile/tilegx/memchr.c deleted file mode 100644 index ee17d9a40a..0000000000 --- a/ports/sysdeps/tile/tilegx/memchr.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -void * -__memchr (const void *s, int c, size_t n) -{ - const uint64_t *last_word_ptr; - const uint64_t *p; - const char *last_byte_ptr; - uintptr_t s_int; - uint64_t goal, before_mask, v, bits; - char *ret; - - if (__builtin_expect (n == 0, 0)) - { - /* Don't dereference any memory if the array is empty. */ - return NULL; - } - - /* Get an aligned pointer. */ - s_int = (uintptr_t) s; - p = (const uint64_t *) (s_int & -8); - - /* Create eight copies of the byte for which we are looking. */ - goal = copy_byte(c); - - /* Read the first word, but munge it so that bytes before the array - will not match goal. */ - before_mask = MASK (s_int); - v = (*p | before_mask) ^ (goal & before_mask); - - /* Compute the address of the last byte. */ - last_byte_ptr = (const char *) s + n - 1; - - /* Compute the address of the word containing the last byte. */ - last_word_ptr = (const uint64_t *) ((uintptr_t) last_byte_ptr & -8); - - while ((bits = __insn_v1cmpeq (v, goal)) == 0) - { - if (__builtin_expect (p == last_word_ptr, 0)) - { - /* We already read the last word in the array, so give up. */ - return NULL; - } - v = *++p; - } - - /* We found a match, but it might be in a byte past the end - of the array. */ - ret = ((char *) p) + (CFZ (bits) >> 3); - return (ret <= last_byte_ptr) ? ret : NULL; -} -weak_alias (__memchr, memchr) -libc_hidden_builtin_def (memchr) diff --git a/ports/sysdeps/tile/tilegx/memcpy.c b/ports/sysdeps/tile/tilegx/memcpy.c deleted file mode 100644 index 5d5df19ef3..0000000000 --- a/ports/sysdeps/tile/tilegx/memcpy.c +++ /dev/null @@ -1,272 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include <stdlib.h> -#include <memcopy.h> -#include <arch/chip.h> - -/* How many cache lines ahead should we prefetch? */ -#define PREFETCH_LINES_AHEAD 3 - -void * -__memcpy (void *__restrict dstv, const void *__restrict srcv, size_t n) -{ - char *__restrict dst1 = (char *) dstv; - const char *__restrict src1 = (const char *) srcv; - const char *__restrict src1_end; - const char *__restrict prefetch; - op_t *__restrict dst8; /* 8-byte pointer to destination memory. */ - op_t final; /* Final bytes to write to trailing word, if any */ - long i; - - if (n < 16) - { - for (; n; n--) - *dst1++ = *src1++; - return dstv; - } - - /* Locate the end of source memory we will copy. Don't prefetch - past this. */ - src1_end = src1 + n - 1; - - /* Prefetch ahead a few cache lines, but not past the end. */ - prefetch = src1; - for (i = 0; i < PREFETCH_LINES_AHEAD; i++) - { - __insn_prefetch (prefetch); - prefetch += CHIP_L2_LINE_SIZE (); - prefetch = (prefetch < src1_end) ? prefetch : src1; - } - - /* Copy bytes until dst is word-aligned. */ - for (; (uintptr_t) dst1 & (sizeof (op_t) - 1); n--) - *dst1++ = *src1++; - - /* 8-byte pointer to destination memory. */ - dst8 = (op_t *) dst1; - - if (__builtin_expect ((uintptr_t) src1 & (sizeof (op_t) - 1), 0)) - { - /* Misaligned copy. Use glibc's _wordcopy_fwd_dest_aligned, but - inline it to avoid prologue/epilogue. TODO: Consider - prefetching and using wh64 as well. */ - void * srci; - op_t a0, a1, a2, a3; - long int dstp = (long int) dst1; - long int srcp = (long int) src1; - long int len = n / OPSIZ; - - /* Save the initial source pointer so we know the number of - bytes to shift for merging two unaligned results. */ - srci = (void *) srcp; - - /* Make SRCP aligned by rounding it down to the beginning of the - `op_t' it points in the middle of. */ - srcp &= -OPSIZ; - - switch (len % 4) - { - case 2: - a1 = ((op_t *) srcp)[0]; - a2 = ((op_t *) srcp)[1]; - len += 2; - srcp += 2 * OPSIZ; - goto do1; - case 3: - a0 = ((op_t *) srcp)[0]; - a1 = ((op_t *) srcp)[1]; - len += 1; - srcp += 2 * OPSIZ; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return dstv; - a3 = ((op_t *) srcp)[0]; - a0 = ((op_t *) srcp)[1]; - len += 0; - srcp += 2 * OPSIZ; - goto do3; - case 1: - a2 = ((op_t *) srcp)[0]; - a3 = ((op_t *) srcp)[1]; - srcp += 2 * OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do4; /* No-op. */ - } - - do - { - do4: - a0 = ((op_t *) srcp)[0]; - a2 = __insn_dblalign (a2, a3, srci); - ((op_t *) dstp)[0] = a2; - srcp += OPSIZ; - dstp += OPSIZ; - do3: - a1 = ((op_t *) srcp)[0]; - a3 = __insn_dblalign (a3, a0, srci); - ((op_t *) dstp)[0] = a3; - srcp += OPSIZ; - dstp += OPSIZ; - do2: - a2 = ((op_t *) srcp)[0]; - a0 = __insn_dblalign (a0, a1, srci); - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - do1: - a3 = ((op_t *) srcp)[0]; - a1 = __insn_dblalign (a1, a2, srci); - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = __insn_dblalign (a2, a3, srci); - - n = n % OPSIZ; - if (n == 0) - return dstv; - - a0 = ((const char *) srcp <= src1_end) ? ((op_t *) srcp)[0] : 0; - - final = __insn_dblalign (a3, a0, srci); - dst8 = (op_t *)(dstp + OPSIZ); - } - else - { - /* Aligned copy. */ - - const op_t *__restrict src8 = (const op_t *) src1; - - /* src8 and dst8 are both word-aligned. */ - if (n >= CHIP_L2_LINE_SIZE ()) - { - /* Copy until 'dst' is cache-line-aligned. */ - for (; (uintptr_t) dst8 & (CHIP_L2_LINE_SIZE () - 1); - n -= sizeof (op_t)) - *dst8++ = *src8++; - - for (; n >= CHIP_L2_LINE_SIZE ();) - { - op_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - - /* Prefetch and advance to next line to prefetch, but - don't go past the end. */ - __insn_prefetch (prefetch); - prefetch += CHIP_L2_LINE_SIZE (); - prefetch = (prefetch < src1_end) ? prefetch : - (const char *) src8; - - /* Do all the loads before wh64. This is necessary if - [src8, src8+7] and [dst8, dst8+7] share the same - cache line and dst8 <= src8, as can be the case when - called from memmove, or with code tested on x86 whose - memcpy always works with forward copies. */ - tmp0 = *src8++; - tmp1 = *src8++; - tmp2 = *src8++; - tmp3 = *src8++; - tmp4 = *src8++; - tmp5 = *src8++; - tmp6 = *src8++; - tmp7 = *src8++; - - __insn_wh64 (dst8); - - *dst8++ = tmp0; - *dst8++ = tmp1; - *dst8++ = tmp2; - *dst8++ = tmp3; - *dst8++ = tmp4; - *dst8++ = tmp5; - *dst8++ = tmp6; - *dst8++ = tmp7; - - n -= 64; - } -#if CHIP_L2_LINE_SIZE() != 64 -# error "Fix code that assumes particular L2 cache line size." -#endif - } - - for (; n >= sizeof (op_t); n -= sizeof (op_t)) - *dst8++ = *src8++; - - if (__builtin_expect (n == 0, 1)) - return dstv; - - final = *src8; - } - - /* n != 0 if we get here. Write out any trailing bytes. */ - dst1 = (char *) dst8; -#ifndef __BIG_ENDIAN__ - if (n & 4) - { - *(uint32_t *) dst1 = final; - dst1 += 4; - final >>= 32; - n &= 3; - } - if (n & 2) - { - *(uint16_t *) dst1 = final; - dst1 += 2; - final >>= 16; - n &= 1; - } - if (n) - *(uint8_t *) dst1 = final; -#else - if (n & 4) - { - *(uint32_t *) dst1 = final >> 32; - dst1 += 4; - } - else - { - final >>= 32; - } - if (n & 2) - { - *(uint16_t *) dst1 = final >> 16; - dst1 += 2; - } - else - { - final >>= 16; - } - if (n & 1) - *(uint8_t *) dst1 = final >> 8; -#endif - - return dstv; -} -weak_alias (__memcpy, memcpy) -libc_hidden_builtin_def (memcpy) diff --git a/ports/sysdeps/tile/tilegx/memmove.c b/ports/sysdeps/tile/tilegx/memmove.c deleted file mode 100644 index 38323cea3d..0000000000 --- a/ports/sysdeps/tile/tilegx/memmove.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copy memory to memory until the specified number of bytes - has been copied. Overlap is handled correctly. - Copyright (C) 2012-2014 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 - <http://www.gnu.org/licenses/>. */ - -/* The tilegx implementation of memcpy is safe to use for memmove. */ -#define MEMCPY_OK_FOR_FWD_MEMMOVE 1 -#include <string/memmove.c> diff --git a/ports/sysdeps/tile/tilegx/memset.c b/ports/sysdeps/tile/tilegx/memset.c deleted file mode 100644 index d41b205a3c..0000000000 --- a/ports/sysdeps/tile/tilegx/memset.c +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <arch/chip.h> -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -void * -__memset (void *s, int c, size_t n) -{ - uint64_t *out64; - int n64, to_align64; - uint64_t v64; - uint8_t *out8 = s; - - /* Experimentation shows that a trivial tight loop is a win up until - around a size of 20, where writing a word at a time starts to win. */ -#define BYTE_CUTOFF 20 - -#if BYTE_CUTOFF < 7 - /* This must be at least at least this big, or some code later - on doesn't work. */ -# error "BYTE_CUTOFF is too small." -#endif - - if (n < BYTE_CUTOFF) - { - /* Strangely, this turns out to be the tightest way to write - this loop. */ - if (n != 0) - { - do - { - /* Strangely, combining these into one line performs worse. */ - *out8 = c; - out8++; - } - while (--n != 0); - } - - return s; - } - - /* Align 'out8'. We know n >= 7 so this won't write past the end. */ - while (((uintptr_t) out8 & 7) != 0) - { - *out8++ = c; - --n; - } - - /* Align 'n'. */ - while (n & 7) - out8[--n] = c; - - out64 = (uint64_t *) out8; - n64 = n >> 3; - - /* Tile input byte out to 64 bits. */ - v64 = copy_byte(c); - - /* This must be at least 8 or the following loop doesn't work. */ -#define CACHE_LINE_SIZE_IN_DOUBLEWORDS (CHIP_L2_LINE_SIZE() / 8) - - /* Determine how many words we need to emit before the 'out32' - pointer becomes aligned modulo the cache line size. */ - to_align64 = (-((uintptr_t) out64 >> 3)) & - (CACHE_LINE_SIZE_IN_DOUBLEWORDS - 1); - - /* Only bother aligning and using wh64 if there is at least - one full cache line to process. This check also prevents - overrunning the end of the buffer with alignment words. */ - if (to_align64 <= n64 - CACHE_LINE_SIZE_IN_DOUBLEWORDS) - { - int lines_left; - - /* Align out64 mod the cache line size so we can use wh64. */ - n64 -= to_align64; - for (; to_align64 != 0; to_align64--) - { - *out64 = v64; - out64++; - } - - /* Use unsigned divide to turn this into a right shift. */ - lines_left = (unsigned) n64 / CACHE_LINE_SIZE_IN_DOUBLEWORDS; - - do - { - /* Only wh64 a few lines at a time, so we don't exceed the - maximum number of victim lines. */ - int x = ((lines_left < CHIP_MAX_OUTSTANDING_VICTIMS ()) ? lines_left - : CHIP_MAX_OUTSTANDING_VICTIMS ()); - uint64_t *wh = out64; - int i = x; - int j; - - lines_left -= x; - - do - { - __insn_wh64 (wh); - wh += CACHE_LINE_SIZE_IN_DOUBLEWORDS; - } - while (--i); - - for (j = x * (CACHE_LINE_SIZE_IN_DOUBLEWORDS / 4); j != 0; j--) - { - *out64++ = v64; - *out64++ = v64; - *out64++ = v64; - *out64++ = v64; - } - } - while (lines_left != 0); - - /* We processed all full lines above, so only this many - words remain to be processed. */ - n64 &= CACHE_LINE_SIZE_IN_DOUBLEWORDS - 1; - } - - /* Now handle any leftover values. */ - if (n64 != 0) - { - do - { - *out64 = v64; - out64++; - } - while (--n64 != 0); - } - - return s; -} -weak_alias (__memset, memset) -libc_hidden_builtin_def (memset) diff --git a/ports/sysdeps/tile/tilegx/memusage.h b/ports/sysdeps/tile/tilegx/memusage.h deleted file mode 100644 index 7a9e661daf..0000000000 --- a/ports/sysdeps/tile/tilegx/memusage.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <stdint.h> -#include <arch/spr_def.h> - -#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; }) - -#define GETTIME(low,high) \ - { \ - uint64_t cycles = __insn_mfspr (SPR_CYCLE); \ - low = cycles & 0xffffffff; \ - high = cycles >> 32; \ - } - -#include <sysdeps/generic/memusage.h> diff --git a/ports/sysdeps/tile/tilegx/rawmemchr.c b/ports/sysdeps/tile/tilegx/rawmemchr.c deleted file mode 100644 index bd6d3c7c70..0000000000 --- a/ports/sysdeps/tile/tilegx/rawmemchr.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -void * -__rawmemchr (const void *s, int c) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint64_t *p = (const uint64_t *) (s_int & -8); - - /* Create eight copies of the byte for which we are looking. */ - const uint64_t goal = copy_byte(c); - - /* Read the first word, but munge it so that bytes before the array - will not match goal. */ - const uint64_t before_mask = MASK (s_int); - uint64_t v = (*p | before_mask) ^ (goal & before_mask); - - uint64_t bits; - while ((bits = __insn_v1cmpeq (v, goal)) == 0) - v = *++p; - - return ((char *) p) + (CFZ (bits) >> 3); -} -libc_hidden_def (__rawmemchr) -weak_alias (__rawmemchr, rawmemchr) diff --git a/ports/sysdeps/tile/tilegx/strchr.c b/ports/sysdeps/tile/tilegx/strchr.c deleted file mode 100644 index 0ce73ce89d..0000000000 --- a/ports/sysdeps/tile/tilegx/strchr.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -#undef strchr - -char * -strchr (const char *s, int c) -{ - int z, g; - - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint64_t *p = (const uint64_t *) (s_int & -8); - - /* Create eight copies of the byte for which we are looking. */ - const uint64_t goal = copy_byte(c); - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each byte - is 1, and the low 7 bits are all the opposite of the goal byte). */ - const uint64_t before_mask = MASK (s_int); - uint64_t v = (*p | before_mask) ^ (goal & __insn_v1shrui (before_mask, 1)); - - uint64_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_v1cmpeqi (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_v1cmpeq (v, goal); - - if (__builtin_expect ((zero_matches | goal_matches) != 0, 0)) - break; - - v = *++p; - } - - z = CFZ (zero_matches); - g = CFZ (goal_matches); - - /* If we found c before '\0' we got a match. Note that if c == '\0' - then g == z, and we correctly return the address of the '\0' - rather than NULL. */ - return (g <= z) ? ((char *) p) + (g >> 3) : NULL; -} -weak_alias (strchr, index) -libc_hidden_builtin_def (strchr) diff --git a/ports/sysdeps/tile/tilegx/strchrnul.c b/ports/sysdeps/tile/tilegx/strchrnul.c deleted file mode 100644 index 34c4317417..0000000000 --- a/ports/sysdeps/tile/tilegx/strchrnul.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -char * -__strchrnul (const char *s, int c) -{ - int z, g; - - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint64_t *p = (const uint64_t *) (s_int & -8); - - /* Create eight copies of the byte for which we are looking. */ - const uint64_t goal = copy_byte(c); - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each byte - is 1, and the low 7 bits are all the opposite of the goal byte). */ - const uint64_t before_mask = MASK (s_int); - uint64_t v = (*p | before_mask) ^ (goal & __insn_v1shrui (before_mask, 1)); - - uint64_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_v1cmpeqi (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_v1cmpeq (v, goal); - - if (__builtin_expect ((zero_matches | goal_matches) != 0, 0)) - break; - - v = *++p; - } - - z = CFZ (zero_matches); - g = CFZ (goal_matches); - - /* Return a pointer to the NUL or goal, whichever is first. */ - if (z < g) - g = z; - return ((char *) p) + (g >> 3); -} -weak_alias (__strchrnul, strchrnul) diff --git a/ports/sysdeps/tile/tilegx/string-endian.h b/ports/sysdeps/tile/tilegx/string-endian.h deleted file mode 100644 index 0c4d51766d..0000000000 --- a/ports/sysdeps/tile/tilegx/string-endian.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* Provide a mask based on the pointer alignment that - sets up non-zero bytes before the beginning of the string. - The MASK expression works because shift counts are taken mod 64. - Also, specify how to count "first" and "last" bits - when the bits have been read as a word. */ - -#include <stdint.h> - -#ifndef __BIG_ENDIAN__ -#define MASK(x) (__insn_shl(1ULL, (x << 3)) - 1) -#define NULMASK(x) ((2ULL << x) - 1) -#define CFZ(x) __insn_ctz(x) -#define REVCZ(x) __insn_clz(x) -#else -#define MASK(x) (__insn_shl(-2LL, ((-x << 3) - 1))) -#define NULMASK(x) (-2LL << (63 - x)) -#define CFZ(x) __insn_clz(x) -#define REVCZ(x) __insn_ctz(x) -#endif - -/* Create eight copies of the byte in a uint64_t. */ -static inline uint64_t copy_byte(uint8_t byte) -{ - uint64_t word = byte; - word = __insn_bfins(word, word, 8, 15); - word = __insn_bfins(word, word, 16, 31); - word = __insn_bfins(word, word, 32, 63); - return word; -} diff --git a/ports/sysdeps/tile/tilegx/strlen.c b/ports/sysdeps/tile/tilegx/strlen.c deleted file mode 100644 index d0c06dc23e..0000000000 --- a/ports/sysdeps/tile/tilegx/strlen.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -size_t -strlen (const char *s) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint64_t *p = (const uint64_t *) (s_int & -8); - - /* Read and MASK the first word. */ - uint64_t v = *p | MASK (s_int); - - uint64_t bits; - while ((bits = __insn_v1cmpeqi (v, 0)) == 0) - v = *++p; - - return ((const char *) p) + (CFZ (bits) >> 3) - s; -} -libc_hidden_builtin_def (strlen) diff --git a/ports/sysdeps/tile/tilegx/strrchr.c b/ports/sysdeps/tile/tilegx/strrchr.c deleted file mode 100644 index f201cfa4fa..0000000000 --- a/ports/sysdeps/tile/tilegx/strrchr.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include "string-endian.h" - -char * -strrchr (const char *s, int c) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint64_t *p = (const uint64_t *) (s_int & -8); - - /* Create eight copies of the byte for which we are looking. */ - const uint64_t goal = copy_byte(c); - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each byte - is 1, and the low 7 bits are all the opposite of the goal byte). */ - const uint64_t before_mask = MASK (s_int); - uint64_t v = (*p | before_mask) ^ (goal & __insn_v1shrui (before_mask, 1)); - const char *found = NULL; - uint64_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_v1cmpeqi (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_v1cmpeq (v, goal); - - /* If we found the goal, record the last offset. */ - if (__builtin_expect (goal_matches != 0, 0)) - { - if (__builtin_expect (zero_matches != 0, 0)) - { - /* Clear any goal after the first zero. */ - int first_nul = CFZ (zero_matches); - goal_matches &= NULMASK (first_nul); - } - if (__builtin_expect (goal_matches != 0, 1)) - found = ((char *) p) + 7 - (REVCZ (goal_matches) >> 3); - } - - if (__builtin_expect (zero_matches != 0, 0)) - return (char *) found; - - v = *++p; - } -} -weak_alias (strrchr, rindex) -libc_hidden_builtin_def (strrchr) diff --git a/ports/sysdeps/tile/tilegx/tilegx32/Implies b/ports/sysdeps/tile/tilegx/tilegx32/Implies deleted file mode 100644 index 993b7f4cd1..0000000000 --- a/ports/sysdeps/tile/tilegx/tilegx32/Implies +++ /dev/null @@ -1,3 +0,0 @@ -tile/tilegx -tile -wordsize-32 diff --git a/ports/sysdeps/tile/tilegx/tilegx64/Implies b/ports/sysdeps/tile/tilegx/tilegx64/Implies deleted file mode 100644 index eb0686e0e6..0000000000 --- a/ports/sysdeps/tile/tilegx/tilegx64/Implies +++ /dev/null @@ -1,3 +0,0 @@ -tile/tilegx -tile -wordsize-64 diff --git a/ports/sysdeps/tile/tilepro/Implies b/ports/sysdeps/tile/tilepro/Implies deleted file mode 100644 index 709e1dc122..0000000000 --- a/ports/sysdeps/tile/tilepro/Implies +++ /dev/null @@ -1,2 +0,0 @@ -tile -wordsize-32 diff --git a/ports/sysdeps/tile/tilepro/bits/atomic.h b/ports/sysdeps/tile/tilepro/bits/atomic.h deleted file mode 100644 index cbbf64cef1..0000000000 --- a/ports/sysdeps/tile/tilepro/bits/atomic.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _BITS_ATOMIC_H -#define _BITS_ATOMIC_H 1 - -#include <asm/unistd.h> - -/* 32-bit integer compare-and-exchange. */ -static __inline __attribute__ ((always_inline)) -int __atomic_cmpxchg_32 (volatile int *mem, int newval, int oldval) -{ - int result; - __asm__ __volatile__ ("swint1" - : "=R00" (result), "=m" (*mem) - : "R10" (__NR_FAST_cmpxchg), "R00" (mem), - "R01" (oldval), "R02" (newval), "m" (*mem) - : "r20", "r21", "r22", "r23", "r24", - "r25", "r26", "r27", "r28", "r29", "memory"); - return result; -} - -#define atomic_compare_and_exchange_val_acq(mem, n, o) \ - ((__typeof (*(mem))) \ - ((sizeof (*(mem)) == 4) ? \ - __atomic_cmpxchg_32 ((int *) (mem), (int) (n), (int) (o)) : \ - __atomic_error_bad_argument_size())) - -/* Atomically compute: - int old = *ptr; - *ptr = (old & mask) + addend; - return old; */ - -static __inline __attribute__ ((always_inline)) -int __atomic_update_32 (volatile int *mem, int mask, int addend) -{ - int result; - __asm__ __volatile__ ("swint1" - : "=R00" (result), "=m" (*mem) - : "R10" (__NR_FAST_atomic_update), "R00" (mem), - "R01" (mask), "R02" (addend), "m" (*mem) - : "r20", "r21", "r22", "r23", "r24", - "r25", "r26", "r27", "r28", "r29", "memory"); - return result; -} - -/* Size-checked verson of __atomic_update_32. */ -#define __atomic_update(mem, mask, addend) \ - ((__typeof (*(mem))) \ - ((sizeof (*(mem)) == 4) ? \ - __atomic_update_32 ((int *) (mem), (int) (mask), (int) (addend)) : \ - __atomic_error_bad_argument_size ())) - -#define atomic_exchange_acq(mem, newvalue) \ - __atomic_update ((mem), 0, (newvalue)) -#define atomic_exchange_and_add(mem, value) \ - __atomic_update ((mem), -1, (value)) -#define atomic_and_val(mem, mask) \ - __atomic_update ((mem), (mask), 0) -#define atomic_or_val(mem, mask) \ - ({ __typeof (mask) __att1_v = (mask); \ - __atomic_update ((mem), ~__att1_v, __att1_v); }) - -#include <sysdeps/tile/bits/atomic.h> - -#endif /* bits/atomic.h */ diff --git a/ports/sysdeps/tile/tilepro/bits/wordsize.h b/ports/sysdeps/tile/tilepro/bits/wordsize.h deleted file mode 100644 index da587a2f12..0000000000 --- a/ports/sysdeps/tile/tilepro/bits/wordsize.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Determine the wordsize from the preprocessor defines. */ - -#define __WORDSIZE 32 diff --git a/ports/sysdeps/tile/tilepro/memchr.c b/ports/sysdeps/tile/tilepro/memchr.c deleted file mode 100644 index 87e64d2216..0000000000 --- a/ports/sysdeps/tile/tilepro/memchr.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -void * -__memchr (const void *s, int c, size_t n) -{ - const uint32_t *last_word_ptr; - const uint32_t *p; - const char *last_byte_ptr; - uintptr_t s_int; - uint32_t goal, before_mask, v, bits; - char *ret; - - if (__builtin_expect (n == 0, 0)) - { - /* Don't dereference any memory if the array is empty. */ - return NULL; - } - - /* Get an aligned pointer. */ - s_int = (uintptr_t) s; - p = (const uint32_t *) (s_int & -4); - - /* Create four copies of the byte for which we are looking. */ - goal = 0x01010101 * (uint8_t) c; - - /* Read the first word, but munge it so that bytes before the array - will not match goal. Note that this shift count expression works - because we know shift counts are taken mod 32. */ - before_mask = (1 << (s_int << 3)) - 1; - v = (*p | before_mask) ^ (goal & before_mask); - - /* Compute the address of the last byte. */ - last_byte_ptr = (const char *) s + n - 1; - - /* Compute the address of the word containing the last byte. */ - last_word_ptr = (const uint32_t *) ((uintptr_t) last_byte_ptr & -4); - - while ((bits = __insn_seqb (v, goal)) == 0) - { - if (__builtin_expect (p == last_word_ptr, 0)) - { - /* We already read the last word in the array, so give up. */ - return NULL; - } - v = *++p; - } - - /* We found a match, but it might be in a byte past the end of the array. */ - ret = ((char *) p) + (__insn_ctz (bits) >> 3); - return (ret <= last_byte_ptr) ? ret : NULL; -} -weak_alias (__memchr, memchr) -libc_hidden_builtin_def (memchr) diff --git a/ports/sysdeps/tile/tilepro/memcpy.S b/ports/sysdeps/tile/tilepro/memcpy.S deleted file mode 100644 index 1d496a4f2c..0000000000 --- a/ports/sysdeps/tile/tilepro/memcpy.S +++ /dev/null @@ -1,397 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <arch/chip.h> -#include <sysdep.h> - - .text -ENTRY (__memcpy) - FEEDBACK_ENTER(__memcpy) - - /* r0 is the dest, r1 is the source, r2 is the size. */ - - /* Save aside original dest so we can return it at the end. */ - { sw sp, lr; move r23, r0; or r4, r0, r1 } - cfi_offset (lr, 0) - - /* Check for an empty size. */ - { bz r2, .Ldone; andi r4, r4, 3 } - - /* Check for an unaligned source or dest. */ - { bnz r4, .Lcopy_unaligned_maybe_many; addli r4, r2, -256 } - -.Lcheck_aligned_copy_size: - /* If we are copying < 256 bytes, branch to simple case. */ - { blzt r4, .Lcopy_8_check; slti_u r8, r2, 8 } - - /* Copying >= 256 bytes, so jump to complex prefetching loop. */ - { andi r6, r1, 63; j .Lcopy_many } - -/* Aligned 4 byte at a time copy loop. */ - -.Lcopy_8_loop: - /* Copy two words at a time to hide load latency. */ - { lw r3, r1; addi r1, r1, 4; slti_u r8, r2, 16 } - { lw r4, r1; addi r1, r1, 4 } - { sw r0, r3; addi r0, r0, 4; addi r2, r2, -4 } - { sw r0, r4; addi r0, r0, 4; addi r2, r2, -4 } -.Lcopy_8_check: - { bzt r8, .Lcopy_8_loop; slti_u r4, r2, 4 } - - /* Copy odd leftover word, if any. */ - { bnzt r4, .Lcheck_odd_stragglers } - { lw r3, r1; addi r1, r1, 4 } - { sw r0, r3; addi r0, r0, 4; addi r2, r2, -4 } - -.Lcheck_odd_stragglers: - { bnz r2, .Lcopy_unaligned_few } - -.Ldone: - { move r0, r23; jrp lr } - -/* Prefetching multiple cache line copy handler (for large transfers). */ - - /* Copy words until r1 is cache-line-aligned. */ -.Lalign_loop: - { lw r3, r1; addi r1, r1, 4 } - { andi r6, r1, 63 } - { sw r0, r3; addi r0, r0, 4; addi r2, r2, -4 } -.Lcopy_many: - { bnzt r6, .Lalign_loop; addi r9, r0, 63 } - - { addi r3, r1, 60; andi r9, r9, -64 } - - /* No need to prefetch dst, we'll just do the wh64 - right before we copy a line. */ - { lw r5, r3; addi r3, r3, 64; movei r4, 1 } - /* Intentionally stall for a few cycles to leave L2 cache alone. */ - { bnzt zero, .; move r27, lr } - { lw r6, r3; addi r3, r3, 64 } - /* Intentionally stall for a few cycles to leave L2 cache alone. */ - { bnzt zero, . } - { lw r7, r3; addi r3, r3, 64 } - /* Intentionally stall for a few cycles to leave L2 cache alone. */ - { bz zero, .Lbig_loop2 } - - /* On entry to this loop: - - r0 points to the start of dst line 0 - - r1 points to start of src line 0 - - r2 >= (256 - 60), only the first time the loop trips. - - r3 contains r1 + 128 + 60 [pointer to end of source line 2] - This is our prefetch address. When we get near the end - rather than prefetching off the end this is changed to point - to some "safe" recently loaded address. - - r5 contains *(r1 + 60) [i.e. last word of source line 0] - - r6 contains *(r1 + 64 + 60) [i.e. last word of source line 1] - - r9 contains ((r0 + 63) & -64) - [start of next dst cache line.] */ - -.Lbig_loop: - { jal .Lcopy_line2; add r15, r1, r2 } - -.Lbig_loop2: - /* Copy line 0, first stalling until r5 is ready. */ - { move r12, r5; lw r16, r1 } - { bz r4, .Lcopy_8_check; slti_u r8, r2, 8 } - /* Prefetch several lines ahead. */ - { lw r5, r3; addi r3, r3, 64 } - { jal .Lcopy_line } - - /* Copy line 1, first stalling until r6 is ready. */ - { move r12, r6; lw r16, r1 } - { bz r4, .Lcopy_8_check; slti_u r8, r2, 8 } - /* Prefetch several lines ahead. */ - { lw r6, r3; addi r3, r3, 64 } - { jal .Lcopy_line } - - /* Copy line 2, first stalling until r7 is ready. */ - { move r12, r7; lw r16, r1 } - { bz r4, .Lcopy_8_check; slti_u r8, r2, 8 } - /* Prefetch several lines ahead. */ - { lw r7, r3; addi r3, r3, 64 } - /* Use up a caches-busy cycle by jumping back to the top of the - loop. Might as well get it out of the way now. */ - { j .Lbig_loop } - - - /* On entry: - - r0 points to the destination line. - - r1 points to the source line. - - r3 is the next prefetch address. - - r9 holds the last address used for wh64. - - r12 = WORD_15 - - r16 = WORD_0. - - r17 == r1 + 16. - - r27 holds saved lr to restore. - - On exit: - - r0 is incremented by 64. - - r1 is incremented by 64, unless that would point to a word - beyond the end of the source array, in which case it is redirected - to point to an arbitrary word already in the cache. - - r2 is decremented by 64. - - r3 is unchanged, unless it points to a word beyond the - end of the source array, in which case it is redirected - to point to an arbitrary word already in the cache. - Redirecting is OK since if we are that close to the end - of the array we will not come back to this subroutine - and use the contents of the prefetched address. - - r4 is nonzero iff r2 >= 64. - - r9 is incremented by 64, unless it points beyond the - end of the last full destination cache line, in which - case it is redirected to a "safe address" that can be - clobbered (sp - 64) - - lr contains the value in r27. */ - -/* r26 unused */ - -.Lcopy_line: - /* TODO: when r3 goes past the end, we would like to redirect it - to prefetch the last partial cache line (if any) just once, for the - benefit of the final cleanup loop. But we don't want to - prefetch that line more than once, or subsequent prefetches - will go into the RTF. But then .Lbig_loop should unconditionally - branch to top of loop to execute final prefetch, and its - nop should become a conditional branch. */ - - /* We need two non-memory cycles here to cover the resources - used by the loads initiated by the caller. */ - { add r15, r1, r2 } -.Lcopy_line2: - { slt_u r13, r3, r15; addi r17, r1, 16 } - - /* NOTE: this will stall for one cycle as L1 is busy. */ - - /* Fill second L1D line. */ - { lw r17, r17; addi r1, r1, 48; mvz r3, r13, r1 } /* r17 = WORD_4 */ - - /* Prepare destination line for writing. */ - { wh64 r9; addi r9, r9, 64 } - - /* Load seven words that are L1D hits to cover wh64 L2 usage. */ - - /* Load the three remaining words from the last L1D line, which - we know has already filled the L1D. */ - { lw r4, r1; addi r1, r1, 4; addi r20, r1, 16 } /* r4 = WORD_12 */ - { lw r8, r1; addi r1, r1, 4; slt_u r13, r20, r15 }/* r8 = WORD_13 */ - { lw r11, r1; addi r1, r1, -52; mvz r20, r13, r1 } /* r11 = WORD_14 */ - - /* Load the three remaining words from the first L1D line, first - stalling until it has filled by "looking at" r16. */ - { lw r13, r1; addi r1, r1, 4; move zero, r16 } /* r13 = WORD_1 */ - { lw r14, r1; addi r1, r1, 4 } /* r14 = WORD_2 */ - { lw r15, r1; addi r1, r1, 8; addi r10, r0, 60 } /* r15 = WORD_3 */ - - /* Load second word from the second L1D line, first - stalling until it has filled by "looking at" r17. */ - { lw r19, r1; addi r1, r1, 4; move zero, r17 } /* r19 = WORD_5 */ - - /* Store last word to the destination line, potentially dirtying it - for the first time, which keeps the L2 busy for two cycles. */ - { sw r10, r12 } /* store(WORD_15) */ - - /* Use two L1D hits to cover the sw L2 access above. */ - { lw r10, r1; addi r1, r1, 4 } /* r10 = WORD_6 */ - { lw r12, r1; addi r1, r1, 4 } /* r12 = WORD_7 */ - - /* Fill third L1D line. */ - { lw r18, r1; addi r1, r1, 4 } /* r18 = WORD_8 */ - - /* Store first L1D line. */ - { sw r0, r16; addi r0, r0, 4; add r16, r0, r2 } /* store(WORD_0) */ - { sw r0, r13; addi r0, r0, 4; andi r16, r16, -64 } /* store(WORD_1) */ - { sw r0, r14; addi r0, r0, 4; slt_u r16, r9, r16 } /* store(WORD_2) */ - { sw r0, r15; addi r0, r0, 4; addi r13, sp, -64 } /* store(WORD_3) */ - - /* Store second L1D line. */ - { sw r0, r17; addi r0, r0, 4; mvz r9, r16, r13 }/* store(WORD_4) */ - { sw r0, r19; addi r0, r0, 4 } /* store(WORD_5) */ - { sw r0, r10; addi r0, r0, 4 } /* store(WORD_6) */ - { sw r0, r12; addi r0, r0, 4 } /* store(WORD_7) */ - - { lw r13, r1; addi r1, r1, 4; move zero, r18 } /* r13 = WORD_9 */ - { lw r14, r1; addi r1, r1, 4 } /* r14 = WORD_10 */ - { lw r15, r1; move r1, r20 } /* r15 = WORD_11 */ - - /* Store third L1D line. */ - { sw r0, r18; addi r0, r0, 4 } /* store(WORD_8) */ - { sw r0, r13; addi r0, r0, 4 } /* store(WORD_9) */ - { sw r0, r14; addi r0, r0, 4 } /* store(WORD_10) */ - { sw r0, r15; addi r0, r0, 4 } /* store(WORD_11) */ - - /* Store rest of fourth L1D line. */ - { sw r0, r4; addi r0, r0, 4 } /* store(WORD_12) */ - { - sw r0, r8 /* store(WORD_13) */ - addi r0, r0, 4 - /* Will r2 be > 64 after we subtract 64 below? */ - shri r4, r2, 7 - } - { - sw r0, r11 /* store(WORD_14) */ - addi r0, r0, 8 - /* Record 64 bytes successfully copied. */ - addi r2, r2, -64 - } - - { jrp lr; move lr, r27 } - - /* Convey to the backtrace library that the stack frame is - size zero, and the real return address is on the stack - rather than in 'lr'. */ - { info 8 } - - .align 64 -.Lcopy_unaligned_maybe_many: - /* Skip the setup overhead if we aren't copying many bytes. */ - { slti_u r8, r2, 20; sub r4, zero, r0 } - { bnzt r8, .Lcopy_unaligned_few; andi r4, r4, 3 } - { bz r4, .Ldest_is_word_aligned; add r18, r1, r2 } - -/* Unaligned 4 byte at a time copy handler. */ - - /* Copy single bytes until r0 == 0 mod 4, so we can store words. */ -.Lalign_dest_loop: - { lb_u r3, r1; addi r1, r1, 1; addi r4, r4, -1 } - { sb r0, r3; addi r0, r0, 1; addi r2, r2, -1 } - { bnzt r4, .Lalign_dest_loop; andi r3, r1, 3 } - - /* If source and dest are now *both* aligned, do an aligned copy. */ - { bz r3, .Lcheck_aligned_copy_size; addli r4, r2, -256 } - -.Ldest_is_word_aligned: - - { andi r8, r0, 63; lwadd_na r6, r1, 4} - { slti_u r9, r2, 64; bz r8, .Ldest_is_L2_line_aligned } - - /* This copies unaligned words until either there are fewer - than 4 bytes left to copy, or until the destination pointer - is cache-aligned, whichever comes first. - - On entry: - - r0 is the next store address. - - r1 points 4 bytes past the load address corresponding to r0. - - r2 >= 4 - - r6 is the next aligned word loaded. */ -.Lcopy_unaligned_src_words: - { lwadd_na r7, r1, 4; slti_u r8, r2, 4 + 4 } - /* stall */ - { dword_align r6, r7, r1; slti_u r9, r2, 64 + 4 } - { swadd r0, r6, 4; addi r2, r2, -4 } - { bnz r8, .Lcleanup_unaligned_words; andi r8, r0, 63 } - { bnzt r8, .Lcopy_unaligned_src_words; move r6, r7 } - - /* On entry: - - r0 is the next store address. - - r1 points 4 bytes past the load address corresponding to r0. - - r2 >= 4 (# of bytes left to store). - - r6 is the next aligned src word value. - - r9 = (r2 < 64U). - - r18 points one byte past the end of source memory. */ -.Ldest_is_L2_line_aligned: - - { - /* Not a full cache line remains. */ - bnz r9, .Lcleanup_unaligned_words - move r7, r6 - } - - /* r2 >= 64 */ - - /* Kick off two prefetches, but don't go past the end. */ - { addi r3, r1, 63 - 4; addi r8, r1, 64 + 63 - 4 } - { prefetch r3; move r3, r8; slt_u r8, r8, r18 } - { mvz r3, r8, r1; addi r8, r3, 64 } - { prefetch r3; move r3, r8; slt_u r8, r8, r18 } - { mvz r3, r8, r1; movei r17, 0 } - -.Lcopy_unaligned_line: - /* Prefetch another line. */ - { prefetch r3; addi r15, r1, 60; addi r3, r3, 64 } - /* Fire off a load of the last word we are about to copy. */ - { lw_na r15, r15; slt_u r8, r3, r18 } - - { mvz r3, r8, r1; wh64 r0 } - - /* This loop runs twice. - - On entry: - - r17 is even before the first iteration, and odd before - the second. It is incremented inside the loop. Encountering - an even value at the end of the loop makes it stop. */ -.Lcopy_half_an_unaligned_line: - { - /* Stall until the last byte is ready. In the steady state this - guarantees all words to load below will be in the L2 cache, which - avoids shunting the loads to the RTF. */ - move zero, r15 - lwadd_na r7, r1, 16 - } - { lwadd_na r11, r1, 12 } - { lwadd_na r14, r1, -24 } - { lwadd_na r8, r1, 4 } - { lwadd_na r9, r1, 4 } - { - lwadd_na r10, r1, 8 - /* r16 = (r2 < 64), after we subtract 32 from r2 below. */ - slti_u r16, r2, 64 + 32 - } - { lwadd_na r12, r1, 4; addi r17, r17, 1 } - { lwadd_na r13, r1, 8; dword_align r6, r7, r1 } - { swadd r0, r6, 4; dword_align r7, r8, r1 } - { swadd r0, r7, 4; dword_align r8, r9, r1 } - { swadd r0, r8, 4; dword_align r9, r10, r1 } - { swadd r0, r9, 4; dword_align r10, r11, r1 } - { swadd r0, r10, 4; dword_align r11, r12, r1 } - { swadd r0, r11, 4; dword_align r12, r13, r1 } - { swadd r0, r12, 4; dword_align r13, r14, r1 } - { swadd r0, r13, 4; addi r2, r2, -32 } - { move r6, r14; bbst r17, .Lcopy_half_an_unaligned_line } - - { bzt r16, .Lcopy_unaligned_line; move r7, r6 } - - /* On entry: - - r0 is the next store address. - - r1 points 4 bytes past the load address corresponding to r0. - - r2 >= 0 (# of bytes left to store). - - r7 is the next aligned src word value. */ -.Lcleanup_unaligned_words: - /* Handle any trailing bytes. */ - { bz r2, .Lcopy_unaligned_done; slti_u r8, r2, 4 } - { bzt r8, .Lcopy_unaligned_src_words; move r6, r7 } - - /* Move r1 back to the point where it corresponds to r0. */ - { addi r1, r1, -4 } - - /* Fall through */ - -/* 1 byte at a time copy handler. */ - -.Lcopy_unaligned_few: - { lb_u r3, r1; addi r1, r1, 1 } - { sb r0, r3; addi r0, r0, 1; addi r2, r2, -1 } - { bnzt r2, .Lcopy_unaligned_few } - -.Lcopy_unaligned_done: - - { move r0, r23; jrp lr } - -END (__memcpy) - -weak_alias (__memcpy, memcpy) -libc_hidden_builtin_def (memcpy) diff --git a/ports/sysdeps/tile/tilepro/memset.c b/ports/sysdeps/tile/tilepro/memset.c deleted file mode 100644 index 85d6b810ed..0000000000 --- a/ports/sysdeps/tile/tilepro/memset.c +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include <arch/chip.h> - -void * -__memset (void *s, int c, size_t n) -{ - uint32_t *out32; - int n32; - uint32_t v16, v32; - uint8_t *out8 = s; - int to_align32; - - /* Experimentation shows that a trivial tight loop is a win up until - around a size of 20, where writing a word at a time starts to win. */ -#define BYTE_CUTOFF 20 - -#if BYTE_CUTOFF < 3 - /* This must be at least at least this big, or some code later - on doesn't work. */ -# error "BYTE_CUTOFF is too small." -#endif - - if (n < BYTE_CUTOFF) - { - /* Strangely, this turns out to be the tightest way to write - this loop. */ - if (n != 0) - { - do - { - /* Strangely, combining these into one line performs worse. */ - *out8 = c; - out8++; - } - while (--n != 0); - } - - return s; - } - - /* Align 'out8'. We know n >= 3 so this won't write past the end. */ - while (((uintptr_t) out8 & 3) != 0) - { - *out8++ = c; - --n; - } - - /* Align 'n'. */ - while (n & 3) - out8[--n] = c; - - out32 = (uint32_t *) out8; - n32 = n >> 2; - - /* Tile input byte out to 32 bits. */ - v16 = __insn_intlb (c, c); - v32 = __insn_intlh (v16, v16); - - /* This must be at least 8 or the following loop doesn't work. */ -#define CACHE_LINE_SIZE_IN_WORDS (CHIP_L2_LINE_SIZE() / 4) - - /* Determine how many words we need to emit before the 'out32' - pointer becomes aligned modulo the cache line size. */ - to_align32 = (-((uintptr_t) out32 >> 2)) & (CACHE_LINE_SIZE_IN_WORDS - 1); - - /* Only bother aligning and using wh64 if there is at least one full - cache line to process. This check also prevents overrunning the - end of the buffer with alignment words. */ - if (to_align32 <= n32 - CACHE_LINE_SIZE_IN_WORDS) - { - int lines_left; - - /* Align out32 mod the cache line size so we can use wh64. */ - n32 -= to_align32; - for (; to_align32 != 0; to_align32--) - { - *out32 = v32; - out32++; - } - - /* Use unsigned divide to turn this into a right shift. */ - lines_left = (unsigned) n32 / CACHE_LINE_SIZE_IN_WORDS; - - do - { - /* Only wh64 a few lines at a time, so we don't exceed the - maximum number of victim lines. */ - int x = ((lines_left < CHIP_MAX_OUTSTANDING_VICTIMS ())? lines_left - : CHIP_MAX_OUTSTANDING_VICTIMS ()); - uint32_t *wh = out32; - int i = x; - int j; - - lines_left -= x; - - do - { - __insn_wh64 (wh); - wh += CACHE_LINE_SIZE_IN_WORDS; - } - while (--i); - - for (j = x * (CACHE_LINE_SIZE_IN_WORDS / 4); j != 0; j--) - { - *out32++ = v32; - *out32++ = v32; - *out32++ = v32; - *out32++ = v32; - } - } - while (lines_left != 0); - - /* We processed all full lines above, so only this many words - remain to be processed. */ - n32 &= CACHE_LINE_SIZE_IN_WORDS - 1; - } - - /* Now handle any leftover values. */ - if (n32 != 0) - { - do - { - *out32 = v32; - out32++; - } - while (--n32 != 0); - } - - return s; -} -weak_alias (__memset, memset) -libc_hidden_builtin_def (memset) diff --git a/ports/sysdeps/tile/tilepro/memusage.h b/ports/sysdeps/tile/tilepro/memusage.h deleted file mode 100644 index 1ce1a29fbe..0000000000 --- a/ports/sysdeps/tile/tilepro/memusage.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <arch/spr_def.h> - -#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; }) - -#define GETTIME(low,high) \ - { \ - low = __insn_mfspr (SPR_CYCLE_LOW); \ - high = __insn_mfspr (SPR_CYCLE_HIGH); \ - } - -#include <sysdeps/generic/memusage.h> diff --git a/ports/sysdeps/tile/tilepro/rawmemchr.c b/ports/sysdeps/tile/tilepro/rawmemchr.c deleted file mode 100644 index 46d9593a7f..0000000000 --- a/ports/sysdeps/tile/tilepro/rawmemchr.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -void * -__rawmemchr (const void *s, int c) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint32_t *p = (const uint32_t *) (s_int & -4); - - /* Create four copies of the byte for which we are looking. */ - const uint32_t goal = 0x01010101 * (uint8_t) c; - - /* Read the first word, but munge it so that bytes before the array - will not match goal. Note that this shift count expression works - because we know shift counts are taken mod 32. */ - const uint32_t before_mask = (1 << (s_int << 3)) - 1; - uint32_t v = (*p | before_mask) ^ (goal & before_mask); - - uint32_t bits; - while ((bits = __insn_seqb (v, goal)) == 0) - v = *++p; - - return ((char *) p) + (__insn_ctz (bits) >> 3); -} -libc_hidden_def (__rawmemchr) -weak_alias (__rawmemchr, rawmemchr) diff --git a/ports/sysdeps/tile/tilepro/strchr.c b/ports/sysdeps/tile/tilepro/strchr.c deleted file mode 100644 index ecdbcfe5d1..0000000000 --- a/ports/sysdeps/tile/tilepro/strchr.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -#undef strchr - -char * -strchr (const char *s, int c) -{ - int z, g; - - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint32_t *p = (const uint32_t *) (s_int & -4); - - /* Create four copies of the byte for which we are looking. */ - const uint32_t goal = 0x01010101 * (uint8_t) c; - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each - byte is 1, and the low 7 bits are all the opposite of the goal - byte). Note that this shift count expression works because we - know shift counts are taken mod 32. */ - const uint32_t before_mask = (1 << (s_int << 3)) - 1; - uint32_t v = (*p | before_mask) ^ (goal & __insn_shrib (before_mask, 1)); - - uint32_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_seqb (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_seqb (v, goal); - - if (__builtin_expect ((zero_matches | goal_matches) != 0, 0)) - break; - - v = *++p; - } - - z = __insn_ctz (zero_matches); - g = __insn_ctz (goal_matches); - - /* If we found c before '\0' we got a match. Note that if c == '\0' - then g == z, and we correctly return the address of the '\0' - rather than NULL. */ - return (g <= z) ? ((char *) p) + (g >> 3) : NULL; -} -weak_alias (strchr, index) -libc_hidden_builtin_def (strchr) diff --git a/ports/sysdeps/tile/tilepro/strchrnul.c b/ports/sysdeps/tile/tilepro/strchrnul.c deleted file mode 100644 index 2dccfe1908..0000000000 --- a/ports/sysdeps/tile/tilepro/strchrnul.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -char * -__strchrnul (const char *s, int c) -{ - int z, g; - - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint32_t *p = (const uint32_t *) (s_int & -4); - - /* Create four copies of the byte for which we are looking. */ - const uint32_t goal = 0x01010101 * (uint8_t) c; - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each - byte is 1, and the low 7 bits are all the opposite of the goal - byte). Note that this shift count expression works because we - know shift counts are taken mod 32. */ - const uint32_t before_mask = (1 << (s_int << 3)) - 1; - uint32_t v = (*p | before_mask) ^ (goal & __insn_shrib (before_mask, 1)); - - uint32_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_seqb (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_seqb (v, goal); - - if (__builtin_expect ((zero_matches | goal_matches) != 0, 0)) - break; - - v = *++p; - } - - z = __insn_ctz (zero_matches); - g = __insn_ctz (goal_matches); - - /* Return a pointer to the NUL or goal, whichever is first. */ - if (z < g) - g = z; - return ((char *) p) + (g >> 3); -} -weak_alias (__strchrnul, strchrnul) diff --git a/ports/sysdeps/tile/tilepro/strlen.c b/ports/sysdeps/tile/tilepro/strlen.c deleted file mode 100644 index c40ee56c6f..0000000000 --- a/ports/sysdeps/tile/tilepro/strlen.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -size_t -strlen (const char *s) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint32_t *p = (const uint32_t *) (s_int & -4); - - /* Read the first word, but force bytes before the string to be nonzero. - This expression works because we know shift counts are taken mod 32. */ - uint32_t v = *p | ((1 << (s_int << 3)) - 1); - - uint32_t bits; - while ((bits = __insn_seqb (v, 0)) == 0) - v = *++p; - - return ((const char *) p) + (__insn_ctz (bits) >> 3) - s; -} -libc_hidden_builtin_def (strlen) diff --git a/ports/sysdeps/tile/tilepro/strrchr.c b/ports/sysdeps/tile/tilepro/strrchr.c deleted file mode 100644 index 1c7f5e7014..0000000000 --- a/ports/sysdeps/tile/tilepro/strrchr.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> - -char * -strrchr (const char *s, int c) -{ - /* Get an aligned pointer. */ - const uintptr_t s_int = (uintptr_t) s; - const uint32_t *p = (const uint32_t *) (s_int & -4); - - /* Create four copies of the byte for which we are looking. */ - const uint32_t goal = 0x01010101 * (uint8_t) c; - - /* Read the first aligned word, but force bytes before the string to - match neither zero nor goal (we make sure the high bit of each - byte is 1, and the low 7 bits are all the opposite of the goal - byte). Note that this shift count expression works because we - know shift counts are taken mod 32. */ - const uint32_t before_mask = (1 << (s_int << 3)) - 1; - uint32_t v = (*p | before_mask) ^ (goal & __insn_shrib (before_mask, 1)); - const char *found = NULL; - uint32_t zero_matches, goal_matches; - while (1) - { - /* Look for a terminating '\0'. */ - zero_matches = __insn_seqb (v, 0); - - /* Look for the goal byte. */ - goal_matches = __insn_seqb (v, goal); - - /* If we found the goal, record the last offset. */ - if (__builtin_expect (goal_matches != 0, 0)) - { - if (__builtin_expect (zero_matches != 0, 0)) - { - /* Clear any goal after the first zero. */ - int first_nul = __insn_ctz (zero_matches); - /* The number of top bits we need to clear is - 32 - (first_nul + 8). */ - int shift_amt = (24 - first_nul); - goal_matches <<= shift_amt; - goal_matches >>= shift_amt; - } - if (__builtin_expect (goal_matches != 0, 1)) - found = ((char *) p) + 3 - (__insn_clz (goal_matches) >> 3); - } - - if (__builtin_expect (zero_matches != 0, 0)) - return (char *) found; - - v = *++p; - } -} -weak_alias (strrchr, rindex) -libc_hidden_builtin_def (strrchr) diff --git a/ports/sysdeps/tile/tls-macros.h b/ports/sysdeps/tile/tls-macros.h deleted file mode 100644 index 20c924fc5a..0000000000 --- a/ports/sysdeps/tile/tls-macros.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#ifdef __tilegx__ -#define TLS_GD_OFFSET(x) \ - "moveli r0, hw1_last_tls_gd(" #x ")\n\t" \ - "shl16insli r0, r0, hw0_tls_gd(" #x ")\n\t" \ - "addi r0, %1, tls_add(" #x ")\n\t" -#else -#define TLS_GD_OFFSET(x) \ - "auli r0, %1, tls_gd_ha16(" #x ")\n\t" \ - "addli r0, r0, tls_gd_lo16(" #x ")\n\t" -#endif - -#define TLS_GD(x) \ - ({ \ - int *__retval; \ - extern char _GLOBAL_OFFSET_TABLE_[]; \ - \ - asm (TLS_GD_OFFSET(x) \ - "jal tls_gd_call(" #x ")\n\t" \ - "addi %0, r0, tls_gd_add(" #x ")" : \ - "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_) : \ - "r0", "r25", "r26", "r27", "r28", "r29"); \ - __retval; }) - -/* No special support for LD mode. */ -#define TLS_LD TLS_GD - -#ifdef __tilegx__ -#define TLS_IE_OFFSET(x) \ - "moveli %0, hw1_last_tls_ie(" #x ")\n\t" \ - "shl16insli %0, %0, hw0_tls_ie(" #x ")\n\t" \ - "addi %0, %1, tls_add(" #x ")\n\t" -#define LD_TLS "ld_tls" -#else -#define TLS_IE_OFFSET(x) \ - "auli %0, %1, tls_ie_ha16(" #x ")\n\t" \ - "addli %0, %0, tls_ie_lo16(" #x ")\n\t" -#define LD_TLS "lw_tls" -#endif - -#define TLS_IE(x) \ - ({ \ - int *__retval; \ - extern char _GLOBAL_OFFSET_TABLE_[]; \ - \ - asm (TLS_IE_OFFSET(x) \ - LD_TLS " %0, %0, tls_ie_load(" #x ")\n\t" \ - "add %0, %0, tp" : \ - "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_)); \ - __retval; }) - -#ifdef __tilegx__ -#define _TLS_LE(x) \ - "moveli %0, hw1_last_tls_le(" #x ")\n\t" \ - "shl16insli %0, %0, hw0_tls_le(" #x ")\n\t" \ - "add %0, %0, tp" -#else -#define _TLS_LE(x) \ - "auli %0, tp, tls_le_ha16(" #x ")\n\t" \ - "addli %0, %0, tls_le_lo16(" #x ")\n\t" -#endif - -#define TLS_LE(x) \ - ({ \ - int *__retval; \ - asm (_TLS_LE(x) : "=r" (__retval)); \ - __retval; }) diff --git a/ports/sysdeps/tile/tst-audit.h b/ports/sysdeps/tile/tst-audit.h deleted file mode 100644 index e5fe61f9e7..0000000000 --- a/ports/sysdeps/tile/tst-audit.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define pltenter la_tile_gnu_pltenter -#define pltexit la_tile_gnu_pltexit -#define La_regs La_tile_regs -#define La_retval La_tile_retval -#define int_retval lrv_reg[0] diff --git a/ports/sysdeps/tile/wordcopy.c b/ports/sysdeps/tile/wordcopy.c deleted file mode 100644 index 5ed0e949f6..0000000000 --- a/ports/sysdeps/tile/wordcopy.c +++ /dev/null @@ -1,449 +0,0 @@ -/* wordcopy.c -- subroutines for memory copy functions. Tile version. - Copyright (C) 1991-2014 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 - <http://www.gnu.org/licenses/>. */ - -/* To optimize for tile, we make the following changes from the - default glibc version: - - Use the double align instruction instead of the MERGE macro. - - Since we don't have offset addressing mode, make sure the loads / - stores in the inner loop always have indices of 0. - - Use post-increment addresses in the inner loops, which yields - better scheduling. */ - -/* BE VERY CAREFUL IF YOU CHANGE THIS CODE...! */ - -#include <stddef.h> -#include <memcopy.h> - -/* Provide the appropriate dblalign builtin to shift two registers - based on the alignment of a pointer held in a third register. */ -#ifdef __tilegx__ -#define DBLALIGN __insn_dblalign -#else -#define DBLALIGN __insn_dword_align -#endif - -/* _wordcopy_fwd_aligned -- Copy block beginning at SRCP to - block beginning at DSTP with LEN `op_t' words (not LEN bytes!). - Both SRCP and DSTP should be aligned for memory operations on `op_t's. */ - -void -_wordcopy_fwd_aligned (dstp, srcp, len) - long int dstp; - long int srcp; - size_t len; -{ - op_t a0, a1; - - switch (len % 8) - { - case 2: - a0 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 6; - goto do1; - case 3: - a1 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 5; - goto do2; - case 4: - a0 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 4; - goto do3; - case 5: - a1 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 3; - goto do4; - case 6: - a0 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 2; - goto do5; - case 7: - a1 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len += 1; - goto do6; - - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - a0 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - goto do7; - case 1: - a1 = ((op_t *) srcp)[0]; - srcp += OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do8; /* No-op. */ - } - - do - { - do8: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - do7: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - do6: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - do5: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - do4: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - do3: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - do2: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - do1: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - - len -= 8; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = a1; -} - -/* _wordcopy_fwd_dest_aligned -- Copy block beginning at SRCP to - block beginning at DSTP with LEN `op_t' words (not LEN bytes!). - DSTP should be aligned for memory operations on `op_t's, but SRCP must - *not* be aligned. */ - -void -_wordcopy_fwd_dest_aligned (dstp, srcp, len) - long int dstp; - long int srcp; - size_t len; -{ - void * srci; - op_t a0, a1, a2, a3; - - /* Save the initial source pointer so we know the number of bytes to - shift for merging two unaligned results. */ - srci = (void *) srcp; - - /* Make SRCP aligned by rounding it down to the beginning of the `op_t' - it points in the middle of. */ - srcp &= -OPSIZ; - - switch (len % 4) - { - case 2: - a1 = ((op_t *) srcp)[0]; - a2 = ((op_t *) srcp)[1]; - len += 2; - srcp += 2 * OPSIZ; - goto do1; - case 3: - a0 = ((op_t *) srcp)[0]; - a1 = ((op_t *) srcp)[1]; - len += 1; - srcp += 2 * OPSIZ; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - a3 = ((op_t *) srcp)[0]; - a0 = ((op_t *) srcp)[1]; - len += 0; - srcp += 2 * OPSIZ; - goto do3; - case 1: - a2 = ((op_t *) srcp)[0]; - a3 = ((op_t *) srcp)[1]; - srcp += 2 * OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do4; /* No-op. */ - } - - do - { - do4: - a0 = ((op_t *) srcp)[0]; - a2 = DBLALIGN (a2, a3, srci); - ((op_t *) dstp)[0] = a2; - srcp += OPSIZ; - dstp += OPSIZ; - do3: - a1 = ((op_t *) srcp)[0]; - a3 = DBLALIGN (a3, a0, srci); - ((op_t *) dstp)[0] = a3; - srcp += OPSIZ; - dstp += OPSIZ; - do2: - a2 = ((op_t *) srcp)[0]; - a0 = DBLALIGN (a0, a1, srci); - ((op_t *) dstp)[0] = a0; - srcp += OPSIZ; - dstp += OPSIZ; - do1: - a3 = ((op_t *) srcp)[0]; - a1 = DBLALIGN (a1, a2, srci); - ((op_t *) dstp)[0] = a1; - srcp += OPSIZ; - dstp += OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = DBLALIGN (a2, a3, srci); -} - -/* _wordcopy_bwd_aligned -- Copy block finishing right before - SRCP to block finishing right before DSTP with LEN `op_t' words - (not LEN bytes!). Both SRCP and DSTP should be aligned for memory - operations on `op_t's. */ - -void -_wordcopy_bwd_aligned (dstp, srcp, len) - long int dstp; - long int srcp; - size_t len; -{ - op_t a0, a1; - long int srcp1; - - srcp1 = srcp - 1 * OPSIZ; - srcp -= 2 * OPSIZ; - dstp -= 1 * OPSIZ; - - switch (len % 8) - { - case 2: - a0 = ((op_t *) srcp1)[0]; - len += 6; - goto do1; - case 3: - a1 = ((op_t *) srcp1)[0]; - len += 5; - goto do2; - case 4: - a0 = ((op_t *) srcp1)[0]; - len += 4; - goto do3; - case 5: - a1 = ((op_t *) srcp1)[0]; - len += 3; - goto do4; - case 6: - a0 = ((op_t *) srcp1)[0]; - len += 2; - goto do5; - case 7: - a1 = ((op_t *) srcp1)[0]; - len += 1; - goto do6; - - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - a0 = ((op_t *) srcp1)[0]; - goto do7; - case 1: - a1 = ((op_t *) srcp1)[0]; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do8; /* No-op. */ - } - - do - { - do8: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp -= OPSIZ; - dstp -= OPSIZ; - do7: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp -= OPSIZ; - dstp -= OPSIZ; - do6: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp -= OPSIZ; - dstp -= OPSIZ; - do5: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp -= OPSIZ; - dstp -= OPSIZ; - do4: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp -= OPSIZ; - dstp -= OPSIZ; - do3: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp -= OPSIZ; - dstp -= OPSIZ; - do2: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - srcp -= OPSIZ; - dstp -= OPSIZ; - do1: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - srcp -= OPSIZ; - dstp -= OPSIZ; - - len -= 8; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = a1; -} - -/* _wordcopy_bwd_dest_aligned -- Copy block finishing right - before SRCP to block finishing right before DSTP with LEN `op_t' - words (not LEN bytes!). DSTP should be aligned for memory - operations on `op_t', but SRCP must *not* be aligned. */ - -void -_wordcopy_bwd_dest_aligned (dstp, srcp, len) - long int dstp; - long int srcp; - size_t len; -{ - void * srci; - op_t a0, a1, a2, a3; - op_t b0, b1, b2, b3; - - /* Save the initial source pointer so we know the number of bytes to - shift for merging two unaligned results. */ - srci = (void *) srcp; - - /* Make SRCP aligned by rounding it down to the beginning of the op_t - it points in the middle of. */ - srcp &= -OPSIZ; - srcp += OPSIZ; - - switch (len % 4) - { - case 2: - srcp -= 3 * OPSIZ; - dstp -= 1 * OPSIZ; - b2 = ((op_t *) srcp)[2]; - b1 = a1 = ((op_t *) srcp)[1]; - len += 2; - goto do1; - case 3: - srcp -= 3 * OPSIZ; - dstp -= 1 * OPSIZ; - b3 = ((op_t *) srcp)[2]; - b2 = a2 = ((op_t *) srcp)[1]; - len += 1; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - srcp -= 3 * OPSIZ; - dstp -= 1 * OPSIZ; - b0 = ((op_t *) srcp)[2]; - b3 = a3 = ((op_t *) srcp)[1]; - goto do3; - case 1: - srcp -= 3 * OPSIZ; - dstp -= 1 * OPSIZ; - b1 = ((op_t *) srcp)[2]; - b0 = a0 = ((op_t *) srcp)[1]; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do4; /* No-op. */ - } - - do - { - do4: - b3 = a3 = ((op_t *) srcp)[0]; - a0 = DBLALIGN (a0, b1, srci); - ((op_t *) dstp)[0] = a0; - srcp -= OPSIZ; - dstp -= OPSIZ; - do3: - b2 = a2 = ((op_t *) srcp)[0]; - a3 = DBLALIGN (a3, b0, srci); - ((op_t *) dstp)[0] = a3; - srcp -= OPSIZ; - dstp -= OPSIZ; - do2: - b1 = a1 = ((op_t *) srcp)[0]; - a2 = DBLALIGN (a2, b3, srci); - ((op_t *) dstp)[0] = a2; - srcp -= OPSIZ; - dstp -= OPSIZ; - do1: - b0 = a0 = ((op_t *) srcp)[0]; - a1 = DBLALIGN (a1, b2, srci); - ((op_t *) dstp)[0] = a1; - srcp -= OPSIZ; - dstp -= OPSIZ; - - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - a0 = DBLALIGN (a0, b1, srci); - ((op_t *) dstp)[0] = a0; -} |