aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc64')
-rw-r--r--sysdeps/powerpc/powerpc64/970/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/Makefile49
-rw-r--r--sysdeps/powerpc/powerpc64/__longjmp-common.S183
-rw-r--r--sysdeps/powerpc/powerpc64/__longjmp.S39
-rw-r--r--sysdeps/powerpc/powerpc64/a2/memcpy.S528
-rw-r--r--sysdeps/powerpc/powerpc64/addmul_1.S208
-rw-r--r--sysdeps/powerpc/powerpc64/atomic-machine.h242
-rw-r--r--sysdeps/powerpc/powerpc64/backtrace.c104
-rw-r--r--sysdeps/powerpc/powerpc64/bits/wordsize.h11
-rw-r--r--sysdeps/powerpc/powerpc64/bsd-_setjmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/bsd-setjmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/bzero.S20
-rw-r--r--sysdeps/powerpc/powerpc64/cell/memcpy.S246
-rw-r--r--sysdeps/powerpc/powerpc64/configure33
-rw-r--r--sysdeps/powerpc/powerpc64/configure.ac23
-rw-r--r--sysdeps/powerpc/powerpc64/crti.S88
-rw-r--r--sysdeps/powerpc/powerpc64/crtn.S51
-rw-r--r--sysdeps/powerpc/powerpc64/dl-dtprocnum.h21
-rw-r--r--sysdeps/powerpc/powerpc64/dl-irel.h63
-rw-r--r--sysdeps/powerpc/powerpc64/dl-machine.c47
-rw-r--r--sysdeps/powerpc/powerpc64/dl-machine.h1036
-rw-r--r--sysdeps/powerpc/powerpc64/dl-trampoline.S500
-rw-r--r--sysdeps/powerpc/powerpc64/entry.h37
-rw-r--r--sysdeps/powerpc/powerpc64/ffsll.c37
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile44
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c24
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf.c31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c40
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-power6.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-ppc64.S35
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c51
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysignf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf.c31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power7.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-ppc64.c34
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c60
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef-ppc64.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c37
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-power5+.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-ppc64.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c40
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-power5+.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-ppc64.S27
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power7.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-ppc64.c33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c53
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff-ppc64.c31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c38
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S33
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c62
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c44
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power6x.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-ppc64.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c60
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power5+.S32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power6x.S32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-ppc64.S28
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c63
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c28
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c41
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c21
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_lrint.c1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_lround.c1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-ppc64.c29
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c44
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c19
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c30
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-power5+.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-ppc64.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c40
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-power5+.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-ppc64.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf.c31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-power5+.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-ppc64.S31
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc.c40
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-power5+.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-ppc64.S26
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf.c32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_ceil.S72
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_ceilf.S66
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_copysign.S59
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_copysignf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_copysignl.S48
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_fabs.S5
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_fabsl.S34
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_floor.S72
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_floorf.S66
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_fma.S5
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_isnan.S56
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llrint.S47
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llrintf.S36
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llround.S96
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llroundf.S88
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_lrint.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_lround.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_lroundf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_nearbyint.S75
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S68
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_rint.S65
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_rintf.S56
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_round.S87
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_roundf.S81
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_trunc.S79
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_truncf.S73
-rw-r--r--sysdeps/powerpc/powerpc64/hp-timing.h46
-rw-r--r--sysdeps/powerpc/powerpc64/lshift.S177
-rw-r--r--sysdeps/powerpc/powerpc64/memcpy.S397
-rw-r--r--sysdeps/powerpc/powerpc64/memset.S265
-rw-r--r--sysdeps/powerpc/powerpc64/mul_1.S135
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/Makefile47
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/bcopy-ppc64.c27
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/bcopy.c29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/bzero.c43
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c389
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/init-arch.h18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memchr-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memchr-ppc64.c31
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memchr.c38
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power4.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power8.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c33
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp.c44
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-a2.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-cell.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-power4.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-power6.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcpy.c55
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memmove-power7.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memmove-ppc64.c44
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memmove.c45
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/mempcpy-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/mempcpy-ppc64.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/mempcpy.c44
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memrchr-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memrchr.c37
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset-power4.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset-power6.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset-power8.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S42
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memset.c53
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/rawmemchr-power7.S23
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/rawmemchr-ppc64.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c39
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/rtld-memset.c18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/rtld-strchr.S18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.c37
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpcpy.c41
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S30
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/stpncpy.c39
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power8.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp-ppc64.c21
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l-power7.S31
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c40
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasestr-power8.S35
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasestr-ppc64.c34
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcasestr.c37
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c30
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c30
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcat.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchr-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchr-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchr-ppc64.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchr.c42
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchrnul-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchrnul-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchrnul-ppc64.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strchrnul.c40
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcmp-power9.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcmp.c42
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.c32
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.c35
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcpy.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcspn-power8.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcspn-ppc64.c26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strcspn.c35
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strlen-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strlen-power8.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strlen.c44
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase-power7.c24
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase-power8.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase-ppc64.c21
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase_l-power7.c25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncase_l.c42
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c31
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c31
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncat-ppc64.c29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncat.c34
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp-power9.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncmp.c47
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c33
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strncpy.c42
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strnlen-power7.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strnlen-power8.S28
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strnlen-ppc64.c18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strnlen.c41
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strrchr-power7.S26
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strrchr-power8.S39
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strrchr-ppc64.c33
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strrchr.c40
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strspn-power8.S25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strspn-ppc64.c25
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strspn.c35
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S30
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strstr-ppc64.c29
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/strstr.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcschr-power6.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcschr-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcschr-ppc64.c18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcschr.c43
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcscpy-power6.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcscpy-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcscpy-ppc64.c18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcscpy.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power6.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power7.c19
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcsrchr-ppc64.c18
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c36
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/wordcopy-ppc64.c18
-rw-r--r--sysdeps/powerpc/powerpc64/power4/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power4/Makefile6
-rw-r--r--sysdeps/powerpc/powerpc64/power4/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power4/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power4/memcmp.S1369
-rw-r--r--sysdeps/powerpc/powerpc64/power4/memcopy.h1
-rw-r--r--sysdeps/powerpc/powerpc64/power4/memcpy.S477
-rw-r--r--sysdeps/powerpc/powerpc64/power4/memset.S251
-rw-r--r--sysdeps/powerpc/powerpc64/power4/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power4/strncmp.S225
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/Implies4
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S37
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S30
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S37
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_floorf.S30
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_llround.S58
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_round.S37
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_roundf.S30
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_trunc.S37
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/fpu/s_truncf.S30
-rw-r--r--sysdeps/powerpc/powerpc64/power5+/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power5/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power5/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power5/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S60
-rw-r--r--sysdeps/powerpc/powerpc64/power5/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power6/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S58
-rw-r--r--sysdeps/powerpc/powerpc64/power6/fpu/s_copysignf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S59
-rw-r--r--sysdeps/powerpc/powerpc64/power6/memcpy.S1499
-rw-r--r--sysdeps/powerpc/powerpc64/power6/memset.S395
-rw-r--r--sysdeps/powerpc/powerpc64/power6/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/wcschr.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/wcscpy.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power6/wcsrchr.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S58
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/fpu/s_llrint.S44
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/fpu/s_llround.S54
-rw-r--r--sysdeps/powerpc/powerpc64/power6x/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power7/Makefile11
-rw-r--r--sysdeps/powerpc/powerpc64/power7/add_n.S98
-rw-r--r--sysdeps/powerpc/powerpc64/power7/bcopy.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S70
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_finitef.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S69
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_isinff.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S68
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memchr.S199
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memcmp.S1061
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memcpy.S430
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memmove.S835
-rw-r--r--sysdeps/powerpc/powerpc64/power7/mempcpy.S472
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memrchr.S201
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memset.S399
-rw-r--r--sysdeps/powerpc/powerpc64/power7/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/rawmemchr.S115
-rw-r--r--sysdeps/powerpc/powerpc64/power7/stpncpy.S24
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strcasecmp.S126
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strcasecmp_l.S5
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strchr.S230
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strchrnul.S131
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strcmp.S168
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strlen.S107
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strncmp.S227
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strncpy.S722
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strnlen.S182
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strrchr.S260
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strstr-ppc64.c27
-rw-r--r--sysdeps/powerpc/powerpc64/power7/strstr.S521
-rw-r--r--sysdeps/powerpc/powerpc64/power7/sub_n.S23
-rw-r--r--sysdeps/powerpc/powerpc64/power8/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power8/Makefile3
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/e_expf.S303
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_cosf.S508
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S56
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S61
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S56
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S45
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S48
-rw-r--r--sysdeps/powerpc/powerpc64/power8/fpu/s_sinf.S519
-rw-r--r--sysdeps/powerpc/powerpc64/power8/memcmp.S1447
-rw-r--r--sysdeps/powerpc/powerpc64/power8/memset.S458
-rw-r--r--sysdeps/powerpc/powerpc64/power8/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/stpcpy.S24
-rw-r--r--sysdeps/powerpc/powerpc64/power8/stpncpy.S24
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcasecmp.S457
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcasestr-ppc64.c29
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcasestr.S538
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strchr.S377
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strchrnul.S23
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcmp.S247
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcpy.S270
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strcspn.S20
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strlen.S301
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strncase.S20
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strncmp.S327
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strncpy.S465
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strnlen.S433
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strrchr.S464
-rw-r--r--sysdeps/powerpc/powerpc64/power8/strspn.S202
-rw-r--r--sysdeps/powerpc/powerpc64/power9/Implies2
-rw-r--r--sysdeps/powerpc/powerpc64/power9/fpu/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power9/fpu/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power9/multiarch/Implies1
-rw-r--r--sysdeps/powerpc/powerpc64/power9/strcmp.S268
-rw-r--r--sysdeps/powerpc/powerpc64/power9/strncmp.S379
-rw-r--r--sysdeps/powerpc/powerpc64/ppc-mcount.S39
-rw-r--r--sysdeps/powerpc/powerpc64/register-dump.h124
-rw-r--r--sysdeps/powerpc/powerpc64/rtld-memset.c4
-rw-r--r--sysdeps/powerpc/powerpc64/setjmp-common.S245
-rw-r--r--sysdeps/powerpc/powerpc64/setjmp.S61
-rw-r--r--sysdeps/powerpc/powerpc64/stackguard-macros.h14
-rw-r--r--sysdeps/powerpc/powerpc64/start.S92
-rw-r--r--sysdeps/powerpc/powerpc64/strchr.S155
-rw-r--r--sysdeps/powerpc/powerpc64/strcmp.S180
-rw-r--r--sysdeps/powerpc/powerpc64/strlen.S203
-rw-r--r--sysdeps/powerpc/powerpc64/strncmp.S210
-rw-r--r--sysdeps/powerpc/powerpc64/submul_1.S21
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h425
-rw-r--r--sysdeps/powerpc/powerpc64/tls-macros.h44
-rw-r--r--sysdeps/powerpc/powerpc64/tst-audit.h33
420 files changed, 0 insertions, 35095 deletions
diff --git a/sysdeps/powerpc/powerpc64/970/Implies b/sysdeps/powerpc/powerpc64/970/Implies
deleted file mode 100644
index bedb20b65c..0000000000
--- a/sysdeps/powerpc/powerpc64/970/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power4/fpu
-powerpc/powerpc64/power4
diff --git a/sysdeps/powerpc/powerpc64/Implies b/sysdeps/powerpc/powerpc64/Implies
deleted file mode 100644
index a8cae95f9d..0000000000
--- a/sysdeps/powerpc/powerpc64/Implies
+++ /dev/null
@@ -1 +0,0 @@
-wordsize-64
diff --git a/sysdeps/powerpc/powerpc64/Makefile b/sysdeps/powerpc/powerpc64/Makefile
deleted file mode 100644
index 9d15db0328..0000000000
--- a/sysdeps/powerpc/powerpc64/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-# Powerpc64 specific build options.
-# this is ./sysdeps/powerpc/powerpc64/Makefile
-
-# Each TOC entry takes 8 bytes and the TOC holds up to 2^16 bytes,
-# or 8192 entries.
-# If -fpic is not specified, the latest gcc-3.2.1 now generates
-# different code for call stubs (without the TOC reload).
-# Shared objects need the TOC reload so specify -fpic.
-ifeq (yes,$(build-shared))
-pic-ccflag = -fpic
-endif
-
-# These flags prevent FPU or Altivec registers from being used,
-# for code called in contexts that is not allowed to touch those registers.
-# Stupid GCC requires us to pass all these ridiculous switches. We need to
-# pass the -mno-* switches as well to prevent the compiler from attempting
-# to emit altivec or vsx instructions, especially when the registers aren't
-# available.
-no-special-regs := $(sort $(foreach n,40 41 50 51 60 61 62 63 \
- $(foreach m,2 3 4 5 6 7 8 9, \
- 3$m 4$m 5$m),\
- -ffixed-$n)) \
- $(sort $(foreach n,$(foreach m,0 1 2 3 4 5 6 7 8 9,\
- $m 1$m 2$m) 30 31,\
- -ffixed-v$n)) \
- -ffixed-vrsave -ffixed-vscr -mno-altivec -mno-vsx
-
-# Need to prevent gcc from using fprs in code used during dynamic linking.
-
-CFLAGS-dl-runtime.os = $(no-special-regs)
-CFLAGS-dl-lookup.os = $(no-special-regs)
-CFLAGS-dl-misc.os = $(no-special-regs)
-CFLAGS-rtld-mempcpy.os = $(no-special-regs)
-CFLAGS-rtld-memmove.os = $(no-special-regs)
-CFLAGS-rtld-memchr.os = $(no-special-regs)
-CFLAGS-rtld-strnlen.os = $(no-special-regs)
-
-ifeq ($(subdir),elf)
-# help gcc inline asm code from dl-machine.h
-+cflags += -finline-limit=2000
-endif
-
-ifeq ($(subdir),gmon)
-# The assembly functions assume that fp arg regs are not trashed.
-# Compiling with -msoft-float ensures that fp regs are not used
-# for moving memory around.
-CFLAGS-mcount.c += $(no-special-regs)
-sysdep_routines += ppc-mcount
-endif
diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S
deleted file mode 100644
index efda025b41..0000000000
--- a/sysdeps/powerpc/powerpc64/__longjmp-common.S
+++ /dev/null
@@ -1,183 +0,0 @@
-/* longjmp for PowerPC64.
- Copyright (C) 1995-2017 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 <sysdep.h>
-#include <stap-probe.h>
-#define _ASM
-#define _SETJMP_H
-#ifdef __NO_VMX__
-# include <novmxsetjmp.h>
-#else
-# include <jmpbuf-offsets.h>
-#endif
-
-#ifndef __NO_VMX__
- .section ".toc","aw"
-.LC__dl_hwcap:
-# ifdef SHARED
-# if IS_IN (rtld)
- /* Inside ld.so we use the local alias to avoid runtime GOT
- relocations. */
- .tc _rtld_local_ro[TC],_rtld_local_ro
-# else
- .tc _rtld_global_ro[TC],_rtld_global_ro
-# endif
-# else
- .tc _dl_hwcap[TC],_dl_hwcap
-# endif
- .section ".text"
-#endif
-
- .machine "altivec"
-ENTRY (__longjmp)
- CALL_MCOUNT 2
-#ifndef __NO_VMX__
- ld r5,.LC__dl_hwcap@toc(r2)
-# ifdef SHARED
- /* Load _rtld-global._dl_hwcap. */
- ld r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
-# else
- ld r5,0(r5) /* Load extern _dl_hwcap. */
-# endif
- andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
- beq L(no_vmx)
- la r5,((JB_VRS)*8)(3)
- andi. r6,r5,0xf
- lwz r0,((JB_VRSAVE)*8)(3) /* 32-bit VRSAVE. */
- mtspr VRSAVE,r0
- beq+ L(aligned_restore_vmx)
- addi r6,r5,16
- lvsl v0,0,r5
- lvx v1,0,r5
- addi r5,r5,32
- lvx v21,0,r6
- vperm v20,v1,v21,v0
-# define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
- addi addgpr,addgpr,32; \
- lvx lovr,0,loadgpr; \
- vperm loadvr,loadvr,lovr,shiftvr;
- load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
- load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
- load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
- load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
- load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
- load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
- load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
- load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
- load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
- load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
- lvx v1,0,r5
- vperm v31,v31,v1,v0
- b L(no_vmx)
-L(aligned_restore_vmx):
- addi r6,r5,16
- lvx v20,0,r5
- addi r5,r5,32
- lvx v21,0,r6
- addi r6,r6,32
- lvx v22,0,r5
- addi r5,r5,32
- lvx v23,0,r6
- addi r6,r6,32
- lvx v24,0,r5
- addi r5,r5,32
- lvx v25,0,r6
- addi r6,r6,32
- lvx v26,0,r5
- addi r5,r5,32
- lvx v27,0,r6
- addi r6,r6,32
- lvx v28,0,r5
- addi r5,r5,32
- lvx v29,0,r6
- addi r6,r6,32
- lvx v30,0,r5
- lvx v31,0,r6
-L(no_vmx):
-#endif
-#if defined PTR_DEMANGLE || defined CHECK_SP
- ld r22,(JB_GPR1*8)(r3)
-#else
- ld r1,(JB_GPR1*8)(r3)
-#endif
-#ifdef PTR_DEMANGLE
-# ifdef CHECK_SP
- PTR_DEMANGLE3 (r22, r22, r25)
-# else
- PTR_DEMANGLE3 (r1, r22, r25)
-# endif
-#endif
-#ifdef CHECK_SP
- CHECK_SP (r22)
- mr r1,r22
-#endif
- ld r2,(JB_GPR2*8)(r3)
- ld r0,(JB_LR*8)(r3)
- ld r14,((JB_GPRS+0)*8)(r3)
- lfd fp14,((JB_FPRS+0)*8)(r3)
-#if defined SHARED && !IS_IN (rtld)
- std r2,FRAME_TOC_SAVE(r1) /* Restore the callers TOC save area. */
-#endif
- ld r15,((JB_GPRS+1)*8)(r3)
- lfd fp15,((JB_FPRS+1)*8)(r3)
- ld r16,((JB_GPRS+2)*8)(r3)
- lfd fp16,((JB_FPRS+2)*8)(r3)
- ld r17,((JB_GPRS+3)*8)(r3)
- lfd fp17,((JB_FPRS+3)*8)(r3)
- ld r18,((JB_GPRS+4)*8)(r3)
- lfd fp18,((JB_FPRS+4)*8)(r3)
- ld r19,((JB_GPRS+5)*8)(r3)
- lfd fp19,((JB_FPRS+5)*8)(r3)
- ld r20,((JB_GPRS+6)*8)(r3)
- lfd fp20,((JB_FPRS+6)*8)(r3)
-#ifdef PTR_DEMANGLE
- PTR_DEMANGLE2 (r0, r25)
-#endif
- /* longjmp/longjmp_target probe expects longjmp first argument (8@3),
- second argument (-4@4), and target address (8@0), respectively. */
- LIBC_PROBE (longjmp, 3, 8@3, -4@4, 8@0)
- mtlr r0
-/* std r2,FRAME_TOC_SAVE(r1) Restore the TOC save area. */
- ld r21,((JB_GPRS+7)*8)(r3)
- lfd fp21,((JB_FPRS+7)*8)(r3)
- ld r22,((JB_GPRS+8)*8)(r3)
- lfd fp22,((JB_FPRS+8)*8)(r3)
- lwz r5,((JB_CR*8)+4)(r3) /* 32-bit CR. */
- ld r23,((JB_GPRS+9)*8)(r3)
- lfd fp23,((JB_FPRS+9)*8)(r3)
- ld r24,((JB_GPRS+10)*8)(r3)
- lfd fp24,((JB_FPRS+10)*8)(r3)
- ld r25,((JB_GPRS+11)*8)(r3)
- lfd fp25,((JB_FPRS+11)*8)(r3)
- mtcrf 0xFF,r5
- ld r26,((JB_GPRS+12)*8)(r3)
- lfd fp26,((JB_FPRS+12)*8)(r3)
- ld r27,((JB_GPRS+13)*8)(r3)
- lfd fp27,((JB_FPRS+13)*8)(r3)
- ld r28,((JB_GPRS+14)*8)(r3)
- lfd fp28,((JB_FPRS+14)*8)(r3)
- ld r29,((JB_GPRS+15)*8)(r3)
- lfd fp29,((JB_FPRS+15)*8)(r3)
- ld r30,((JB_GPRS+16)*8)(r3)
- lfd fp30,((JB_FPRS+16)*8)(r3)
- ld r31,((JB_GPRS+17)*8)(r3)
- lfd fp31,((JB_FPRS+17)*8)(r3)
- LIBC_PROBE (longjmp_target, 3, 8@3, -4@4, 8@0)
- mr r3,r4
- blr
-END (__longjmp)
diff --git a/sysdeps/powerpc/powerpc64/__longjmp.S b/sysdeps/powerpc/powerpc64/__longjmp.S
deleted file mode 100644
index 78659d012f..0000000000
--- a/sysdeps/powerpc/powerpc64/__longjmp.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/* AltiVec/VMX (new) version of __longjmp for PowerPC64.
- Copyright (C) 1995-2017 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 <libc-symbols.h>
-#include <rtld-global-offsets.h>
-#include <shlib-compat.h>
-
-#if !IS_IN (libc)
-/* Build a non-versioned object for rtld-*. */
-# include "__longjmp-common.S"
-
-#else /* IS_IN (libc) */
-strong_alias (__vmx__longjmp, __longjmp)
-# define __longjmp __vmx__longjmp
-# include "__longjmp-common.S"
-
-# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
-# define __NO_VMX__
-# undef __longjmp
-# undef JB_SIZE
-# define __longjmp __novmx__longjmp
-# include "__longjmp-common.S"
-# endif
-#endif /* IS_IN (libc) */
diff --git a/sysdeps/powerpc/powerpc64/a2/memcpy.S b/sysdeps/powerpc/powerpc64/a2/memcpy.S
deleted file mode 100644
index ff30898df5..0000000000
--- a/sysdeps/powerpc/powerpc64/a2/memcpy.S
+++ /dev/null
@@ -1,528 +0,0 @@
-/* Optimized memcpy implementation for PowerPC A2.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Michael Brutman <brutman@us.ibm.com>.
- 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 <sysdep.h>
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
-
-#define PREFETCH_AHEAD 4 /* no cache lines SRC prefetching ahead */
-#define ZERO_AHEAD 2 /* no cache lines DST zeroing ahead */
-
- .section ".toc","aw"
-.LC0:
- .tc __cache_line_size[TC],__cache_line_size
- .section ".text"
- .align 2
-
-
- .machine a2
-EALIGN (MEMCPY, 5, 0)
- CALL_MCOUNT 3
-
- dcbt 0,r4 /* Prefetch ONE SRC cacheline */
- cmpldi cr1,r5,16 /* is size < 16 ? */
- mr r6,r3 /* Copy dest reg to r6; */
- blt+ cr1,L(shortcopy)
-
-
- /* Big copy (16 bytes or more)
-
- Figure out how far to the nearest quadword boundary, or if we are
- on one already. Also get the cache line size.
-
- r3 - return value (always)
- r4 - current source addr
- r5 - copy length
- r6 - current dest addr
- */
-
- neg r8,r3 /* LS 4 bits = # bytes to 8-byte dest bdry */
- ld r9,.LC0@toc(r2) /* Get cache line size (part 1) */
- clrldi r8,r8,64-4 /* align to 16byte boundary */
- sub r7,r4,r3 /* compute offset to src from dest */
- lwz r9,0(r9) /* Get cache line size (part 2) */
- cmpldi cr0,r8,0 /* Were we aligned on a 16 byte bdy? */
- addi r10,r9,-1 /* Cache line mask */
- beq+ L(dst_aligned)
-
-
-
- /* Destination is not aligned on quadword boundary. Get us to one.
-
- r3 - return value (always)
- r4 - current source addr
- r5 - copy length
- r6 - current dest addr
- r7 - offset to src from dest
- r8 - number of bytes to quadword boundary
- */
-
- mtcrf 0x01,r8 /* put #bytes to boundary into cr7 */
- subf r5,r8,r5 /* adjust remaining len */
-
- bf cr7*4+3,1f
- lbzx r0,r7,r6 /* copy 1 byte addr */
- stb r0,0(r6)
- addi r6,r6,1
-1:
- bf cr7*4+2,2f
- lhzx r0,r7,r6 /* copy 2 byte addr */
- sth r0,0(r6)
- addi r6,r6,2
-2:
- bf cr7*4+1,4f
- lwzx r0,r7,r6 /* copy 4 byte addr */
- stw r0,0(r6)
- addi r6,r6,4
-4:
- bf cr7*4+0,8f
- ldx r0,r7,r6 /* copy 8 byte addr */
- std r0,0(r6)
- addi r6,r6,8
-8:
- add r4,r7,r6 /* update src addr */
-
-
-
- /* Dest is quadword aligned now.
-
- Lots of decisions to make. If we are copying less than a cache
- line we won't be here long. If we are not on a cache line
- boundary we need to get there. And then we need to figure out
- how many cache lines ahead to pre-touch.
-
- r3 - return value (always)
- r4 - current source addr
- r5 - copy length
- r6 - current dest addr
- */
-
-
- .align 4
-L(dst_aligned):
- cmpdi cr0,r9,0 /* Cache line size set? */
- bne+ cr0,L(cachelineset)
-
-/* __cache_line_size not set: generic byte copy without much optimization */
- clrldi. r0,r5,63 /* If length is odd copy one byte */
- beq L(cachelinenotset_align)
- lbz r7,0(r4) /* Read one byte from source */
- addi r5,r5,-1 /* Update length */
- addi r4,r4,1 /* Update source pointer address */
- stb r7,0(r6) /* Store one byte at dest */
- addi r6,r6,1 /* Update dest pointer address */
-L(cachelinenotset_align):
- cmpdi cr7,r5,0 /* If length is 0 return */
- beqlr cr7
- ori r2,r2,0 /* Force a new dispatch group */
-L(cachelinenotset_loop):
- addic. r5,r5,-2 /* Update length */
- lbz r7,0(r4) /* Load 2 bytes from source */
- lbz r8,1(r4)
- addi r4,r4,2 /* Update source pointer address */
- stb r7,0(r6) /* Store 2 bytes on dest */
- stb r8,1(r6)
- addi r6,r6,2 /* Update dest pointer address */
- bne L(cachelinenotset_loop)
- blr
-
-
-L(cachelineset):
- cmpd cr5,r5,r10 /* Less than a cacheline to go? */
-
- neg r7,r6 /* How far to next cacheline bdy? */
-
- addi r6,r6,-8 /* prepare for stdu */
- cmpdi cr0,r9,128
- addi r4,r4,-8 /* prepare for ldu */
-
-
- ble+ cr5,L(lessthancacheline)
-
- beq- cr0,L(big_lines) /* 128 byte line code */
-
-
-
- /* More than a cacheline left to go, and using 64 byte cachelines */
-
- clrldi r7,r7,64-6 /* How far to next cacheline bdy? */
-
- cmpldi cr6,r7,0 /* Are we on a cacheline bdy already? */
-
- /* Reduce total len by what it takes to get to the next cache line */
- subf r5,r7,r5
- srdi r7,r7,4 /* How many qws to get to the line bdy? */
-
- /* How many full cache lines to copy after getting to a line bdy? */
- srdi r10,r5,6
-
- cmpldi r10,0 /* If no full cache lines to copy ... */
- li r11,0 /* number cachelines to copy with prefetch */
- beq L(nocacheprefetch)
-
-
- /* We are here because we have at least one full cache line to copy,
- and therefore some pre-touching to do. */
-
- cmpldi r10,PREFETCH_AHEAD
- li r12,64+8 /* prefetch distance */
- ble L(lessthanmaxprefetch)
-
- /* We can only do so much pre-fetching. R11 will have the count of
- lines left to prefetch after the initial batch of prefetches
- are executed. */
-
- subi r11,r10,PREFETCH_AHEAD
- li r10,PREFETCH_AHEAD
-
-L(lessthanmaxprefetch):
- mtctr r10
-
- /* At this point r10/ctr hold the number of lines to prefetch in this
- initial batch, and r11 holds any remainder. */
-
-L(prefetchSRC):
- dcbt r12,r4
- addi r12,r12,64
- bdnz L(prefetchSRC)
-
-
- /* Prefetching is done, or was not needed.
-
- cr6 - are we on a cacheline boundary already?
- r7 - number of quadwords to the next cacheline boundary
- */
-
-L(nocacheprefetch):
- mtctr r7
-
- cmpldi cr1,r5,64 /* Less than a cache line to copy? */
-
- /* How many bytes are left after we copy whatever full
- cache lines we can get? */
- clrldi r5,r5,64-6
-
- beq cr6,L(cachelinealigned)
-
-
- /* Copy quadwords up to the next cacheline boundary */
-
-L(aligntocacheline):
- ld r9,0x08(r4)
- ld r7,0x10(r4)
- addi r4,r4,0x10
- std r9,0x08(r6)
- stdu r7,0x10(r6)
- bdnz L(aligntocacheline)
-
-
- .align 4
-L(cachelinealigned): /* copy while cache lines */
-
- blt- cr1,L(lessthancacheline) /* size <64 */
-
-L(outerloop):
- cmpdi r11,0
- mtctr r11
- beq- L(endloop)
-
- li r11,64*ZERO_AHEAD +8 /* DCBZ dist */
-
- .align 4
- /* Copy whole cachelines, optimized by prefetching SRC cacheline */
-L(loop): /* Copy aligned body */
- dcbt r12,r4 /* PREFETCH SOURCE some cache lines ahead */
- ld r9, 0x08(r4)
- dcbz r11,r6
- ld r7, 0x10(r4)
- ld r8, 0x18(r4)
- ld r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- std r0, 0x20(r6)
- ld r9, 0x28(r4)
- ld r7, 0x30(r4)
- ld r8, 0x38(r4)
- ld r0, 0x40(r4)
- addi r4, r4,0x40
- std r9, 0x28(r6)
- std r7, 0x30(r6)
- std r8, 0x38(r6)
- stdu r0, 0x40(r6)
-
- bdnz L(loop)
-
-
-L(endloop):
- cmpdi r10,0
- beq- L(endloop2)
- mtctr r10
-
-L(loop2): /* Copy aligned body */
- ld r9, 0x08(r4)
- ld r7, 0x10(r4)
- ld r8, 0x18(r4)
- ld r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- std r0, 0x20(r6)
- ld r9, 0x28(r4)
- ld r7, 0x30(r4)
- ld r8, 0x38(r4)
- ld r0, 0x40(r4)
- addi r4, r4,0x40
- std r9, 0x28(r6)
- std r7, 0x30(r6)
- std r8, 0x38(r6)
- stdu r0, 0x40(r6)
-
- bdnz L(loop2)
-L(endloop2):
-
-
- .align 4
-L(lessthancacheline): /* Was there less than cache to do ? */
- cmpldi cr0,r5,16
- srdi r7,r5,4 /* divide size by 16 */
- blt- L(do_lt16)
- mtctr r7
-
-L(copy_remaining):
- ld r8,0x08(r4)
- ld r7,0x10(r4)
- addi r4,r4,0x10
- std r8,0x08(r6)
- stdu r7,0x10(r6)
- bdnz L(copy_remaining)
-
-L(do_lt16): /* less than 16 ? */
- cmpldi cr0,r5,0 /* copy remaining bytes (0-15) */
- beqlr+ /* no rest to copy */
- addi r4,r4,8
- addi r6,r6,8
-
-L(shortcopy): /* SIMPLE COPY to handle size =< 15 bytes */
- mtcrf 0x01,r5
- sub r7,r4,r6
- bf- cr7*4+0,8f
- ldx r0,r7,r6 /* copy 8 byte */
- std r0,0(r6)
- addi r6,r6,8
-8:
- bf cr7*4+1,4f
- lwzx r0,r7,r6 /* copy 4 byte */
- stw r0,0(r6)
- addi r6,r6,4
-4:
- bf cr7*4+2,2f
- lhzx r0,r7,r6 /* copy 2 byte */
- sth r0,0(r6)
- addi r6,r6,2
-2:
- bf cr7*4+3,1f
- lbzx r0,r7,r6 /* copy 1 byte */
- stb r0,0(r6)
-1:
- blr
-
-
-
-
-
- /* Similar to above, but for use with 128 byte lines. */
-
-
-L(big_lines):
-
- clrldi r7,r7,64-7 /* How far to next cacheline bdy? */
-
- cmpldi cr6,r7,0 /* Are we on a cacheline bdy already? */
-
- /* Reduce total len by what it takes to get to the next cache line */
- subf r5,r7,r5
- srdi r7,r7,4 /* How many qws to get to the line bdy? */
-
- /* How many full cache lines to copy after getting to a line bdy? */
- srdi r10,r5,7
-
- cmpldi r10,0 /* If no full cache lines to copy ... */
- li r11,0 /* number cachelines to copy with prefetch */
- beq L(nocacheprefetch_128)
-
-
- /* We are here because we have at least one full cache line to copy,
- and therefore some pre-touching to do. */
-
- cmpldi r10,PREFETCH_AHEAD
- li r12,128+8 /* prefetch distance */
- ble L(lessthanmaxprefetch_128)
-
- /* We can only do so much pre-fetching. R11 will have the count of
- lines left to prefetch after the initial batch of prefetches
- are executed. */
-
- subi r11,r10,PREFETCH_AHEAD
- li r10,PREFETCH_AHEAD
-
-L(lessthanmaxprefetch_128):
- mtctr r10
-
- /* At this point r10/ctr hold the number of lines to prefetch in this
- initial batch, and r11 holds any remainder. */
-
-L(prefetchSRC_128):
- dcbt r12,r4
- addi r12,r12,128
- bdnz L(prefetchSRC_128)
-
-
- /* Prefetching is done, or was not needed.
-
- cr6 - are we on a cacheline boundary already?
- r7 - number of quadwords to the next cacheline boundary
- */
-
-L(nocacheprefetch_128):
- mtctr r7
-
- cmpldi cr1,r5,128 /* Less than a cache line to copy? */
-
- /* How many bytes are left after we copy whatever full
- cache lines we can get? */
- clrldi r5,r5,64-7
-
- beq cr6,L(cachelinealigned_128)
-
-
- /* Copy quadwords up to the next cacheline boundary */
-
-L(aligntocacheline_128):
- ld r9,0x08(r4)
- ld r7,0x10(r4)
- addi r4,r4,0x10
- std r9,0x08(r6)
- stdu r7,0x10(r6)
- bdnz L(aligntocacheline_128)
-
-
-L(cachelinealigned_128): /* copy while cache lines */
-
- blt- cr1,L(lessthancacheline) /* size <128 */
-
-L(outerloop_128):
- cmpdi r11,0
- mtctr r11
- beq- L(endloop_128)
-
- li r11,128*ZERO_AHEAD +8 /* DCBZ dist */
-
- .align 4
- /* Copy whole cachelines, optimized by prefetching SRC cacheline */
-L(loop_128): /* Copy aligned body */
- dcbt r12,r4 /* PREFETCH SOURCE some cache lines ahead */
- ld r9, 0x08(r4)
- dcbz r11,r6
- ld r7, 0x10(r4)
- ld r8, 0x18(r4)
- ld r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- std r0, 0x20(r6)
- ld r9, 0x28(r4)
- ld r7, 0x30(r4)
- ld r8, 0x38(r4)
- ld r0, 0x40(r4)
- std r9, 0x28(r6)
- std r7, 0x30(r6)
- std r8, 0x38(r6)
- std r0, 0x40(r6)
- ld r9, 0x48(r4)
- ld r7, 0x50(r4)
- ld r8, 0x58(r4)
- ld r0, 0x60(r4)
- std r9, 0x48(r6)
- std r7, 0x50(r6)
- std r8, 0x58(r6)
- std r0, 0x60(r6)
- ld r9, 0x68(r4)
- ld r7, 0x70(r4)
- ld r8, 0x78(r4)
- ld r0, 0x80(r4)
- addi r4, r4,0x80
- std r9, 0x68(r6)
- std r7, 0x70(r6)
- std r8, 0x78(r6)
- stdu r0, 0x80(r6)
-
- bdnz L(loop_128)
-
-
-L(endloop_128):
- cmpdi r10,0
- beq- L(endloop2_128)
- mtctr r10
-
-L(loop2_128): /* Copy aligned body */
- ld r9, 0x08(r4)
- ld r7, 0x10(r4)
- ld r8, 0x18(r4)
- ld r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- std r0, 0x20(r6)
- ld r9, 0x28(r4)
- ld r7, 0x30(r4)
- ld r8, 0x38(r4)
- ld r0, 0x40(r4)
- std r9, 0x28(r6)
- std r7, 0x30(r6)
- std r8, 0x38(r6)
- std r0, 0x40(r6)
- ld r9, 0x48(r4)
- ld r7, 0x50(r4)
- ld r8, 0x58(r4)
- ld r0, 0x60(r4)
- std r9, 0x48(r6)
- std r7, 0x50(r6)
- std r8, 0x58(r6)
- std r0, 0x60(r6)
- ld r9, 0x68(r4)
- ld r7, 0x70(r4)
- ld r8, 0x78(r4)
- ld r0, 0x80(r4)
- addi r4, r4,0x80
- std r9, 0x68(r6)
- std r7, 0x70(r6)
- std r8, 0x78(r6)
- stdu r0, 0x80(r6)
-
- bdnz L(loop2_128)
-L(endloop2_128):
-
- b L(lessthancacheline)
-
-
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/addmul_1.S b/sysdeps/powerpc/powerpc64/addmul_1.S
deleted file mode 100644
index b4b052141d..0000000000
--- a/sysdeps/powerpc/powerpc64/addmul_1.S
+++ /dev/null
@@ -1,208 +0,0 @@
-/* PowerPC64 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
- the result to a second limb vector.
- Copyright (C) 1999-2017 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 <sysdep.h>
-
-#ifdef USE_AS_SUBMUL
-# define FUNC __mpn_submul_1
-# define ADDSUBC subfe
-# define ADDSUB subfc
-#else
-# define FUNC __mpn_addmul_1
-# define ADDSUBC adde
-# define ADDSUB addc
-#endif
-
-#define RP r3
-#define UP r4
-#define N r5
-#define VL r6
-
-EALIGN(FUNC, 5, 0)
- std r31, -8(r1)
- rldicl. r0, N, 0, 62
- std r30, -16(r1)
- cmpdi VL, r0, 2
- std r29, -24(r1)
- addi N, N, 3
- std r28, -32(r1)
- srdi N, N, 2
- std r27, -40(r1)
- mtctr N
- beq cr0, L(b00)
- blt cr6, L(b01)
- beq cr6, L(b10)
-
-L(b11): ld r9, 0(UP)
- ld r28, 0(RP)
- mulld r0, r9, VL
- mulhdu r12, r9, VL
- ADDSUB r0, r0, r28
- std r0, 0(RP)
- addi RP, RP, 8
- ld r9, 8(UP)
- ld r27, 16(UP)
- addi UP, UP, 24
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
-#endif
- b L(bot)
-
- .align 4
-L(b00): ld r9, 0(UP)
- ld r27, 8(UP)
- ld r28, 0(RP)
- ld r29, 8(RP)
- mulld r0, r9, VL
- mulhdu N, r9, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- addc r7, r7, N
- addze r12, r8
- ADDSUB r0, r0, r28
- std r0, 0(RP)
- ADDSUBC r7, r7, r29
- std r7, 8(RP)
- addi RP, RP, 16
- ld r9, 16(UP)
- ld r27, 24(UP)
- addi UP, UP, 32
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
-#endif
- b L(bot)
-
- .align 4
-L(b01): bdnz L(gt1)
- ld r9, 0(UP)
- ld r11, 0(RP)
- mulld r0, r9, VL
- mulhdu r8, r9, VL
- ADDSUB r0, r0, r11
- std r0, 0(RP)
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
- addic r11, r11, 1
-#endif
- addze RP, r8
- blr
-
-L(gt1): ld r9, 0(UP)
- ld r27, 8(UP)
- mulld r0, r9, VL
- mulhdu N, r9, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- ld r9, 16(UP)
- ld r28, 0(RP)
- ld r29, 8(RP)
- ld r30, 16(RP)
- mulld r11, r9, VL
- mulhdu r10, r9, VL
- addc r7, r7, N
- adde r11, r11, r8
- addze r12, r10
- ADDSUB r0, r0, r28
- std r0, 0(RP)
- ADDSUBC r7, r7, r29
- std r7, 8(RP)
- ADDSUBC r11, r11, r30
- std r11, 16(RP)
- addi RP, RP, 24
- ld r9, 24(UP)
- ld r27, 32(UP)
- addi UP, UP, 40
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
-#endif
- b L(bot)
-
-L(b10): addic r0, r0, r0
- li r12, 0
- ld r9, 0(UP)
- ld r27, 8(UP)
- bdz L(end)
- addi UP, UP, 16
-
- .align 4
-L(top): mulld r0, r9, VL
- mulhdu N, r9, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- ld r9, 0(UP)
- ld r28, 0(RP)
- ld r27, 8(UP)
- ld r29, 8(RP)
- adde r0, r0, r12
- adde r7, r7, N
- mulld N, r9, VL
- mulhdu r10, r9, VL
- mulld r11, r27, VL
- mulhdu r12, r27, VL
- ld r9, 16(UP)
- ld r30, 16(RP)
- ld r27, 24(UP)
- ld r31, 24(RP)
- adde N, N, r8
- adde r11, r11, r10
- addze r12, r12
- ADDSUB r0, r0, r28
- std r0, 0(RP)
- ADDSUBC r7, r7, r29
- std r7, 8(RP)
- ADDSUBC N, N, r30
- std N, 16(RP)
- ADDSUBC r11, r11, r31
- std r11, 24(RP)
- addi UP, UP, 32
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
-#endif
- addi RP, RP, 32
-L(bot):
-#ifdef USE_AS_SUBMUL
- addic r11, r11, 1
-#endif
- bdnz L(top)
-
-L(end): mulld r0, r9, VL
- mulhdu N, r9, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- ld r28, 0(RP)
- ld r29, 8(RP)
- adde r0, r0, r12
- adde r7, r7, N
- addze r8, r8
- ADDSUB r0, r0, r28
- std r0, 0(RP)
- ADDSUBC r7, r7, r29
- std r7, 8(RP)
-#ifdef USE_AS_SUBMUL
- subfe r11, r11, r11
- addic r11, r11, 1
-#endif
- addze RP, r8
- ld r31, -8(r1)
- ld r30, -16(r1)
- ld r29, -24(r1)
- ld r28, -32(r1)
- ld r27, -40(r1)
- blr
-END(FUNC)
diff --git a/sysdeps/powerpc/powerpc64/atomic-machine.h b/sysdeps/powerpc/powerpc64/atomic-machine.h
deleted file mode 100644
index 46df488b3c..0000000000
--- a/sysdeps/powerpc/powerpc64/atomic-machine.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/* Atomic operations. PowerPC64 version.
- Copyright (C) 2003-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Paul Mackerras <paulus@au.ibm.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/>. */
-
-/* POWER6 adds a "Mutex Hint" to the Load and Reserve instruction.
- This is a hint to the hardware to expect additional updates adjacent
- to the lock word or not. If we are acquiring a Mutex, the hint
- should be true. Otherwise we releasing a Mutex or doing a simple
- atomic operation. In that case we don't expect additional updates
- adjacent to the lock word after the Store Conditional and the hint
- should be false. */
-
-#if defined _ARCH_PWR6 || defined _ARCH_PWR6X
-# define MUTEX_HINT_ACQ ",1"
-# define MUTEX_HINT_REL ",0"
-#else
-# define MUTEX_HINT_ACQ
-# define MUTEX_HINT_REL
-#endif
-
-#define __HAVE_64B_ATOMICS 1
-#define USE_ATOMIC_COMPILER_BUILTINS 0
-#define ATOMIC_EXCHANGE_USES_CAS 1
-
-/* The 32-bit exchange_bool is different on powerpc64 because the subf
- does signed 64-bit arithmetic while the lwarx is 32-bit unsigned
- (a load word and zero (high 32) form) load.
- In powerpc64 register values are 64-bit by default, including oldval.
- The value in old val unknown sign extension, lwarx loads the 32-bit
- value as unsigned. So we explicitly clear the high 32 bits in oldval. */
-#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
-({ \
- unsigned int __tmp, __tmp2; \
- __asm __volatile (" clrldi %1,%1,32\n" \
- "1: lwarx %0,0,%2" MUTEX_HINT_ACQ "\n" \
- " subf. %0,%1,%0\n" \
- " bne 2f\n" \
- " stwcx. %4,0,%2\n" \
- " bne- 1b\n" \
- "2: " __ARCH_ACQ_INSTR \
- : "=&r" (__tmp), "=r" (__tmp2) \
- : "b" (mem), "1" (oldval), "r" (newval) \
- : "cr0", "memory"); \
- __tmp != 0; \
-})
-
-/*
- * Only powerpc64 processors support Load doubleword and reserve index (ldarx)
- * and Store doubleword conditional indexed (stdcx) instructions. So here
- * we define the 64-bit forms.
- */
-#define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
-({ \
- unsigned long __tmp; \
- __asm __volatile ( \
- "1: ldarx %0,0,%1" MUTEX_HINT_ACQ "\n" \
- " subf. %0,%2,%0\n" \
- " bne 2f\n" \
- " stdcx. %3,0,%1\n" \
- " bne- 1b\n" \
- "2: " __ARCH_ACQ_INSTR \
- : "=&r" (__tmp) \
- : "b" (mem), "r" (oldval), "r" (newval) \
- : "cr0", "memory"); \
- __tmp != 0; \
-})
-
-#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
- ({ \
- __typeof (*(mem)) __tmp; \
- __typeof (mem) __memp = (mem); \
- __asm __volatile ( \
- "1: ldarx %0,0,%1" MUTEX_HINT_ACQ "\n" \
- " cmpd %0,%2\n" \
- " bne 2f\n" \
- " stdcx. %3,0,%1\n" \
- " bne- 1b\n" \
- "2: " __ARCH_ACQ_INSTR \
- : "=&r" (__tmp) \
- : "b" (__memp), "r" (oldval), "r" (newval) \
- : "cr0", "memory"); \
- __tmp; \
- })
-
-#define __arch_compare_and_exchange_val_64_rel(mem, newval, oldval) \
- ({ \
- __typeof (*(mem)) __tmp; \
- __typeof (mem) __memp = (mem); \
- __asm __volatile (__ARCH_REL_INSTR "\n" \
- "1: ldarx %0,0,%1" MUTEX_HINT_REL "\n" \
- " cmpd %0,%2\n" \
- " bne 2f\n" \
- " stdcx. %3,0,%1\n" \
- " bne- 1b\n" \
- "2: " \
- : "=&r" (__tmp) \
- : "b" (__memp), "r" (oldval), "r" (newval) \
- : "cr0", "memory"); \
- __tmp; \
- })
-
-#define __arch_atomic_exchange_64_acq(mem, value) \
- ({ \
- __typeof (*mem) __val; \
- __asm __volatile (__ARCH_REL_INSTR "\n" \
- "1: ldarx %0,0,%2" MUTEX_HINT_ACQ "\n" \
- " stdcx. %3,0,%2\n" \
- " bne- 1b\n" \
- " " __ARCH_ACQ_INSTR \
- : "=&r" (__val), "=m" (*mem) \
- : "b" (mem), "r" (value), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_exchange_64_rel(mem, value) \
- ({ \
- __typeof (*mem) __val; \
- __asm __volatile (__ARCH_REL_INSTR "\n" \
- "1: ldarx %0,0,%2" MUTEX_HINT_REL "\n" \
- " stdcx. %3,0,%2\n" \
- " bne- 1b" \
- : "=&r" (__val), "=m" (*mem) \
- : "b" (mem), "r" (value), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_exchange_and_add_64(mem, value) \
- ({ \
- __typeof (*mem) __val, __tmp; \
- __asm __volatile ("1: ldarx %0,0,%3\n" \
- " add %1,%0,%4\n" \
- " stdcx. %1,0,%3\n" \
- " bne- 1b" \
- : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \
- : "b" (mem), "r" (value), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_exchange_and_add_64_acq(mem, value) \
- ({ \
- __typeof (*mem) __val, __tmp; \
- __asm __volatile ("1: ldarx %0,0,%3" MUTEX_HINT_ACQ "\n" \
- " add %1,%0,%4\n" \
- " stdcx. %1,0,%3\n" \
- " bne- 1b\n" \
- __ARCH_ACQ_INSTR \
- : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \
- : "b" (mem), "r" (value), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_exchange_and_add_64_rel(mem, value) \
- ({ \
- __typeof (*mem) __val, __tmp; \
- __asm __volatile (__ARCH_REL_INSTR "\n" \
- "1: ldarx %0,0,%3" MUTEX_HINT_REL "\n" \
- " add %1,%0,%4\n" \
- " stdcx. %1,0,%3\n" \
- " bne- 1b" \
- : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \
- : "b" (mem), "r" (value), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_increment_val_64(mem) \
- ({ \
- __typeof (*(mem)) __val; \
- __asm __volatile ("1: ldarx %0,0,%2\n" \
- " addi %0,%0,1\n" \
- " stdcx. %0,0,%2\n" \
- " bne- 1b" \
- : "=&b" (__val), "=m" (*mem) \
- : "b" (mem), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_decrement_val_64(mem) \
- ({ \
- __typeof (*(mem)) __val; \
- __asm __volatile ("1: ldarx %0,0,%2\n" \
- " subi %0,%0,1\n" \
- " stdcx. %0,0,%2\n" \
- " bne- 1b" \
- : "=&b" (__val), "=m" (*mem) \
- : "b" (mem), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-#define __arch_atomic_decrement_if_positive_64(mem) \
- ({ int __val, __tmp; \
- __asm __volatile ("1: ldarx %0,0,%3\n" \
- " cmpdi 0,%0,0\n" \
- " addi %1,%0,-1\n" \
- " ble 2f\n" \
- " stdcx. %1,0,%3\n" \
- " bne- 1b\n" \
- "2: " __ARCH_ACQ_INSTR \
- : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \
- : "b" (mem), "m" (*mem) \
- : "cr0", "memory"); \
- __val; \
- })
-
-/*
- * All powerpc64 processors support the new "light weight" sync (lwsync).
- */
-#define atomic_read_barrier() __asm ("lwsync" ::: "memory")
-/*
- * "light weight" sync can also be used for the release barrier.
- */
-#ifndef UP
-# define __ARCH_REL_INSTR "lwsync"
-#endif
-#define atomic_write_barrier() __asm ("lwsync" ::: "memory")
-
-/*
- * Include the rest of the atomic ops macros which are common to both
- * powerpc32 and powerpc64.
- */
-#include_next <atomic-machine.h>
diff --git a/sysdeps/powerpc/powerpc64/backtrace.c b/sysdeps/powerpc/powerpc64/backtrace.c
deleted file mode 100644
index 723948d78f..0000000000
--- a/sysdeps/powerpc/powerpc64/backtrace.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Return backtrace of current program state.
- Copyright (C) 1998-2017 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <stddef.h>
-#include <string.h>
-#include <signal.h>
-#include <stdint.h>
-
-#include <execinfo.h>
-#include <libc-vdso.h>
-
-/* This is the stack layout we see with every stack frame.
- Note that every routine is required by the ABI to lay out the stack
- like this.
-
- +----------------+ +-----------------+
- %r1 -> | %r1 last frame--------> | %r1 last frame--->... --> NULL
- | | | |
- | cr save | | cr save |
- | | | |
- | (unused) | | return address |
- +----------------+ +-----------------+
-*/
-struct layout
-{
- struct layout *next;
- long int condition_register;
- void *return_address;
-};
-
-/* Since the signal handler is just like any other function it needs to
- save/restore its LR and it will save it into callers stack frame.
- Since a signal handler doesn't have a caller, the kernel creates a
- dummy frame to make it look like it has a caller. */
-struct signal_frame_64 {
-#define SIGNAL_FRAMESIZE 128
- char dummy[SIGNAL_FRAMESIZE];
- struct ucontext uc;
- /* We don't care about the rest, since the IP value is at 'uc' field. */
-};
-
-static inline int
-is_sigtramp_address (void *nip)
-{
-#ifdef SHARED
- if (nip == VDSO_SYMBOL (sigtramp_rt64))
- return 1;
-#endif
- return 0;
-}
-
-int
-__backtrace (void **array, int size)
-{
- struct layout *current;
- int count;
-
- /* Force gcc to spill LR. */
- asm volatile ("" : "=l"(current));
-
- /* Get the address on top-of-stack. */
- asm volatile ("ld %0,0(1)" : "=r"(current));
-
- for ( count = 0;
- current != NULL && count < size;
- current = current->next, count++)
- {
- array[count] = current->return_address;
-
- /* Check if the symbol is the signal trampoline and get the interrupted
- * symbol address from the trampoline saved area. */
- if (is_sigtramp_address (current->return_address))
- {
- struct signal_frame_64 *sigframe = (struct signal_frame_64*) current;
- array[++count] = (void*) sigframe->uc.uc_mcontext.gp_regs[PT_NIP];
- current = (void*) sigframe->uc.uc_mcontext.gp_regs[PT_R1];
- }
- }
-
- /* It's possible the second-last stack frame can't return
- (that is, it's __libc_start_main), in which case
- the CRT startup code will have set its LR to 'NULL'. */
- if (count > 0 && array[count-1] == NULL)
- count--;
-
- return count;
-}
-weak_alias (__backtrace, backtrace)
-libc_hidden_def (__backtrace)
diff --git a/sysdeps/powerpc/powerpc64/bits/wordsize.h b/sysdeps/powerpc/powerpc64/bits/wordsize.h
deleted file mode 100644
index 04ca9debf0..0000000000
--- a/sysdeps/powerpc/powerpc64/bits/wordsize.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Determine the wordsize from the preprocessor defines. */
-
-#if defined __powerpc64__
-# define __WORDSIZE 64
-# define __WORDSIZE_TIME64_COMPAT32 1
-#else
-# define __WORDSIZE 32
-# define __WORDSIZE_TIME64_COMPAT32 0
-# define __WORDSIZE32_SIZE_ULONG 0
-# define __WORDSIZE32_PTRDIFF_LONG 0
-#endif
diff --git a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S b/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
deleted file mode 100644
index 86d49b1c6e..0000000000
--- a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
+++ /dev/null
@@ -1 +0,0 @@
-/* _setjmp moved to setjmp-common.S */
diff --git a/sysdeps/powerpc/powerpc64/bsd-setjmp.S b/sysdeps/powerpc/powerpc64/bsd-setjmp.S
deleted file mode 100644
index 38b734fcb4..0000000000
--- a/sysdeps/powerpc/powerpc64/bsd-setjmp.S
+++ /dev/null
@@ -1 +0,0 @@
-/* setjmp moved to setjmp-common.S */
diff --git a/sysdeps/powerpc/powerpc64/bzero.S b/sysdeps/powerpc/powerpc64/bzero.S
deleted file mode 100644
index 41cfac5127..0000000000
--- a/sysdeps/powerpc/powerpc64/bzero.S
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Optimized bzero `implementation' for PowerPC64.
- Copyright (C) 1997-2017 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/>. */
-
-/* This code was moved into memset.S to solve a double stub call problem.
- @local would have worked but it is not supported in PowerPC64 asm. */
diff --git a/sysdeps/powerpc/powerpc64/cell/memcpy.S b/sysdeps/powerpc/powerpc64/cell/memcpy.S
deleted file mode 100644
index 1cc66456e3..0000000000
--- a/sysdeps/powerpc/powerpc64/cell/memcpy.S
+++ /dev/null
@@ -1,246 +0,0 @@
-/* Optimized memcpy implementation for CELL BE PowerPC.
- Copyright (C) 2010-2017 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 <sysdep.h>
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
-
-#define PREFETCH_AHEAD 6 /* no cache lines SRC prefetching ahead */
-#define ZERO_AHEAD 4 /* no cache lines DST zeroing ahead */
-
-/* memcpy routine optimized for CELL-BE-PPC v2.0
- *
- * The CELL PPC core has 1 integer unit and 1 load/store unit
- * CELL:
- * 1st level data cache = 32K
- * 2nd level data cache = 512K
- * 3rd level data cache = 0K
- * With 3.2 GHz clockrate the latency to 2nd level cache is >36 clocks,
- * latency to memory is >400 clocks
- * To improve copy performance we need to prefetch source data
- * far ahead to hide this latency
- * For best performance instruction forms ending in "." like "andi."
- * should be avoided as the are implemented in microcode on CELL.
- * The below code is loop unrolled for the CELL cache line of 128 bytes
- */
-
-.align 7
-
-EALIGN (MEMCPY, 5, 0)
- CALL_MCOUNT 3
-
- dcbt 0,r4 /* Prefetch ONE SRC cacheline */
- cmpldi cr1,r5,16 /* is size < 16 ? */
- mr r6,r3
- blt+ cr1,.Lshortcopy
-
-.Lbigcopy:
- neg r8,r3 /* LS 3 bits = # bytes to 8-byte dest bdry */
- clrldi r8,r8,64-4 /* align to 16byte boundary */
- sub r7,r4,r3
- cmpldi cr0,r8,0
- beq+ .Ldst_aligned
-
-.Ldst_unaligned:
- mtcrf 0x01,r8 /* put #bytes to boundary into cr7 */
- subf r5,r8,r5
-
- bf cr7*4+3,1f
- lbzx r0,r7,r6 /* copy 1 byte */
- stb r0,0(r6)
- addi r6,r6,1
-1: bf cr7*4+2,2f
- lhzx r0,r7,r6 /* copy 2 byte */
- sth r0,0(r6)
- addi r6,r6,2
-2: bf cr7*4+1,4f
- lwzx r0,r7,r6 /* copy 4 byte */
- stw r0,0(r6)
- addi r6,r6,4
-4: bf cr7*4+0,8f
- ldx r0,r7,r6 /* copy 8 byte */
- std r0,0(r6)
- addi r6,r6,8
-8:
- add r4,r7,r6
-
-.Ldst_aligned:
-
- cmpdi cr5,r5,128-1
-
- neg r7,r6
- addi r6,r6,-8 /* prepare for stdu */
- addi r4,r4,-8 /* prepare for ldu */
-
- clrldi r7,r7,64-7 /* align to cacheline boundary */
- ble+ cr5,.Llessthancacheline
-
- cmpldi cr6,r7,0
- subf r5,r7,r5
- srdi r7,r7,4 /* divide size by 16 */
- srdi r10,r5,7 /* number of cache lines to copy */
-
- cmpldi r10,0
- li r11,0 /* number cachelines to copy with prefetch */
- beq .Lnocacheprefetch
-
- cmpldi r10,PREFETCH_AHEAD
- li r12,128+8 /* prefetch distance */
- ble .Llessthanmaxprefetch
-
- subi r11,r10,PREFETCH_AHEAD
- li r10,PREFETCH_AHEAD
-
-.Llessthanmaxprefetch:
- mtctr r10
-
-.LprefetchSRC:
- dcbt r12,r4
- addi r12,r12,128
- bdnz .LprefetchSRC
-
-.Lnocacheprefetch:
- mtctr r7
- cmpldi cr1,r5,128
- clrldi r5,r5,64-7
- beq cr6,.Lcachelinealigned
-
-.Laligntocacheline:
- ld r9,0x08(r4)
- ldu r7,0x10(r4)
- std r9,0x08(r6)
- stdu r7,0x10(r6)
- bdnz .Laligntocacheline
-
-
-.Lcachelinealigned: /* copy while cache lines */
-
- blt- cr1,.Llessthancacheline /* size <128 */
-
-.Louterloop:
- cmpdi r11,0
- mtctr r11
- beq- .Lendloop
-
- li r11,128*ZERO_AHEAD +8 /* DCBZ dist */
-
-.align 4
- /* Copy whole cachelines, optimized by prefetching SRC cacheline */
-.Lloop: /* Copy aligned body */
- dcbt r12,r4 /* PREFETCH SOURCE some cache lines ahead */
- ld r9, 0x08(r4)
- dcbz r11,r6
- ld r7, 0x10(r4) /* 4 register stride copy is optimal */
- ld r8, 0x18(r4) /* to hide 1st level cache latency. */
- ld r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- std r0, 0x20(r6)
- ld r9, 0x28(r4)
- ld r7, 0x30(r4)
- ld r8, 0x38(r4)
- ld r0, 0x40(r4)
- std r9, 0x28(r6)
- std r7, 0x30(r6)
- std r8, 0x38(r6)
- std r0, 0x40(r6)
- ld r9, 0x48(r4)
- ld r7, 0x50(r4)
- ld r8, 0x58(r4)
- ld r0, 0x60(r4)
- std r9, 0x48(r6)
- std r7, 0x50(r6)
- std r8, 0x58(r6)
- std r0, 0x60(r6)
- ld r9, 0x68(r4)
- ld r7, 0x70(r4)
- ld r8, 0x78(r4)
- ldu r0, 0x80(r4)
- std r9, 0x68(r6)
- std r7, 0x70(r6)
- std r8, 0x78(r6)
- stdu r0, 0x80(r6)
-
- bdnz .Lloop
-
-.Lendloop:
- cmpdi r10,0
- sldi r10,r10,2 /* adjust from 128 to 32 byte stride */
- beq- .Lendloop2
- mtctr r10
-
-.Lloop2: /* Copy aligned body */
- ld r9, 0x08(r4)
- ld r7, 0x10(r4)
- ld r8, 0x18(r4)
- ldu r0, 0x20(r4)
- std r9, 0x08(r6)
- std r7, 0x10(r6)
- std r8, 0x18(r6)
- stdu r0, 0x20(r6)
-
- bdnz .Lloop2
-.Lendloop2:
-
-.Llessthancacheline: /* less than cache to do ? */
- cmpldi cr0,r5,16
- srdi r7,r5,4 /* divide size by 16 */
- blt- .Ldo_lt16
- mtctr r7
-
-.Lcopy_remaining:
- ld r8,0x08(r4)
- ldu r7,0x10(r4)
- std r8,0x08(r6)
- stdu r7,0x10(r6)
- bdnz .Lcopy_remaining
-
-.Ldo_lt16: /* less than 16 ? */
- cmpldi cr0,r5,0 /* copy remaining bytes (0-15) */
- beqlr+ /* no rest to copy */
- addi r4,r4,8
- addi r6,r6,8
-
-.Lshortcopy: /* SIMPLE COPY to handle size =< 15 bytes */
- mtcrf 0x01,r5
- sub r7,r4,r6
- bf- cr7*4+0,8f
- ldx r0,r7,r6 /* copy 8 byte */
- std r0,0(r6)
- addi r6,r6,8
-8:
- bf cr7*4+1,4f
- lwzx r0,r7,r6 /* copy 4 byte */
- stw r0,0(r6)
- addi r6,r6,4
-4:
- bf cr7*4+2,2f
- lhzx r0,r7,r6 /* copy 2 byte */
- sth r0,0(r6)
- addi r6,r6,2
-2:
- bf cr7*4+3,1f
- lbzx r0,r7,r6 /* copy 1 byte */
- stb r0,0(r6)
-1: blr
-
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/configure b/sysdeps/powerpc/powerpc64/configure
deleted file mode 100644
index 7632a7be04..0000000000
--- a/sysdeps/powerpc/powerpc64/configure
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
- # Local configure fragment for sysdeps/powerpc/powerpc64.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for support for overlapping .opd entries" >&5
-$as_echo_n "checking for support for overlapping .opd entries... " >&6; }
-if ${libc_cv_overlapping_opd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- libc_cv_overlapping_opd=no
-echo 'void foo (void) {}' > conftest.c
-if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -S conftest.c -o conftest.s 1>&5'
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- if grep '\.TOC\.@tocbase' conftest.s > /dev/null; then
- if grep '\.TOC\.@tocbase[ ]*,[ ]*0' conftest.s > /dev/null; then
- :
- else
- libc_cv_overlapping_opd=yes
- fi
- fi
-fi
-rm -f conftest.c conftest.s
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_overlapping_opd" >&5
-$as_echo "$libc_cv_overlapping_opd" >&6; }
-if test x$libc_cv_overlapping_opd = xyes; then
- $as_echo "#define USE_PPC64_OVERLAPPING_OPD 1" >>confdefs.h
-
-fi
diff --git a/sysdeps/powerpc/powerpc64/configure.ac b/sysdeps/powerpc/powerpc64/configure.ac
deleted file mode 100644
index f309ba35a8..0000000000
--- a/sysdeps/powerpc/powerpc64/configure.ac
+++ /dev/null
@@ -1,23 +0,0 @@
-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
-# Local configure fragment for sysdeps/powerpc/powerpc64.
-
-AC_CACHE_CHECK(for support for overlapping .opd entries,
-libc_cv_overlapping_opd, [dnl
-libc_cv_overlapping_opd=no
-echo 'void foo (void) {}' > conftest.c
-if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
-changequote(,)dnl
- if grep '\.TOC\.@tocbase' conftest.s > /dev/null; then
- if grep '\.TOC\.@tocbase[ ]*,[ ]*0' conftest.s > /dev/null; then
- :
- else
- libc_cv_overlapping_opd=yes
- fi
- fi
-changequote([,])dnl
-fi
-rm -f conftest.c conftest.s
-])
-if test x$libc_cv_overlapping_opd = xyes; then
- AC_DEFINE(USE_PPC64_OVERLAPPING_OPD)
-fi
diff --git a/sysdeps/powerpc/powerpc64/crti.S b/sysdeps/powerpc/powerpc64/crti.S
deleted file mode 100644
index fa4f5833ef..0000000000
--- a/sysdeps/powerpc/powerpc64/crti.S
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Special .init and .fini section support for PowerPC64.
- Copyright (C) 2012-2017 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
-
-#if PREINIT_FUNCTION_WEAK
- .section ".toc", "aw"
-.LC0:
- .tc PREINIT_FUNCTION[TC], PREINIT_FUNCTION
-#endif
- .section ".init", "ax", @progbits
- ENTRY_2(_init)
- .align ALIGNARG (2)
-BODY_LABEL (_init):
- LOCALENTRY(_init)
- mflr 0
- std 0, FRAME_LR_SAVE(r1)
- stdu r1, -FRAME_MIN_SIZE_PARM(r1)
-#if PREINIT_FUNCTION_WEAK
- addis r9, r2, .LC0@toc@ha
- ld r0, .LC0@toc@l(r9)
- cmpdi cr7, r0, 0
- beq+ cr7, 1f
-#endif
- bl JUMPTARGET (PREINIT_FUNCTION)
- nop
-1:
-
- .section ".fini", "ax", @progbits
- ENTRY_2(_fini)
- .align ALIGNARG (2)
-BODY_LABEL (_fini):
- LOCALENTRY(_fini)
- mflr 0
- std 0, FRAME_LR_SAVE(r1)
- stdu r1, -FRAME_MIN_SIZE_PARM(r1)
diff --git a/sysdeps/powerpc/powerpc64/crtn.S b/sysdeps/powerpc/powerpc64/crtn.S
deleted file mode 100644
index a8906aa16c..0000000000
--- a/sysdeps/powerpc/powerpc64/crtn.S
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Special .init and .fini section support for PowerPC64.
- Copyright (C) 2012-2017 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 r1, r1, FRAME_MIN_SIZE_PARM
- ld r0, FRAME_LR_SAVE(r1)
- mtlr r0
- blr
-
- .section .fini,"ax",@progbits
- addi r1, r1, FRAME_MIN_SIZE_PARM
- ld r0, FRAME_LR_SAVE(r1)
- mtlr r0
- blr
diff --git a/sysdeps/powerpc/powerpc64/dl-dtprocnum.h b/sysdeps/powerpc/powerpc64/dl-dtprocnum.h
deleted file mode 100644
index 142714b421..0000000000
--- a/sysdeps/powerpc/powerpc64/dl-dtprocnum.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Configuration of lookup functions. PowerPC64 version.
- Copyright (C) 2002-2017 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/>. */
-
-/* Number of extra dynamic section entries for this architecture. By
- default there are none. */
-#define DT_THISPROCNUM DT_PPC64_NUM
diff --git a/sysdeps/powerpc/powerpc64/dl-irel.h b/sysdeps/powerpc/powerpc64/dl-irel.h
deleted file mode 100644
index d8f5988bc9..0000000000
--- a/sysdeps/powerpc/powerpc64/dl-irel.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Machine-dependent ELF indirect relocation inline functions.
- PowerPC64 version.
- Copyright (C) 2009-2017 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/>. */
-
-#ifndef _DL_IREL_H
-#define _DL_IREL_H
-
-#include <stdio.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <dl-machine.h>
-
-#define ELF_MACHINE_IRELA 1
-
-static inline Elf64_Addr
-__attribute ((always_inline))
-elf_ifunc_invoke (Elf64_Addr addr)
-{
- return ((Elf64_Addr (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap));
-}
-
-static inline void
-__attribute ((always_inline))
-elf_irela (const Elf64_Rela *reloc)
-{
- unsigned int r_type = ELF64_R_TYPE (reloc->r_info);
-
- if (__glibc_likely (r_type == R_PPC64_IRELATIVE))
- {
- Elf64_Addr *const reloc_addr = (void *) reloc->r_offset;
- Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend);
- *reloc_addr = value;
- }
- else if (__glibc_likely (r_type == R_PPC64_JMP_IREL))
- {
- Elf64_Addr *const reloc_addr = (void *) reloc->r_offset;
- Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend);
-#if _CALL_ELF != 2
- *(Elf64_FuncDesc *) reloc_addr = *(Elf64_FuncDesc *) value;
-#else
- *reloc_addr = value;
-#endif
- }
- else
- __libc_fatal ("unexpected reloc type in static binary");
-}
-
-#endif /* dl-irel.h */
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.c b/sysdeps/powerpc/powerpc64/dl-machine.c
deleted file mode 100644
index 0eccc6621a..0000000000
--- a/sysdeps/powerpc/powerpc64/dl-machine.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Machine-dependent ELF dynamic relocation functions. PowerPC64 version.
- Copyright (C) 1995-2017 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <_itoa.h>
-#include <dl-machine.h>
-
-void
-_dl_reloc_overflow (struct link_map *map,
- const char *name,
- Elf64_Addr *const reloc_addr,
- const Elf64_Sym *refsym)
-{
- char buffer[128];
- char *t;
- t = stpcpy (buffer, name);
- t = stpcpy (t, " reloc at 0x");
- _itoa_word ((unsigned long) reloc_addr, t, 16, 0);
- if (refsym)
- {
- const char *strtab;
-
- strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
- t = stpcpy (t, " for symbol `");
- t = stpcpy (t, strtab + refsym->st_name);
- t = stpcpy (t, "'");
- }
- t = stpcpy (t, " out of range");
- _dl_signal_error (0, map->l_name, NULL, buffer);
-}
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
deleted file mode 100644
index 6391b3a558..0000000000
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
+++ /dev/null
@@ -1,1036 +0,0 @@
-/* Machine-dependent ELF dynamic relocation inline functions.
- PowerPC64 version.
- Copyright 1995-2017 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef dl_machine_h
-#define dl_machine_h
-
-#define ELF_MACHINE_NAME "powerpc64"
-
-#include <assert.h>
-#include <sys/param.h>
-#include <dl-tls.h>
-#include <sysdep.h>
-#include <hwcapinfo.h>
-
-/* Translate a processor specific dynamic tag to the index
- in l_info array. */
-#define DT_PPC64(x) (DT_PPC64_##x - DT_LOPROC + DT_NUM)
-
-#if _CALL_ELF != 2
-/* A PowerPC64 function descriptor. The .plt (procedure linkage
- table) and .opd (official procedure descriptor) sections are
- arrays of these. */
-typedef struct
-{
- Elf64_Addr fd_func;
- Elf64_Addr fd_toc;
- Elf64_Addr fd_aux;
-} Elf64_FuncDesc;
-#endif
-
-#define ELF_MULT_MACHINES_SUPPORTED
-
-/* Return nonzero iff ELF header is compatible with the running host. */
-static inline int
-elf_machine_matches_host (const Elf64_Ehdr *ehdr)
-{
- /* Verify that the binary matches our ABI version. */
- if ((ehdr->e_flags & EF_PPC64_ABI) != 0)
- {
-#if _CALL_ELF != 2
- if ((ehdr->e_flags & EF_PPC64_ABI) != 1)
- return 0;
-#else
- if ((ehdr->e_flags & EF_PPC64_ABI) != 2)
- return 0;
-#endif
- }
-
- return ehdr->e_machine == EM_PPC64;
-}
-
-/* Return nonzero iff ELF header is compatible with the running host,
- but not this loader. */
-static inline int
-elf_host_tolerates_machine (const Elf64_Ehdr *ehdr)
-{
- return ehdr->e_machine == EM_PPC;
-}
-
-/* Return nonzero iff ELF header is compatible with the running host,
- but not this loader. */
-static inline int
-elf_host_tolerates_class (const Elf64_Ehdr *ehdr)
-{
- return ehdr->e_ident[EI_CLASS] == ELFCLASS32;
-}
-
-
-/* Return the run-time load address of the shared object, assuming it
- was originally linked at zero. */
-static inline Elf64_Addr
-elf_machine_load_address (void) __attribute__ ((const));
-
-static inline Elf64_Addr
-elf_machine_load_address (void)
-{
- Elf64_Addr ret;
-
- /* The first entry in .got (and thus the first entry in .toc) is the
- link-time TOC_base, ie. r2. So the difference between that and
- the current r2 set by the kernel is how far the shared lib has
- moved. */
- asm ( " ld %0,-32768(2)\n"
- " subf %0,%0,2\n"
- : "=r" (ret));
- return ret;
-}
-
-/* Return the link-time address of _DYNAMIC. */
-static inline Elf64_Addr
-elf_machine_dynamic (void)
-{
- Elf64_Addr runtime_dynamic;
- /* It's easier to get the run-time address. */
- asm ( " addis %0,2,_DYNAMIC@toc@ha\n"
- " addi %0,%0,_DYNAMIC@toc@l\n"
- : "=b" (runtime_dynamic));
- /* Then subtract off the load address offset. */
- return runtime_dynamic - elf_machine_load_address() ;
-}
-
-#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
-
-/* The PLT uses Elf64_Rela relocs. */
-#define elf_machine_relplt elf_machine_rela
-
-
-#ifdef HAVE_INLINED_SYSCALLS
-/* We do not need _dl_starting_up. */
-# define DL_STARTING_UP_DEF
-#else
-# define DL_STARTING_UP_DEF \
-".LC__dl_starting_up:\n" \
-" .tc __GI__dl_starting_up[TC],__GI__dl_starting_up\n"
-#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 (".pushsection \".text\"\n" \
-" .align 2\n" \
-" " ENTRY_2(_start) "\n" \
-BODY_PREFIX "_start:\n" \
-" " LOCALENTRY(_start) "\n" \
-/* We start with the following on the stack, from top: \
- argc (4 bytes); \
- arguments for program (terminated by NULL); \
- environment variables (terminated by NULL); \
- arguments for the program loader. */ \
-" mr 3,1\n" \
-" li 4,0\n" \
-" stdu 4,-128(1)\n" \
-/* Call _dl_start with one parameter pointing at argc. */ \
-" bl " DOT_PREFIX "_dl_start\n" \
-" nop\n" \
-/* Transfer control to _dl_start_user! */ \
-" b " DOT_PREFIX "_dl_start_user\n" \
-".LT__start:\n" \
-" .long 0\n" \
-" .byte 0x00,0x0c,0x24,0x40,0x00,0x00,0x00,0x00\n" \
-" .long .LT__start-" BODY_PREFIX "_start\n" \
-" .short .LT__start_name_end-.LT__start_name_start\n" \
-".LT__start_name_start:\n" \
-" .ascii \"_start\"\n" \
-".LT__start_name_end:\n" \
-" .align 2\n" \
-" " END_2(_start) "\n" \
-" .pushsection \".toc\",\"aw\"\n" \
-DL_STARTING_UP_DEF \
-".LC__rtld_local:\n" \
-" .tc _rtld_local[TC],_rtld_local\n" \
-".LC__dl_argc:\n" \
-" .tc _dl_argc[TC],_dl_argc\n" \
-".LC__dl_argv:\n" \
-" .tc __GI__dl_argv[TC],__GI__dl_argv\n" \
-".LC__dl_fini:\n" \
-" .tc _dl_fini[TC],_dl_fini\n" \
-" .popsection\n" \
-" " ENTRY_2(_dl_start_user) "\n" \
-/* Now, we do our main work of calling initialisation procedures. \
- The ELF ABI doesn't say anything about parameters for these, \
- so we just pass argc, argv, and the environment. \
- Changing these is strongly discouraged (not least because argc is \
- passed by value!). */ \
-BODY_PREFIX "_dl_start_user:\n" \
-" " LOCALENTRY(_dl_start_user) "\n" \
-/* the address of _start in r30. */ \
-" mr 30,3\n" \
-/* &_dl_argc in 29, &_dl_argv in 27, and _dl_loaded in 28. */ \
-" ld 28,.LC__rtld_local@toc(2)\n" \
-" ld 29,.LC__dl_argc@toc(2)\n" \
-" ld 27,.LC__dl_argv@toc(2)\n" \
-/* _dl_init (_dl_loaded, _dl_argc, _dl_argv, _dl_argv+_dl_argc+1). */ \
-" ld 3,0(28)\n" \
-" lwa 4,0(29)\n" \
-" ld 5,0(27)\n" \
-" sldi 6,4,3\n" \
-" add 6,5,6\n" \
-" addi 6,6,8\n" \
-" bl " DOT_PREFIX "_dl_init\n" \
-" nop\n" \
-/* Now, to conform to the ELF ABI, we have to: \
- Pass argc (actually _dl_argc) in r3; */ \
-" lwa 3,0(29)\n" \
-/* Pass argv (actually _dl_argv) in r4; */ \
-" ld 4,0(27)\n" \
-/* Pass argv+argc+1 in r5; */ \
-" sldi 5,3,3\n" \
-" add 6,4,5\n" \
-" addi 5,6,8\n" \
-/* Pass the auxiliary vector in r6. This is passed to us just after \
- _envp. */ \
-"2: ldu 0,8(6)\n" \
-" cmpdi 0,0\n" \
-" bne 2b\n" \
-" addi 6,6,8\n" \
-/* Pass a termination function pointer (in this case _dl_fini) in \
- r7. */ \
-" ld 7,.LC__dl_fini@toc(2)\n" \
-/* Pass the stack pointer in r1 (so far so good), pointing to a NULL \
- value. This lets our startup code distinguish between a program \
- linked statically, which linux will call with argc on top of the \
- stack which will hopefully never be zero, and a dynamically linked \
- program which will always have a NULL on the top of the stack. \
- Take the opportunity to clear LR, so anyone who accidentally \
- returns from _start gets SEGV. Also clear the next few words of \
- the stack. */ \
-" li 31,0\n" \
-" std 31,0(1)\n" \
-" mtlr 31\n" \
-" std 31,8(1)\n" \
-" std 31,16(1)\n" \
-" std 31,24(1)\n" \
-/* Now, call the start function descriptor at r30... */ \
-" .globl ._dl_main_dispatch\n" \
-"._dl_main_dispatch:\n" \
-" " PPC64_LOAD_FUNCPTR(30) "\n" \
-" bctr\n" \
-".LT__dl_start_user:\n" \
-" .long 0\n" \
-" .byte 0x00,0x0c,0x24,0x40,0x00,0x00,0x00,0x00\n" \
-" .long .LT__dl_start_user-" BODY_PREFIX "_dl_start_user\n" \
-" .short .LT__dl_start_user_name_end-.LT__dl_start_user_name_start\n" \
-".LT__dl_start_user_name_start:\n" \
-" .ascii \"_dl_start_user\"\n" \
-".LT__dl_start_user_name_end:\n" \
-" .align 2\n" \
-" " END_2(_dl_start_user) "\n" \
-" .popsection");
-
-/* ELF_RTYPE_CLASS_COPY iff TYPE should not be allowed to resolve to
- one of the main executable's symbols, as for a COPY reloc.
-
- To make function pointer comparisons work on most targets, the
- relevant ABI states that the address of a non-local function in a
- dynamically linked executable is the address of the PLT entry for
- that function. This is quite reasonable since using the real
- function address in a non-PIC executable would typically require
- dynamic relocations in .text, something to be avoided. For such
- functions, the linker emits a SHN_UNDEF symbol in the executable
- with value equal to the PLT entry address. Normally, SHN_UNDEF
- symbols have a value of zero, so this is a clue to ld.so that it
- should treat these symbols specially. For relocations not in
- ELF_RTYPE_CLASS_PLT (eg. those on function pointers), ld.so should
- use the value of the executable SHN_UNDEF symbol, ie. the PLT entry
- address. For relocations in ELF_RTYPE_CLASS_PLT (eg. the relocs in
- the PLT itself), ld.so should use the value of the corresponding
- defined symbol in the object that defines the function, ie. the
- real function address. This complicates ld.so in that there are
- now two possible values for a given symbol, and it gets even worse
- because protected symbols need yet another set of rules.
-
- On PowerPC64 we don't need any of this. The linker won't emit
- SHN_UNDEF symbols with non-zero values. ld.so can make all
- relocations behave "normally", ie. always use the real address
- like PLT relocations. So always set ELF_RTYPE_CLASS_PLT. */
-
-#if _CALL_ELF != 2
-#define elf_machine_type_class(type) \
- (ELF_RTYPE_CLASS_PLT | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY))
-#else
-/* And now that you have read that large comment, you can disregard it
- all for ELFv2. ELFv2 does need the special SHN_UNDEF treatment. */
-#define IS_PPC64_TLS_RELOC(R) \
- (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \
- || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA))
-
-#define elf_machine_type_class(type) \
- ((((type) == R_PPC64_JMP_SLOT \
- || (type) == R_PPC64_ADDR24 \
- || IS_PPC64_TLS_RELOC (type)) * ELF_RTYPE_CLASS_PLT) \
- | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY))
-#endif
-
-/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
-#define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT
-
-/* The PowerPC never uses REL relocations. */
-#define ELF_MACHINE_NO_REL 1
-#define ELF_MACHINE_NO_RELA 0
-
-/* We define an initialization function to initialize HWCAP/HWCAP2 and
- platform data so it can be copied into the TCB later. This is called
- very early in _dl_sysdep_start for dynamically linked binaries. */
-#ifdef SHARED
-# define DL_PLATFORM_INIT dl_platform_init ()
-
-static inline void __attribute__ ((unused))
-dl_platform_init (void)
-{
- __tcb_parse_hwcap_and_convert_at_platform ();
-}
-#endif
-
-/* Stuff for the PLT. */
-#if _CALL_ELF != 2
-#define PLT_INITIAL_ENTRY_WORDS 3
-#define PLT_ENTRY_WORDS 3
-#define GLINK_INITIAL_ENTRY_WORDS 8
-/* The first 32k entries of glink can set an index and branch using two
- instructions; past that point, glink uses three instructions. */
-#define GLINK_ENTRY_WORDS(I) (((I) < 0x8000)? 2 : 3)
-#else
-#define PLT_INITIAL_ENTRY_WORDS 2
-#define PLT_ENTRY_WORDS 1
-#define GLINK_INITIAL_ENTRY_WORDS 8
-#define GLINK_ENTRY_WORDS(I) 1
-#endif
-
-#define PPC_DCBST(where) asm volatile ("dcbst 0,%0" : : "r"(where) : "memory")
-#define PPC_DCBT(where) asm volatile ("dcbt 0,%0" : : "r"(where) : "memory")
-#define PPC_DCBF(where) asm volatile ("dcbf 0,%0" : : "r"(where) : "memory")
-#define PPC_SYNC asm volatile ("sync" : : : "memory")
-#define PPC_ISYNC asm volatile ("sync; isync" : : : "memory")
-#define PPC_ICBI(where) asm volatile ("icbi 0,%0" : : "r"(where) : "memory")
-#define PPC_DIE asm volatile ("tweq 0,0")
-/* Use this when you've modified some code, but it won't be in the
- instruction fetch queue (or when it doesn't matter if it is). */
-#define MODIFIED_CODE_NOQUEUE(where) \
- do { PPC_DCBST(where); PPC_SYNC; PPC_ICBI(where); } while (0)
-/* Use this when it might be in the instruction queue. */
-#define MODIFIED_CODE(where) \
- do { PPC_DCBST(where); PPC_SYNC; PPC_ICBI(where); PPC_ISYNC; } while (0)
-
-/* Set up the loaded object described by MAP so its unrelocated PLT
- entries will jump to the on-demand fixup code in dl-runtime.c. */
-static inline int __attribute__ ((always_inline))
-elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
-{
- if (map->l_info[DT_JMPREL])
- {
- Elf64_Word i;
- Elf64_Word *glink = NULL;
- Elf64_Xword *plt = (Elf64_Xword *) D_PTR (map, l_info[DT_PLTGOT]);
- Elf64_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
- / sizeof (Elf64_Rela));
- Elf64_Addr l_addr = map->l_addr;
- Elf64_Dyn **info = map->l_info;
- char *p;
-
- extern void _dl_runtime_resolve (void);
- extern void _dl_profile_resolve (void);
-
- /* Relocate the DT_PPC64_GLINK entry in the _DYNAMIC section.
- elf_get_dynamic_info takes care of the standard entries but
- doesn't know exactly what to do with processor specific
- entries. */
- if (info[DT_PPC64(GLINK)] != NULL)
- info[DT_PPC64(GLINK)]->d_un.d_ptr += l_addr;
-
- if (lazy)
- {
- Elf64_Word glink_offset;
- Elf64_Word offset;
- Elf64_Addr dlrr;
-
- dlrr = (Elf64_Addr) (profile ? _dl_profile_resolve
- : _dl_runtime_resolve);
- if (profile && GLRO(dl_profile) != NULL
- && _dl_name_match_p (GLRO(dl_profile), map))
- /* This is the object we are looking for. Say that we really
- want profiling and the timers are started. */
- GL(dl_profile_map) = map;
-
-#if _CALL_ELF != 2
- /* We need to stuff the address/TOC of _dl_runtime_resolve
- into doublewords 0 and 1 of plt_reserve. Then we need to
- stuff the map address into doubleword 2 of plt_reserve.
- This allows the GLINK0 code to transfer control to the
- correct trampoline which will transfer control to fixup
- in dl-machine.c. */
- {
- /* The plt_reserve area is the 1st 3 doublewords of the PLT. */
- Elf64_FuncDesc *plt_reserve = (Elf64_FuncDesc *) plt;
- Elf64_FuncDesc *resolve_fd = (Elf64_FuncDesc *) dlrr;
- plt_reserve->fd_func = resolve_fd->fd_func;
- plt_reserve->fd_toc = resolve_fd->fd_toc;
- plt_reserve->fd_aux = (Elf64_Addr) map;
-#ifdef RTLD_BOOTSTRAP
- /* When we're bootstrapping, the opd entry will not have
- been relocated yet. */
- plt_reserve->fd_func += l_addr;
- plt_reserve->fd_toc += l_addr;
-#endif
- }
-#else
- /* When we don't have function descriptors, the first doubleword
- of the PLT holds the address of _dl_runtime_resolve, and the
- second doubleword holds the map address. */
- plt[0] = dlrr;
- plt[1] = (Elf64_Addr) map;
-#endif
-
- /* Set up the lazy PLT entries. */
- glink = (Elf64_Word *) D_PTR (map, l_info[DT_PPC64(GLINK)]);
- offset = PLT_INITIAL_ENTRY_WORDS;
- glink_offset = GLINK_INITIAL_ENTRY_WORDS;
- for (i = 0; i < num_plt_entries; i++)
- {
-
- plt[offset] = (Elf64_Xword) &glink[glink_offset];
- offset += PLT_ENTRY_WORDS;
- glink_offset += GLINK_ENTRY_WORDS (i);
- }
-
- /* Now, we've modified data. We need to write the changes from
- the data cache to a second-level unified cache, then make
- sure that stale data in the instruction cache is removed.
- (In a multiprocessor system, the effect is more complex.)
- Most of the PLT shouldn't be in the instruction cache, but
- there may be a little overlap at the start and the end.
-
- Assumes that dcbst and icbi apply to lines of 16 bytes or
- more. Current known line sizes are 16, 32, and 128 bytes. */
-
- for (p = (char *) plt; p < (char *) &plt[offset]; p += 16)
- PPC_DCBST (p);
- PPC_SYNC;
- }
- }
- return lazy;
-}
-
-#if _CALL_ELF == 2
-/* If the PLT entry whose reloc is 'reloc' resolves to a function in
- the same object, return the target function's local entry point
- offset if usable. */
-static inline Elf64_Addr __attribute__ ((always_inline))
-ppc64_local_entry_offset (struct link_map *map, lookup_t sym_map,
- const Elf64_Rela *reloc)
-{
- const Elf64_Sym *symtab;
- const Elf64_Sym *sym;
-
- /* If the target function is in a different object, we cannot
- use the local entry point. */
- if (sym_map != map)
- return 0;
-
- /* If the linker inserted multiple TOCs, we cannot use the
- local entry point. */
- if (map->l_info[DT_PPC64(OPT)]
- && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_MULTI_TOC))
- return 0;
-
- /* Otherwise, we can use the local entry point. Retrieve its offset
- from the symbol's ELF st_other field. */
- symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
- sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
-
- /* If the target function is an ifunc then the local entry offset is
- for the resolver, not the final destination. */
- if (__builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0))
- return 0;
-
- return PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
-}
-#endif
-
-/* Change the PLT entry whose reloc is 'reloc' to call the actual
- routine. */
-static inline Elf64_Addr __attribute__ ((always_inline))
-elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map,
- const Elf64_Rela *reloc,
- Elf64_Addr *reloc_addr, Elf64_Addr finaladdr)
-{
-#if _CALL_ELF != 2
- Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr;
- Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr;
- Elf64_Addr offset = 0;
- Elf64_FuncDesc zero_fd = {0, 0, 0};
-
- PPC_DCBT (&plt->fd_aux);
- PPC_DCBT (&plt->fd_func);
-
- /* If sym_map is NULL, it's a weak undefined sym; Set the plt to
- zero. finaladdr should be zero already in this case, but guard
- against invalid plt relocations with non-zero addends. */
- if (sym_map == NULL)
- finaladdr = 0;
-
- /* Don't die here if finaladdr is zero, die if this plt entry is
- actually called. Makes a difference when LD_BIND_NOW=1.
- finaladdr may be zero for a weak undefined symbol, or when an
- ifunc resolver returns zero. */
- if (finaladdr == 0)
- rel = &zero_fd;
- else
- {
- PPC_DCBT (&rel->fd_aux);
- PPC_DCBT (&rel->fd_func);
- }
-
- /* If the opd entry is not yet relocated (because it's from a shared
- object that hasn't been processed yet), then manually reloc it. */
- if (finaladdr != 0 && map != sym_map && !sym_map->l_relocated
-#if !defined RTLD_BOOTSTRAP && defined SHARED
- /* Bootstrap map doesn't have l_relocated set for it. */
- && sym_map != &GL(dl_rtld_map)
-#endif
- )
- offset = sym_map->l_addr;
-
- /* For PPC64, fixup_plt copies the function descriptor from opd
- over the corresponding PLT entry.
- Initially, PLT Entry[i] is set up for lazy linking, or is zero.
- For lazy linking, the fd_toc and fd_aux entries are irrelevant,
- so for thread safety we write them before changing fd_func. */
-
- plt->fd_aux = rel->fd_aux + offset;
- plt->fd_toc = rel->fd_toc + offset;
- PPC_DCBF (&plt->fd_toc);
- PPC_ISYNC;
-
- plt->fd_func = rel->fd_func + offset;
- PPC_DCBST (&plt->fd_func);
- PPC_ISYNC;
-#else
- finaladdr += ppc64_local_entry_offset (map, sym_map, reloc);
- *reloc_addr = finaladdr;
-#endif
-
- return finaladdr;
-}
-
-static inline void __attribute__ ((always_inline))
-elf_machine_plt_conflict (struct link_map *map, lookup_t sym_map,
- const Elf64_Rela *reloc,
- Elf64_Addr *reloc_addr, Elf64_Addr finaladdr)
-{
-#if _CALL_ELF != 2
- Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr;
- Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr;
- Elf64_FuncDesc zero_fd = {0, 0, 0};
-
- if (sym_map == NULL)
- finaladdr = 0;
-
- if (finaladdr == 0)
- rel = &zero_fd;
-
- plt->fd_func = rel->fd_func;
- plt->fd_aux = rel->fd_aux;
- plt->fd_toc = rel->fd_toc;
- PPC_DCBST (&plt->fd_func);
- PPC_DCBST (&plt->fd_aux);
- PPC_DCBST (&plt->fd_toc);
- PPC_SYNC;
-#else
- finaladdr += ppc64_local_entry_offset (map, sym_map, reloc);
- *reloc_addr = finaladdr;
-#endif
-}
-
-/* Return the final value of a plt relocation. */
-static inline Elf64_Addr
-elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
- Elf64_Addr value)
-{
- return value + reloc->r_addend;
-}
-
-
-/* Names of the architecture-specific auditing callback functions. */
-#if _CALL_ELF != 2
-#define ARCH_LA_PLTENTER ppc64_gnu_pltenter
-#define ARCH_LA_PLTEXIT ppc64_gnu_pltexit
-#else
-#define ARCH_LA_PLTENTER ppc64v2_gnu_pltenter
-#define ARCH_LA_PLTEXIT ppc64v2_gnu_pltexit
-#endif
-
-#endif /* dl_machine_h */
-
-#ifdef RESOLVE_MAP
-
-#define PPC_LO(v) ((v) & 0xffff)
-#define PPC_HI(v) (((v) >> 16) & 0xffff)
-#define PPC_HA(v) PPC_HI ((v) + 0x8000)
-#define PPC_HIGHER(v) (((v) >> 32) & 0xffff)
-#define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
-#define PPC_HIGHEST(v) (((v) >> 48) & 0xffff)
-#define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
-#define BIT_INSERT(var, val, mask) \
- ((var) = ((var) & ~(Elf64_Addr) (mask)) | ((val) & (mask)))
-
-#define dont_expect(X) __builtin_expect ((X), 0)
-
-extern void _dl_reloc_overflow (struct link_map *map,
- const char *name,
- Elf64_Addr *const reloc_addr,
- const Elf64_Sym *refsym)
- attribute_hidden;
-
-auto inline void __attribute__ ((always_inline))
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
- void *const reloc_addr_arg)
-{
- Elf64_Addr *const reloc_addr = reloc_addr_arg;
- *reloc_addr = l_addr + reloc->r_addend;
-}
-
-/* This computes the value used by TPREL* relocs. */
-auto inline Elf64_Addr __attribute__ ((always_inline, const))
-elf_machine_tprel (struct link_map *map,
- struct link_map *sym_map,
- const Elf64_Sym *sym,
- const Elf64_Rela *reloc)
-{
-#ifndef RTLD_BOOTSTRAP
- if (sym_map)
- {
- CHECK_STATIC_TLS (map, sym_map);
-#endif
- return TLS_TPREL_VALUE (sym_map, sym, reloc);
-#ifndef RTLD_BOOTSTRAP
- }
-#endif
- return 0;
-}
-
-/* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */
-auto inline Elf64_Addr __attribute__ ((always_inline))
-resolve_ifunc (Elf64_Addr value,
- const struct link_map *map, const struct link_map *sym_map)
-{
-#if _CALL_ELF != 2
-#ifndef RESOLVE_CONFLICT_FIND_MAP
- /* The function we are calling may not yet have its opd entry relocated. */
- Elf64_FuncDesc opd;
- if (map != sym_map
-# if !defined RTLD_BOOTSTRAP && defined SHARED
- /* Bootstrap map doesn't have l_relocated set for it. */
- && sym_map != &GL(dl_rtld_map)
-# endif
- && !sym_map->l_relocated)
- {
- Elf64_FuncDesc *func = (Elf64_FuncDesc *) value;
- opd.fd_func = func->fd_func + sym_map->l_addr;
- opd.fd_toc = func->fd_toc + sym_map->l_addr;
- opd.fd_aux = func->fd_aux;
- /* GCC 4.9+ eliminates the branch as dead code, force the odp set
- dependency. */
- asm ("" : "=r" (value) : "0" (&opd), "X" (opd));
- }
-#endif
-#endif
- return ((Elf64_Addr (*) (unsigned long int)) value) (GLRO(dl_hwcap));
-}
-
-/* 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 Elf64_Rela *reloc,
- const Elf64_Sym *sym,
- const struct r_found_version *version,
- void *const reloc_addr_arg,
- int skip_ifunc)
-{
- Elf64_Addr *const reloc_addr = reloc_addr_arg;
- const int r_type = ELF64_R_TYPE (reloc->r_info);
- const Elf64_Sym *const refsym = sym;
- union unaligned
- {
- uint16_t u2;
- uint32_t u4;
- uint64_t u8;
- } __attribute__ ((__packed__));
-
- if (r_type == R_PPC64_RELATIVE)
- {
- *reloc_addr = map->l_addr + reloc->r_addend;
- return;
- }
-
- if (__glibc_unlikely (r_type == R_PPC64_NONE))
- return;
-
- /* We need SYM_MAP even in the absence of TLS, for elf_machine_fixup_plt
- and STT_GNU_IFUNC. */
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
- Elf64_Addr value = ((sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value)
- + reloc->r_addend);
-
- 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 = resolve_ifunc (value, map, sym_map);
-
- /* For relocs that don't edit code, return.
- For relocs that might edit instructions, break from the switch. */
- switch (r_type)
- {
- case R_PPC64_ADDR64:
- case R_PPC64_GLOB_DAT:
- *reloc_addr = value;
- return;
-
- case R_PPC64_IRELATIVE:
- if (__glibc_likely (!skip_ifunc))
- value = resolve_ifunc (value, map, sym_map);
- *reloc_addr = value;
- return;
-
- case R_PPC64_JMP_IREL:
- if (__glibc_likely (!skip_ifunc))
- value = resolve_ifunc (value, map, sym_map);
- /* Fall thru */
- case R_PPC64_JMP_SLOT:
-#ifdef RESOLVE_CONFLICT_FIND_MAP
- elf_machine_plt_conflict (map, sym_map, reloc, reloc_addr, value);
-#else
- elf_machine_fixup_plt (map, sym_map, reloc, reloc_addr, value);
-#endif
- return;
-
- case R_PPC64_DTPMOD64:
- if (map->l_info[DT_PPC64(OPT)]
- && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_TLS))
- {
-#ifdef RTLD_BOOTSTRAP
- reloc_addr[0] = 0;
- reloc_addr[1] = (sym_map->l_tls_offset - TLS_TP_OFFSET
- + TLS_DTV_OFFSET);
- return;
-#else
- if (sym_map != NULL)
- {
-# ifndef SHARED
- CHECK_STATIC_TLS (map, sym_map);
-# else
- if (TRY_STATIC_TLS (map, sym_map))
-# endif
- {
- reloc_addr[0] = 0;
- /* Set up for local dynamic. */
- reloc_addr[1] = (sym_map->l_tls_offset - TLS_TP_OFFSET
- + TLS_DTV_OFFSET);
- return;
- }
- }
-#endif
- }
-#ifdef RTLD_BOOTSTRAP
- /* During startup the dynamic linker is always index 1. */
- *reloc_addr = 1;
-#else
- /* Get the information from the link map returned by the
- resolve function. */
- if (sym_map != NULL)
- *reloc_addr = sym_map->l_tls_modid;
-#endif
- return;
-
- case R_PPC64_DTPREL64:
- if (map->l_info[DT_PPC64(OPT)]
- && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_TLS))
- {
-#ifdef RTLD_BOOTSTRAP
- *reloc_addr = TLS_TPREL_VALUE (sym_map, sym, reloc);
- return;
-#else
- if (sym_map != NULL)
- {
- /* This reloc is always preceded by R_PPC64_DTPMOD64. */
-# ifndef SHARED
- assert (HAVE_STATIC_TLS (map, sym_map));
-# else
- if (HAVE_STATIC_TLS (map, sym_map))
-# endif
- {
- *reloc_addr = TLS_TPREL_VALUE (sym_map, sym, reloc);
- return;
- }
- }
-#endif
- }
- /* During relocation all TLS symbols are defined and used.
- Therefore the offset is already correct. */
-#ifndef RTLD_BOOTSTRAP
- if (sym_map != NULL)
- *reloc_addr = TLS_DTPREL_VALUE (sym, reloc);
-#endif
- return;
-
- case R_PPC64_TPREL64:
- *reloc_addr = elf_machine_tprel (map, sym_map, sym, reloc);
- return;
-
- case R_PPC64_TPREL16_LO_DS:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- if (dont_expect ((value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
- break;
-
- case R_PPC64_TPREL16_DS:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
- break;
-
- case R_PPC64_TPREL16:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- if (dont_expect ((value + 0x8000) >= 0x10000))
- _dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, refsym);
- *(Elf64_Half *) reloc_addr = PPC_LO (value);
- break;
-
- case R_PPC64_TPREL16_LO:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_LO (value);
- break;
-
- case R_PPC64_TPREL16_HI:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- if (dont_expect (value + 0x80000000 >= 0x100000000LL))
- _dl_reloc_overflow (map, "R_PPC64_TPREL16_HI", reloc_addr, refsym);
- *(Elf64_Half *) reloc_addr = PPC_HI (value);
- break;
-
- case R_PPC64_TPREL16_HIGH:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HI (value);
- break;
-
- case R_PPC64_TPREL16_HA:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- if (dont_expect (value + 0x80008000 >= 0x100000000LL))
- _dl_reloc_overflow (map, "R_PPC64_TPREL16_HA", reloc_addr, refsym);
- *(Elf64_Half *) reloc_addr = PPC_HA (value);
- break;
-
- case R_PPC64_TPREL16_HIGHA:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HA (value);
- break;
-
- case R_PPC64_TPREL16_HIGHER:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HIGHER (value);
- break;
-
- case R_PPC64_TPREL16_HIGHEST:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HIGHEST (value);
- break;
-
- case R_PPC64_TPREL16_HIGHERA:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HIGHERA (value);
- break;
-
- case R_PPC64_TPREL16_HIGHESTA:
- value = elf_machine_tprel (map, sym_map, sym, reloc);
- *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value);
- break;
-
-#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */
- case R_PPC64_ADDR16_LO_DS:
- if (dont_expect ((value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
- break;
-
- case R_PPC64_ADDR16_LO:
- *(Elf64_Half *) reloc_addr = PPC_LO (value);
- break;
-
- case R_PPC64_ADDR16_HI:
- if (dont_expect (value + 0x80000000 >= 0x100000000LL))
- _dl_reloc_overflow (map, "R_PPC64_ADDR16_HI", reloc_addr, refsym);
- case R_PPC64_ADDR16_HIGH:
- *(Elf64_Half *) reloc_addr = PPC_HI (value);
- break;
-
- case R_PPC64_ADDR16_HA:
- if (dont_expect (value + 0x80008000 >= 0x100000000LL))
- _dl_reloc_overflow (map, "R_PPC64_ADDR16_HA", reloc_addr, refsym);
- case R_PPC64_ADDR16_HIGHA:
- *(Elf64_Half *) reloc_addr = PPC_HA (value);
- break;
-
- case R_PPC64_ADDR30:
- {
- Elf64_Addr delta = value - (Elf64_Xword) reloc_addr;
- if (dont_expect ((delta + 0x80000000) >= 0x100000000LL
- || (delta & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc);
- }
- break;
-
- case R_PPC64_COPY:
- if (dont_expect (sym == NULL))
- /* This can happen in trace mode when an object could not be found. */
- return;
- if (dont_expect (sym->st_size > refsym->st_size
- || (GLRO(dl_verbose)
- && sym->st_size < refsym->st_size)))
- {
- const char *strtab;
-
- strtab = (const void *) 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, (char *) value,
- MIN (sym->st_size, refsym->st_size));
- return;
-
- case R_PPC64_UADDR64:
- ((union unaligned *) reloc_addr)->u8 = value;
- return;
-
- case R_PPC64_UADDR32:
- ((union unaligned *) reloc_addr)->u4 = value;
- return;
-
- case R_PPC64_ADDR32:
- if (dont_expect ((value + 0x80000000) >= 0x100000000LL))
- _dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym);
- *(Elf64_Word *) reloc_addr = value;
- return;
-
- case R_PPC64_ADDR24:
- if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc);
- break;
-
- case R_PPC64_ADDR16:
- if (dont_expect ((value + 0x8000) >= 0x10000))
- _dl_reloc_overflow (map, "R_PPC64_ADDR16", reloc_addr, refsym);
- *(Elf64_Half *) reloc_addr = value;
- break;
-
- case R_PPC64_UADDR16:
- if (dont_expect ((value + 0x8000) >= 0x10000))
- _dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym);
- ((union unaligned *) reloc_addr)->u2 = value;
- return;
-
- case R_PPC64_ADDR16_DS:
- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, refsym);
- BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
- break;
-
- case R_PPC64_ADDR16_HIGHER:
- *(Elf64_Half *) reloc_addr = PPC_HIGHER (value);
- break;
-
- case R_PPC64_ADDR16_HIGHEST:
- *(Elf64_Half *) reloc_addr = PPC_HIGHEST (value);
- break;
-
- case R_PPC64_ADDR16_HIGHERA:
- *(Elf64_Half *) reloc_addr = PPC_HIGHERA (value);
- break;
-
- case R_PPC64_ADDR16_HIGHESTA:
- *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value);
- break;
-
- case R_PPC64_ADDR14:
- case R_PPC64_ADDR14_BRTAKEN:
- case R_PPC64_ADDR14_BRNTAKEN:
- {
- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
- _dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, refsym);
- Elf64_Word insn = *(Elf64_Word *) reloc_addr;
- BIT_INSERT (insn, value, 0xfffc);
- if (r_type != R_PPC64_ADDR14)
- {
- insn &= ~(1 << 21);
- if (r_type == R_PPC64_ADDR14_BRTAKEN)
- insn |= 1 << 21;
- if ((insn & (0x14 << 21)) == (0x04 << 21))
- insn |= 0x02 << 21;
- else if ((insn & (0x14 << 21)) == (0x10 << 21))
- insn |= 0x08 << 21;
- }
- *(Elf64_Word *) reloc_addr = insn;
- }
- break;
-
- case R_PPC64_REL32:
- *(Elf64_Word *) reloc_addr = value - (Elf64_Addr) reloc_addr;
- return;
-
- case R_PPC64_REL64:
- *reloc_addr = value - (Elf64_Addr) reloc_addr;
- return;
-#endif /* !RTLD_BOOTSTRAP */
-
- default:
- _dl_reloc_bad_type (map, r_type, 0);
- return;
- }
- MODIFIED_CODE_NOQUEUE (reloc_addr);
-}
-
-auto inline void __attribute__ ((always_inline))
-elf_machine_lazy_rel (struct link_map *map,
- Elf64_Addr l_addr, const Elf64_Rela *reloc,
- int skip_ifunc)
-{
- /* elf_machine_runtime_setup handles this. */
-}
-
-
-#endif /* RESOLVE */
diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S
deleted file mode 100644
index 5ec729d1f4..0000000000
--- a/sysdeps/powerpc/powerpc64/dl-trampoline.S
+++ /dev/null
@@ -1,500 +0,0 @@
-/* PLT trampolines. PPC64 version.
- Copyright (C) 2005-2017 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 <sysdep.h>
-#include <rtld-global-offsets.h>
-
-
- .section ".text"
-/* On entry r0 contains the index of the PLT entry we need to fixup
- and r11 contains the link_map (from PLT0+16). The link_map becomes
- parm1 (r3) and the index (r0) need to be converted to an offset
- (index * 24) in parm2 (r4). */
-
-#define FRAME_SIZE (FRAME_MIN_SIZE+64)
-/* We need to save the registers used to pass parameters, ie. r3 thru
- r10; Use local var space rather than the parameter save area,
- because gcc as of 2010/05 doesn't allocate a proper stack frame for
- a function that makes no calls except for __tls_get_addr and we
- might be here resolving the __tls_get_addr call. */
-#define INT_PARMS FRAME_MIN_SIZE
-EALIGN(_dl_runtime_resolve, 4, 0)
- stdu r1,-FRAME_SIZE(r1)
- cfi_adjust_cfa_offset (FRAME_SIZE)
- std r3,INT_PARMS+0(r1)
- mr r3,r11
- std r4,INT_PARMS+8(r1)
- sldi r4,r0,1
- std r5,INT_PARMS+16(r1)
- add r4,r4,r0
- std r6,INT_PARMS+24(r1)
- sldi r4,r4,3
- std r7,INT_PARMS+32(r1)
- mflr r0
- std r8,INT_PARMS+40(r1)
-/* Store the LR in the LR Save area. */
- std r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
- cfi_offset (lr, FRAME_LR_SAVE)
- std r9,INT_PARMS+48(r1)
- std r10,INT_PARMS+56(r1)
- bl JUMPTARGET(_dl_fixup)
-#ifndef SHARED
- nop
-#endif
-/* Put the registers back. */
- ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
- ld r10,INT_PARMS+56(r1)
- ld r9,INT_PARMS+48(r1)
- ld r8,INT_PARMS+40(r1)
- ld r7,INT_PARMS+32(r1)
- mtlr r0
- ld r6,INT_PARMS+24(r1)
- ld r5,INT_PARMS+16(r1)
- ld r4,INT_PARMS+8(r1)
-/* Prepare for calling the function returned by fixup. */
- PPC64_LOAD_FUNCPTR r3
- ld r3,INT_PARMS+0(r1)
-#if _CALL_ELF == 2
-/* Restore the caller's TOC in case we jump to a local entry point. */
- ld r2,FRAME_SIZE+FRAME_TOC_SAVE(r1)
-#endif
-/* Unwind the stack frame, and jump. */
- addi r1,r1,FRAME_SIZE
- bctr
-END(_dl_runtime_resolve)
-#undef FRAME_SIZE
-#undef INT_PARMS
-
- /* Stack layout: ELFv2 ABI.
- +752 previous backchain
- +744 spill_r31
- +736 spill_r30
- +720 v8
- +704 v7
- +688 v6
- +672 v5
- +656 v4
- +640 v3
- +624 v2
- +608 v1
- +600 fp10
- ELFv1 ABI +592 fp9
- +592 previous backchain +584 fp8
- +584 spill_r31 +576 fp7
- +576 spill_r30 +568 fp6
- +560 v1 +560 fp5
- +552 fp4 +552 fp4
- +544 fp3 +544 fp3
- +536 fp2 +536 fp2
- +528 fp1 +528 fp1
- +520 r4 +520 r4
- +512 r3 +512 r3
- return values
- +504 free
- +496 stackframe
- +488 lr
- +480 r1
- +464 v13
- +448 v12
- +432 v11
- +416 v10
- +400 v9
- +384 v8
- +368 v7
- +352 v6
- +336 v5
- +320 v4
- +304 v3
- +288 v2
- * VMX Parms in V2-V13, V0-V1 are scratch
- +284 vrsave
- +280 free
- +272 fp13
- +264 fp12
- +256 fp11
- +248 fp10
- +240 fp9
- +232 fp8
- +224 fp7
- +216 fp6
- +208 fp5
- +200 fp4
- +192 fp3
- +184 fp2
- +176 fp1
- * FP Parms in FP1-FP13, FP0 is a scratch register
- +168 r10
- +160 r9
- +152 r8
- +144 r7
- +136 r6
- +128 r5
- +120 r4
- +112 r3
- * Integer parms in R3-R10, R0 is scratch, R1 SP, R2 is TOC
- +104 parm8
- +96 parm7
- +88 parm6
- +80 parm5
- +72 parm4
- +64 parm3
- +56 parm2
- +48 parm1
- * Parameter save area
- * (v1 ABI: Allocated by the call, at least 8 double words)
- +40 v1 ABI: TOC save area
- +32 v1 ABI: Reserved for linker
- +24 v1 ABI: Reserved for compiler / v2 ABI: TOC save area
- +16 LR save area
- +8 CR save area
- r1+0 stack back chain
- */
-#if _CALL_ELF == 2
-# define FRAME_SIZE 752
-# define VR_RTN 608
-#else
-# define FRAME_SIZE 592
-# define VR_RTN 560
-#endif
-#define INT_RTN 512
-#define FPR_RTN 528
-#define STACK_FRAME 496
-#define CALLING_LR 488
-#define CALLING_SP 480
-#define INT_PARMS 112
-#define FPR_PARMS 176
-#define VR_PARMS 288
-#define VR_VRSAVE 284
- .section ".toc","aw"
-.LC__dl_hwcap:
-# ifdef SHARED
- .tc _rtld_local_ro[TC],_rtld_local_ro
-# else
- .tc _dl_hwcap[TC],_dl_hwcap
-# endif
- .section ".text"
-
- .machine "altivec"
-/* On entry r0 contains the index of the PLT entry we need to fixup
- and r11 contains the link_map (from PLT0+16). The link_map becomes
- parm1 (r3) and the index (r0) needs to be converted to an offset
- (index * 24) in parm2 (r4). */
-#ifndef PROF
-EALIGN(_dl_profile_resolve, 4, 0)
-/* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we
- need to call _dl_call_pltexit. */
- std r31,-8(r1)
- std r30,-16(r1)
-/* We need to save the registers used to pass parameters, ie. r3 thru
- r10; the registers are saved in a stack frame. */
- stdu r1,-FRAME_SIZE(r1)
- cfi_adjust_cfa_offset (FRAME_SIZE)
- cfi_offset(r31,-8)
- cfi_offset(r30,-16)
- std r3,INT_PARMS+0(r1)
- mr r3,r11
- std r4,INT_PARMS+8(r1)
- sldi r4,r0,1 /* index * 2 */
- std r5,INT_PARMS+16(r1)
- add r4,r4,r0 /* index * 3 */
- std r6,INT_PARMS+24(r1)
- sldi r4,r4,3 /* index * 24 == PLT offset */
- mflr r5
- std r7,INT_PARMS+32(r1)
- std r8,INT_PARMS+40(r1)
-/* Store the LR in the LR Save area. */
- la r8,FRAME_SIZE(r1)
- std r5,FRAME_SIZE+FRAME_LR_SAVE(r1)
- cfi_offset (lr, FRAME_LR_SAVE)
- std r5,CALLING_LR(r1)
- std r9,INT_PARMS+48(r1)
- std r10,INT_PARMS+56(r1)
- std r8,CALLING_SP(r1)
- ld r12,.LC__dl_hwcap@toc(r2)
-#ifdef SHARED
- /* Load _rtld_local_ro._dl_hwcap. */
- ld r12,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r12)
-#else
- ld r12,0(r12) /* Load extern _dl_hwcap. */
-#endif
- andis. r0,r12,(PPC_FEATURE_HAS_ALTIVEC >> 16)
- beq L(saveFP)
- la r10,(VR_PARMS+0)(r1)
- la r9,(VR_PARMS+16)(r1)
- li r11,32
- li r12,64
- stvx v2,0,r10
- stvx v3,0,r9
-
- stvx v4,r11,r10
- stvx v5,r11,r9
- addi r11,r11,64
-
- stvx v6,r12,r10
- stvx v7,r12,r9
- addi r12,r12,64
-
- stvx v8,r11,r10
- stvx v9,r11,r9
- addi r11,r11,64
-
- stvx v10,r12,r10
- stvx v11,r12,r9
- mfspr r0,VRSAVE
-
- stvx v12,r11,r10
- stvx v13,r11,r9
-L(saveFP):
- stw r0,VR_VRSAVE(r1)
-/* Save floating registers. */
- stfd fp1,FPR_PARMS+0(r1)
- stfd fp2,FPR_PARMS+8(r1)
- stfd fp3,FPR_PARMS+16(r1)
- stfd fp4,FPR_PARMS+24(r1)
- stfd fp5,FPR_PARMS+32(r1)
- stfd fp6,FPR_PARMS+40(r1)
- stfd fp7,FPR_PARMS+48(r1)
- stfd fp8,FPR_PARMS+56(r1)
- stfd fp9,FPR_PARMS+64(r1)
- stfd fp10,FPR_PARMS+72(r1)
- stfd fp11,FPR_PARMS+80(r1)
- li r0,-1
- stfd fp12,FPR_PARMS+88(r1)
- stfd fp13,FPR_PARMS+96(r1)
-/* Load the extra parameters. */
- addi r6,r1,INT_PARMS
- addi r7,r1,STACK_FRAME
-/* Save link_map* and reloc_addr parms for later. */
- mr r31,r3
- mr r30,r4
- std r0,0(r7)
- bl JUMPTARGET(_dl_profile_fixup)
-#ifndef SHARED
- nop
-#endif
-/* Test *framesizep > 0 to see if need to do pltexit processing. */
- ld r0,STACK_FRAME(r1)
-/* Put the registers back. */
- lwz r12,VR_VRSAVE(r1)
- cmpdi cr1,r0,0
- cmpdi cr0,r12,0
- bgt cr1,L(do_pltexit)
- la r10,(VR_PARMS+0)(r1)
- la r9,(VR_PARMS+16)(r1)
-/* VRSAVE must be non-zero if VMX is present and VRs are in use. */
- beq L(restoreFXR)
- li r11,32
- li r12,64
- lvx v2,0,r10
- lvx v3,0,r9
-
- lvx v4,r11,r10
- lvx v5,r11,r9
- addi r11,r11,64
-
- lvx v6,r12,r10
- lvx v7,r12,r9
- addi r12,r12,64
-
- lvx v8,r11,r10
- lvx v9,r11,r9
- addi r11,r11,64
-
- lvx v10,r12,r10
- lvx v11,r12,r9
-
- lvx v12,r11,r10
- lvx v13,r11,r9
-L(restoreFXR):
- ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
- ld r10,INT_PARMS+56(r1)
- ld r9,INT_PARMS+48(r1)
- ld r8,INT_PARMS+40(r1)
- ld r7,INT_PARMS+32(r1)
- mtlr r0
- ld r6,INT_PARMS+24(r1)
- ld r5,INT_PARMS+16(r1)
- ld r4,INT_PARMS+8(r1)
-/* Prepare for calling the function returned by fixup. */
- PPC64_LOAD_FUNCPTR r3
- ld r3,INT_PARMS+0(r1)
-#if _CALL_ELF == 2
-/* Restore the caller's TOC in case we jump to a local entry point. */
- ld r2,FRAME_SIZE+FRAME_TOC_SAVE(r1)
-#endif
-/* Load the floating point registers. */
- lfd fp1,FPR_PARMS+0(r1)
- lfd fp2,FPR_PARMS+8(r1)
- lfd fp3,FPR_PARMS+16(r1)
- lfd fp4,FPR_PARMS+24(r1)
- lfd fp5,FPR_PARMS+32(r1)
- lfd fp6,FPR_PARMS+40(r1)
- lfd fp7,FPR_PARMS+48(r1)
- lfd fp8,FPR_PARMS+56(r1)
- lfd fp9,FPR_PARMS+64(r1)
- lfd fp10,FPR_PARMS+72(r1)
- lfd fp11,FPR_PARMS+80(r1)
- lfd fp12,FPR_PARMS+88(r1)
- lfd fp13,FPR_PARMS+96(r1)
-/* Unwind the stack frame, and jump. */
- ld r31,FRAME_SIZE-8(r1)
- ld r30,FRAME_SIZE-16(r1)
- addi r1,r1,FRAME_SIZE
- bctr
-
-L(do_pltexit):
- la r10,(VR_PARMS+0)(r1)
- la r9,(VR_PARMS+16)(r1)
- beq L(restoreFXR2)
- li r11,32
- li r12,64
- lvx v2,0,r10
- lvx v3,0,r9
-
- lvx v4,r11,r10
- lvx v5,r11,r9
- addi r11,r11,64
-
- lvx v6,r12,r10
- lvx v7,r12,r9
- addi r12,r12,64
-
- lvx v8,r11,r10
- lvx v9,r11,r9
- addi r11,r11,64
-
- lvx v10,r12,r10
- lvx v11,r12,r9
-
- lvx v12,r11,r10
- lvx v13,r11,r9
-L(restoreFXR2):
- ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
- ld r10,INT_PARMS+56(r1)
- ld r9,INT_PARMS+48(r1)
- ld r8,INT_PARMS+40(r1)
- ld r7,INT_PARMS+32(r1)
- mtlr r0
- ld r6,INT_PARMS+24(r1)
- ld r5,INT_PARMS+16(r1)
- ld r4,INT_PARMS+8(r1)
-/* Prepare for calling the function returned by fixup. */
- std r2,FRAME_TOC_SAVE(r1)
- PPC64_LOAD_FUNCPTR r3
- ld r3,INT_PARMS+0(r1)
-/* Load the floating point registers. */
- lfd fp1,FPR_PARMS+0(r1)
- lfd fp2,FPR_PARMS+8(r1)
- lfd fp3,FPR_PARMS+16(r1)
- lfd fp4,FPR_PARMS+24(r1)
- lfd fp5,FPR_PARMS+32(r1)
- lfd fp6,FPR_PARMS+40(r1)
- lfd fp7,FPR_PARMS+48(r1)
- lfd fp8,FPR_PARMS+56(r1)
- lfd fp9,FPR_PARMS+64(r1)
- lfd fp10,FPR_PARMS+72(r1)
- lfd fp11,FPR_PARMS+80(r1)
- lfd fp12,FPR_PARMS+88(r1)
- lfd fp13,FPR_PARMS+96(r1)
-/* Call the target function. */
- bctrl
- ld r2,FRAME_TOC_SAVE(r1)
- lwz r12,VR_VRSAVE(r1)
-/* But return here and store the return values. */
- std r3,INT_RTN(r1)
- std r4,INT_RTN+8(r1)
- stfd fp1,FPR_RTN+0(r1)
- stfd fp2,FPR_RTN+8(r1)
- cmpdi cr0,r12,0
- la r10,VR_RTN(r1)
- stfd fp3,FPR_RTN+16(r1)
- stfd fp4,FPR_RTN+24(r1)
-#if _CALL_ELF == 2
- la r12,VR_RTN+16(r1)
- stfd fp5,FPR_RTN+32(r1)
- stfd fp6,FPR_RTN+40(r1)
- li r5,32
- li r6,64
- stfd fp7,FPR_RTN+48(r1)
- stfd fp8,FPR_RTN+56(r1)
- stfd fp9,FPR_RTN+64(r1)
- stfd fp10,FPR_RTN+72(r1)
-#endif
- mr r3,r31
- mr r4,r30
- beq L(callpltexit)
- stvx v2,0,r10
-#if _CALL_ELF == 2
- stvx v3,0,r12
- stvx v4,r5,r10
- stvx v5,r5,r12
- addi r5,r5,64
- stvx v6,r6,r10
- stvx v7,r6,r12
- stvx v8,r5,r10
- stvx v9,r5,r12
-#endif
-L(callpltexit):
- addi r5,r1,INT_PARMS
- addi r6,r1,INT_RTN
- bl JUMPTARGET(_dl_call_pltexit)
-#ifndef SHARED
- nop
-#endif
-/* Restore the return values from target function. */
- lwz r12,VR_VRSAVE(r1)
- ld r3,INT_RTN(r1)
- ld r4,INT_RTN+8(r1)
- lfd fp1,FPR_RTN+0(r1)
- lfd fp2,FPR_RTN+8(r1)
- cmpdi cr0,r12,0
- la r11,VR_RTN(r1)
- lfd fp3,FPR_RTN+16(r1)
- lfd fp4,FPR_RTN+24(r1)
-#if _CALL_ELF == 2
- la r12,VR_RTN+16(r1)
- lfd fp5,FPR_RTN+32(r1)
- lfd fp6,FPR_RTN+40(r1)
- li r30,32
- li r31,64
- lfd fp7,FPR_RTN+48(r1)
- lfd fp8,FPR_RTN+56(r1)
- lfd fp9,FPR_RTN+64(r1)
- lfd fp10,FPR_RTN+72(r1)
-#endif
- beq L(pltexitreturn)
- lvx v2,0,r11
-#if _CALL_ELF == 2
- lvx v3,0,r12
- lvx v4,r30,r11
- lvx v5,r30,r12
- addi r30,r30,64
- lvx v6,r31,r11
- lvx v7,r31,r12
- lvx v8,r30,r11
- lvx v9,r30,r12
-#endif
-L(pltexitreturn):
- ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
- ld r31,FRAME_SIZE-8(r1)
- ld r30,FRAME_SIZE-16(r1)
- mtlr r0
- ld r1,0(r1)
- blr
-END(_dl_profile_resolve)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/entry.h b/sysdeps/powerpc/powerpc64/entry.h
deleted file mode 100644
index 9131d9ceb6..0000000000
--- a/sysdeps/powerpc/powerpc64/entry.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Finding the entry point and start of text. PowerPC64 version.
- Copyright (C) 2002-2017 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/>. */
-
-
-#ifndef __ASSEMBLY__
-extern void _start (void);
-#endif
-
-#define ENTRY_POINT _start
-
-#if _CALL_ELF != 2
-/* We have to provide a special declaration. */
-#define ENTRY_POINT_DECL(class) class void _start (void);
-
-/* Use the address of ._start as the lowest address for which we need
- to keep profiling records. We can't copy the ia64 scheme as our
- entry poiny address is really the address of the function
- descriptor, not the actual function entry. */
-#define TEXT_START \
- ({ extern unsigned long int _start_as_data[] asm ("_start"); \
- _start_as_data[0]; })
-#endif
diff --git a/sysdeps/powerpc/powerpc64/ffsll.c b/sysdeps/powerpc/powerpc64/ffsll.c
deleted file mode 100644
index ae18f127a0..0000000000
--- a/sysdeps/powerpc/powerpc64/ffsll.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Find first set bit in a word, counted from least significant end.
- For PowerPC.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Torbjorn Granlund (tege@sics.se).
-
- 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 ffsl __something_else
-#include <limits.h>
-#include <string.h>
-
-#undef ffs
-
-int
-__ffsll (long long int x)
-{
- int cnt;
-
- asm ("cntlzd %0,%1" : "=r" (cnt) : "r" (x & -x));
- return 64 - cnt;
-}
-weak_alias (__ffsll, ffsll)
-#undef ffsl
-weak_alias (__ffsll, ffsl)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
deleted file mode 100644
index 317a988854..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-ifeq ($(subdir),math)
-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \
- s_isnan-power5 s_isnan-ppc64 s_copysign-power6 \
- s_copysign-ppc64 s_finite-power7 s_finite-ppc64 \
- s_finitef-ppc64 s_isinff-ppc64 s_isinf-power7 \
- s_isinf-ppc64 s_modf-power5+ s_modf-ppc64 \
- s_modff-power5+ s_modff-ppc64 s_isnan-power8 \
- s_isinf-power8 s_finite-power8
-
-libm-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \
- s_isnan-power5 s_isnan-ppc64 s_llround-power6x \
- s_llround-power5+ s_llround-ppc64 s_ceil-power5+ \
- s_ceil-ppc64 s_ceilf-power5+ s_ceilf-ppc64 \
- s_floor-power5+ s_floor-ppc64 s_floorf-power5+ \
- s_floorf-ppc64 s_round-power5+ s_round-ppc64 \
- s_roundf-power5+ s_roundf-ppc64 s_trunc-power5+ \
- s_trunc-ppc64 s_truncf-power5+ s_truncf-ppc64 \
- s_copysign-power6 s_copysign-ppc64 s_llrint-power6x \
- s_llrint-ppc64 s_finite-power7 s_finite-ppc64 \
- s_finitef-ppc64 s_isinff-ppc64 s_isinf-power7 \
- s_isinf-ppc64 s_logb-power7 s_logbf-power7 \
- s_logbl-power7 s_logb-ppc64 s_logbf-ppc64 \
- s_logbl-ppc64 s_modf-power5+ s_modf-ppc64 \
- s_modff-power5+ s_modff-ppc64 e_hypot-ppc64 \
- e_hypot-power7 e_hypotf-ppc64 e_hypotf-power7 \
- s_isnan-power8 s_isinf-power8 s_finite-power8 \
- s_llrint-power8 s_llround-power8 \
- e_expf-power8 e_expf-ppc64 \
- s_sinf-ppc64 s_sinf-power8 \
- s_cosf-ppc64 s_cosf-power8
-
-CFLAGS-s_logbf-power7.c = -mcpu=power7
-CFLAGS-s_logbl-power7.c = -mcpu=power7
-CFLAGS-s_logb-power7.c = -mcpu=power7
-CFLAGS-s_modf-power5+.c = -mcpu=power5+
-CFLAGS-s_modff-power5+.c = -mcpu=power5+
-CFLAGS-e_hypot-power7.c = -mcpu=power7
-CFLAGS-e_hypotf-power7.c = -mcpu=power7
-
-# These files quiet sNaNs in a way that is optimized away without
-# -fsignaling-nans.
-CFLAGS-s_modf-ppc64.c += -fsignaling-nans
-CFLAGS-s_modff-ppc64.c += -fsignaling-nans
-endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-power8.S
deleted file mode 100644
index 1e6cc51d9e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* __ieee754_expf() POWER8 version.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __ieee754_expf __ieee754_expf_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/e_expf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c
deleted file mode 100644
index b236290ea2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* __ieee_expf() PowerPC64 version.
- Copyright (C) 2016-2017 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/>. */
-
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __ieee754_expf __ieee754_expf_ppc64
-
-#include <sysdeps/ieee754/flt-32/e_expf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf.c
deleted file mode 100644
index 577093675c..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Multiple versions of ieee754_expf.
- Copyright (C) 2016-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include "init-arch.h"
-
-extern __typeof (__ieee754_expf) __ieee754_expf_ppc64 attribute_hidden;
-extern __typeof (__ieee754_expf) __ieee754_expf_power8 attribute_hidden;
-
-libc_ifunc (__ieee754_expf,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __ieee754_expf_power8
- : __ieee754_expf_ppc64);
-
-strong_alias (__ieee754_expf, __expf_finite)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-power7.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-power7.c
deleted file mode 100644
index dbe9b33e2e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* __ieee_hypot() POWER7 version.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/e_hypot-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-ppc64.c
deleted file mode 100644
index baebb36ae3..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* __ieee_hypot() PowerPC64 version.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __ieee754_hypot __ieee754_hypot_ppc64
-
-#include <sysdeps/powerpc/fpu/e_hypot.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot.c
deleted file mode 100644
index 6a3d60a830..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypot.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of ieee754_hypot.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__ieee754_hypot) __ieee754_hypot_ppc64 attribute_hidden;
-extern __typeof (__ieee754_hypot) __ieee754_hypot_power7 attribute_hidden;
-
-libc_ifunc (__ieee754_hypot,
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __ieee754_hypot_power7
- : __ieee754_hypot_ppc64);
-
-strong_alias (__ieee754_hypot, __hypot_finite)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-power7.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-power7.c
deleted file mode 100644
index 70584863f7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* __ieee_hypotf() POWER7 version.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/e_hypotf-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-ppc64.c
deleted file mode 100644
index 839e94e56c..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* __ieee_hypot() PowerPC64 version.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __ieee754_hypotf __ieee754_hypotf_ppc64
-
-#include <sysdeps/powerpc/fpu/e_hypotf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf.c
deleted file mode 100644
index 2c8112d3b2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/e_hypotf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of ieee754_hypot.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__ieee754_hypotf) __ieee754_hypotf_ppc64 attribute_hidden;
-extern __typeof (__ieee754_hypotf) __ieee754_hypotf_power7 attribute_hidden;
-
-libc_ifunc (__ieee754_hypotf,
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __ieee754_hypotf_power7
- : __ieee754_hypotf_ppc64);
-
-strong_alias (__ieee754_hypotf, __hypotf_finite)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S
deleted file mode 100644
index bbea647da7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ceil function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __ceil __ceil_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S
deleted file mode 100644
index c19bb42329..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ceil function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __ceil __ceil_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_ceil.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c
deleted file mode 100644
index 968e8cb17e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of ceil.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__ceil) __ceil_ppc64 attribute_hidden;
-extern __typeof (__ceil) __ceil_power5plus attribute_hidden;
-
-libc_ifunc (__ceil,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __ceil_power5plus
- : __ceil_ppc64);
-
-weak_alias (__ceil, ceil)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__ceil, __ceill)
-weak_alias (__ceil, ceill)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __ceil, ceill, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S
deleted file mode 100644
index 8e875ce679..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ceilf function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __ceilf __ceilf_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S
deleted file mode 100644
index c9d31da2a7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ceilf function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __ceilf __ceilf_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_ceilf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c
deleted file mode 100644
index 7d4a028fe5..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of ceilf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__ceilf) __ceilf_ppc64 attribute_hidden;
-extern __typeof (__ceilf) __ceilf_power5plus attribute_hidden;
-
-libc_ifunc (__ceilf,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __ceilf_power5plus
- : __ceilf_ppc64);
-
-weak_alias (__ceilf, ceilf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-power6.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-power6.S
deleted file mode 100644
index d59fbfae73..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-power6.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* copysign(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a, b, c, d)
-#undef hidden_def
-#define hidden_def(name)
-
-#define __copysign __copysign_power6
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_copysign.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-ppc64.S
deleted file mode 100644
index 3f4fbc96ad..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign-ppc64.S
+++ /dev/null
@@ -1,35 +0,0 @@
-/* copysign(). PowerPC64 default version.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a, b, c, d)
-
-#define __copysign __copysign_ppc64
-#undef hidden_def
-#define hidden_def(name) \
- strong_alias (__copysign_ppc64, __GI___copysign)
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_copysign.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c
deleted file mode 100644
index 2bfb625bf7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Multiple versions of copysign.
- Copyright (C) 2013-2017 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/>. */
-
-/* Redefine copysign so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias below. */
-#undef __copysign
-#define __copysign __redirect_copysign
-#include <math.h>
-#include <math_ldbl_opt.h>
-#undef __copysign
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__redirect_copysign) __copysign_ppc64 attribute_hidden;
-extern __typeof (__redirect_copysign) __copysign_power6 attribute_hidden;
-
-extern __typeof (__redirect_copysign) __libm_copysign;
-libc_ifunc (__libm_copysign,
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __copysign_power6
- : __copysign_ppc64);
-
-strong_alias (__libm_copysign, __copysign)
-weak_alias (__copysign, copysign)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__copysign,copysignl)
-strong_alias(__copysign,__copysignl)
-#endif
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __copysign, copysignl, GLIBC_2_0);
-# endif
-#elif LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __copysign, copysignl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysignf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysignf.c
deleted file mode 100644
index c9be2b6811..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysignf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of copysignf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-/* It's safe to use double-precision implementation for single-precision. */
-extern __typeof (__copysignf) __copysign_ppc64 attribute_hidden;
-extern __typeof (__copysignf) __copysign_power6 attribute_hidden;
-
-libc_ifunc (__copysignf,
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __copysign_power6
- : __copysign_ppc64);
-
-weak_alias (__copysignf, copysignf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-power8.S
deleted file mode 100644
index ee00a2c43a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* cosf function. PowerPC64/power8 version.
- Copyright (C) 2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __cosf __cosf_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_cosf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-ppc64.c
deleted file mode 100644
index 635624c538..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* cosf function. PowerPC64 default version.
- Copyright (C) 2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define __cosf __cosf_ppc64
-
-#include <sysdeps/powerpc/fpu/s_cosf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf.c
deleted file mode 100644
index acf2a59d69..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_cosf.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Multiple versions of cosf.
- Copyright (C) 2017 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 <math.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__cosf) __cosf_ppc64 attribute_hidden;
-extern __typeof (__cosf) __cosf_power8 attribute_hidden;
-
-libc_ifunc (__cosf,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __cosf_power8
- : __cosf_ppc64);
-
-weak_alias (__cosf, cosf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power7.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power7.S
deleted file mode 100644
index 9220383ee6..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power7.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __finite __finite_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S
deleted file mode 100644
index fa878ab3e1..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER7 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __finite __finite_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-ppc64.c
deleted file mode 100644
index fabd9b0e3d..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-ppc64.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* finite(). PowerPC64 default version.
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define FINITE __finite_ppc64
-#ifdef SHARED
-# undef hidden_def
-# define hidden_def(a) \
- __hidden_ver1 (__finite_ppc64, __GI___finite, __finite_ppc64);
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_finite.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c
deleted file mode 100644
index a5ec36b72f..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Multiple versions of finite.
- Copyright (C) 2013-2017 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 __finite __redirect___finite
-#define __finitef __redirect___finitef
-#define __finitel __redirect___finitel
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__finite) __finite_ppc64 attribute_hidden;
-extern __typeof (__finite) __finite_power7 attribute_hidden;
-extern __typeof (__finite) __finite_power8 attribute_hidden;
-#undef __finite
-#undef __finitef
-#undef __finitel
-
-libc_ifunc_redirected (__redirect___finite, __finite,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __finite_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __finite_power7
- : __finite_ppc64);
-
-weak_alias (__finite, finite)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__finite, __finitel)
-weak_alias (__finite, finitel)
-#endif
-
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, finite, finitel, GLIBC_2_0);
-# endif
-# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
-compat_symbol (libm, __finite, __finitel, GLIBC_2_1);
-# endif
-#else
-# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
-compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
-compat_symbol (libc, finite, finitel, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef-ppc64.c
deleted file mode 100644
index c6f8033e6e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef-ppc64.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* finitef(). PowerPC64 default version.
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define FINITEF __finitef_ppc64
-#ifdef SHARED
-# undef hidden_def
-# define hidden_def(a) \
- __hidden_ver1 (__finitef_ppc64, __GI___finitef, __finitef_ppc64);
-#endif
-
-#include <sysdeps/ieee754/flt-32/s_finitef.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c
deleted file mode 100644
index cdd7824efb..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Multiple versions of finitef.
- Copyright (C) 2013-2017 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 __finitef __redirect___finitef
-#include <math.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__finitef) __finitef_ppc64 attribute_hidden;
-/* The double-precision version also works for single-precision. */
-extern __typeof (__finitef) __finite_power7 attribute_hidden;
-extern __typeof (__finitef) __finite_power8 attribute_hidden;
-#undef __finitef
-
-libc_ifunc_redirected (__redirect___finitef, __finitef,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __finite_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __finite_power7
- : __finitef_ppc64);
-
-weak_alias (__finitef, finitef)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-power5+.S
deleted file mode 100644
index 24f2460693..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* floor function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __floor __floor_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-ppc64.S
deleted file mode 100644
index 5ec9a33d89..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor-ppc64.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* floor function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __floor __floor_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_floor.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c
deleted file mode 100644
index 6ab7a35490..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of floor.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__floor) __floor_ppc64 attribute_hidden;
-extern __typeof (__floor) __floor_power5plus attribute_hidden;
-
-libc_ifunc (__floor,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __floor_power5plus
- : __floor_ppc64);
-
-weak_alias (__floor, floor)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__floor, __floorl)
-weak_alias (__floor, floorl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __floor, floorl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-power5+.S
deleted file mode 100644
index 8b621de68e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-power5+.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* floorf function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __floorf __floorf_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_floorf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-ppc64.S
deleted file mode 100644
index 3feea6e162..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf-ppc64.S
+++ /dev/null
@@ -1,27 +0,0 @@
-/* floorf function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __floorf __floorf_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_floorf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c
deleted file mode 100644
index ee96536247..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of floorf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__floorf) __floorf_ppc64 attribute_hidden;
-extern __typeof (__floorf) __floorf_power5plus attribute_hidden;
-
-libc_ifunc (__floorf,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __floorf_power5plus
- : __floorf_ppc64);
-
-weak_alias (__floorf, floorf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power7.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power7.S
deleted file mode 100644
index 33a7e3de1a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power7.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isinf(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
-#define __isinf __isinf_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S
deleted file mode 100644
index b630696927..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isinf(). PowerPC64/POWER8 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
-#define __isinf __isinf_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-ppc64.c
deleted file mode 100644
index e7f64438b4..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-ppc64.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isinf(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __isinf __isinf_ppc64
-#ifdef SHARED
-# undef hidden_def
-# define hidden_def(a) \
- __hidden_ver1 (__isinf_ppc64, __GI___isinf, __isinf_ppc64);
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_isinf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c
deleted file mode 100644
index 9c6789c7bd..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Multiple versions of isinf.
- Copyright (C) 2013-2017 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 __isinf __redirect___isinf
-#define __isinff __redirect___isinff
-#define __isinfl __redirect___isinfl
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__isinf) __isinf_ppc64 attribute_hidden;
-extern __typeof (__isinf) __isinf_power7 attribute_hidden;
-extern __typeof (__isinf) __isinf_power8 attribute_hidden;
-#undef __isinf
-#undef __isinff
-#undef __isinfl
-
-libc_ifunc_redirected (__redirect___isinf, __isinf,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __isinf_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __isinf_power7
- : __isinf_ppc64);
-
-weak_alias (__isinf, isinf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isinf, __isinfl)
-weak_alias (__isinf, isinfl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
-compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
-compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff-ppc64.c
deleted file mode 100644
index e58e0b53be..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff-ppc64.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* isinff(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define __isinff __isinff_ppc64
-#ifdef SHARED
-# undef hidden_def
-# define hidden_def(a) \
- __hidden_ver1 (__isinff_ppc64, __GI___isinff, __isinff_ppc64);
-#endif
-
-#include <sysdeps/ieee754/flt-32/s_isinff.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c
deleted file mode 100644
index 439e0b80d1..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Multiple versions of isinf.
- Copyright (C) 2013-2017 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 __isinff __redirect___isinff
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__isinff) __isinff_ppc64 attribute_hidden;
-/* The double-precision version also works for single-precision. */
-extern __typeof (__isinff) __isinf_power7 attribute_hidden;
-extern __typeof (__isinff) __isinf_power8 attribute_hidden;
-#undef __isinff
-
-libc_ifunc_redirected (__redirect___isinff, __isinff,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __isinf_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __isinf_power7
- : __isinff_ppc64);
-
-weak_alias (__isinff, isinff)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S
deleted file mode 100644
index 18d368a63b..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER5 version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __isnan __isnan_power5
-
-#include <sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S
deleted file mode 100644
index 7f0eae0430..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER6 version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __isnan __isnan_power6
-
-#include <sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S
deleted file mode 100644
index aa283096ae..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER6X version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __isnan __isnan_power6x
-
-#include <sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S
deleted file mode 100644
index b67d58e2ea..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __isnan __isnan_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S
deleted file mode 100644
index 03151b3087..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* isnan(). PowerPC64/POWER7 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, symbol, ver)
-
-#define __isnan __isnan_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S
deleted file mode 100644
index ee219c14be..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S
+++ /dev/null
@@ -1,32 +0,0 @@
-/* isnan(). PowerPC32 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-
-#define __isnan __isnan_ppc64
-#undef hidden_def
-#define hidden_def(name) \
- .globl __GI___isnan ; .set __GI___isnan,__isnan_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_isnan.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c
deleted file mode 100644
index 3cfe1793da..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Multiple versions of isnan.
- Copyright (C) 2013-2017 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 __isnan __redirect___isnan
-#define __isnanf __redirect___isnanf
-#define __isnanl __redirect___isnanl
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__isnan) __isnan_ppc64 attribute_hidden;
-extern __typeof (__isnan) __isnan_power5 attribute_hidden;
-extern __typeof (__isnan) __isnan_power6 attribute_hidden;
-extern __typeof (__isnan) __isnan_power6x attribute_hidden;
-extern __typeof (__isnan) __isnan_power7 attribute_hidden;
-extern __typeof (__isnan) __isnan_power8 attribute_hidden;
-#undef __isnan
-#undef __isnanf
-#undef __isnanl
-
-libc_ifunc_redirected (__redirect___isnan, __isnan,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __isnan_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __isnan_power7
- : (hwcap & PPC_FEATURE_POWER6_EXT)
- ? __isnan_power6x
- : (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __isnan_power6
- : (hwcap & PPC_FEATURE_POWER5)
- ? __isnan_power5
- : __isnan_ppc64);
-
-weak_alias (__isnan, isnan)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c
deleted file mode 100644
index 958c373245..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of isnan.
- Copyright (C) 2013-2017 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 <math.h>
-#include "init-arch.h"
-
-/* The double-precision implementation also works for the single one. */
-extern __typeof (__isnanf) __isnan_ppc64 attribute_hidden;
-extern __typeof (__isnanf) __isnan_power5 attribute_hidden;
-extern __typeof (__isnanf) __isnan_power6 attribute_hidden;
-extern __typeof (__isnanf) __isnan_power6x attribute_hidden;
-extern __typeof (__isnanf) __isnan_power7 attribute_hidden;
-extern __typeof (__isnanf) __isnan_power8 attribute_hidden;
-
-libc_ifunc_hidden (__isnanf, __isnanf,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __isnan_power8
- : (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __isnan_power7
- : (hwcap & PPC_FEATURE_POWER6_EXT)
- ? __isnan_power6x
- : (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __isnan_power6
- : (hwcap & PPC_FEATURE_POWER5)
- ? __isnan_power5
- : __isnan_ppc64);
-
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power6x.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power6x.S
deleted file mode 100644
index f9b1616be3..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power6x.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Round double to long int. PowerPC64/POWER6X default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llrint __llrint_power6x
-
-#include <sysdeps/powerpc/powerpc64/power6x/fpu/s_llrint.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S
deleted file mode 100644
index b7f5276a66..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Round double to long int. PowerPC64/POWER6X default version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llrint __llrint_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-ppc64.S
deleted file mode 100644
index b92dafbcdb..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-ppc64.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Round double to long int. PowerPC32 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llrint __llrint_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_llrint.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c
deleted file mode 100644
index 8db494cfde..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Multiple versions of llrint.
- Copyright (C) 2013-2017 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/>. */
-
-/* Redefine lrint/__lrint so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias below. */
-#define lrint __hidden_lrint
-#define __lrint __hidden___lrint
-
-#include <math.h>
-#include <math_ldbl_opt.h>
-#undef lrint
-#undef __lrint
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__llrint) __llrint_ppc64 attribute_hidden;
-extern __typeof (__llrint) __llrint_power6x attribute_hidden;
-extern __typeof (__llrint) __llrint_power8 attribute_hidden;
-
-libc_ifunc (__llrint,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __llrint_power8 :
- (hwcap & PPC_FEATURE_POWER6_EXT)
- ? __llrint_power6x
- : __llrint_ppc64);
-
-weak_alias (__llrint, llrint)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__llrint, __llrintl)
-weak_alias (__llrint, llrintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llrint, llrintl, GLIBC_2_1);
-#endif
-
-/* long has the same width as long long on PowerPC64. */
-strong_alias (__llrint, __lrint)
-weak_alias (__lrint, lrint)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__lrint, __lrintl)
-weak_alias (__lrint, lrintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __lrint, lrintl, GLIBC_2_1);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power5+.S
deleted file mode 100644
index b8305ce968..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power5+.S
+++ /dev/null
@@ -1,32 +0,0 @@
-/* llround(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_power5plus
-#define __lround __lround_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power6x.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power6x.S
deleted file mode 100644
index 1145aff2a8..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power6x.S
+++ /dev/null
@@ -1,32 +0,0 @@
-/* llround(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
-#define __llround __llround_power6x
-#define __lround __lround_power6x
-
-#include <sysdeps/powerpc/powerpc64/power6x/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S
deleted file mode 100644
index 8d6190df89..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* llround(). PowerPC64 default version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
-#define __llround __llround_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-ppc64.S
deleted file mode 100644
index 8e6f9aed78..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-ppc64.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* llround(). PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_ppc64
-#define __lround __lround_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c
deleted file mode 100644
index cb1a446158..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Multiple versions of llround.
- Copyright (C) 2013-2017 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 lround __hidden_lround
-#define __lround __hidden___lround
-
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__llround) __llround_ppc64 attribute_hidden;
-extern __typeof (__llround) __llround_power5plus attribute_hidden;
-extern __typeof (__llround) __llround_power6x attribute_hidden;
-extern __typeof (__llround) __llround_power8 attribute_hidden;
-
-libc_ifunc (__llround,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __llround_power8 :
- (hwcap & PPC_FEATURE_POWER6_EXT)
- ? __llround_power6x :
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __llround_power5plus
- : __llround_ppc64);
-
-weak_alias (__llround, llround)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__llround, llroundl)
-strong_alias (__llround, __llroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llround, llroundl, GLIBC_2_1);
-compat_symbol (libm, llround, lroundl, GLIBC_2_1);
-#endif
-
-/* long has the same width as long long on PPC64. */
-#undef lround
-#undef __lround
-strong_alias (__llround, __lround)
-weak_alias (__llround, lround)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__llround, __llroundl)
-weak_alias (__llround, llroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __lround, lroundl, GLIBC_2_1);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c
deleted file mode 100644
index 73b5e2d48c..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* logb(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c
deleted file mode 100644
index e428b9a29a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* logb(). PowerPC32/POWER7 version.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __logb __logb_ppc64
-
-#include <sysdeps/ieee754/dbl-64/s_logb.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c
deleted file mode 100644
index d70919e3d4..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Multiple versions of logb.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__logb) __logb_ppc64 attribute_hidden;
-extern __typeof (__logb) __logb_power7 attribute_hidden;
-
-libc_ifunc (__logb,
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __logb_power7
- : __logb_ppc64);
-
-weak_alias (__logb, logb)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__logb, __logbl)
-weak_alias (__logb, logbl)
-#endif
-
-#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, logb, logbl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c
deleted file mode 100644
index 02e04318e5..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* logb(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c
deleted file mode 100644
index 147b710c73..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* logbf(). PowerPC64 default implementation.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define __logbf __logbf_ppc64
-
-#include <sysdeps/ieee754/flt-32/s_logbf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c
deleted file mode 100644
index 1cacc8a950..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of logbf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__logbf) __logbf_ppc64 attribute_hidden;
-extern __typeof (__logbf) __logbf_power7 attribute_hidden;
-
-libc_ifunc (__logbf,
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __logbf_power7
- : __logbf_ppc64);
-
-weak_alias (__logbf, logbf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c
deleted file mode 100644
index 60ec533b8e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* logb(). PowerPC64/POWER7 version.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c
deleted file mode 100644
index 502410f877..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* logbl(). PowerPC64/POWER7 version.
- Copyright (C) 2012-2017 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 __logbl __logbl_ppc64
-
-#include <sysdeps/ieee754/ldbl-128ibm/s_logbl.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c
deleted file mode 100644
index 63b9c812e2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of logbl.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__logbl) __logbl_ppc64 attribute_hidden;
-extern __typeof (__logbl) __logbl_power7 attribute_hidden;
-
-libc_ifunc (__logbl,
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __logbl_power7
- : __logbl_ppc64);
-
-long_double_symbol (libm, __logbl, logbl);
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lrint.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lrint.c
deleted file mode 100644
index d09286267b..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lrint.c
+++ /dev/null
@@ -1 +0,0 @@
- /* __lrint is in s_llrint.c */
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lround.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lround.c
deleted file mode 100644
index 0dab5443e2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_lround.c
+++ /dev/null
@@ -1 +0,0 @@
-/* __lround is in s_llround.c */
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c
deleted file mode 100644
index c923f84d97..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC/POWER5+ implementation for modf.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/s_modf-power5+.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-ppc64.c
deleted file mode 100644
index 43318ee4dd..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-ppc64.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* PowerPC64 default implementation for modf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-
-#define __modf __modf_ppc64
-
-#include <sysdeps/ieee754/dbl-64/s_modf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c
deleted file mode 100644
index 3e79b2bd5a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of modf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__modf) __modf_ppc64 attribute_hidden;
-extern __typeof (__modf) __modf_power5plus attribute_hidden;
-
-libc_ifunc (__modf,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __modf_power5plus
- : __modf_ppc64);
-
-weak_alias (__modf, modf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__modf, __modfl)
-weak_alias (__modf, modfl)
-#endif
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __modf, modfl, GLIBC_2_0);
-# endif
-#elif LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __modf, modfl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c
deleted file mode 100644
index 22dbf5341e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC/POWER5+ implementation for modff.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/fpu/multiarch/s_modff-power5+.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c
deleted file mode 100644
index 6fc97f0114..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* PowerPC64 default implementation for modff.
- Copyright (C) 2013-2017 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 <math.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __modff __modff_ppc64
-
-#include <sysdeps/ieee754/flt-32/s_modff.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c
deleted file mode 100644
index f57939cc66..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Multiple versions of modff.
- Copyright (C) 2013-2017 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 <math.h>
-#include "init-arch.h"
-
-extern __typeof (__modff) __modff_ppc64 attribute_hidden;
-extern __typeof (__modff) __modff_power5plus attribute_hidden;
-
-libc_ifunc (__modff,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __modff_power5plus
- : __modff_ppc64);
-
-weak_alias (__modff, modff)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-power5+.S
deleted file mode 100644
index a7c7492f21..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* round function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __round __round_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_round.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-ppc64.S
deleted file mode 100644
index 44a2b0105a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round-ppc64.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* round function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __round __round_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_round.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c
deleted file mode 100644
index d440f6f45c..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of round.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__round) __round_ppc64 attribute_hidden;
-extern __typeof (__round) __round_power5plus attribute_hidden;
-
-libc_ifunc (__round,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __round_power5plus
- : __round_ppc64);
-
-weak_alias (__round, round)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__round, __roundl)
-weak_alias (__round, roundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __round, roundl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-power5+.S
deleted file mode 100644
index 81501a1547..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-power5+.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* roundf function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __roundf __roundf_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_roundf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-ppc64.S
deleted file mode 100644
index 8f3b24c556..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf-ppc64.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* roundf function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __roundf __roundf_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_roundf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c
deleted file mode 100644
index 09609d3e91..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of roundf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__roundf) __roundf_ppc64 attribute_hidden;
-extern __typeof (__roundf) __roundf_power5plus attribute_hidden;
-
-libc_ifunc (__roundf,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __roundf_power5plus
- : __roundf_ppc64);
-
-weak_alias (__roundf, roundf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-power8.S
deleted file mode 100644
index 3d01533da8..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* sinf(). PowerPC64/POWER8 version.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define __sinf __sinf_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/fpu/s_sinf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-ppc64.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-ppc64.c
deleted file mode 100644
index 83e37f92c6..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* sinf(). PowerPC64 default version.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-#define __sinf __sinf_ppc64
-
-#include <sysdeps/ieee754/flt-32/s_sinf.c>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf.c
deleted file mode 100644
index 6d7d6ce50d..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_sinf.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Multiple versions of sinf.
- Copyright (C) 2016-2017 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 <math.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__sinf) __sinf_ppc64 attribute_hidden;
-extern __typeof (__sinf) __sinf_power8 attribute_hidden;
-
-libc_ifunc (__sinf,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __sinf_power8
- : __sinf_ppc64);
-
-weak_alias (__sinf, sinf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-power5+.S
deleted file mode 100644
index 53d8cd5013..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* trunc function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __trunc __trunc_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_trunc.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-ppc64.S
deleted file mode 100644
index 36e8fd05c2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc-ppc64.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* trunc function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __trunc __trunc_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_trunc.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc.c
deleted file mode 100644
index 54844d5ff2..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_trunc.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of trunc.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__trunc) __trunc_ppc64 attribute_hidden;
-extern __typeof (__trunc) __trunc_power5plus attribute_hidden;
-
-libc_ifunc (__trunc,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __trunc_power5plus
- : __trunc_ppc64);
-
-weak_alias (__trunc, trunc)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__trunc, __truncl)
-weak_alias (__trunc, truncl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __trunc, truncl, GLIBC_2_0);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-power5+.S
deleted file mode 100644
index e28de7cb1e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-power5+.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* truncf function. PowerPC64/power5+ version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __truncf __truncf_power5plus
-
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_truncf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-ppc64.S
deleted file mode 100644
index b60242d83b..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf-ppc64.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* truncf function. PowerPC64 default version.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-#define __truncf __truncf_ppc64
-
-#include <sysdeps/powerpc/powerpc64/fpu/s_truncf.S>
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf.c
deleted file mode 100644
index 2c46525235..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_truncf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiple versions of truncf.
- Copyright (C) 2013-2017 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 <math.h>
-#include <math_ldbl_opt.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__truncf) __truncf_ppc64 attribute_hidden;
-extern __typeof (__truncf) __truncf_power5plus attribute_hidden;
-
-libc_ifunc (__truncf,
- (hwcap & PPC_FEATURE_POWER5_PLUS)
- ? __truncf_power5plus
- : __truncf_ppc64);
-
-weak_alias (__truncf, truncf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S b/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
deleted file mode 100644
index 78d7feefed..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ceil function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-EALIGN (__ceil, 4, 0)
- CALL_MCOUNT 0
- lfd fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,2 /* Set rounding mode toward +inf. */
- ble- cr6,.L4
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
- END (__ceil)
-
-weak_alias (__ceil, ceil)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__ceil, ceill)
-strong_alias (__ceil, __ceill)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __ceil, ceill, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
deleted file mode 100644
index bc5ab02cb0..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
+++ /dev/null
@@ -1,66 +0,0 @@
-/* float ceil function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
- .long 0x0
- .section ".text"
-
-EALIGN (__ceilf, 4, 0)
- CALL_MCOUNT 0
- lfs fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,2 /* Set rounding mode toward +inf. */
- ble- cr6,.L4
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
- END (__ceilf)
-
-weak_alias (__ceilf, ceilf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_copysign.S b/sysdeps/powerpc/powerpc64/fpu/s_copysign.S
deleted file mode 100644
index 59472816c7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_copysign.S
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copy a sign bit between floating-point values. PowerPC64 version.
- Copyright (C) 1997-2017 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/>. */
-
-/* This has been coded in assembler because GCC makes such a mess of it
- when it's coded in C. */
-
-#include <sysdep.h>
-#include <math_ldbl_opt.h>
-
-ENTRY(__copysign)
- CALL_MCOUNT 0
-/* double [f1] copysign (double [f1] x, double [f2] y);
- copysign(x,y) returns a value with the magnitude of x and
- with the sign bit of y. */
- stfd fp2,-8(r1)
- nop
- nop
- nop
- ld r3,-8(r1)
- cmpdi r3,0
- blt L(0)
- fabs fp1,fp1
- blr
-L(0): fnabs fp1,fp1
- blr
- END (__copysign)
-
-weak_alias (__copysign,copysign)
-
-/* It turns out that it's safe to use this code even for single-precision. */
-weak_alias (__copysign,copysignf)
-strong_alias(__copysign,__copysignf)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__copysign,copysignl)
-strong_alias(__copysign,__copysignl)
-#endif
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __copysign, copysignl, GLIBC_2_0)
-# endif
-#elif LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __copysign, copysignl, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_copysignf.S b/sysdeps/powerpc/powerpc64/fpu/s_copysignf.S
deleted file mode 100644
index e05438ae7d..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_copysignf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* __copysignf is in s_copysign.S */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S b/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S
deleted file mode 100644
index b33ea6e256..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copy a sign bit between floating-point values.
- IBM extended format long double version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-ENTRY(__copysignl)
-/* long double [f1,f2] copysign (long double [f1,f2] x, long double [f3,f4] y);
- copysign(x,y) returns a value with the magnitude of x and
- with the sign bit of y. */
- stfd fp3,-16(r1)
- ld r3,-16(r1)
- cmpdi r3,0
- blt L(0)
- fmr fp0,fp1
- fabs fp1,fp1
- fneg fp3,fp2
- fsel fp2,fp0,fp2,fp3
- blr
-L(0):
- fmr fp0,fp1
- fnabs fp1,fp1
- fneg fp3,fp2
- fsel fp2,fp0,fp3,fp2
- blr
-END (__copysignl)
-
-#if IS_IN (libm)
-long_double_symbol (libm, __copysignl, copysignl)
-#else
-long_double_symbol (libc, __copysignl, copysignl)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_fabs.S b/sysdeps/powerpc/powerpc64/fpu/s_fabs.S
deleted file mode 100644
index 53d21301ee..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_fabs.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <math_ldbl_opt.h>
-#include <sysdeps/powerpc/fpu/s_fabs.S>
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __fabs, fabsl, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S b/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S
deleted file mode 100644
index 7603abba5d..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copy a sign bit between floating-point values.
- IBM extended format long double version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-ENTRY(__fabsl)
-/* long double [f1,f2] fabs (long double [f1,f2] x);
- fabs(x,y) returns a value with the magnitude of x and
- with the sign bit of y. */
- fmr fp0,fp1
- fabs fp1,fp1
- fneg fp3,fp2
- fsel fp2,fp0,fp2,fp3
- blr
-END (__fabsl)
-
-long_double_symbol (libm, __fabsl, fabsl)
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_floor.S b/sysdeps/powerpc/powerpc64/fpu/s_floor.S
deleted file mode 100644
index 4a6cc0ebba..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_floor.S
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Floor function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-EALIGN (__floor, 4, 0)
- CALL_MCOUNT 0
- lfd fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,3 /* Set rounding mode toward -inf. */
- ble- cr6,.L4
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
- END (__floor)
-
-weak_alias (__floor, floor)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__floor, floorl)
-strong_alias (__floor, __floorl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __floor, floorl, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_floorf.S b/sysdeps/powerpc/powerpc64/fpu/s_floorf.S
deleted file mode 100644
index d8b5e21248..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_floorf.S
+++ /dev/null
@@ -1,66 +0,0 @@
-/* float Floor function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
- .long 0x0
- .section ".text"
-
-EALIGN (__floorf, 4, 0)
- CALL_MCOUNT 0
- lfs fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,3 /* Set rounding mode toward -inf. */
- ble- cr6,.L4
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
- END (__floorf)
-
-weak_alias (__floorf, floorf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_fma.S b/sysdeps/powerpc/powerpc64/fpu/s_fma.S
deleted file mode 100644
index d40695c633..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_fma.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <math_ldbl_opt.h>
-#include <sysdeps/powerpc/fpu/s_fma.S>
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __fma, fmal, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/fpu/s_isnan.S
deleted file mode 100644
index 6cba2d4408..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_isnan.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* isnan(). PowerPC64 version.
- Copyright (C) 2008-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isnan(x) */
- .machine power4
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- mffs fp0
- mtfsb0 4*cr6+lt /* reset_fpscr_bit (FPSCR_VE) */
- fcmpu cr7,fp1,fp1
- mtfsf 255,fp0
- li r3,0
- beqlr+ cr7 /* (x == x) then not a NAN */
- li r3,1 /* else must be a NAN */
- blr
- END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llrint.S b/sysdeps/powerpc/powerpc64/fpu/s_llrint.S
deleted file mode 100644
index 39e765434a..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_llrint.S
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Round double to long int. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* long long int[r3] __llrint (double x[fp1]) */
-ENTRY (__llrint)
- CALL_MCOUNT 0
- fctid fp13,fp1
- stfd fp13,-16(r1)
- nop /* Insure the following load is in a different dispatch group */
- nop /* to avoid pipe stall on POWER4&5. */
- nop
- ld r3,-16(r1)
- blr
- END (__llrint)
-
-strong_alias (__llrint, __lrint)
-weak_alias (__llrint, llrint)
-weak_alias (__lrint, lrint)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__llrint, __llrintl)
-weak_alias (__llrint, llrintl)
-strong_alias (__lrint, __lrintl)
-weak_alias (__lrint, lrintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llrint, llrintl, GLIBC_2_1)
-compat_symbol (libm, __lrint, lrintl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S b/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S
deleted file mode 100644
index 4050be6437..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Round double to long int. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
-/* long long int[r3] __llrintf (float x[fp1]) */
-ENTRY (__llrintf)
- CALL_MCOUNT 0
- fctid fp13,fp1
- stfd fp13,-16(r1)
- nop /* Insure the following load is in a different dispatch group */
- nop /* to avoid pipe stall on POWER4&5. */
- nop
- ld r3,-16(r1)
- blr
- END (__llrintf)
-
-strong_alias (__llrintf, __lrintf)
-weak_alias (__llrintf, llrintf)
-weak_alias (__lrintf, lrintf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/fpu/s_llround.S
deleted file mode 100644
index 0803ba1eb3..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_llround.S
+++ /dev/null
@@ -1,96 +0,0 @@
-/* llround function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2^52 */
- .tc FD_43300000_0[TC],0x4330000000000000
-.LC1: /* 0.5 */
- .tc FD_3fe00000_0[TC],0x3fe0000000000000
- .section ".text"
-
-/* long long [r3] llround (double x [fp1])
- IEEE 1003.1 llround function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we can't use the PowerPC "round to Nearest" mode. Instead we set
- "round toward Zero" mode and round by adding +-0.5 before rounding
- to the integer value.
-
- It is necessary to detect when x is (+-)0x1.fffffffffffffp-2
- because adding +-0.5 in this case will cause an erroneous shift,
- carry and round. We simply return 0 if 0.5 > x > -0.5. Likewise
- if x is and odd number between +-(2^52 and 2^53-1) a shift and
- carry will erroneously round if biased with +-0.5. Therefore if x
- is greater/less than +-2^52 we don't need to bias the number with
- +-0.5. */
-
-ENTRY (__llround)
- CALL_MCOUNT 0
- lfd fp9,.LC0@toc(2) /* Load 2^52 into fpr9. */
- lfd fp10,.LC1@toc(2)/* Load 0.5 into fpr10. */
- fabs fp2,fp1 /* Get the absolute value of x. */
- fsub fp12,fp10,fp10 /* Compute 0.0 into fp12. */
- fcmpu cr6,fp2,fp10 /* if |x| < 0.5 */
- fcmpu cr7,fp2,fp9 /* if |x| >= 2^52 */
- fcmpu cr1,fp1,fp12 /* x is negative? x < 0.0 */
- blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */
- bge- cr7,.Lnobias /* 2^52 > x < -2^52 just convert with no bias. */
- /* Test whether an integer to avoid spurious "inexact". */
- fadd fp3,fp2,fp9
- fsub fp3,fp3,fp9
- fcmpu cr5,fp2,fp3
- beq cr5,.Lnobias
- fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */
- bge cr1,.Lconvert /* x is positive so don't negate x. */
- fnabs fp3,fp3 /* -(|x|+=0.5) */
-.Lconvert:
- fctidz fp4,fp3 /* Convert to Integer double word round toward 0. */
- stfd fp4,-16(r1)
- nop
- nop
- nop
- ld r3,-16(r1) /* Load return as integer. */
-.Lout:
- blr
-.Lretzero: /* 0.5 > x > -0.5 */
- li r3,0 /* return 0. */
- b .Lout
-.Lnobias:
- fmr fp3,fp1
- b .Lconvert
- END (__llround)
-
-strong_alias (__llround, __lround)
-weak_alias (__llround, llround)
-weak_alias (__lround, lround)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__llround, llroundl)
-strong_alias (__llround, __llroundl)
-weak_alias (__lround, lroundl)
-strong_alias (__lround, __lroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llround, llroundl, GLIBC_2_1)
-compat_symbol (libm, __lround, lroundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S
deleted file mode 100644
index 3e910ac322..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S
+++ /dev/null
@@ -1,88 +0,0 @@
-/* llroundf function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
-.LC0: /* 2^23 */
- .tc FD_41600000_0[TC],0x4160000000000000
-.LC1: /* 0.5 */
- .tc FD_3fe00000_0[TC],0x3fe0000000000000
-.LC2: /* 2^52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-/* long long [r3] llroundf (float x [fp1])
- IEEE 1003.1 llroundf function. IEEE specifies "roundf to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "roundf to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we can't use the PowerPC "round to Nearest" mode. Instead we set
- "round toward Zero" mode and round by adding +-0.5 before rounding
- to the integer value.
-
- It is necessary to detect when x is (+-)0x1.fffffffffffffp-2
- because adding +-0.5 in this case will cause an erroneous shift,
- carry and round. We simply return 0 if 0.5 > x > -0.5. Likewise
- if x is and odd number between +-(2^23 and 2^24-1) a shift and
- carry will erroneously round if biased with +-0.5. Therefore if x
- is greater/less than +-2^23 we don't need to bias the number with
- +-0.5. */
-
-ENTRY (__llroundf)
- CALL_MCOUNT 0
- lfd fp9,.LC0@toc(2) /* Load 2^23 into fpr9. */
- lfd fp10,.LC1@toc(2)/* Load 0.5 into fpr10. */
- lfd fp11,.LC2@toc(2) /* Load 2^52 into fpr11. */
- fabs fp2,fp1 /* Get the absolute value of x. */
- fsub fp12,fp10,fp10 /* Compute 0.0 into fp12. */
- fcmpu cr6,fp2,fp10 /* if |x| < 0.5 */
- fcmpu cr7,fp2,fp9 /* if |x| >= 2^23 */
- fcmpu cr1,fp1,fp12 /* x is negative? x < 0.0 */
- blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */
- bge- cr7,.Lnobias /* 2^23 > x < -2^23 just convert with no bias. */
- /* Test whether an integer to avoid spurious "inexact". */
- fadd fp3,fp2,fp11
- fsub fp3,fp3,fp11
- fcmpu cr5,fp2,fp3
- beq cr5,.Lnobias
- fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */
- bge cr1,.Lconvert /* x is positive so don't negate x. */
- fnabs fp3,fp3 /* -(|x|+=0.5) */
-.Lconvert:
- fctidz fp4,fp3 /* Convert to Integer double word round toward 0. */
- stfd fp4,-16(r1)
- nop
- nop
- nop
- ld r3,-16(r1) /* Load return as integer. */
-.Lout:
- blr
-.Lretzero: /* 0.5 > x > -0.5 */
- li r3,0 /* return 0. */
- b .Lout
-.Lnobias:
- fmr fp3,fp1
- b .Lconvert
- END (__llroundf)
-
-strong_alias (__llroundf, __lroundf)
-weak_alias (__llroundf, llroundf)
-weak_alias (__lroundf, lroundf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lrint.S b/sysdeps/powerpc/powerpc64/fpu/s_lrint.S
deleted file mode 100644
index d3c2fff581..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_lrint.S
+++ /dev/null
@@ -1 +0,0 @@
-/* __lrint is in s_llrint.c */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lround.S b/sysdeps/powerpc/powerpc64/fpu/s_lround.S
deleted file mode 100644
index 4306c405c4..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_lround.S
+++ /dev/null
@@ -1 +0,0 @@
-/* __lround is in s_llround.S */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S b/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S
deleted file mode 100644
index 6b2a4e37a6..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* __lroundf is in s_llroundf.S */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_nearbyint.S b/sysdeps/powerpc/powerpc64/fpu/s_nearbyint.S
deleted file mode 100644
index 3dcd04b1f3..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_nearbyint.S
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Round to int floating-point values. PowerPC64 version.
- Copyright (C) 2011-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Adhemerval Zanella <azanella@br.ibm.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 has been coded in assembler because GCC makes such a mess of it
- when it's coded in C. */
-
-#include <sysdep.h>
-#include <math_ldbl_opt.h>
-
-
-/* double [fp1] nearbyint(double [fp1] x) */
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-EALIGN (__nearbyint, 4, 0)
- CALL_MCOUNT 0
- fabs fp0,fp1
- lfd fp13,.LC0@toc(2)
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- bge cr7,.L10
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp1,fp12 /* if (x > 0.0) */
- ble cr7, L(lessthanzero)
- mffs fp11
- mtfsb0 4*cr7+lt /* Disable FE_INEXACT exception */
- fadd fp1,fp1,fp13 /* x+= TWO52 */
- fsub fp1,fp1,fp13 /* x-= TWO52 */
- fabs fp1,fp1 /* if (x == 0.0) */
- mtfsf 0xff,fp11 /* Restore FE_INEXACT state. */
- blr /* x = 0.0; */
-L(lessthanzero):
- bgelr cr7 /* if (x < 0.0) */
- mffs fp11
- mtfsb0 4*cr7+lt
- fsub fp1,fp1,fp13 /* x -= TWO52 */
- fadd fp1,fp1,fp13 /* x += TWO52 */
- fnabs fp1,fp1 /* if (x == 0.0) */
- mtfsf 0xff,fp11 /* Restore FE_INEXACT state. */
- blr /* x = -0.0; */
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
-END (__nearbyint)
-
-weak_alias (__nearbyint, nearbyint)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__nearbyint, nearbyint)
-strong_alias (__nearbyint, __nearbyintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S b/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S
deleted file mode 100644
index 11be35f94e..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Round to int floating-point values. PowerPC64 version.
- Copyright (C) 2011-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Adhemerval Zanella <azanella@br.ibm.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 has been coded in assembler because GCC makes such a mess of it
- when it's coded in C. */
-
-#include <sysdep.h>
-
-
-/* float [fp1] nearbyintf(float [fp1]) */
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
- .long 0x0
- .section ".text"
-
-EALIGN (__nearbyintf, 4, 0)
- CALL_MCOUNT 0
- fabs fp0,fp1
- lfs fp13,.LC0@toc(2)
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- bge cr7,.L10
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp1,fp12 /* if (x > 0.0) */
- ble cr7, L(lessthanzero)
- mffs fp11
- mtfsb0 4*cr7+lt /* Disable FE_INEXACT exception */
- fadds fp1,fp1,fp13 /* x += TWO23 */
- fsubs fp1,fp1,fp13 /* x -= TWO23 */
- fabs fp1,fp1 /* if (x == 0.0) */
- mtfsf 0xff,fp11 /* Restore FE_INEXACT state. */
- blr /* x = 0.0; */
-L(lessthanzero):
- bgelr cr7 /* if (x < 0.0) */
- mffs fp11
- mtfsb0 4*cr7+lt /* Disable FE_INEXACT exception */
- fsubs fp1,fp1,fp13 /* x -= TWO23 */
- fadds fp1,fp1,fp13 /* x += TWO23 */
- fnabs fp1,fp1 /* if (x == 0.0) */
- mtfsf 0xff,fp11 /* Restore FE_INEXACT state. */
- blr /* x = -0.0; */
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
-END (__nearbyintf)
-
-weak_alias (__nearbyintf, nearbyintf)
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rint.S b/sysdeps/powerpc/powerpc64/fpu/s_rint.S
deleted file mode 100644
index 7ba0adff84..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_rint.S
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Round to int floating-point values. PowerPC64 version.
- Copyright (C) 2004-2017 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/>. */
-
-/* This has been coded in assembler because GCC makes such a mess of it
- when it's coded in C. */
-
-#include <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-EALIGN (__rint, 4, 0)
- CALL_MCOUNT 0
- lfd fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl cr7,.L10
- bng cr6,.L4
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- blr /* x = 0.0; */
-.L4:
- bnllr cr6 /* if (x < 0.0) */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- blr /* x = -0.0; */
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
- END (__rint)
-
-weak_alias (__rint, rint)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__rint, rintl)
-strong_alias (__rint, __rintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __rint, rintl, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rintf.S b/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
deleted file mode 100644
index b1d1e158c0..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Round float to int floating-point values. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
- .long 0x0
- .section ".text"
-
-EALIGN (__rintf, 4, 0)
- CALL_MCOUNT 0
- lfs fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl cr7,.L10
- bng cr6,.L4
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fabs fp1,fp1 /* if (x == 0.0) */
- blr /* x = 0.0; */
-.L4:
- bnllr cr6 /* if (x < 0.0) */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- blr /* x = -0.0; */
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
- END (__rintf)
-
-weak_alias (__rintf, rintf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_round.S b/sysdeps/powerpc/powerpc64/fpu/s_round.S
deleted file mode 100644
index fe315af51d..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_round.S
+++ /dev/null
@@ -1,87 +0,0 @@
-/* round function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
-.LC1: /* 0.5 */
- .tc FD_3fe00000_0[TC],0x3fe0000000000000
- .section ".text"
-
-/* double [fp1] round (double x [fp1])
- IEEE 1003.1 round function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "Round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we can't use the PowerPC "Round to Nearest" mode. Instead we set
- "Round toward Zero" mode and round by adding +-0.5 before rounding
- to the integer value. */
-
-EALIGN (__round, 4, 0)
- CALL_MCOUNT 0
- lfd fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,1 /* Set rounding mode toward 0. */
- lfd fp10,.LC1@toc(2)
- ble- cr6,.L4
- fadd fp1,fp1,fp10 /* x+= 0.5; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- fsub fp9,fp1,fp10 /* x+= 0.5; */
- bge- cr6,.L9 /* if (x < 0.0) */
- fsub fp1,fp9,fp13 /* x-= TWO52; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
- END (__round)
-
-weak_alias (__round, round)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__round, roundl)
-strong_alias (__round, __roundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __round, roundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S b/sysdeps/powerpc/powerpc64/fpu/s_roundf.S
deleted file mode 100644
index d213f43566..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S
+++ /dev/null
@@ -1,81 +0,0 @@
-/* roundf function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
-.LC1: /* 0.5 */
- .long 0x3f000000
-
- .section ".text"
-
-/* float [fp1] roundf (float x [fp1])
- IEEE 1003.1 round function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "Round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we can't use the PowerPC "Round to Nearest" mode. Instead we set
- "Round toward Zero" mode and round by adding +-0.5 before rounding
- to the integer value. */
-
-EALIGN (__roundf, 4, 0)
- CALL_MCOUNT 0
- lfs fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,1 /* Set rounding mode toward 0. */
- lfs fp10,.LC1@toc(2)
- ble- cr6,.L4
- fadds fp1,fp1,fp10 /* x+= 0.5; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- fsubs fp9,fp1,fp10 /* x+= 0.5; */
- bge- cr6,.L9 /* if (x < 0.0) */
- fsubs fp1,fp9,fp13 /* x-= TWO23; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
- END (__roundf)
-
-weak_alias (__roundf, roundf)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_trunc.S b/sysdeps/powerpc/powerpc64/fpu/s_trunc.S
deleted file mode 100644
index 890eb21c54..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_trunc.S
+++ /dev/null
@@ -1,79 +0,0 @@
-/* trunc function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .section ".toc","aw"
-.LC0: /* 2**52 */
- .tc FD_43300000_0[TC],0x4330000000000000
- .section ".text"
-
-/* double [fp1] trunc (double x [fp1])
- IEEE 1003.1 trunc function. IEEE specifies "trunc to the integer
- value, in floating format, nearest to but no larger in magnitude
- then the argument."
- We set "round toward Zero" mode and trunc by adding +-2**52 then
- subtracting +-2**52. */
-
-EALIGN (__trunc, 4, 0)
- CALL_MCOUNT 0
- lfd fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsub fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,1 /* Set rounding toward 0 mode. */
- ble- cr6,.L4
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsub fp1,fp1,fp13 /* x-= TWO52; */
- fadd fp1,fp1,fp13 /* x+= TWO52; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadd fp1,fp1,fp1
- blr
- END (__trunc)
-
-weak_alias (__trunc, trunc)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__trunc, truncl)
-strong_alias (__trunc, __truncl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __trunc, truncl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_truncf.S b/sysdeps/powerpc/powerpc64/fpu/s_truncf.S
deleted file mode 100644
index cfcff80bf7..0000000000
--- a/sysdeps/powerpc/powerpc64/fpu/s_truncf.S
+++ /dev/null
@@ -1,73 +0,0 @@
-/* truncf function. PowerPC64 version.
- Copyright (C) 2004-2017 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 <sysdep.h>
-
- .section ".toc","aw"
- .p2align 3
-.LC0: /* 2**23 */
- .long 0x4b000000
- .long 0x0
- .section ".text"
-
-/* float [fp1] truncf (float x [fp1])
- IEEE 1003.1 trunc function. IEEE specifies "trunc to the integer
- value, in floating format, nearest to but no larger in magnitude
- then the argument."
- We set "round toward Zero" mode and trunc by adding +-2**23 then
- subtracting +-2**23. */
-
-EALIGN (__truncf, 4, 0)
- CALL_MCOUNT 0
- lfs fp13,.LC0@toc(2)
- fabs fp0,fp1
- fsubs fp12,fp13,fp13 /* generate 0.0 */
- fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
- mffs fp11 /* Save current FPU rounding mode and
- "inexact" state. */
- fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
- bnl- cr7,.L10
- mtfsfi 7,1 /* Set rounding toward 0 mode. */
- ble- cr6,.L4
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L4:
- bge- cr6,.L9 /* if (x < 0.0) */
- fsubs fp1,fp1,fp13 /* x-= TWO23; */
- fadds fp1,fp1,fp13 /* x+= TWO23; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
- mtfsf 0xff,fp11 /* Restore previous rounding mode and
- "inexact" state. */
- blr
-.L10:
- /* Ensure sNaN input is converted to qNaN. */
- fcmpu cr7,fp1,fp1
- beqlr cr7
- fadds fp1,fp1,fp1
- blr
- END (__truncf)
-
-weak_alias (__truncf, truncf)
-
diff --git a/sysdeps/powerpc/powerpc64/hp-timing.h b/sysdeps/powerpc/powerpc64/hp-timing.h
deleted file mode 100644
index 33064c6781..0000000000
--- a/sysdeps/powerpc/powerpc64/hp-timing.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* High precision, low overhead timing functions. powerpc64 version.
- Copyright (C) 2005-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- 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 _HP_TIMING_H
-#define _HP_TIMING_H 1
-
-/* We always assume having the timestamp register. */
-#define HP_TIMING_AVAIL (1)
-#define HP_SMALL_TIMING_AVAIL (1)
-
-/* We indeed have inlined functions. */
-#define HP_TIMING_INLINE (1)
-
-/* We use 64bit values for the times. */
-typedef unsigned long long int hp_timing_t;
-
-/* That's quite simple. Use the `mftb' instruction. Note that the value
- might not be 100% accurate since there might be some more instructions
- running in this moment. This could be changed by using a barrier like
- 'lwsync' right before the `mftb' instruction. But we are not interested
- in accurate clock cycles here so we don't do this. */
-#ifdef _ARCH_PWR4
-#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mfspr %0,268" : "=r" (Var))
-#else
-#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var))
-#endif
-
-#include <hp-timing-common.h>
-
-#endif /* hp-timing.h */
diff --git a/sysdeps/powerpc/powerpc64/lshift.S b/sysdeps/powerpc/powerpc64/lshift.S
deleted file mode 100644
index 480e38688b..0000000000
--- a/sysdeps/powerpc/powerpc64/lshift.S
+++ /dev/null
@@ -1,177 +0,0 @@
-/* PowerPC64 mpn_lshift -- rp[] = up[] << cnt
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-#define RP r3
-#define UP r4
-#define N r5
-#define CNT r6
-
-#define TNC r0
-#define U0 r30
-#define U1 r31
-#define RETVAL r5
-
-EALIGN(__mpn_lshift, 5, 0)
- std U1, -8(r1)
- std U0, -16(r1)
- subfic TNC, CNT, 64
- sldi r7, N, RP
- add UP, UP, r7
- add RP, RP, r7
- rldicl. U0, N, 0, 62
- cmpdi CNT, U0, 2
- addi U1, N, RP
- ld r10, -8(UP)
- srd RETVAL, r10, TNC
-
- srdi U1, U1, 2
- mtctr U1
- beq cr0, L(b00)
- blt cr6, L(b01)
- ld r11, -16(UP)
- beq cr6, L(b10)
-
- .align 4
-L(b11): sld r8, r10, CNT
- srd r9, r11, TNC
- ld U1, -24(UP)
- addi UP, UP, -24
- sld r12, r11, CNT
- srd r7, U1, TNC
- addi RP, RP, 16
- bdnz L(gt3)
-
- or r11, r8, r9
- sld r8, U1, CNT
- b L(cj3)
-
- .align 4
-L(gt3): ld U0, -8(UP)
- or r11, r8, r9
- sld r8, U1, CNT
- srd r9, U0, TNC
- ld U1, -16(UP)
- or r10, r12, r7
- b L(L11)
-
- .align 5
-L(b10): sld r12, r10, CNT
- addi RP, RP, 24
- srd r7, r11, TNC
- bdnz L(gt2)
-
- sld r8, r11, CNT
- or r10, r12, r7
- b L(cj2)
-
-L(gt2): ld U0, -24(UP)
- sld r8, r11, CNT
- srd r9, U0, TNC
- ld U1, -32(UP)
- or r10, r12, r7
- sld r12, U0, CNT
- srd r7, U1, 0
- ld U0, -40(UP)
- or r11, r8, r9
- addi UP, UP, -16
- b L(L10)
-
- .align 4
-L(b00): ld U1, -16(UP)
- sld r12, r10, CNT
- srd r7, U1, TNC
- ld U0, -24(UP)
- sld r8, U1, CNT
- srd r9, U0, TNC
- ld U1, -32(UP)
- or r10, r12, r7
- sld r12, U0, CNT
- srd r7, U1, TNC
- addi RP, RP, r8
- bdz L(cj4)
-
-L(gt4): addi UP, UP, -32
- ld U0, -8(UP)
- or r11, r8, r9
- b L(L00)
-
- .align 4
-L(b01): bdnz L(gt1)
- sld r8, r10, CNT
- std r8, -8(RP)
- b L(ret)
-
-L(gt1): ld U0, -16(UP)
- sld r8, r10, CNT
- srd r9, U0, TNC
- ld U1, -24(UP)
- sld r12, U0, CNT
- srd r7, U1, TNC
- ld U0, -32(UP)
- or r11, r8, r9
- sld r8, U1, CNT
- srd r9, U0, TNC
- ld U1, -40(UP)
- addi UP, UP, -40
- or r10, r12, r7
- bdz L(end)
-
- .align 5
-L(top): sld r12, U0, CNT
- srd r7, U1, TNC
- ld U0, -8(UP)
- std r11, -8(RP)
- or r11, r8, r9
-L(L00): sld r8, U1, CNT
- srd r9, U0, TNC
- ld U1, -16(UP)
- std r10, -16(RP)
- or r10, r12, r7
-L(L11): sld r12, U0, CNT
- srd r7, U1, TNC
- ld U0, -24(UP)
- std r11, -24(RP)
- or r11, r8, r9
-L(L10): sld r8, U1, CNT
- srd r9, U0, TNC
- ld U1, -32(UP)
- addi UP, UP, -32
- std r10, -32(RP)
- addi RP, RP, -32
- or r10, r12, r7
- bdnz L(top)
-
- .align 5
-L(end): sld r12, U0, CNT
- srd r7, U1, TNC
- std r11, -8(RP)
-L(cj4): or r11, r8, r9
- sld r8, U1, CNT
- std r10, -16(RP)
-L(cj3): or r10, r12, r7
- std r11, -24(RP)
-L(cj2): std r10, -32(RP)
- std r8, -40(RP)
-
-L(ret): ld U1, -8(r1)
- ld U0, -16(r1)
- mr RP, RETVAL
- blr
-END(__mpn_lshift)
diff --git a/sysdeps/powerpc/powerpc64/memcpy.S b/sysdeps/powerpc/powerpc64/memcpy.S
deleted file mode 100644
index a4c82c31ef..0000000000
--- a/sysdeps/powerpc/powerpc64/memcpy.S
+++ /dev/null
@@ -1,397 +0,0 @@
-/* Optimized memcpy implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
- Returns 'dst'.
-
- Memcpy handles short copies (< 32-bytes) using a binary move blocks
- (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled
- with the appropriate combination of byte and halfword load/stores.
- There is minimal effort to optimize the alignment of short moves.
- The 64-bit implementations of POWER3 and POWER4 do a reasonable job
- of handling unaligned load/stores that do not cross 32-byte boundaries.
-
- Longer moves (>= 32-bytes) justify the effort to get at least the
- destination doubleword (8-byte) aligned. Further optimization is
- possible when both source and destination are doubleword aligned.
- Each case has a optimized unrolled loop. */
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
-
-EALIGN (MEMCPY, 5, 0)
- CALL_MCOUNT 3
-
- cmpldi cr1,5,31
- neg 0,3
- std 3,-16(1)
- std 31,-8(1)
- cfi_offset(31,-8)
- andi. 11,3,7 /* check alignment of dst. */
- clrldi 0,0,61 /* Number of bytes until the 1st doubleword of dst. */
- clrldi 10,4,61 /* check alignment of src. */
- cmpldi cr6,5,8
- ble- cr1,.L2 /* If move < 32 bytes use short move code. */
- cmpld cr6,10,11
- mr 12,4
- srdi 9,5,3 /* Number of full double words remaining. */
- mtcrf 0x01,0
- mr 31,5
- beq .L0
-
- subf 31,0,5
- /* Move 0-7 bytes as needed to get the destination doubleword aligned. */
-1: bf 31,2f
- lbz 6,0(12)
- addi 12,12,1
- stb 6,0(3)
- addi 3,3,1
-2: bf 30,4f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-4: bf 29,0f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-0:
- clrldi 10,12,61 /* check alignment of src again. */
- srdi 9,31,3 /* Number of full double words remaining. */
-
- /* Copy doublewords from source to destination, assuming the
- destination is aligned on a doubleword boundary.
-
- At this point we know there are at least 25 bytes left (32-7) to copy.
- The next step is to determine if the source is also doubleword aligned.
- If not branch to the unaligned move code at .L6. which uses
- a load, shift, store strategy.
-
- Otherwise source and destination are doubleword aligned, and we can
- the optimized doubleword copy loop. */
-.L0:
- clrldi 11,31,61
- mtcrf 0x01,9
- bne- cr6,.L6 /* If source is not DW aligned. */
-
- /* Move doublewords where destination and source are DW aligned.
- Use a unrolled loop to copy 4 doubleword (32-bytes) per iteration.
- If the copy is not an exact multiple of 32 bytes, 1-3
- doublewords are copied as needed to set up the main loop. After
- the main loop exits there may be a tail of 1-7 bytes. These byte are
- copied a word/halfword/byte at a time as needed to preserve alignment. */
-
- srdi 8,31,5
- cmpldi cr1,9,4
- cmpldi cr6,11,0
- mr 11,12
-
- bf 30,1f
- ld 6,0(12)
- ld 7,8(12)
- addi 11,12,16
- mtctr 8
- std 6,0(3)
- std 7,8(3)
- addi 10,3,16
- bf 31,4f
- ld 0,16(12)
- std 0,16(3)
- blt cr1,3f
- addi 11,12,24
- addi 10,3,24
- b 4f
- .align 4
-1:
- mr 10,3
- mtctr 8
- bf 31,4f
- ld 6,0(12)
- addi 11,12,8
- std 6,0(3)
- addi 10,3,8
-
- .align 4
-4:
- ld 6,0(11)
- ld 7,8(11)
- ld 8,16(11)
- ld 0,24(11)
- addi 11,11,32
-2:
- std 6,0(10)
- std 7,8(10)
- std 8,16(10)
- std 0,24(10)
- addi 10,10,32
- bdnz 4b
-3:
-
- rldicr 0,31,0,60
- mtcrf 0x01,31
- beq cr6,0f
-.L9:
- add 3,3,0
- add 12,12,0
-
-/* At this point we have a tail of 0-7 bytes and we know that the
- destination is double word aligned. */
-4: bf 29,2f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: bf 30,1f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: bf 31,0f
- lbz 6,0(12)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- blr
-
-/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31
- bytes. Each case is handled without loops, using binary (1,2,4,8)
- tests.
-
- In the short (0-8 byte) case no attempt is made to force alignment
- of either source or destination. The hardware will handle the
- unaligned load/stores with small delays for crossing 32- 64-byte, and
- 4096-byte boundaries. Since these short moves are unlikely to be
- unaligned or cross these boundaries, the overhead to force
- alignment is not justified.
-
- The longer (9-31 byte) move is more likely to cross 32- or 64-byte
- boundaries. Since only loads are sensitive to the 32-/64-byte
- boundaries it is more important to align the source then the
- destination. If the source is not already word aligned, we first
- move 1-3 bytes as needed. Since we are only word aligned we don't
- use double word load/stores to insure that all loads are aligned.
- While the destination and stores may still be unaligned, this
- is only an issue for page (4096 byte boundary) crossing, which
- should be rare for these short moves. The hardware handles this
- case automatically with a small delay. */
-
- .align 4
-.L2:
- mtcrf 0x01,5
- neg 8,4
- clrrdi 11,4,2
- andi. 0,8,3
- ble cr6,.LE8 /* Handle moves of 0-8 bytes. */
-/* At least 9 bytes left. Get the source word aligned. */
- cmpldi cr1,5,16
- mr 10,5
- mr 12,4
- cmpldi cr6,0,2
- beq .L3 /* If the source is already word aligned skip this. */
-/* Copy 1-3 bytes to get source address word aligned. */
- lwz 6,0(11)
- subf 10,0,5
- add 12,4,0
- blt cr6,5f
- srdi 7,6,16
- bgt cr6,3f
-#ifdef __LITTLE_ENDIAN__
- sth 7,0(3)
-#else
- sth 6,0(3)
-#endif
- b 7f
- .align 4
-3:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,24
- stb 6,0(3)
- sth 7,1(3)
-#else
- stb 7,0(3)
- sth 6,1(3)
-#endif
- b 7f
- .align 4
-5:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,8
-#endif
- stb 6,0(3)
-7:
- cmpldi cr1,10,16
- add 3,3,0
- mtcrf 0x01,10
- .align 4
-.L3:
-/* At least 6 bytes left and the source is word aligned. */
- blt cr1,8f
-16: /* Move 16 bytes. */
- lwz 6,0(12)
- lwz 7,4(12)
- stw 6,0(3)
- lwz 6,8(12)
- stw 7,4(3)
- lwz 7,12(12)
- addi 12,12,16
- stw 6,8(3)
- stw 7,12(3)
- addi 3,3,16
-8: /* Move 8 bytes. */
- bf 28,4f
- lwz 6,0(12)
- lwz 7,4(12)
- addi 12,12,8
- stw 6,0(3)
- stw 7,4(3)
- addi 3,3,8
-4: /* Move 4 bytes. */
- bf 29,2f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: /* Move 2-3 bytes. */
- bf 30,1f
- lhz 6,0(12)
- sth 6,0(3)
- bf 31,0f
- lbz 7,2(12)
- stb 7,2(3)
- ld 3,-16(1)
- blr
-1: /* Move 1 byte. */
- bf 31,0f
- lbz 6,0(12)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
-/* Special case to copy 0-8 bytes. */
- .align 4
-.LE8:
- mr 12,4
- bne cr6,4f
-/* Would have liked to use use ld/std here but the 630 processors are
- slow for load/store doubles that are not at least word aligned.
- Unaligned Load/Store word execute with only a 1 cycle penalty. */
- lwz 6,0(4)
- lwz 7,4(4)
- stw 6,0(3)
- stw 7,4(3)
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
- .align 4
-4: bf 29,2b
- lwz 6,0(4)
- stw 6,0(3)
-6:
- bf 30,5f
- lhz 7,4(4)
- sth 7,4(3)
- bf 31,0f
- lbz 8,6(4)
- stb 8,6(3)
- ld 3,-16(1)
- blr
- .align 4
-5:
- bf 31,0f
- lbz 6,4(4)
- stb 6,4(3)
- .align 4
-0:
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
- .align 4
-.L6:
-
- /* Copy doublewords where the destination is aligned but the source is
- not. Use aligned doubleword loads from the source, shifted to realign
- the data, to allow aligned destination stores. */
- subf 5,10,12
- andi. 0,9,1
- cmpldi cr6,11,0
- sldi 10,10,3
- mr 11,9
- mr 4,3
- ld 6,0(5)
- ld 7,8(5)
- subfic 9,10,64
- beq 2f
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
-#else
- sld 0,6,10
-#endif
- cmpldi 11,1
- mr 6,7
- addi 4,4,-8
- addi 11,11,-1
- b 1f
-2: addi 5,5,8
- .align 4
-#ifdef __LITTLE_ENDIAN__
-0: srd 0,6,10
- sld 8,7,9
-#else
-0: sld 0,6,10
- srd 8,7,9
-#endif
- cmpldi 11,2
- ld 6,8(5)
- or 0,0,8
- addi 11,11,-2
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srd 0,7,10
-1: sld 8,6,9
-#else
- sld 0,7,10
-1: srd 8,6,9
-#endif
- or 0,0,8
- beq 8f
- ld 7,16(5)
- std 0,8(4)
- addi 5,5,16
- addi 4,4,16
- b 0b
- .align 4
-8:
- std 0,8(4)
- rldicr 0,31,0,60
- mtcrf 0x01,31
- bne cr6,.L9 /* If the tail is 0 bytes we are done! */
- /* Return original dst pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- blr
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/memset.S b/sysdeps/powerpc/powerpc64/memset.S
deleted file mode 100644
index f6581b50f7..0000000000
--- a/sysdeps/powerpc/powerpc64/memset.S
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Optimized memset implementation for PowerPC64.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
- .section ".toc","aw"
-.LC0:
- .tc __cache_line_size[TC],__cache_line_size
- .section ".text"
- .align 2
-
-/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
- Returns 's'.
-
- The memset is done in three sizes: byte (8 bits), word (32 bits),
- cache line (256 bits). There is a special case for setting cache lines
- to 0, to take advantage of the dcbz instruction. */
-
-#ifndef MEMSET
-# define MEMSET memset
-#endif
-
-EALIGN (MEMSET, 5, 0)
- CALL_MCOUNT 3
-
-#define rTMP r0
-#define rRTN r3 /* Initial value of 1st argument. */
-#define rMEMP0 r3 /* Original value of 1st arg. */
-#define rCHR r4 /* Char to set in each byte. */
-#define rLEN r5 /* Length of region to set. */
-#define rMEMP r6 /* Address at which we are storing. */
-#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
-#define rMEMP2 r8
-
-#define rNEG64 r8 /* Constant -64 for clearing with dcbz. */
-#define rCLS r8 /* Cache line size obtained from static. */
-#define rCLM r9 /* Cache line size mask to check for cache alignment. */
-L(_memset):
-/* Take care of case for size <= 4. */
- cmpldi cr1, rLEN, 8
- andi. rALIGN, rMEMP0, 7
- mr rMEMP, rMEMP0
- ble- cr1, L(small)
-
-/* Align to doubleword boundary. */
- cmpldi cr5, rLEN, 31
- insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */
- beq+ L(aligned2)
- mtcrf 0x01, rMEMP0
- subfic rALIGN, rALIGN, 8
- cror 28,30,31 /* Detect odd word aligned. */
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
- bt 29, L(g4)
-/* Process the even word of doubleword. */
- bf+ 31, L(g2)
- stb rCHR, 0(rMEMP0)
- bt 30, L(g4x)
-L(g2):
- sth rCHR, -6(rMEMP)
-L(g4x):
- stw rCHR, -4(rMEMP)
- b L(aligned)
-/* Process the odd word of doubleword. */
-L(g4):
- bf 28, L(g4x) /* If false, word aligned on odd word. */
- bf+ 31, L(g0)
- stb rCHR, 0(rMEMP0)
- bt 30, L(aligned)
-L(g0):
- sth rCHR, -2(rMEMP)
-
-/* Handle the case of size < 31. */
-L(aligned2):
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
-L(aligned):
- mtcrf 0x01, rLEN
- ble cr5, L(medium)
-/* Align to 32-byte boundary. */
- andi. rALIGN, rMEMP, 0x18
- subfic rALIGN, rALIGN, 0x20
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- beq L(caligned)
- mtcrf 0x01, rALIGN
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- cmplwi cr1, rALIGN, 0x10
- mr rMEMP2, rMEMP
- bf 28, L(a1)
- stdu rCHR, -8(rMEMP2)
-L(a1): blt cr1, L(a2)
- std rCHR, -8(rMEMP2)
- stdu rCHR, -16(rMEMP2)
-L(a2):
-
-/* Now aligned to a 32 byte boundary. */
-L(caligned):
- cmpldi cr1, rCHR, 0
- clrrdi. rALIGN, rLEN, 5
- mtcrf 0x01, rLEN
- beq cr1, L(zloopstart) /* Special case for clearing memory using dcbz. */
-L(nondcbz):
- srdi rTMP, rALIGN, 5
- mtctr rTMP
- beq L(medium) /* We may not actually get to do a full line. */
- clrldi. rLEN, rLEN, 59
- add rMEMP, rMEMP, rALIGN
- li rNEG64, -0x40
- bdz L(cloopdone)
-
-L(c3): dcbtst rNEG64, rMEMP
- std rCHR, -8(rMEMP)
- std rCHR, -16(rMEMP)
- std rCHR, -24(rMEMP)
- stdu rCHR, -32(rMEMP)
- bdnz L(c3)
-L(cloopdone):
- std rCHR, -8(rMEMP)
- std rCHR, -16(rMEMP)
- cmpldi cr1, rLEN, 16
- std rCHR, -24(rMEMP)
- stdu rCHR, -32(rMEMP)
- beqlr
- add rMEMP, rMEMP, rALIGN
- b L(medium_tail2)
-
- .align 5
-/* Clear lines of memory in 128-byte chunks. */
-L(zloopstart):
-/* If the remaining length is less the 32 bytes, don't bother getting
- the cache line size. */
- beq L(medium)
- ld rCLS,.LC0@toc(r2)
- lwz rCLS,0(rCLS)
-/* If the cache line size was not set just goto to L(nondcbz) which is
- safe for any cache line size. */
- cmpldi cr1,rCLS,0
- beq cr1,L(nondcbz)
-
-
-/* Now we know the cache line size, and it is not 32-bytes, but
- we may not yet be aligned to the cache line. May have a partial
- line to fill, so touch it 1st. */
- dcbt 0,rMEMP
- addi rCLM,rCLS,-1
-L(getCacheAligned):
- cmpldi cr1,rLEN,32
- and. rTMP,rCLM,rMEMP
- blt cr1,L(handletail32)
- beq L(cacheAligned)
- addi rMEMP,rMEMP,32
- addi rLEN,rLEN,-32
- std rCHR,-32(rMEMP)
- std rCHR,-24(rMEMP)
- std rCHR,-16(rMEMP)
- std rCHR,-8(rMEMP)
- b L(getCacheAligned)
-
-/* Now we are aligned to the cache line and can use dcbz. */
-L(cacheAligned):
- cmpld cr1,rLEN,rCLS
- blt cr1,L(handletail32)
- dcbz 0,rMEMP
- subf rLEN,rCLS,rLEN
- add rMEMP,rMEMP,rCLS
- b L(cacheAligned)
-
-/* We are here because the cache line size was set and was not 32-bytes
- and the remainder (rLEN) is less than the actual cache line size.
- So set up the preconditions for L(nondcbz) and go there. */
-L(handletail32):
- clrrwi. rALIGN, rLEN, 5
- b L(nondcbz)
-
- .align 5
-L(small):
-/* Memset of 8 bytes or less. */
- cmpldi cr6, rLEN, 4
- cmpldi cr5, rLEN, 1
- ble cr6,L(le4)
- subi rLEN, rLEN, 4
- stb rCHR,0(rMEMP)
- stb rCHR,1(rMEMP)
- stb rCHR,2(rMEMP)
- stb rCHR,3(rMEMP)
- addi rMEMP,rMEMP, 4
- cmpldi cr5, rLEN, 1
-L(le4):
- cmpldi cr1, rLEN, 3
- bltlr cr5
- stb rCHR, 0(rMEMP)
- beqlr cr5
- stb rCHR, 1(rMEMP)
- bltlr cr1
- stb rCHR, 2(rMEMP)
- beqlr cr1
- stb rCHR, 3(rMEMP)
- blr
-
-/* Memset of 0-31 bytes. */
- .align 5
-L(medium):
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- cmpldi cr1, rLEN, 16
-L(medium_tail2):
- add rMEMP, rMEMP, rLEN
-L(medium_tail):
- bt- 31, L(medium_31t)
- bt- 30, L(medium_30t)
-L(medium_30f):
- bt- 29, L(medium_29t)
-L(medium_29f):
- bge- cr1, L(medium_27t)
- bflr- 28
- std rCHR, -8(rMEMP)
- blr
-
-L(medium_31t):
- stbu rCHR, -1(rMEMP)
- bf- 30, L(medium_30f)
-L(medium_30t):
- sthu rCHR, -2(rMEMP)
- bf- 29, L(medium_29f)
-L(medium_29t):
- stwu rCHR, -4(rMEMP)
- blt- cr1, L(medium_27f)
-L(medium_27t):
- std rCHR, -8(rMEMP)
- stdu rCHR, -16(rMEMP)
-L(medium_27f):
- bflr- 28
-L(medium_28t):
- std rCHR, -8(rMEMP)
- blr
-END_GEN_TB (MEMSET,TB_TOCLESS)
-libc_hidden_builtin_def (memset)
-
-#ifndef NO_BZERO_IMPL
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. */
-ENTRY (__bzero)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END_GEN_TB (__bzero,TB_TOCLESS)
-
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/mul_1.S b/sysdeps/powerpc/powerpc64/mul_1.S
deleted file mode 100644
index 68e85cbdc8..0000000000
--- a/sysdeps/powerpc/powerpc64/mul_1.S
+++ /dev/null
@@ -1,135 +0,0 @@
-/* PowerPC64 __mpn_mul_1 -- Multiply a limb vector with a limb and store
- the result in a second limb vector.
- Copyright (C) 1999-2017 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 <sysdep.h>
-
-#define RP r3
-#define UP r4
-#define N r5
-#define VL r6
-
-EALIGN(__mpn_mul_1, 5, 0)
- std r27, -40(r1)
- std r26, -48(r1)
- li r12, 0
- ld r26, 0(UP)
-
- rldicl. r0, N, 0, 62
- cmpdi VL, r0, 2
- addic N, N, RP
- srdi N, N, 2
- mtctr N
- beq cr0, L(b00)
- blt cr6, L(b01)
- beq cr6, L(b10)
-
-L(b11): mr cr7, r12
- mulld cr0, r26, VL
- mulhdu r12, r26, VL
- addi UP, UP, 8
- addc r0, r0, r7
- std r0, 0(RP)
- addi RP, RP, 8
- b L(fic)
-
-L(b00): ld r27, r8(UP)
- addi UP, UP, 16
- mulld r0, r26, VL
- mulhdu N, r26, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- addc r0, r0, r12
- adde r7, r7, N
- addze r12, r8
- std r0, 0(RP)
- std r7, 8(RP)
- addi RP, RP, 16
- b L(fic)
-
- nop
-L(b01): bdnz L(gt1)
- mulld r0, r26, VL
- mulhdu r8, r26, VL
- addc r0, r0, r12
- std r0, 0(RP)
- b L(ret)
-L(gt1): ld r27, 8(UP)
- nop
- mulld r0, r26, VL
- mulhdu N, r26, VL
- ld r26, 16(UP)
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- mulld r9, r26, VL
- mulhdu r10, r26, VL
- addc r0, r0, r12
- adde r7, r7, N
- adde r9, r9, r8
- addze r12, r10
- std r0, 0(RP)
- std r7, 8(RP)
- std r9, 16(RP)
- addi UP, UP, 24
- addi RP, RP, 24
- b L(fic)
-
- nop
-L(fic): ld r26, 0(UP)
-L(b10): ld r27, 8(UP)
- addi UP, UP, 16
- bdz L(end)
-
-L(top): mulld r0, r26, VL
- mulhdu N, r26, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- ld r26, 0(UP)
- ld r27, 8(UP)
- adde r0, r0, r12
- adde r7, r7, N
- mulld r9, r26, VL
- mulhdu r10, r26, VL
- mulld r11, r27, VL
- mulhdu r12, r27, VL
- ld r26, 16(UP)
- ld r27, 24(UP)
- std r0, 0(RP)
- adde r9, r9, r8
- std r7, 8(RP)
- adde r11, r11, r10
- std r9, 16(RP)
- addi UP, UP, 32
- std r11, 24(RP)
-
- addi RP, RP, 32
- bdnz L(top)
-
-L(end): mulld r0, r26, VL
- mulhdu N, r26, VL
- mulld r7, r27, VL
- mulhdu r8, r27, VL
- adde r0, r0, r12
- adde r7, r7, N
- std r0, 0(RP)
- std r7, 8(RP)
-L(ret): addze RP, r8
- ld r27, -40(r1)
- ld r26, -48(r1)
- blr
-END(__mpn_mul_1)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
deleted file mode 100644
index 5da9052993..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-ifeq ($(subdir),string)
-sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \
- memcpy-power4 memcpy-ppc64 \
- memcmp-power8 memcmp-power7 memcmp-power4 memcmp-ppc64 \
- memset-power7 memset-power6 memset-power4 \
- memset-ppc64 memset-power8 \
- mempcpy-power7 mempcpy-ppc64 memchr-power7 memchr-ppc64 \
- memrchr-power7 memrchr-ppc64 rawmemchr-power7 \
- rawmemchr-ppc64 strlen-power7 strlen-ppc64 \
- strnlen-power8 strnlen-power7 strnlen-ppc64 \
- strcasecmp-power7 strcasecmp_l-power7 \
- strncase-power7 strncase_l-power7 \
- strncmp-power9 strncmp-power8 strncmp-power7 \
- strncmp-power4 strncmp-ppc64 \
- strchr-power8 strchr-power7 strchr-ppc64 \
- strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \
- strcpy-power8 strcpy-power7 strcpy-ppc64 stpcpy-power8 \
- stpcpy-power7 stpcpy-ppc64 \
- strrchr-power8 strrchr-power7 strrchr-ppc64 \
- strncat-power8 strncat-power7 strncat-ppc64 \
- strncpy-power7 strncpy-ppc64 \
- stpncpy-power8 stpncpy-power7 stpncpy-ppc64 \
- strcmp-power9 strcmp-power8 strcmp-power7 strcmp-ppc64 \
- strcat-power8 strcat-power7 strcat-ppc64 \
- memmove-power7 memmove-ppc64 wordcopy-ppc64 bcopy-ppc64 \
- strncpy-power8 strstr-power7 strstr-ppc64 \
- strspn-power8 strspn-ppc64 strcspn-power8 strcspn-ppc64 \
- strlen-power8 strcasestr-power8 strcasestr-ppc64 \
- strcasecmp-ppc64 strcasecmp-power8 strncase-ppc64 \
- strncase-power8
-
-CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops
-CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops
-endif
-
-ifeq ($(subdir),wcsmbs)
-sysdep_routines += wcschr-power7 wcschr-power6 wcschr-ppc64 \
- wcsrchr-power7 wcsrchr-power6 wcsrchr-ppc64 \
- wcscpy-power7 wcscpy-power6 wcscpy-ppc64 \
-
-CFLAGS-wcschr-power7.c += -mcpu=power7
-CFLAGS-wcschr-power6.c += -mcpu=power6
-CFLAGS-wcsrchr-power7.c += -mcpu=power7
-CFLAGS-wcsrchr-power6.c += -mcpu=power6
-CFLAGS-wcscpy-power7.c += -mcpu=power7
-CFLAGS-wcscpy-power6.c += -mcpu=power6
-endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/bcopy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/bcopy-ppc64.c
deleted file mode 100644
index a8a097a614..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/bcopy-ppc64.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* PowerPC64 default bcopy.
- Copyright (C) 2014-2017 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 <string.h>
-
-extern __typeof (bcopy) __bcopy_ppc attribute_hidden;
-extern __typeof (memmove) __memmove_ppc attribute_hidden;
-
-void __bcopy_ppc (const void *src, void *dest, size_t n)
-{
- __memmove_ppc (dest, src, n);
-}
diff --git a/sysdeps/powerpc/powerpc64/multiarch/bcopy.c b/sysdeps/powerpc/powerpc64/multiarch/bcopy.c
deleted file mode 100644
index 05d46e2b48..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/bcopy.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* PowerPC64 multiarch bcopy.
- Copyright (C) 2014-2017 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 <string.h>
-#include "init-arch.h"
-
-extern __typeof (bcopy) __bcopy_ppc attribute_hidden;
-/* __bcopy_power7 symbol is implemented at memmove-power7.S */
-extern __typeof (bcopy) __bcopy_power7 attribute_hidden;
-
-libc_ifunc (bcopy,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __bcopy_power7
- : __bcopy_ppc);
diff --git a/sysdeps/powerpc/powerpc64/multiarch/bzero.c b/sysdeps/powerpc/powerpc64/multiarch/bzero.c
deleted file mode 100644
index 83b224b8d3..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/bzero.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Multiple versions of bzero. PowerPC64 version.
- Copyright (C) 2013-2017 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 multiple versions only for definition in libc. */
-#if IS_IN (libc)
-# include <string.h>
-# include <strings.h>
-# include "init-arch.h"
-
-extern __typeof (bzero) __bzero_ppc attribute_hidden;
-extern __typeof (bzero) __bzero_power4 attribute_hidden;
-extern __typeof (bzero) __bzero_power6 attribute_hidden;
-extern __typeof (bzero) __bzero_power7 attribute_hidden;
-extern __typeof (bzero) __bzero_power8 attribute_hidden;
-
-libc_ifunc (__bzero,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __bzero_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __bzero_power7 :
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __bzero_power6 :
- (hwcap & PPC_FEATURE_POWER4)
- ? __bzero_power4
- : __bzero_ppc);
-
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
deleted file mode 100644
index eb173f8b05..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* Enumerate available IFUNC implementations of a function. PowerPC64 version.
- Copyright (C) 2013-2017 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 <assert.h>
-#include <string.h>
-#include <wchar.h>
-#include <ldsodefs.h>
-#include <ifunc-impl-list.h>
-
-/* Maximum number of IFUNC implementations. */
-#define MAX_IFUNC 6
-
-size_t
-__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
- size_t max)
-{
- assert (max >= MAX_IFUNC);
-
- size_t i = 0;
-
- unsigned long int hwcap = GLRO(dl_hwcap);
- unsigned long int hwcap2 = GLRO(dl_hwcap2);
-
- /* hwcap contains only the latest supported ISA, the code checks which is
- and fills the previous supported ones. */
- if (hwcap & PPC_FEATURE_ARCH_2_06)
- hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS |
- PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
- else if (hwcap & PPC_FEATURE_ARCH_2_05)
- hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
- else if (hwcap & PPC_FEATURE_POWER5_PLUS)
- hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
- else if (hwcap & PPC_FEATURE_POWER5)
- hwcap |= PPC_FEATURE_POWER4;
-
-#ifdef SHARED
- /* Support sysdeps/powerpc/powerpc64/multiarch/memcpy.c. */
- IFUNC_IMPL (i, name, memcpy,
- IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_HAS_VSX,
- __memcpy_power7)
- IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06,
- __memcpy_a2)
- IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_05,
- __memcpy_power6)
- IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_CELL_BE,
- __memcpy_cell)
- IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_POWER4,
- __memcpy_power4)
- IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/memmove.c. */
- IFUNC_IMPL (i, name, memmove,
- IFUNC_IMPL_ADD (array, i, memmove, hwcap & PPC_FEATURE_HAS_VSX,
- __memmove_power7)
- IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/memset.c. */
- IFUNC_IMPL (i, name, memset,
- IFUNC_IMPL_ADD (array, i, memset, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __memset_power8)
- IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_HAS_VSX,
- __memset_power7)
- IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_05,
- __memset_power6)
- IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_POWER4,
- __memset_power4)
- IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c. */
- IFUNC_IMPL (i, name, strcpy,
- IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcpy_power8)
- IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_HAS_VSX,
- __strcpy_power7)
- IFUNC_IMPL_ADD (array, i, strcpy, 1,
- __strcpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c. */
- IFUNC_IMPL (i, name, stpcpy,
- IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __stpcpy_power8)
- IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_HAS_VSX,
- __stpcpy_power7)
- IFUNC_IMPL_ADD (array, i, stpcpy, 1,
- __stpcpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strlen.c. */
- IFUNC_IMPL (i, name, strlen,
- IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strlen_power8)
- IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_HAS_VSX,
- __strlen_power7)
- IFUNC_IMPL_ADD (array, i, strlen, 1,
- __strlen_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */
- IFUNC_IMPL (i, name, strncmp,
- IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00,
- __strncmp_power9)
- IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strncmp_power8)
- IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX,
- __strncmp_power7)
- IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4,
- __strncmp_power4)
- IFUNC_IMPL_ADD (array, i, strncmp, 1,
- __strncmp_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strchr.c. */
- IFUNC_IMPL (i, name, strchr,
- IFUNC_IMPL_ADD (array, i, strchr,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strchr_power8)
- IFUNC_IMPL_ADD (array, i, strchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strchr_power7)
- IFUNC_IMPL_ADD (array, i, strchr, 1,
- __strchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strchrnul.c. */
- IFUNC_IMPL (i, name, strchrnul,
- IFUNC_IMPL_ADD (array, i, strchrnul,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strchrnul_power8)
- IFUNC_IMPL_ADD (array, i, strchrnul,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strchrnul_power7)
- IFUNC_IMPL_ADD (array, i, strchrnul, 1,
- __strchrnul_ppc))
-#endif
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/memcmp.c. */
- IFUNC_IMPL (i, name, memcmp,
- IFUNC_IMPL_ADD (array, i, memcmp, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __memcmp_power8)
- IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_HAS_VSX,
- __memcmp_power7)
- IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_POWER4,
- __memcmp_power4)
- IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/bzero.c. */
- IFUNC_IMPL (i, name, bzero,
- IFUNC_IMPL_ADD (array, i, bzero, hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __bzero_power8)
- IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_HAS_VSX,
- __bzero_power7)
- IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05,
- __bzero_power6)
- IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_POWER4,
- __bzero_power4)
- IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/bcopy.c. */
- IFUNC_IMPL (i, name, bcopy,
- IFUNC_IMPL_ADD (array, i, bcopy, hwcap & PPC_FEATURE_HAS_VSX,
- __bcopy_power7)
- IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/mempcpy.c. */
- IFUNC_IMPL (i, name, mempcpy,
- IFUNC_IMPL_ADD (array, i, mempcpy,
- hwcap & PPC_FEATURE_HAS_VSX,
- __mempcpy_power7)
- IFUNC_IMPL_ADD (array, i, mempcpy, 1,
- __mempcpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
- IFUNC_IMPL (i, name, memchr,
- IFUNC_IMPL_ADD (array, i, memchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __memchr_power7)
- IFUNC_IMPL_ADD (array, i, memchr, 1,
- __memchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c. */
- IFUNC_IMPL (i, name, memrchr,
- IFUNC_IMPL_ADD (array, i, memrchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __memrchr_power7)
- IFUNC_IMPL_ADD (array, i, memrchr, 1,
- __memrchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c. */
- IFUNC_IMPL (i, name, rawmemchr,
- IFUNC_IMPL_ADD (array, i, rawmemchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __rawmemchr_power7)
- IFUNC_IMPL_ADD (array, i, rawmemchr, 1,
- __rawmemchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c. */
- IFUNC_IMPL (i, name, strnlen,
- IFUNC_IMPL_ADD (array, i, strnlen,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strnlen_power8)
- IFUNC_IMPL_ADD (array, i, strnlen, hwcap & PPC_FEATURE_HAS_VSX,
- __strnlen_power7)
- IFUNC_IMPL_ADD (array, i, strnlen, 1,
- __strnlen_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c. */
- IFUNC_IMPL (i, name, strcasecmp,
- IFUNC_IMPL_ADD (array, i, strcasecmp,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcasecmp_power8)
- IFUNC_IMPL_ADD (array, i, strcasecmp,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strcasecmp_power7)
- IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c. */
- IFUNC_IMPL (i, name, strcasecmp_l,
- IFUNC_IMPL_ADD (array, i, strcasecmp_l,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strcasecmp_l_power7)
- IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
- __strcasecmp_l_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c. */
- IFUNC_IMPL (i, name, strncasecmp,
- IFUNC_IMPL_ADD (array, i, strncasecmp,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strncasecmp_power8)
- IFUNC_IMPL_ADD (array, i, strncasecmp,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strncasecmp_power7)
- IFUNC_IMPL_ADD (array, i, strncasecmp, 1, __strncasecmp_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strncase_l.c. */
- IFUNC_IMPL (i, name, strncasecmp_l,
- IFUNC_IMPL_ADD (array, i, strncasecmp_l,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strncasecmp_l_power7)
- IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
- __strncasecmp_l_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/wcschr.c. */
- IFUNC_IMPL (i, name, wcschr,
- IFUNC_IMPL_ADD (array, i, wcschr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __wcschr_power7)
- IFUNC_IMPL_ADD (array, i, wcschr,
- hwcap & PPC_FEATURE_ARCH_2_05,
- __wcschr_power6)
- IFUNC_IMPL_ADD (array, i, wcschr, 1,
- __wcschr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/wcschr.c. */
- IFUNC_IMPL (i, name, wcsrchr,
- IFUNC_IMPL_ADD (array, i, wcsrchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __wcsrchr_power7)
- IFUNC_IMPL_ADD (array, i, wcsrchr,
- hwcap & PPC_FEATURE_ARCH_2_05,
- __wcsrchr_power6)
- IFUNC_IMPL_ADD (array, i, wcsrchr, 1,
- __wcsrchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/wcscpy.c. */
- IFUNC_IMPL (i, name, wcscpy,
- IFUNC_IMPL_ADD (array, i, wcscpy,
- hwcap & PPC_FEATURE_HAS_VSX,
- __wcscpy_power7)
- IFUNC_IMPL_ADD (array, i, wcscpy,
- hwcap & PPC_FEATURE_ARCH_2_05,
- __wcscpy_power6)
- IFUNC_IMPL_ADD (array, i, wcscpy, 1,
- __wcscpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c. */
- IFUNC_IMPL (i, name, strrchr,
- IFUNC_IMPL_ADD (array, i, strrchr,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strrchr_power8)
- IFUNC_IMPL_ADD (array, i, strrchr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strrchr_power7)
- IFUNC_IMPL_ADD (array, i, strrchr, 1,
- __strrchr_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c. */
- IFUNC_IMPL (i, name, strncat,
- IFUNC_IMPL_ADD (array, i, strncat,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strncat_power8)
- IFUNC_IMPL_ADD (array, i, strncat,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strncat_power7)
- IFUNC_IMPL_ADD (array, i, strncat, 1,
- __strncat_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c. */
- IFUNC_IMPL (i, name, strncpy,
- IFUNC_IMPL_ADD (array, i, strncpy,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strncpy_power8)
- IFUNC_IMPL_ADD (array, i, strncpy,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strncpy_power7)
- IFUNC_IMPL_ADD (array, i, strncpy, 1,
- __strncpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c. */
- IFUNC_IMPL (i, name, stpncpy,
- IFUNC_IMPL_ADD (array, i, stpncpy,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __stpncpy_power8)
- IFUNC_IMPL_ADD (array, i, stpncpy,
- hwcap & PPC_FEATURE_HAS_VSX,
- __stpncpy_power7)
- IFUNC_IMPL_ADD (array, i, stpncpy, 1,
- __stpncpy_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */
- IFUNC_IMPL (i, name, strcmp,
- IFUNC_IMPL_ADD (array, i, strcmp,
- hwcap2 & PPC_FEATURE2_ARCH_3_00,
- __strcmp_power9)
- IFUNC_IMPL_ADD (array, i, strcmp,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcmp_power8)
- IFUNC_IMPL_ADD (array, i, strcmp,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strcmp_power7)
- IFUNC_IMPL_ADD (array, i, strcmp, 1,
- __strcmp_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */
- IFUNC_IMPL (i, name, strcat,
- IFUNC_IMPL_ADD (array, i, strcat,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcat_power8)
- IFUNC_IMPL_ADD (array, i, strcat,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strcat_power7)
- IFUNC_IMPL_ADD (array, i, strcat, 1,
- __strcat_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strspn.c. */
- IFUNC_IMPL (i, name, strspn,
- IFUNC_IMPL_ADD (array, i, strspn,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strspn_power8)
- IFUNC_IMPL_ADD (array, i, strspn, 1,
- __strspn_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcspn.c. */
- IFUNC_IMPL (i, name, strcspn,
- IFUNC_IMPL_ADD (array, i, strcspn,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcspn_power8)
- IFUNC_IMPL_ADD (array, i, strcspn, 1,
- __strcspn_ppc))
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strstr.c. */
- IFUNC_IMPL (i, name, strstr,
- IFUNC_IMPL_ADD (array, i, strstr,
- hwcap & PPC_FEATURE_HAS_VSX,
- __strstr_power7)
- IFUNC_IMPL_ADD (array, i, strstr, 1,
- __strstr_ppc))
-
-
- /* Support sysdeps/powerpc/powerpc64/multiarch/strcasestr.c. */
- IFUNC_IMPL (i, name, strcasestr,
- IFUNC_IMPL_ADD (array, i, strcasestr,
- hwcap2 & PPC_FEATURE2_ARCH_2_07,
- __strcasestr_power8)
- IFUNC_IMPL_ADD (array, i, strcasestr, 1,
- __strcasestr_ppc))
-
- return i;
-}
diff --git a/sysdeps/powerpc/powerpc64/multiarch/init-arch.h b/sysdeps/powerpc/powerpc64/multiarch/init-arch.h
deleted file mode 100644
index dbbe83c67c..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/init-arch.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* This file is part of the GNU C Library.
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
-
- 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/powerpc/powerpc32/power4/multiarch/init-arch.h>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power7.S
deleted file mode 100644
index fedca9c997..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memchr-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memchr implementation for PowerPC64/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCHR __memchr_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name,alias)
-
-#include <sysdeps/powerpc/powerpc64/power7/memchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/memchr-ppc64.c
deleted file mode 100644
index b67631f017..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memchr-ppc64.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* PowerPC64 default implementation of memchr.
- Copyright (C) 2013-2017 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 <string.h>
-
-#define MEMCHR __memchr_ppc
-
-#undef weak_alias
-#define weak_alias(a, b)
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-
-extern __typeof (memchr) __memchr_ppc attribute_hidden;
-
-#include <string/memchr.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c
deleted file mode 100644
index f6f4babc09..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Multiple versions of memchr.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__memchr) __memchr_ppc attribute_hidden;
-extern __typeof (__memchr) __memchr_power7 attribute_hidden;
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc (__memchr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memchr_power7
- : __memchr_ppc);
-
-weak_alias (__memchr, memchr)
-libc_hidden_builtin_def (memchr)
-#else
-#include <string/memchr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power4.S b/sysdeps/powerpc/powerpc64/multiarch/memcmp-power4.S
deleted file mode 100644
index e38b2a9c44..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power4.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memcmp implementation for PowerPC64/POWER4.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCMP __memcmp_power4
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name,alias)
-
-#include <sysdeps/powerpc/powerpc64/power4/memcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memcmp-power7.S
deleted file mode 100644
index a9cc979b92..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memcmp implementation for PowerPC64/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCMP __memcmp_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name,alias)
-
-#include <sysdeps/powerpc/powerpc64/power7/memcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/memcmp-power8.S
deleted file mode 100644
index b7837035b1..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcmp-power8.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memcmp implementation for PowerPC64/POWER8.
- Copyright (C) 2017 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 <sysdep.h>
-
-#define MEMCMP __memcmp_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name,alias)
-
-#include <sysdeps/powerpc/powerpc64/power8/memcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c
deleted file mode 100644
index 3bd035dc49..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2013-2017 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 <string.h>
-
-#define MEMCMP __memcmp_ppc
-#undef weak_alias
-#define weak_alias(name, aliasname) \
- extern __typeof (__memcmp_ppc) aliasname \
- __attribute__ ((weak, alias ("__memcmp_ppc")));
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1(__memcmp_ppc, __GI_memcmp, __memcmp_ppc);
-#endif
-
-extern __typeof (memcmp) __memcmp_ppc attribute_hidden;
-
-#include <string/memcmp.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp.c b/sysdeps/powerpc/powerpc64/multiarch/memcmp.c
deleted file mode 100644
index 0d315d5e70..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcmp.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of memcmp. PowerPC64 version.
- Copyright (C) 2013-2017 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 multiple versions only for definition in libc. */
-#if IS_IN (libc)
-# define memcmp __redirect_memcmp
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (memcmp) __memcmp_ppc attribute_hidden;
-extern __typeof (memcmp) __memcmp_power4 attribute_hidden;
-extern __typeof (memcmp) __memcmp_power7 attribute_hidden;
-extern __typeof (memcmp) __memcmp_power8 attribute_hidden;
-# undef memcmp
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_memcmp, memcmp,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __memcmp_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memcmp_power7
- : (hwcap & PPC_FEATURE_POWER4)
- ? __memcmp_power4
- : __memcmp_ppc);
-#else
-#include <string/memcmp.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-a2.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-a2.S
deleted file mode 100644
index a942287900..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-a2.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized memcpy implementation for PowerPC A2.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCPY __memcpy_a2
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/a2/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-cell.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-cell.S
deleted file mode 100644
index 39aa30c729..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-cell.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized memcpy implementation for PowerPC/CELL.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCPY __memcpy_cell
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/cell/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power4.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-power4.S
deleted file mode 100644
index 6e7fea382b..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power4.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized memcpy implementation for PowerPC64/POWER4.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCPY __memcpy_power4
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power4/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power6.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-power6.S
deleted file mode 100644
index 40bcdb1161..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power6.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized memcpy implementation for PowerPC/POWER6.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCPY __memcpy_power6
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power6/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-power7.S
deleted file mode 100644
index 222936af63..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized memcpy implementation for PowerPC/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMCPY __memcpy_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S
deleted file mode 100644
index 2dc644c809..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Default memcpy implementation for PowerPC64.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#if defined SHARED && IS_IN (libc)
-# define MEMCPY __memcpy_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-#endif
-
-#include <sysdeps/powerpc/powerpc64/memcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy.c b/sysdeps/powerpc/powerpc64/multiarch/memcpy.c
deleted file mode 100644
index 9f4286c4fe..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memcpy.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Multiple versions of memcpy. PowerPC64 version.
- Copyright (C) 2013-2017 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 multiple versions only for the definition in lib and for
- DSO. In static binaries we need memcpy before the initialization
- happened. */
-#if defined SHARED && IS_IN (libc)
-/* Redefine memcpy so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias, below. */
-# undef memcpy
-# define memcpy __redirect_memcpy
-# include <string.h>
-# include "init-arch.h"
-
-extern __typeof (__redirect_memcpy) __libc_memcpy;
-
-extern __typeof (__redirect_memcpy) __memcpy_ppc attribute_hidden;
-extern __typeof (__redirect_memcpy) __memcpy_power4 attribute_hidden;
-extern __typeof (__redirect_memcpy) __memcpy_cell attribute_hidden;
-extern __typeof (__redirect_memcpy) __memcpy_power6 attribute_hidden;
-extern __typeof (__redirect_memcpy) __memcpy_a2 attribute_hidden;
-extern __typeof (__redirect_memcpy) __memcpy_power7 attribute_hidden;
-
-libc_ifunc (__libc_memcpy,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memcpy_power7 :
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __memcpy_a2 :
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __memcpy_power6 :
- (hwcap & PPC_FEATURE_CELL_BE)
- ? __memcpy_cell :
- (hwcap & PPC_FEATURE_POWER4)
- ? __memcpy_power4
- : __memcpy_ppc);
-
-#undef memcpy
-strong_alias (__libc_memcpy, memcpy);
-libc_hidden_ver (__libc_memcpy, memcpy);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memmove-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memmove-power7.S
deleted file mode 100644
index a9435fa654..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memmove-power7.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized memmove implementation for PowerPC64/POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define MEMMOVE __memmove_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#undef bcopy
-#define bcopy __bcopy_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/memmove.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memmove-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/memmove-ppc64.c
deleted file mode 100644
index 80353c5332..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memmove-ppc64.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-#include <memcopy.h>
-
-extern __typeof (_wordcopy_fwd_aligned) _wordcopy_fwd_aligned_ppc;
-extern __typeof (_wordcopy_fwd_dest_aligned) _wordcopy_fwd_dest_aligned_ppc;
-extern __typeof (_wordcopy_bwd_aligned) _wordcopy_bwd_aligned_ppc;
-extern __typeof (_wordcopy_bwd_dest_aligned) _wordcopy_bwd_dest_aligned_ppc;
-
-#define _wordcopy_fwd_aligned _wordcopy_fwd_aligned_ppc
-#define _wordcopy_fwd_dest_aligned _wordcopy_fwd_dest_aligned_ppc
-#define _wordcopy_bwd_aligned _wordcopy_bwd_aligned_ppc
-#define _wordcopy_bwd_dest_aligned _wordcopy_bwd_dest_aligned_ppc
-
-extern __typeof (memmove) __memmove_ppc attribute_hidden;
-#define MEMMOVE __memmove_ppc
-
-extern __typeof (memcpy) __memcpy_ppc attribute_hidden;
-#ifdef SHARED
-# define memcpy __memcpy_ppc
-#endif
-
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-#endif
-
-#include <string/memmove.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memmove.c b/sysdeps/powerpc/powerpc64/multiarch/memmove.c
deleted file mode 100644
index db2bbc7837..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memmove.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Multiple versions of memmove. PowerPC64 version.
- Copyright (C) 2014-2017 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 multiple versions only for the definition in lib and for
- DSO. In static binaries we need memmove before the initialization
- happened. */
-#if defined SHARED && IS_IN (libc)
-/* Redefine memmove so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias, below. */
-# undef memmove
-# define memmove __redirect_memmove
-# include <string.h>
-# include "init-arch.h"
-
-extern __typeof (__redirect_memmove) __libc_memmove;
-
-extern __typeof (__redirect_memmove) __memmove_ppc attribute_hidden;
-extern __typeof (__redirect_memmove) __memmove_power7 attribute_hidden;
-
-libc_ifunc (__libc_memmove,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memmove_power7
- : __memmove_ppc);
-
-#undef memmove
-strong_alias (__libc_memmove, memmove);
-libc_hidden_ver (__libc_memmove, memmove);
-#else
-# include <string/memmove.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/mempcpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/mempcpy-power7.S
deleted file mode 100644
index 08f133644a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/mempcpy-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized mempcpy implementation for PowerPC/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMPCPY __mempcpy_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#include <sysdeps/powerpc/powerpc64/power7/mempcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/mempcpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/mempcpy-ppc64.c
deleted file mode 100644
index d0741fe318..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/mempcpy-ppc64.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC64 default implementation of mempcpy.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/mempcpy-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c b/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c
deleted file mode 100644
index 430557ee0a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of mempcpy.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# define mempcpy __redirect_mempcpy
-# define __mempcpy __redirect___mempcpy
-# define NO_MEMPCPY_STPCPY_REDIRECT
-/* Omit the mempcpy inline definitions because it would redefine mempcpy. */
-# define _HAVE_STRING_ARCH_mempcpy 1
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__mempcpy) __mempcpy_ppc attribute_hidden;
-extern __typeof (__mempcpy) __mempcpy_power7 attribute_hidden;
-# undef mempcpy
-# undef __mempcpy
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect___mempcpy, __mempcpy,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __mempcpy_power7
- : __mempcpy_ppc);
-
-weak_alias (__mempcpy, mempcpy)
-#else
-# include <string/mempcpy.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memrchr-power7.S
deleted file mode 100644
index 052aa732ba..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memrchr-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memrchr implementation for PowerPC64/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMRCHR __memrchr_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name,alias)
-
-#include <sysdeps/powerpc/powerpc64/power7/memrchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c
deleted file mode 100644
index 2fc706db71..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC64 default implementation of memrchr.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr.c b/sysdeps/powerpc/powerpc64/multiarch/memrchr.c
deleted file mode 100644
index fb09fdf89c..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memrchr.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Multiple versions of memrchr.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__memrchr) __memrchr_ppc attribute_hidden;
-extern __typeof (__memrchr) __memrchr_power7 attribute_hidden;
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc (__memrchr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memrchr_power7
- : __memrchr_ppc);
-
-weak_alias (__memrchr, memrchr)
-#else
-#include <string/memrchr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-power4.S b/sysdeps/powerpc/powerpc64/multiarch/memset-power4.S
deleted file mode 100644
index 3908e8e412..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset-power4.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER4.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMSET __memset_power4
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#undef __bzero
-#define __bzero __bzero_power4
-
-#include <sysdeps/powerpc/powerpc64/power4/memset.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-power6.S b/sysdeps/powerpc/powerpc64/multiarch/memset-power6.S
deleted file mode 100644
index 4ddbd2e274..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset-power6.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER6.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMSET __memset_power6
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#undef __bzero
-#define __bzero __bzero_power6
-
-#include <sysdeps/powerpc/powerpc64/power6/memset.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-power7.S b/sysdeps/powerpc/powerpc64/multiarch/memset-power7.S
deleted file mode 100644
index 97f686b35d..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define MEMSET __memset_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#undef __bzero
-#define __bzero __bzero_power7
-#include <sysdeps/powerpc/powerpc64/power7/memset.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-power8.S b/sysdeps/powerpc/powerpc64/multiarch/memset-power8.S
deleted file mode 100644
index ea303533f4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset-power8.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER8.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define MEMSET __memset_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#undef __bzero
-#define __bzero __bzero_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/memset.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S
deleted file mode 100644
index 0f16e21c61..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Default memset/bzero implementation for PowerPC64.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. NOTE: this code should be positioned
- before ENTRY/END_GEN_TB redefinition. */
-ENTRY (__bzero_ppc)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END_GEN_TB (__bzero_ppc,TB_TOCLESS)
-
-
-#if defined SHARED && IS_IN (libc)
-# define MEMSET __memset_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-#endif
-
-/* Do not implement __bzero at powerpc64/memset.S. */
-#define NO_BZERO_IMPL
-
-#include <sysdeps/powerpc/powerpc64/memset.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset.c b/sysdeps/powerpc/powerpc64/multiarch/memset.c
deleted file mode 100644
index a5d9b3e60e..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/memset.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Multiple versions of memset.
- Copyright (C) 2013-2017 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 multiple versions only for definition in libc. */
-#if defined SHARED && IS_IN (libc)
-/* Redefine memset so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias, below. */
-# undef memset
-# define memset __redirect_memset
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__redirect_memset) __libc_memset;
-
-extern __typeof (__redirect_memset) __memset_ppc attribute_hidden;
-extern __typeof (__redirect_memset) __memset_power4 attribute_hidden;
-extern __typeof (__redirect_memset) __memset_power6 attribute_hidden;
-extern __typeof (__redirect_memset) __memset_power7 attribute_hidden;
-extern __typeof (__redirect_memset) __memset_power8 attribute_hidden;
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc (__libc_memset,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __memset_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __memset_power7 :
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __memset_power6 :
- (hwcap & PPC_FEATURE_POWER4)
- ? __memset_power4
- : __memset_ppc);
-
-#undef memset
-strong_alias (__libc_memset, memset);
-libc_hidden_ver (__libc_memset, memset);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-power7.S
deleted file mode 100644
index d79d72820c..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-power7.S
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Optimized rawmemchr implementation for PowerPC64/POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define RAWMEMCHR __rawmemchr_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/rawmemchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-ppc64.c
deleted file mode 100644
index cb55dbcc50..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr-ppc64.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC64 default implementation of rawmemchr.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/rawmemchr-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c b/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c
deleted file mode 100644
index 8bfd58dd47..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Multiple versions of rawmemchr.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# define __rawmemchr __redirect___rawmemchr
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__rawmemchr) __rawmemchr_ppc attribute_hidden;
-extern __typeof (__rawmemchr) __rawmemchr_power7 attribute_hidden;
-# undef __rawmemchr
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect___rawmemchr, __rawmemchr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __rawmemchr_power7
- : __rawmemchr_ppc);
-
-weak_alias (__rawmemchr, rawmemchr)
-#else
-#include <string/rawmemchr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/rtld-memset.c b/sysdeps/powerpc/powerpc64/multiarch/rtld-memset.c
deleted file mode 100644
index 7fb4b733e4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/rtld-memset.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc64/rtld-memset.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/rtld-strchr.S b/sysdeps/powerpc/powerpc64/multiarch/rtld-strchr.S
deleted file mode 100644
index 16ba7264c4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/rtld-strchr.S
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc64/strchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.c
deleted file mode 100644
index e4b9ce9b6f..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiarch stpcpy for POWER7/PPC64.
- Copyright (C) 2015-2017 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 <string.h>
-
-extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
-extern __typeof (strlen) __strlen_power7 attribute_hidden;
-extern __typeof (stpcpy) __stpcpy_power7 attribute_hidden;
-
-#define STPCPY __stpcpy_power7
-#define memcpy __memcpy_power7
-#define strlen __strlen_power7
-
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <string/stpcpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S
deleted file mode 100644
index 935347115a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized stpcpy implementation for POWER8/PPC64.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STPCPY __stpcpy_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/stpcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.c
deleted file mode 100644
index b5a3b12c05..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Multiarch stpcpy for PPC64.
- Copyright (C) 2015-2017 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 <string.h>
-
-extern __typeof (memcpy) __memcpy_ppc attribute_hidden;
-extern __typeof (strlen) __strlen_ppc attribute_hidden;
-extern __typeof (stpcpy) __stpcpy_ppc attribute_hidden;
-
-#define STPCPY __stpcpy_ppc
-#define memcpy __memcpy_ppc
-#define strlen __strlen_ppc
-
-#undef weak_alias
-#define weak_alias(name, aliasname)
-
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <string/stpcpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c
deleted file mode 100644
index 3e34e3cafe..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Multiple versions of stpcpy. PowerPC64 version.
- Copyright (C) 2013-2017 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/>. */
-
-#if defined SHARED && IS_IN (libc)
-# define NO_MEMPCPY_STPCPY_REDIRECT
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__stpcpy) __stpcpy_ppc attribute_hidden;
-extern __typeof (__stpcpy) __stpcpy_power7 attribute_hidden;
-extern __typeof (__stpcpy) __stpcpy_power8 attribute_hidden;
-
-libc_ifunc_hidden (__stpcpy, __stpcpy,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __stpcpy_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __stpcpy_power7
- : __stpcpy_ppc);
-
-weak_alias (__stpcpy, stpcpy)
-libc_hidden_def (__stpcpy)
-libc_hidden_def (stpcpy)
-#else
-# include <string/stpcpy.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
deleted file mode 100644
index 6636b01d07..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Optimized stpncpy implementation for POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define USE_AS_STPNCPY
-
-#define STPNCPY __stpncpy_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define MEMSET __memset_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/stpncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
deleted file mode 100644
index 6ce706a879..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized stpncpy implementation for POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define USE_AS_STPNCPY
-
-#define STPNCPY __stpncpy_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/stpncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c
deleted file mode 100644
index 22186166a0..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Default stpncpy implementation for PowerPC64.
- Copyright (C) 2014-2017 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 STPNCPY __stpncpy_ppc
-#ifdef SHARED
-#undef libc_hidden_def
-#define libc_hidden_def(name) \
- __hidden_ver1 (__stpncpy_ppc, __GI___stpncpy, __stpncpy_ppc);
-#endif
-
-#include <string/stpncpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c
deleted file mode 100644
index e9b37dcc9a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Multiple versions of stpncpy. PowerPC64 version.
- Copyright (C) 2014-2017 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/>. */
-
-#if IS_IN (libc)
-# define stpncpy __redirect_stpncpy
-# define __stpncpy __redirect___stpncpy
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__stpncpy) __stpncpy_ppc attribute_hidden;
-extern __typeof (__stpncpy) __stpncpy_power7 attribute_hidden;
-extern __typeof (__stpncpy) __stpncpy_power8 attribute_hidden;
-# undef stpncpy
-# undef __stpncpy
-
-libc_ifunc_redirected (__redirect___stpncpy, __stpncpy,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __stpncpy_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __stpncpy_power7
- : __stpncpy_ppc);
-weak_alias (__stpncpy, stpncpy)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power7.S
deleted file mode 100644
index 025c5a9f13..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strcasecmp implementation for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define __strcasecmp __strcasecmp_power7
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strcasecmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power8.S
deleted file mode 100644
index 9b62476e09..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-power8.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strcasecmp implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define __strcasecmp __strcasecmp_power8
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strcasecmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-ppc64.c
deleted file mode 100644
index cbf91755da..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp-ppc64.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Multiarch strcasecmp for PPC64.
- Copyright (C) 2016-2017 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 strcasecmp __strcasecmp_ppc
-
-#include <string/strcasecmp.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c
deleted file mode 100644
index dcb4ef4125..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of strcasecmp
- Copyright (C) 2013-2017 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 <string.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__strcasecmp) __libc_strcasecmp;
-
-extern __typeof (__strcasecmp) __strcasecmp_ppc attribute_hidden;
-extern __typeof (__strcasecmp) __strcasecmp_power7 attribute_hidden;
-extern __typeof (__strcasecmp) __strcasecmp_power8 attribute_hidden;
-
-libc_ifunc (__libc_strcasecmp,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcasecmp_power8:
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strcasecmp_power7
- : __strcasecmp_ppc);
-
-weak_alias (__libc_strcasecmp, strcasecmp)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l-power7.S
deleted file mode 100644
index da4c4054c3..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l-power7.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Optimized strcasecmp_l implementation for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define __strcasecmp __strcasecmp_l_power7
-
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define USE_IN_EXTENDED_LOCALE_MODEL
-
-#include <sysdeps/powerpc/powerpc64/power7/strcasecmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c
deleted file mode 100644
index 10b8f2e84d..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of strcasecmp_l.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# define strcasecmp_l __strcasecmp_l_ppc
-extern __typeof (__strcasecmp_l) __strcasecmp_l_ppc attribute_hidden;
-extern __typeof (__strcasecmp_l) __strcasecmp_l_power7 attribute_hidden;
-#endif
-
-#include <string/strcasecmp_l.c>
-#undef strcasecmp_l
-
-#if IS_IN (libc)
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__strcasecmp_l) __libc_strcasecmp_l;
-libc_ifunc (__libc_strcasecmp_l,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strcasecmp_l_power7
- : __strcasecmp_l_ppc);
-
-weak_alias (__libc_strcasecmp_l, strcasecmp_l)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasestr-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcasestr-power8.S
deleted file mode 100644
index 2cfb5ae77a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasestr-power8.S
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Optimized strcasestr implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRCASESTR __strcasestr_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-/* The following definitions are used in strcasestr optimization. */
-
-/* strlen is used to calculate len of r4. */
-#define STRLEN __strlen_power8
-/* strnlen is used to check if len of r3 is more than r4. */
-#define STRNLEN __strnlen_power7
-/* strchr is used to check if first char of r4 is present in r3. */
-#define STRCHR __strchr_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/strcasestr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasestr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcasestr-ppc64.c
deleted file mode 100644
index 61f278f697..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasestr-ppc64.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* PowerPC64 default implementation of strcasestr.
- Copyright (C) 2016-2017 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 <string.h>
-
-#define STRCASESTR __strcasestr_ppc
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1(__strcasestr_ppc, __GI_strcasestr, __strcasestr_ppc);
-#endif
-
-
-#undef weak_alias
-#define weak_alias(a,b)
-
-extern __typeof (strcasestr) __strcasestr_ppc attribute_hidden;
-
-#include <string/strcasestr.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c b/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c
deleted file mode 100644
index 9e6a16d6a9..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Multiple versions of strcasestr.
- Copyright (C) 2016-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__strcasestr) __strcasestr_ppc attribute_hidden;
-extern __typeof (__strcasestr) __strcasestr_power8 attribute_hidden;
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc (__strcasestr,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcasestr_power8
- : __strcasestr_ppc);
-
-weak_alias (__strcasestr, strcasestr)
-#else
-#include <string/strcasestr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c
deleted file mode 100644
index 22d2caaec3..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-
-#define STRCAT __strcat_power7
-
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-
-extern typeof (strcpy) __strcpy_power7;
-extern typeof (strlen) __strlen_power7;
-
-#define strcpy __strcpy_power7
-#define strlen __strlen_power7
-#include <string/strcat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c
deleted file mode 100644
index f138beec67..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 2015-2017 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 <string.h>
-
-#define STRCAT __strcat_power8
-
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-
-extern typeof (strcpy) __strcpy_power8;
-extern typeof (strlen) __strlen_power8;
-
-#define strcpy __strcpy_power8
-#define strlen __strlen_power8
-#include <string/strcat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c
deleted file mode 100644
index 5049fc03f4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-
-#define STRCAT __strcat_ppc
-#ifdef SHARED
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1 (__strcat_ppc, __GI_strcat, __strcat_ppc);
-#endif
-
-extern __typeof (strcat) __strcat_ppc attribute_hidden;
-
-#include <string/strcat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat.c b/sysdeps/powerpc/powerpc64/multiarch/strcat.c
deleted file mode 100644
index 3336aedcec..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcat.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of strcat. PowerPC64 version.
- Copyright (C) 2014-2017 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/>. */
-
-#if IS_IN (libc)
-# define strcat __redirect_strcat
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strcat) __strcat_ppc attribute_hidden;
-extern __typeof (strcat) __strcat_power7 attribute_hidden;
-extern __typeof (strcat) __strcat_power8 attribute_hidden;
-# undef strcat
-
-libc_ifunc_redirected (__redirect_strcat, strcat,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcat_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strcat_power7
- : __strcat_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strchr-power7.S
deleted file mode 100644
index e64c0b7c82..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchr-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strchr implementation for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRCHR __strchr_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchr-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strchr-power8.S
deleted file mode 100644
index bbda7b0505..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchr-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strchr implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRCHR __strchr_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchr-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strchr-ppc64.S
deleted file mode 100644
index 769f9f07d4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchr-ppc64.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* PowerPC64 default implementation of strchr.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#ifdef SHARED
-# define STRCHR __strchr_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- .globl __GI_strchr; __GI_strchr = __strchr_ppc
-#endif
-
-#include <sysdeps/powerpc/powerpc64/strchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchr.c b/sysdeps/powerpc/powerpc64/multiarch/strchr.c
deleted file mode 100644
index 573105818f..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchr.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Multiple versions of strchr.
- Copyright (C) 2013-2017 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 multiple versions only for definition in libc. */
-#if defined SHARED && IS_IN (libc)
-# define strchr __redirect_strchr
-/* Omit the strchr inline definitions because it would redefine strchr. */
-# define __NO_STRING_INLINES
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strchr) __strchr_ppc attribute_hidden;
-extern __typeof (strchr) __strchr_power7 attribute_hidden;
-extern __typeof (strchr) __strchr_power8 attribute_hidden;
-# undef strchr
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_strchr, strchr,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strchr_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strchr_power7
- : __strchr_ppc);
-weak_alias (strchr, index)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power7.S
deleted file mode 100644
index c8e28721fd..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strchrnul implementation for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRCHRNUL __strchrnul_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strchrnul.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power8.S
deleted file mode 100644
index 1cd39fc1b3..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strchrnul implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRCHRNUL __strchrnul_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strchrnul.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strchrnul-ppc64.c
deleted file mode 100644
index 8d313c3e1d..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchrnul-ppc64.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* PowerPC64 default implementation of strchrnul.
- Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/strchrnul-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c b/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c
deleted file mode 100644
index 1e9018f88a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of strchrnul.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__strchrnul) __strchrnul_ppc attribute_hidden;
-extern __typeof (__strchrnul) __strchrnul_power7 attribute_hidden;
-extern __typeof (__strchrnul) __strchrnul_power8 attribute_hidden;
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc (__strchrnul,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strchrnul_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strchrnul_power7
- : __strchrnul_ppc);
-
-weak_alias (__strchrnul, strchrnul)
-#else
-#include <string/strchrnul.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S
deleted file mode 100644
index 82d1b63af9..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strcmp implementation for POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define STRCMP __strcmp_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S
deleted file mode 100644
index b2464a8018..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strcmp implementation for POWER8/PPC64.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STRCMP __strcmp_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power9.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power9.S
deleted file mode 100644
index 48ea05d2c5..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power9.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strcmp implementation for POWER9/PPC64.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRCMP __strcmp_power9
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power9/strcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S
deleted file mode 100644
index 085e74758f..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Default strcmp implementation for PowerPC64.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#if defined SHARED && IS_IN (libc)
-# define STRCMP __strcmp_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- .globl __GI_strcmp; __GI_strcmp = __strcmp_ppc
-#endif /* SHARED && IS_IN */
-
-#include <sysdeps/powerpc/powerpc64/strcmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c
deleted file mode 100644
index fc10205b00..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Multiple versions of strcmp. PowerPC64 version.
- Copyright (C) 2014-2017 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/>. */
-
-#if defined SHARED && IS_IN (libc)
-# define strcmp __redirect_strcmp
-/* Omit the strcmp inline definitions because it would redefine strcmp. */
-# define __NO_STRING_INLINES
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strcmp) __strcmp_ppc attribute_hidden;
-extern __typeof (strcmp) __strcmp_power7 attribute_hidden;
-extern __typeof (strcmp) __strcmp_power8 attribute_hidden;
-extern __typeof (strcmp) __strcmp_power9 attribute_hidden;
-
-# undef strcmp
-
-libc_ifunc_redirected (__redirect_strcmp, strcmp,
- (hwcap2 & PPC_FEATURE2_ARCH_3_00)
- ? __strcmp_power9 :
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcmp_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strcmp_power7
- : __strcmp_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.c
deleted file mode 100644
index 892a551183..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Multiarch strcpy for POWER7/PPC64.
- Copyright (C) 2015-2017 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 <string.h>
-
-extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
-extern __typeof (strlen) __strlen_power7 attribute_hidden;
-extern __typeof (strcpy) __strcpy_power7 attribute_hidden;
-
-#define STRCPY __strcpy_power7
-#define memcpy __memcpy_power7
-#define strlen __strlen_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <string/strcpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S
deleted file mode 100644
index 6c753b5d1a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strcpy implementation for POWER8/PPC64.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STRCPY __strcpy_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.c
deleted file mode 100644
index cd6dd09541..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Multiarch strcpy for PPC64.
- Copyright (C) 2015-2017 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 <string.h>
-
-#if defined SHARED && IS_IN (libc)
-extern __typeof (memcpy) __memcpy_ppc attribute_hidden;
-extern __typeof (strlen) __strlen_ppc attribute_hidden;
-extern __typeof (strcpy) __strcpy_ppc attribute_hidden;
-
-# define STRCPY __strcpy_ppc
-# define memcpy __memcpy_ppc
-# define strlen __strlen_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1 (__strcpy_ppc, __GI_strcpy, __strcpy_ppc);
-#endif
-
-#include <string/strcpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c
deleted file mode 100644
index 0da53e30b0..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of strcpy. PowerPC64 version.
- Copyright (C) 2013-2017 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/>. */
-
-#if defined SHARED && IS_IN (libc)
-# define strcpy __redirect_strcpy
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strcpy) __strcpy_ppc attribute_hidden;
-extern __typeof (strcpy) __strcpy_power7 attribute_hidden;
-extern __typeof (strcpy) __strcpy_power8 attribute_hidden;
-#undef strcpy
-
-libc_ifunc_redirected (__redirect_strcpy, strcpy,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcpy_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strcpy_power7
- : __strcpy_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcspn-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcspn-power8.S
deleted file mode 100644
index 39b4cd8239..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcspn-power8.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Optimized strcspn implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRSPN __strcspn_power8
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strcspn.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcspn-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcspn-ppc64.c
deleted file mode 100644
index 96396af125..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcspn-ppc64.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Default strcspn implementation for PowerPC64.
- Copyright (C) 2016-2017 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 STRCSPN __strcspn_ppc
-
-#ifdef SHARED
-# undef libc_hidden_def
-# define libc_hidden_def(name)
-#endif
-
-#include <string/strcspn.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcspn.c b/sysdeps/powerpc/powerpc64/multiarch/strcspn.c
deleted file mode 100644
index a6df885181..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strcspn.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Multiple versions of strcspn. PowerPC64 version.
- Copyright (C) 2016-2017 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 <string.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-#undef strcspn
-extern __typeof (strcspn) __libc_strcspn;
-
-extern __typeof (strcspn) __strcspn_ppc attribute_hidden;
-extern __typeof (strcspn) __strcspn_power8 attribute_hidden;
-
-libc_ifunc (__libc_strcspn,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strcspn_power8
- : __strcspn_ppc);
-
-weak_alias (__libc_strcspn, strcspn)
-libc_hidden_builtin_def (strcspn)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strlen-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strlen-power7.S
deleted file mode 100644
index 333496efa5..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strlen-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strlen implementation for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRLEN __strlen_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strlen.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strlen-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strlen-power8.S
deleted file mode 100644
index b4deea5f93..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strlen-power8.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strlen implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRLEN __strlen_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strlen.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S
deleted file mode 100644
index 13231b8c64..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Default strlen implementation for PowerPC64.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#if defined SHARED && IS_IN (libc)
-# define STRLEN __strlen_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-#endif
-
-#include <sysdeps/powerpc/powerpc64/strlen.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strlen.c b/sysdeps/powerpc/powerpc64/multiarch/strlen.c
deleted file mode 100644
index a5a7b59558..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strlen.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of strlen. PowerPC64 version.
- Copyright (C) 2013-2017 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/>. */
-
-#if defined SHARED && IS_IN (libc)
-/* Redefine strlen so that the compiler won't complain about the type
- mismatch with the IFUNC selector in strong_alias, below. */
-# undef strlen
-# define strlen __redirect_strlen
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__redirect_strlen) __libc_strlen;
-
-extern __typeof (__redirect_strlen) __strlen_ppc attribute_hidden;
-extern __typeof (__redirect_strlen) __strlen_power7 attribute_hidden;
-extern __typeof (__redirect_strlen) __strlen_power8 attribute_hidden;
-
-libc_ifunc (__libc_strlen,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strlen_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strlen_power7
- : __strlen_ppc);
-
-#undef strlen
-strong_alias (__libc_strlen, strlen)
-libc_hidden_ver (__libc_strlen, strlen)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strncase-power7.c
deleted file mode 100644
index 177da4a2f0..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase-power7.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright (C) 2013-2017 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 <string.h>
-
-#define __strncasecmp __strncasecmp_power7
-
-extern __typeof (strncasecmp) __strncasecmp_power7 attribute_hidden;
-
-#include <string/strncase.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncase-power8.S
deleted file mode 100644
index 8a24c34719..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase-power8.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strncasecmp implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define __strncasecmp __strncasecmp_power8
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strncase.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strncase-ppc64.c
deleted file mode 100644
index 0a75f75745..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase-ppc64.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Multiarch strncasecmp for PPC64.
- Copyright (C) 2016-2017 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 strncasecmp __strncasecmp_ppc
-
-#include <string/strncase.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase.c b/sysdeps/powerpc/powerpc64/multiarch/strncase.c
deleted file mode 100644
index 197f7133e4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of strncasecmp
- Copyright (C) 2013-2017 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 <string.h>
-#include <shlib-compat.h>
-#include "init-arch.h"
-
-extern __typeof (__strncasecmp) __libc_strncasecmp;
-
-extern __typeof (__strncasecmp) __strncasecmp_ppc attribute_hidden;
-extern __typeof (__strncasecmp) __strncasecmp_power7 attribute_hidden;
-extern __typeof (__strncasecmp) __strncasecmp_power8 attribute_hidden;
-
-libc_ifunc (__libc_strncasecmp,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strncasecmp_power8:
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strncasecmp_power7
- : __strncasecmp_ppc);
-
-weak_alias (__libc_strncasecmp, strncasecmp)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase_l-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strncase_l-power7.c
deleted file mode 100644
index f87ff6c640..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase_l-power7.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2013-2017 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 <string.h>
-
-#define __strncasecmp_l __strncasecmp_l_power7
-#define USE_IN_EXTENDED_LOCALE_MODEL 1
-
-extern __typeof (strncasecmp_l) __strncasecmp_l_power7 attribute_hidden;
-
-#include <string/strncase.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c b/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c
deleted file mode 100644
index 6c2429c58a..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Multiple versions of strncasecmp_l
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# define strncasecmp_l __strncasecmp_l_ppc
-extern __typeof (__strncasecmp_l) __strncasecmp_l_ppc attribute_hidden;
-extern __typeof (__strncasecmp_l) __strncasecmp_l_power7 attribute_hidden;
-#endif
-
-#include <string/strncase_l.c>
-#undef strncasecmp_l
-
-#if IS_IN (libc)
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-extern __typeof (__strncasecmp_l) __libc_strncasecmp_l;
-libc_ifunc (__libc_strncasecmp_l,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strncasecmp_l_power7
- : __strncasecmp_l_ppc);
-
-weak_alias (__libc_strncasecmp_l, strncasecmp_l)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c
deleted file mode 100644
index f695f834a0..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 2015-2017 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 <string.h>
-
-#define STRNCAT __strncat_power7
-
-extern __typeof (strncat) __strncat_power7 attribute_hidden;
-extern __typeof (strlen) __strlen_power7 attribute_hidden;
-extern __typeof (strnlen) __strnlen_power7 attribute_hidden;
-extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
-
-#define strlen __strlen_power7
-#define __strnlen __strnlen_power7
-#define memcpy __memcpy_power7
-
-#include <string/strncat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c b/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c
deleted file mode 100644
index 1ec1259b95..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 2017 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 <string.h>
-
-#define STRNCAT __strncat_power8
-
-extern __typeof (strncat) __strncat_power8 attribute_hidden;
-extern __typeof (strlen) __strlen_power8 attribute_hidden;
-extern __typeof (strnlen) __strnlen_power8 attribute_hidden;
-extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
-
-#define strlen __strlen_power8
-#define __strnlen __strnlen_power8
-#define memcpy __memcpy_power7
-
-#include <string/strncat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strncat-ppc64.c
deleted file mode 100644
index e4c8c01105..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncat-ppc64.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-
-#define STRNCAT __strncat_ppc
-#ifdef SHARED
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1 (__strncat_ppc, __GI_strncat, __strncat_ppc);
-#endif
-
-extern __typeof (strncat) __strncat_ppc attribute_hidden;
-
-#include <string/strncat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat.c b/sysdeps/powerpc/powerpc64/multiarch/strncat.c
deleted file mode 100644
index 72f283354e..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncat.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Multiple versions of strncat. PowerPC64 version.
- Copyright (C) 2014-2017 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/>. */
-
-#if IS_IN (libc)
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strncat) __strncat_ppc attribute_hidden;
-extern __typeof (strncat) __strncat_power7 attribute_hidden;
-extern __typeof (strncat) __strncat_power8 attribute_hidden;
-
-libc_ifunc (strncat,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strncat_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strncat_power7
- : __strncat_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S
deleted file mode 100644
index 01729a3bba..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRNCMP __strncmp_power4
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power4/strncmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S
deleted file mode 100644
index a069d4b21c..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRNCMP __strncmp_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strncmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S
deleted file mode 100644
index 3cbcaada62..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STRNCMP __strncmp_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strncmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power9.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power9.S
deleted file mode 100644
index 6d0deaa6e6..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power9.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRNCMP __strncmp_power9
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power9/strncmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S
deleted file mode 100644
index e4b93ae8f2..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 2013-2017 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 <sysdep.h>
-
-#if defined SHARED && IS_IN (libc)
-# define STRNCMP __strncmp_ppc
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- .globl __GI_strncmp; __GI_strncmp = __strncmp_ppc
-#endif
-
-#include <sysdeps/powerpc/powerpc64/strncmp.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c
deleted file mode 100644
index 14122c65a4..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Multiple versions of strncmp.
- Copyright (C) 2013-2017 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 multiple versions only for definition in libc. */
-#if defined SHARED && IS_IN (libc)
-# define strncmp __redirect_strncmp
-/* Omit the strncmp inline definitions because it would redefine strncmp. */
-# define __NO_STRING_INLINES
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strncmp) __strncmp_ppc attribute_hidden;
-extern __typeof (strncmp) __strncmp_power4 attribute_hidden;
-extern __typeof (strncmp) __strncmp_power7 attribute_hidden;
-extern __typeof (strncmp) __strncmp_power8 attribute_hidden;
-extern __typeof (strncmp) __strncmp_power9 attribute_hidden;
-# undef strncmp
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_strncmp, strncmp,
- (hwcap2 & PPC_FEATURE2_ARCH_3_00)
- ? __strncmp_power9 :
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strncmp_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strncmp_power7
- : (hwcap & PPC_FEATURE_POWER4)
- ? __strncmp_power4
- : __strncmp_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
deleted file mode 100644
index 03f7f83448..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strncpy implementation for POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define STRNCPY __strncpy_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define MEMSET __memset_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/strncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
deleted file mode 100644
index 17117eb7ec..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized strncpy implementation for POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STRNCPY __strncpy_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-/* memset is used to pad the end of the string. */
-#define MEMSET __memset_power8
-
-#include <sysdeps/powerpc/powerpc64/power8/strncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c
deleted file mode 100644
index 32412974aa..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-
-#define STRNCPY __strncpy_ppc
-#undef weak_alias
-#define weak_alias(name, aliasname) \
- extern __typeof (__strncpy_ppc) aliasname \
- __attribute__ ((weak, alias ("__strncpy_ppc")));
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1(__strncpy_ppc, __GI_strncpy, __strncpy_ppc);
-#endif
-
-extern __typeof (strncpy) __strncpy_ppc attribute_hidden;
-
-#include <string/strncpy.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy.c b/sysdeps/powerpc/powerpc64/multiarch/strncpy.c
deleted file mode 100644
index bb63c185e6..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Multiple versions of strncpy.
- Copyright (C) 2014-2017 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 multiple versions only for definition in libc. */
-#if IS_IN (libc)
-# define strncpy __redirect_strncpy
-/* Omit the strncpy inline definitions because it would redefine strncpy. */
-# define __NO_STRING_INLINES
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strncpy) __strncpy_ppc attribute_hidden;
-extern __typeof (strncpy) __strncpy_power7 attribute_hidden;
-extern __typeof (strncpy) __strncpy_power8 attribute_hidden;
-# undef strncpy
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_strncpy, strncpy,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strncpy_power8
- : (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strncpy_power7
- : __strncpy_ppc);
-
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strnlen-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strnlen-power7.S
deleted file mode 100644
index 2f0a183e31..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strnlen-power7.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strnlen version for POWER7.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define STRNLEN __strnlen_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#include <sysdeps/powerpc/powerpc64/power7/strnlen.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strnlen-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strnlen-power8.S
deleted file mode 100644
index ccea15df10..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strnlen-power8.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Optimized strnlen version for POWER8.
- Copyright (C) 2017 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 <sysdep.h>
-
-#define __strnlen __strnlen_power8
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-
-#include <sysdeps/powerpc/powerpc64/power8/strnlen.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strnlen-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strnlen-ppc64.c
deleted file mode 100644
index 708455a156..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strnlen-ppc64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/strnlen-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strnlen.c b/sysdeps/powerpc/powerpc64/multiarch/strnlen.c
deleted file mode 100644
index 7f89132aa5..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strnlen.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Multiple versions of strnlen.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# define strnlen __redirect_strnlen
-# define __strnlen __redirect___strnlen
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (__strnlen) __strnlen_ppc attribute_hidden;
-extern __typeof (__strnlen) __strnlen_power7 attribute_hidden;
-extern __typeof (__strnlen) __strnlen_power8 attribute_hidden;
-# undef strnlen
-# undef __strnlen
-libc_ifunc_redirected (__redirect___strnlen, __strnlen,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strnlen_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strnlen_power7
- : __strnlen_ppc);
-weak_alias (__strnlen, strnlen)
-
-#else
-#include <string/strnlen.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strrchr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strrchr-power7.S
deleted file mode 100644
index 10bab2ec54..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strrchr-power7.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Optimized strrchr implementation for POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define STRRCHR __strrchr_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power7/strrchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strrchr-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strrchr-power8.S
deleted file mode 100644
index 23365a1446..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strrchr-power8.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Optimized strrchr implementation for POWER8.
- Copyright (C) 2017 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 <sysdep.h>
-
-#undef ENTRY
-#define ENTRY(name) \
- .section ".text"; \
- ENTRY_2(__strrchr_power8) \
- .align ALIGNARG(2); \
- BODY_LABEL(__strrchr_power8): \
- cfi_startproc; \
- LOCALENTRY(__strrchr_power8)
-
-#undef END
-#define END(name) \
- cfi_endproc; \
- TRACEBACK(__strrchr_power8) \
- END_2(__strrchr_power8)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strrchr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strrchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strrchr-ppc64.c
deleted file mode 100644
index 62b77a0bbe..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strrchr-ppc64.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2014-2017 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 <string.h>
-
-#define STRRCHR __strrchr_ppc
-
-#undef weak_alias
-#define weak_alias(name, aliasname)
-
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1(__strrchr_ppc, __GI_strrchr, __strrchr_ppc);
-#endif
-
-extern __typeof (strrchr) __strrchr_ppc attribute_hidden;
-
-#include <string/strrchr.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strrchr.c b/sysdeps/powerpc/powerpc64/multiarch/strrchr.c
deleted file mode 100644
index 0f94c9d6a1..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strrchr.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Multiple versions of strrchr. PowerPC64 version.
- Copyright (C) 2014-2017 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 multiple versions only for definition in libc. */
-#if IS_IN (libc)
-# define strrchr __redirect_strrchr
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strrchr) __strrchr_ppc attribute_hidden;
-extern __typeof (strrchr) __strrchr_power7 attribute_hidden;
-extern __typeof (strrchr) __strrchr_power8 attribute_hidden;
-#undef strrchr
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_strrchr, strrchr,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strrchr_power8 :
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strrchr_power7
- : __strrchr_ppc);
-weak_alias (strrchr, rindex)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strspn-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strspn-power8.S
deleted file mode 100644
index f8487f1cbc..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strspn-power8.S
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Optimized strspn implementation for POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#define STRSPN __strspn_power8
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#include <sysdeps/powerpc/powerpc64/power8/strspn.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strspn-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strspn-ppc64.c
deleted file mode 100644
index 53d3d61651..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strspn-ppc64.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Default strspn implementation for PowerPC64.
- Copyright (C) 2016-2017 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 STRSPN __strspn_ppc
-#ifdef SHARED
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-#endif
-
-#include <string/strspn.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strspn.c b/sysdeps/powerpc/powerpc64/multiarch/strspn.c
deleted file mode 100644
index 0957482766..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strspn.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Multiple versions of strspn. PowerPC64 version.
- Copyright (C) 2016-2017 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 <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-#undef strspn
-extern __typeof (strspn) __libc_strspn;
-
-extern __typeof (strspn) __strspn_ppc attribute_hidden;
-extern __typeof (strspn) __strspn_power8 attribute_hidden;
-
-libc_ifunc (__libc_strspn,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07)
- ? __strspn_power8
- : __strspn_ppc);
-
-weak_alias (__libc_strspn, strspn)
-libc_hidden_builtin_def (strspn)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
deleted file mode 100644
index 3991df74a8..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Optimized strstr implementation for POWER7.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#define STRSTR __strstr_power7
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define STRLEN __strlen_power7
-#define STRNLEN __strnlen_power7
-#define STRCHR __strchr_power7
-
-#include <sysdeps/powerpc/powerpc64/power7/strstr.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strstr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strstr-ppc64.c
deleted file mode 100644
index 37add12c87..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strstr-ppc64.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (C) 2015-2017 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 <string.h>
-
-#define STRSTR __strstr_ppc
-#if IS_IN (libc) && defined(SHARED)
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name) \
- __hidden_ver1(__strstr_ppc, __GI_strstr, __strstr_ppc);
-#endif
-
-extern __typeof (strstr) __strstr_ppc attribute_hidden;
-
-#include <string/strstr.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strstr.c b/sysdeps/powerpc/powerpc64/multiarch/strstr.c
deleted file mode 100644
index d903b2702b..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/strstr.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of strstr. PowerPC64 version.
- Copyright (C) 2015-2017 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 multiple versions only for definition in libc. */
-#if IS_IN (libc)
-# define strstr __redirect_strstr
-# include <string.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (strstr) __strstr_ppc attribute_hidden;
-extern __typeof (strstr) __strstr_power7 attribute_hidden;
-# undef strstr
-
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
- ifunc symbol properly. */
-libc_ifunc_redirected (__redirect_strstr, strstr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __strstr_power7
- : __strstr_ppc);
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcschr-power6.c b/sysdeps/powerpc/powerpc64/multiarch/wcschr-power6.c
deleted file mode 100644
index 080cb696a7..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcschr-power6.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcschr.c - Wide Character Search for powerpc64/power6.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-power6.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcschr-power7.c b/sysdeps/powerpc/powerpc64/multiarch/wcschr-power7.c
deleted file mode 100644
index 8f4de0e857..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcschr-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcschr.c - Wide Character Search for powerpc64/power7.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcschr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/wcschr-ppc64.c
deleted file mode 100644
index e781e947fe..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcschr-ppc64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcschr.c b/sysdeps/powerpc/powerpc64/multiarch/wcschr.c
deleted file mode 100644
index ca373e096f..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcschr.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Multiple versions of wcschr
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# define wcschr __redirect_wcschr
-# define __wcschr __redirect___wcschr
-# include <wchar.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (wcschr) __wcschr_ppc attribute_hidden;
-extern __typeof (wcschr) __wcschr_power6 attribute_hidden;
-extern __typeof (wcschr) __wcschr_power7 attribute_hidden;
-# undef wcschr
-# undef __wcschr
-
-libc_ifunc_redirected (__redirect___wcschr, __wcschr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __wcschr_power7
- : (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __wcschr_power6
- : __wcschr_ppc);
-weak_alias (__wcschr, wcschr)
-#else
-#undef libc_hidden_def
-#define libc_hidden_def(a)
-#include <wcsmbs/wcschr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power6.c b/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power6.c
deleted file mode 100644
index 89d8a39640..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power6.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcscpy.c - Wide Character Search for powerpc64/power6.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power6.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power7.c b/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power7.c
deleted file mode 100644
index 47ba73b2cc..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcscpy.c - Wide Character Search for powerpc64/power7.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/wcscpy-ppc64.c
deleted file mode 100644
index 1924b235ef..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcscpy-ppc64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c b/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c
deleted file mode 100644
index 13e44afb09..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of wcscpy.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <wchar.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (wcscpy) __wcscpy_ppc attribute_hidden;
-extern __typeof (wcscpy) __wcscpy_power6 attribute_hidden;
-extern __typeof (wcscpy) __wcscpy_power7 attribute_hidden;
-
-libc_ifunc (wcscpy,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __wcscpy_power7 :
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __wcscpy_power6
- : __wcscpy_ppc);
-#else
-#include <wcsmbs/wcscpy.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power6.c b/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power6.c
deleted file mode 100644
index 5dc448b339..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power6.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcsrchr.c - Wide Character Search for powerpc64/power6.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power6.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power7.c b/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power7.c
deleted file mode 100644
index fa25aa0475..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-power7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* wcsrchr.c - Wide Character Search for powerpc64/power7.
- Copyright (C) 2013-2017 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; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#include <sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power7.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-ppc64.c
deleted file mode 100644
index 8a913412a0..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr-ppc64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c b/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c
deleted file mode 100644
index 07590f5a90..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Multiple versions of wcsrchr.
- Copyright (C) 2013-2017 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/>. */
-
-#if IS_IN (libc)
-# include <wchar.h>
-# include <shlib-compat.h>
-# include "init-arch.h"
-
-extern __typeof (wcsrchr) __wcsrchr_ppc attribute_hidden;
-extern __typeof (wcsrchr) __wcsrchr_power6 attribute_hidden;
-extern __typeof (wcsrchr) __wcsrchr_power7 attribute_hidden;
-
-libc_ifunc (wcsrchr,
- (hwcap & PPC_FEATURE_HAS_VSX)
- ? __wcsrchr_power7 :
- (hwcap & PPC_FEATURE_ARCH_2_05)
- ? __wcsrchr_power6
- : __wcsrchr_ppc);
-#else
-#include <wcsmbs/wcsrchr.c>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/wordcopy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/wordcopy-ppc64.c
deleted file mode 100644
index 078156f5d9..0000000000
--- a/sysdeps/powerpc/powerpc64/multiarch/wordcopy-ppc64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2013-2017 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/powerpc/powerpc32/power4/multiarch/wordcopy-ppc32.c>
diff --git a/sysdeps/powerpc/powerpc64/power4/Implies b/sysdeps/powerpc/powerpc64/power4/Implies
deleted file mode 100644
index a372141bb7..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/power4/fpu
-powerpc/power4
diff --git a/sysdeps/powerpc/powerpc64/power4/Makefile b/sysdeps/powerpc/powerpc64/power4/Makefile
deleted file mode 100644
index ba06adb5d0..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# Makefile fragment for POWER4/5/5+.
-
-ifeq ($(subdir),string)
-CFLAGS-wordcopy.c += --param max-variable-expansions-in-unroller=2 --param max-unroll-times=2 -funroll-loops -fpeel-loops
-CFLAGS-memmove.c += --param max-variable-expansions-in-unroller=2 --param max-unroll-times=2 -funroll-loops -fpeel-loops
-endif
diff --git a/sysdeps/powerpc/powerpc64/power4/fpu/Implies b/sysdeps/powerpc/powerpc64/power4/fpu/Implies
deleted file mode 100644
index c1f617b7da..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/fpu
diff --git a/sysdeps/powerpc/powerpc64/power4/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power4/fpu/multiarch/Implies
deleted file mode 100644
index 8d6531a174..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power4/memcmp.S b/sysdeps/powerpc/powerpc64/power4/memcmp.S
deleted file mode 100644
index 6ca98e909c..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/memcmp.S
+++ /dev/null
@@ -1,1369 +0,0 @@
-/* Optimized memcmp implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* int [r3] memcmp (const char *s1 [r3],
- const char *s2 [r4],
- size_t size [r5]) */
-
-#ifndef MEMCMP
-# define MEMCMP memcmp
-#endif
-
- .machine power4
-EALIGN (MEMCMP, 4, 0)
- CALL_MCOUNT 3
-
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rN r5 /* max string length */
-#define rWORD1 r6 /* current word in s1 */
-#define rWORD2 r7 /* current word in s2 */
-#define rWORD3 r8 /* next word in s1 */
-#define rWORD4 r9 /* next word in s2 */
-#define rWORD5 r10 /* next word in s1 */
-#define rWORD6 r11 /* next word in s2 */
-#define rWORD7 r30 /* next word in s1 */
-#define rWORD8 r31 /* next word in s2 */
-
- xor r0, rSTR2, rSTR1
- cmpldi cr6, rN, 0
- cmpldi cr1, rN, 12
- clrldi. r0, r0, 61
- clrldi r12, rSTR1, 61
- cmpldi cr5, r12, 0
- beq- cr6, L(zeroLength)
- dcbt 0, rSTR1
- dcbt 0, rSTR2
-/* If less than 8 bytes or not aligned, use the unaligned
- byte loop. */
- blt cr1, L(bytealigned)
- std rWORD8, -8(r1)
- std rWORD7, -16(r1)
- cfi_offset(rWORD8, -8)
- cfi_offset(rWORD7, -16)
- bne L(unaligned)
-/* At this point we know both strings have the same alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then we are already double word
- aligned and can perform the DW aligned loop.
-
- Otherwise we know the two strings have the same alignment (but not
- yet DW). So we force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DW aligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected register pair. */
- .align 4
-L(samealignment):
- clrrdi rSTR1, rSTR1, 3
- clrrdi rSTR2, rSTR2, 3
- beq cr5, L(DWaligned)
- add rN, rN, r12
- sldi rWORD6, r12, 3
- srdi r0, rN, 5 /* Divide by 32 */
- andi. r12, rN, 24 /* Get the DW remainder */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
-#endif
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dPs4)
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- bgt cr1, L(dPs3)
- beq cr1, L(dPs2)
-
-/* Remainder is 8 */
- .align 3
-L(dsP1):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
-/* Do something useful in this cycle since we have to branch anyway. */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- b L(dP1e)
-/* Remainder is 16 */
- .align 4
-L(dPs2):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
-/* Do something useful in this cycle since we have to branch anyway. */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD7, 8(rSTR1)
- ld rWORD8, 8(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- b L(dP2e)
-/* Remainder is 24 */
- .align 4
-L(dPs3):
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD2, rWORD6
- cmpld cr1, rWORD3, rWORD4
- b L(dP3e)
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(dPs4):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD2, rWORD6
- cmpld cr7, rWORD1, rWORD2
- b L(dP4e)
-
-/* At this point we know both strings are double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWaligned):
- andi. r12, rN, 24 /* Get the DW remainder */
- srdi r0, rN, 5 /* Divide by 32 */
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dP4)
- bgt cr1, L(dP3)
- beq cr1, L(dP2)
-
-/* Remainder is 8 */
- .align 4
-L(dP1):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
-/* Normally we'd use rWORD7/rWORD8 here, but since we might exit early
- (8-15 byte compare), we want to use only volatile registers. This
- means we can avoid restoring non-volatile registers since we did not
- change any on the early exit path. The key here is the non-early
- exit path only cares about the condition code (cr5), not about which
- register pair was used. */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 0(rSTR1)
- ld rWORD6, 0(rSTR2)
-#endif
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
-L(dP1e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 16(rSTR1)
- ld rWORD4, 16(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 24(rSTR1)
- ld rWORD6, 24(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5x)
- bne cr7, L(dLcr7x)
-
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ldu rWORD7, 32(rSTR1)
- ldu rWORD8, 32(rSTR2)
-#endif
- bne cr1, L(dLcr1)
- cmpld cr5, rWORD7, rWORD8
- bdnz L(dLoop)
- bne cr6, L(dLcr6)
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- .align 3
-L(dP1x):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- li rRTN, 0
- blr
-
-/* Remainder is 16 */
- .align 4
-L(dP2):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 0(rSTR1)
- ld rWORD6, 0(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD7, 8(rSTR1)
- ld rWORD8, 8(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
-L(dP2e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 16(rSTR1)
- ld rWORD2, 16(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 24(rSTR1)
- ld rWORD4, 24(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#endif
- bne cr6, L(dLcr6)
- bne cr5, L(dLcr5)
- b L(dLoop2)
-/* Again we are on a early exit path (16-23 byte compare), we want to
- only use volatile registers and avoid restoring non-volatile
- registers. */
- .align 4
-L(dP2x):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 8(rSTR1)
- ld rWORD4, 8(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- sldi. r12, rN, 3
- bne cr6, L(dLcr6x)
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#endif
- bne cr1, L(dLcr1x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- li rRTN, 0
- blr
-
-/* Remainder is 24 */
- .align 4
-L(dP3):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 0(rSTR1)
- ld rWORD4, 0(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
-L(dP3e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 8(rSTR1)
- ld rWORD6, 8(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP3x)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD7, 16(rSTR1)
- ld rWORD8, 16(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 24(rSTR1)
- ld rWORD2, 24(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#endif
- bne cr1, L(dLcr1)
- bne cr6, L(dLcr6)
- b L(dLoop1)
-/* Again we are on a early exit path (24-31 byte compare), we want to
- only use volatile registers and avoid restoring non-volatile
- registers. */
- .align 4
-L(dP3x):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 16(rSTR1)
- ld rWORD2, 16(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- sldi. r12, rN, 3
- bne cr1, L(dLcr1x)
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#endif
- bne cr6, L(dLcr6x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne cr7, L(dLcr7x)
- bne L(d00)
- li rRTN, 0
- blr
-
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(dP4):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
-L(dP4e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 8(rSTR1)
- ld rWORD4, 8(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 16(rSTR1)
- ld rWORD6, 16(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ldu rWORD7, 24(rSTR1)
- ldu rWORD8, 24(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
- bne cr1, L(dLcr1)
- bdz- L(d24) /* Adjust CTR as we start with +4 */
-/* This is the primary loop */
- .align 4
-L(dLoop):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
-L(dLoop1):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 16(rSTR1)
- ld rWORD4, 16(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
-L(dLoop2):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 24(rSTR1)
- ld rWORD6, 24(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
-L(dLoop3):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ldu rWORD7, 32(rSTR1)
- ldu rWORD8, 32(rSTR2)
-#endif
- bne- cr1, L(dLcr1)
- cmpld cr7, rWORD1, rWORD2
- bdnz+ L(dLoop)
-
-L(dL4):
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(d44):
- bne cr7, L(dLcr7)
-L(d34):
- bne cr1, L(dLcr1)
-L(d24):
- bne cr6, L(dLcr6)
-L(d14):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5)
-L(d04):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- beq L(zeroLength)
-/* At this point we have a remainder of 1 to 7 bytes to compare. Since
- we are aligned it is safe to load the whole double word, and use
- shift right double to eliminate bits beyond the compare length. */
-L(d00):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- cmpld cr7, rWORD1, rWORD2
- bne cr7, L(dLcr7x)
- li rRTN, 0
- blr
-
- .align 4
-L(dLcr7):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
-L(dLcr7x):
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(dLcr1):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
-L(dLcr1x):
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
- .align 4
-L(dLcr6):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
-L(dLcr6x):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
- .align 4
-L(dLcr5):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
-L(dLcr5x):
- li rRTN, 1
- bgtlr cr5
- li rRTN, -1
- blr
-
- .align 4
-L(bytealigned):
- mtctr rN /* Power4 wants mtctr 1st in dispatch group */
-#if 0
-/* Huh? We've already branched on cr6! */
- beq- cr6, L(zeroLength)
-#endif
-
-/* We need to prime this loop. This loop is swing modulo scheduled
- to avoid pipe delays. The dependent instruction latencies (load to
- compare to conditional branch) is 2 to 3 cycles. In this loop each
- dispatch group ends in a branch and takes 1 cycle. Effectively
- the first iteration of the loop only serves to load operands and
- branches based on compares are delayed until the next loop.
-
- So we must precondition some registers and condition codes so that
- we don't exit the loop early on the first iteration. */
-
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- bdz- L(b11)
- cmpld cr7, rWORD1, rWORD2
- lbz rWORD3, 1(rSTR1)
- lbz rWORD4, 1(rSTR2)
- bdz- L(b12)
- cmpld cr1, rWORD3, rWORD4
- lbzu rWORD5, 2(rSTR1)
- lbzu rWORD6, 2(rSTR2)
- bdz- L(b13)
- .align 4
-L(bLoop):
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- bne- cr7, L(bLcr7)
-
- cmpld cr6, rWORD5, rWORD6
- bdz- L(b3i)
-
- lbzu rWORD3, 1(rSTR1)
- lbzu rWORD4, 1(rSTR2)
- bne- cr1, L(bLcr1)
-
- cmpld cr7, rWORD1, rWORD2
- bdz- L(b2i)
-
- lbzu rWORD5, 1(rSTR1)
- lbzu rWORD6, 1(rSTR2)
- bne- cr6, L(bLcr6)
-
- cmpld cr1, rWORD3, rWORD4
- bdnz+ L(bLoop)
-
-/* We speculatively loading bytes before we have tested the previous
- bytes. But we must avoid overrunning the length (in the ctr) to
- prevent these speculative loads from causing a segfault. In this
- case the loop will exit early (before the all pending bytes are
- tested. In this case we must complete the pending operations
- before returning. */
-L(b1i):
- bne- cr7, L(bLcr7)
- bne- cr1, L(bLcr1)
- b L(bx56)
- .align 4
-L(b2i):
- bne- cr6, L(bLcr6)
- bne- cr7, L(bLcr7)
- b L(bx34)
- .align 4
-L(b3i):
- bne- cr1, L(bLcr1)
- bne- cr6, L(bLcr6)
- b L(bx12)
- .align 4
-L(bLcr7):
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
-L(bLcr1):
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
-L(bLcr6):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
-
-L(b13):
- bne- cr7, L(bx12)
- bne- cr1, L(bx34)
-L(bx56):
- sub rRTN, rWORD5, rWORD6
- blr
- nop
-L(b12):
- bne- cr7, L(bx12)
-L(bx34):
- sub rRTN, rWORD3, rWORD4
- blr
-L(b11):
-L(bx12):
- sub rRTN, rWORD1, rWORD2
- blr
- .align 4
-L(zeroLength):
- li rRTN, 0
- blr
-
- .align 4
-/* At this point we know the strings have different alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then rStr1 is double word
- aligned and can perform the DWunaligned loop.
-
- Otherwise we know that rSTR1 is not already DW aligned yet.
- So we can force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DWaligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected resister pair. */
-#define rSHL r29 /* Unaligned shift left count. */
-#define rSHR r28 /* Unaligned shift right count. */
-#define rWORD8_SHIFT r27 /* Left rotation temp for rWORD2. */
-#define rWORD2_SHIFT r26 /* Left rotation temp for rWORD4. */
-#define rWORD4_SHIFT r25 /* Left rotation temp for rWORD6. */
-#define rWORD6_SHIFT r24 /* Left rotation temp for rWORD8. */
-L(unaligned):
- std rSHL, -24(r1)
- cfi_offset(rSHL, -24)
- clrldi rSHL, rSTR2, 61
- beq- cr6, L(duzeroLength)
- std rSHR, -32(r1)
- cfi_offset(rSHR, -32)
- beq cr5, L(DWunaligned)
- std rWORD8_SHIFT, -40(r1)
- cfi_offset(rWORD8_SHIFT, -40)
-/* Adjust the logical start of rSTR2 to compensate for the extra bits
- in the 1st rSTR1 DW. */
- sub rWORD8_SHIFT, rSTR2, r12
-/* But do not attempt to address the DW before that DW that contains
- the actual start of rSTR2. */
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, -48(r1)
-/* Compute the left/right shift counts for the unaligned rSTR2,
- compensating for the logical (DW aligned) start of rSTR1. */
- clrldi rSHL, rWORD8_SHIFT, 61
- clrrdi rSTR1, rSTR1, 3
- std rWORD4_SHIFT, -56(r1)
- sldi rSHL, rSHL, 3
- cmpld cr5, rWORD8_SHIFT, rSTR2
- add rN, rN, r12
- sldi rWORD6, r12, 3
- std rWORD6_SHIFT, -64(r1)
- cfi_offset(rWORD2_SHIFT, -48)
- cfi_offset(rWORD4_SHIFT, -56)
- cfi_offset(rWORD6_SHIFT, -64)
- subfic rSHR, rSHL, 64
- srdi r0, rN, 5 /* Divide by 32 */
- andi. r12, rN, 24 /* Get the DW remainder */
-/* We normally need to load 2 DWs to start the unaligned rSTR2, but in
- this special case those bits may be discarded anyway. Also we
- must avoid loading a DW where none of the bits are part of rSTR2 as
- this may cross a page boundary and cause a page fault. */
- li rWORD8, 0
- blt cr5, L(dus0)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD8, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD8, 0(rSTR2)
- addi rSTR2, rSTR2, 8
-#endif
- sld rWORD8, rWORD8, rSHL
-
-L(dus0):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
-#endif
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- srd r12, rWORD2, rSHR
- clrldi rN, rN, 61
- beq L(duPs4)
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- or rWORD8, r12, rWORD8
- bgt cr1, L(duPs3)
- beq cr1, L(duPs2)
-
-/* Remainder is 8 */
- .align 4
-L(dusP1):
- sld rWORD8_SHIFT, rWORD2, rSHL
- sld rWORD7, rWORD1, rWORD6
- sld rWORD8, rWORD8, rWORD6
- bge cr7, L(duP1e)
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD2, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD2, 8(rSTR2)
-#endif
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16 */
- .align 4
-L(duPs2):
- sld rWORD6_SHIFT, rWORD2, rSHL
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD8, rWORD6
- b L(duP2e)
-/* Remainder is 24 */
- .align 4
-L(duPs3):
- sld rWORD4_SHIFT, rWORD2, rSHL
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD8, rWORD6
- b L(duP3e)
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(duPs4):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- or rWORD8, r12, rWORD8
- sld rWORD2_SHIFT, rWORD2, rSHL
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD8, rWORD6
- b L(duP4e)
-
-/* At this point we know rSTR1 is double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWunaligned):
- std rWORD8_SHIFT, -40(r1)
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, -48(r1)
- srdi r0, rN, 5 /* Divide by 32 */
- std rWORD4_SHIFT, -56(r1)
- andi. r12, rN, 24 /* Get the DW remainder */
- std rWORD6_SHIFT, -64(r1)
- cfi_offset(rWORD8_SHIFT, -40)
- cfi_offset(rWORD2_SHIFT, -48)
- cfi_offset(rWORD4_SHIFT, -56)
- cfi_offset(rWORD6_SHIFT, -64)
- sldi rSHL, rSHL, 3
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD6, 0, rSTR2
- addi rSTR2, rSTR2, 8
- ldbrx rWORD8, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD6, 0(rSTR2)
- ldu rWORD8, 8(rSTR2)
-#endif
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- subfic rSHR, rSHL, 64
- sld rWORD6_SHIFT, rWORD6, rSHL
- beq L(duP4)
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- bgt cr1, L(duP3)
- beq cr1, L(duP2)
-
-/* Remainder is 8 */
- .align 4
-L(duP1):
- srd r12, rWORD8, rSHR
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- addi rSTR1, rSTR1, 8
-#else
- ld rWORD7, 0(rSTR1)
-#endif
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP1x)
-L(duP1e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 16(rSTR1)
- ld rWORD4, 16(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- bne cr5, L(duLcr5)
- or rWORD4, r12, rWORD2_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 24(rSTR1)
- ld rWORD6, 24(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- bne cr7, L(duLcr7)
- or rWORD6, r0, rWORD4_SHIFT
- cmpld cr6, rWORD5, rWORD6
- b L(duLoop3)
- .align 4
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
-L(duP1x):
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD2, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD2, 8(rSTR2)
-#endif
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16 */
- .align 4
-L(duP2):
- srd r0, rWORD8, rSHR
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- addi rSTR1, rSTR1, 8
-#else
- ld rWORD5, 0(rSTR1)
-#endif
- or rWORD6, r0, rWORD6_SHIFT
- sld rWORD6_SHIFT, rWORD8, rSHL
-L(duP2e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD7, 8(rSTR1)
- ld rWORD8, 8(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP2x)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 16(rSTR1)
- ld rWORD2, 16(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 24(rSTR1)
- ld rWORD4, 24(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#endif
- cmpld cr1, rWORD3, rWORD4
- b L(duLoop2)
- .align 4
-L(duP2x):
- cmpld cr5, rWORD7, rWORD8
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#endif
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD2, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD2, 8(rSTR2)
-#endif
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Remainder is 24 */
- .align 4
-L(duP3):
- srd r12, rWORD8, rSHR
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- addi rSTR1, rSTR1, 8
-#else
- ld rWORD3, 0(rSTR1)
-#endif
- sld rWORD4_SHIFT, rWORD8, rSHL
- or rWORD4, r12, rWORD6_SHIFT
-L(duP3e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 8(rSTR1)
- ld rWORD6, 8(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD7, 16(rSTR1)
- ld rWORD8, 16(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP3x)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 24(rSTR1)
- ld rWORD2, 24(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#endif
- cmpld cr7, rWORD1, rWORD2
- b L(duLoop1)
- .align 4
-L(duP3x):
-#ifndef __LITTLE_ENDIAN__
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#endif
-#if 0
-/* Huh? We've already branched on cr1! */
- bne cr1, L(duLcr1)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD2, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD2, 8(rSTR2)
-#endif
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(duP4):
- mtctr r0 /* Power4 wants mtctr 1st in dispatch group */
- srd r0, rWORD8, rSHR
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- addi rSTR1, rSTR1, 8
-#else
- ld rWORD1, 0(rSTR1)
-#endif
- sld rWORD2_SHIFT, rWORD8, rSHL
- or rWORD2, r0, rWORD6_SHIFT
-L(duP4e):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 8(rSTR1)
- ld rWORD4, 8(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 16(rSTR1)
- ld rWORD6, 16(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ldu rWORD7, 24(rSTR1)
- ldu rWORD8, 24(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- cmpld cr5, rWORD7, rWORD8
- bdz- L(du24) /* Adjust CTR as we start with +4 */
-/* This is the primary loop */
- .align 4
-L(duLoop):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
- ldbrx rWORD2, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD1, 8(rSTR1)
- ld rWORD2, 8(rSTR2)
-#endif
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-L(duLoop1):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD3, 0, rSTR1
- ldbrx rWORD4, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD3, 16(rSTR1)
- ld rWORD4, 16(rSTR2)
-#endif
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
-L(duLoop2):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD5, 0, rSTR1
- ldbrx rWORD6, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD5, 24(rSTR1)
- ld rWORD6, 24(rSTR2)
-#endif
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
-L(duLoop3):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD7, 0, rSTR1
- ldbrx rWORD8, 0, rSTR2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
-#else
- ldu rWORD7, 32(rSTR1)
- ldu rWORD8, 32(rSTR2)
-#endif
- cmpld cr7, rWORD1, rWORD2
- bne- cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- bdnz+ L(duLoop)
-
-L(duL4):
-#if 0
-/* Huh? We've already branched on cr1! */
- bne cr1, L(duLcr1)
-#endif
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(du44):
- bne cr7, L(duLcr7)
-L(du34):
- bne cr1, L(duLcr1)
-L(du24):
- bne cr6, L(duLcr6)
-L(du14):
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
-/* At this point we have a remainder of 1 to 7 bytes to compare. We use
- shift right double to eliminate bits beyond the compare length.
-
- However it may not be safe to load rWORD2 which may be beyond the
- string length. So we compare the bit length of the remainder to
- the right shift count (rSHR). If the bit count is less than or equal
- we do not need to load rWORD2 (all significant bits are already in
- rWORD8_SHIFT). */
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD2, 0, rSTR2
- addi rSTR2, rSTR2, 8
-#else
- ld rWORD2, 8(rSTR2)
-#endif
- srd r0, rWORD2, rSHR
- .align 4
-L(dutrim):
-#ifdef __LITTLE_ENDIAN__
- ldbrx rWORD1, 0, rSTR1
-#else
- ld rWORD1, 8(rSTR1)
-#endif
- ld rWORD8, -8(r1)
- subfic rN, rN, 64 /* Shift count is 64 - (rN * 8). */
- or rWORD2, r0, rWORD8_SHIFT
- ld rWORD7, -16(r1)
- ld rSHL, -24(r1)
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- ld rSHR, -32(r1)
- ld rWORD8_SHIFT, -40(r1)
- li rRTN, 0
- cmpld cr7, rWORD1, rWORD2
- ld rWORD2_SHIFT, -48(r1)
- ld rWORD4_SHIFT, -56(r1)
- beq cr7, L(dureturn24)
- li rRTN, 1
- ld rWORD6_SHIFT, -64(r1)
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(duLcr7):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- li rRTN, 1
- bgt cr7, L(dureturn29)
- ld rSHL, -24(r1)
- ld rSHR, -32(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr1):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- li rRTN, 1
- bgt cr1, L(dureturn29)
- ld rSHL, -24(r1)
- ld rSHR, -32(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr6):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- li rRTN, 1
- bgt cr6, L(dureturn29)
- ld rSHL, -24(r1)
- ld rSHR, -32(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr5):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
- li rRTN, 1
- bgt cr5, L(dureturn29)
- ld rSHL, -24(r1)
- ld rSHR, -32(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 3
-L(duZeroReturn):
- li rRTN, 0
- .align 4
-L(dureturn):
- ld rWORD8, -8(r1)
- ld rWORD7, -16(r1)
-L(dureturn29):
- ld rSHL, -24(r1)
- ld rSHR, -32(r1)
-L(dureturn27):
- ld rWORD8_SHIFT, -40(r1)
-L(dureturn26):
- ld rWORD2_SHIFT, -48(r1)
-L(dureturn25):
- ld rWORD4_SHIFT, -56(r1)
-L(dureturn24):
- ld rWORD6_SHIFT, -64(r1)
- blr
-L(duzeroLength):
- li rRTN, 0
- blr
-
-END (MEMCMP)
-libc_hidden_builtin_def (memcmp)
-weak_alias (memcmp, bcmp)
diff --git a/sysdeps/powerpc/powerpc64/power4/memcopy.h b/sysdeps/powerpc/powerpc64/power4/memcopy.h
deleted file mode 100644
index 9a4ff79f4a..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/memcopy.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../powerpc32/power4/memcopy.h"
diff --git a/sysdeps/powerpc/powerpc64/power4/memcpy.S b/sysdeps/powerpc/powerpc64/power4/memcpy.S
deleted file mode 100644
index 2e96376b9f..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/memcpy.S
+++ /dev/null
@@ -1,477 +0,0 @@
-/* Optimized memcpy implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
- Returns 'dst'.
-
- Memcpy handles short copies (< 32-bytes) using a binary move blocks
- (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled
- with the appropriate combination of byte and halfword load/stores.
- There is minimal effort to optimize the alignment of short moves.
- The 64-bit implementations of POWER3 and POWER4 do a reasonable job
- of handling unaligned load/stores that do not cross 32-byte boundaries.
-
- Longer moves (>= 32-bytes) justify the effort to get at least the
- destination doubleword (8-byte) aligned. Further optimization is
- possible when both source and destination are doubleword aligned.
- Each case has a optimized unrolled loop. */
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
- .machine power4
-EALIGN (MEMCPY, 5, 0)
- CALL_MCOUNT 3
-
- cmpldi cr1,5,31
- neg 0,3
- std 3,-16(1)
- std 31,-8(1)
- cfi_offset(31,-8)
- andi. 11,3,7 /* check alignment of dst. */
- clrldi 0,0,61 /* Number of bytes until the 1st doubleword of dst. */
- clrldi 10,4,61 /* check alignment of src. */
- cmpldi cr6,5,8
- ble- cr1,.L2 /* If move < 32 bytes use short move code. */
- cmpld cr6,10,11
- mr 12,4
- srdi 9,5,3 /* Number of full double words remaining. */
- mtcrf 0x01,0
- mr 31,5
- beq .L0
-
- subf 31,0,5
- /* Move 0-7 bytes as needed to get the destination doubleword aligned. */
-1: bf 31,2f
- lbz 6,0(12)
- addi 12,12,1
- stb 6,0(3)
- addi 3,3,1
-2: bf 30,4f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-4: bf 29,0f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-0:
- clrldi 10,12,61 /* check alignment of src again. */
- srdi 9,31,3 /* Number of full double words remaining. */
-
- /* Copy doublewords from source to destination, assuming the
- destination is aligned on a doubleword boundary.
-
- At this point we know there are at least 25 bytes left (32-7) to copy.
- The next step is to determine if the source is also doubleword aligned.
- If not branch to the unaligned move code at .L6. which uses
- a load, shift, store strategy.
-
- Otherwise source and destination are doubleword aligned, and we can
- the optimized doubleword copy loop. */
-.L0:
- clrldi 11,31,61
- mtcrf 0x01,9
- cmpldi cr1,11,0
- bne- cr6,.L6 /* If source is not DW aligned. */
-
- /* Move doublewords where destination and source are DW aligned.
- Use a unrolled loop to copy 4 doubleword (32-bytes) per iteration.
- If the copy is not an exact multiple of 32 bytes, 1-3
- doublewords are copied as needed to set up the main loop. After
- the main loop exits there may be a tail of 1-7 bytes. These byte are
- copied a word/halfword/byte at a time as needed to preserve alignment. */
-
- srdi 8,31,5
- cmpldi cr1,9,4
- cmpldi cr6,11,0
- mr 11,12
-
- bf 30,1f
- ld 6,0(12)
- ld 7,8(12)
- addi 11,12,16
- mtctr 8
- std 6,0(3)
- std 7,8(3)
- addi 10,3,16
- bf 31,4f
- ld 0,16(12)
- std 0,16(3)
- blt cr1,3f
- addi 11,12,24
- addi 10,3,24
- b 4f
- .align 4
-1:
- mr 10,3
- mtctr 8
- bf 31,4f
- ld 6,0(12)
- addi 11,12,8
- std 6,0(3)
- addi 10,3,8
-
- .align 4
-4:
- ld 6,0(11)
- ld 7,8(11)
- ld 8,16(11)
- ld 0,24(11)
- addi 11,11,32
-2:
- std 6,0(10)
- std 7,8(10)
- std 8,16(10)
- std 0,24(10)
- addi 10,10,32
- bdnz 4b
-3:
-
- rldicr 0,31,0,60
- mtcrf 0x01,31
- beq cr6,0f
-.L9:
- add 3,3,0
- add 12,12,0
-
-/* At this point we have a tail of 0-7 bytes and we know that the
- destination is double word aligned. */
-4: bf 29,2f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: bf 30,1f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: bf 31,0f
- lbz 6,0(12)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- blr
-
-/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31
- bytes. Each case is handled without loops, using binary (1,2,4,8)
- tests.
-
- In the short (0-8 byte) case no attempt is made to force alignment
- of either source or destination. The hardware will handle the
- unaligned load/stores with small delays for crossing 32- 64-byte, and
- 4096-byte boundaries. Since these short moves are unlikely to be
- unaligned or cross these boundaries, the overhead to force
- alignment is not justified.
-
- The longer (9-31 byte) move is more likely to cross 32- or 64-byte
- boundaries. Since only loads are sensitive to the 32-/64-byte
- boundaries it is more important to align the source then the
- destination. If the source is not already word aligned, we first
- move 1-3 bytes as needed. Since we are only word aligned we don't
- use double word load/stores to insure that all loads are aligned.
- While the destination and stores may still be unaligned, this
- is only an issue for page (4096 byte boundary) crossing, which
- should be rare for these short moves. The hardware handles this
- case automatically with a small delay. */
-
- .align 4
-.L2:
- mtcrf 0x01,5
- neg 8,4
- clrrdi 11,4,2
- andi. 0,8,3
- ble cr6,.LE8 /* Handle moves of 0-8 bytes. */
-/* At least 9 bytes left. Get the source word aligned. */
- cmpldi cr1,5,16
- mr 10,5
- mr 12,4
- cmpldi cr6,0,2
- beq .L3 /* If the source is already word aligned skip this. */
-/* Copy 1-3 bytes to get source address word aligned. */
- lwz 6,0(11)
- subf 10,0,5
- add 12,4,0
- blt cr6,5f
- srdi 7,6,16
- bgt cr6,3f
-#ifdef __LITTLE_ENDIAN__
- sth 7,0(3)
-#else
- sth 6,0(3)
-#endif
- b 7f
- .align 4
-3:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,24
- stb 6,0(3)
- sth 7,1(3)
-#else
- stb 7,0(3)
- sth 6,1(3)
-#endif
- b 7f
- .align 4
-5:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,8
-#endif
- stb 6,0(3)
-7:
- cmpldi cr1,10,16
- add 3,3,0
- mtcrf 0x01,10
- .align 4
-.L3:
-/* At least 6 bytes left and the source is word aligned. */
- blt cr1,8f
-16: /* Move 16 bytes. */
- lwz 6,0(12)
- lwz 7,4(12)
- stw 6,0(3)
- lwz 6,8(12)
- stw 7,4(3)
- lwz 7,12(12)
- addi 12,12,16
- stw 6,8(3)
- stw 7,12(3)
- addi 3,3,16
-8: /* Move 8 bytes. */
- bf 28,4f
- lwz 6,0(12)
- lwz 7,4(12)
- addi 12,12,8
- stw 6,0(3)
- stw 7,4(3)
- addi 3,3,8
-4: /* Move 4 bytes. */
- bf 29,2f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: /* Move 2-3 bytes. */
- bf 30,1f
- lhz 6,0(12)
- sth 6,0(3)
- bf 31,0f
- lbz 7,2(12)
- stb 7,2(3)
- ld 3,-16(1)
- blr
-1: /* Move 1 byte. */
- bf 31,0f
- lbz 6,0(12)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
-/* Special case to copy 0-8 bytes. */
- .align 4
-.LE8:
- mr 12,4
- bne cr6,4f
-/* Would have liked to use use ld/std here but the 630 processors are
- slow for load/store doubles that are not at least word aligned.
- Unaligned Load/Store word execute with only a 1 cycle penalty. */
- lwz 6,0(4)
- lwz 7,4(4)
- stw 6,0(3)
- stw 7,4(3)
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
- .align 4
-4: bf 29,2b
- lwz 6,0(4)
- stw 6,0(3)
-6:
- bf 30,5f
- lhz 7,4(4)
- sth 7,4(3)
- bf 31,0f
- lbz 8,6(4)
- stb 8,6(3)
- ld 3,-16(1)
- blr
- .align 4
-5:
- bf 31,0f
- lbz 6,4(4)
- stb 6,4(3)
- .align 4
-0:
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
- .align 4
-.L6:
-
- /* Copy doublewords where the destination is aligned but the source is
- not. Use aligned doubleword loads from the source, shifted to realign
- the data, to allow aligned destination stores. */
- addi 11,9,-1 /* loop DW count is one less than total */
- subf 5,10,12
- sldi 10,10,3
- mr 4,3
- srdi 8,11,2 /* calculate the 32 byte loop count */
- ld 6,0(5)
- mtcrf 0x01,11
- cmpldi cr6,9,4
- mtctr 8
- ld 7,8(5)
- subfic 9,10,64
- bf 30,1f
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srd 0,7,10
- sld 8,6,9
-#else
- sld 0,7,10
- srd 8,6,9
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,8f /* if total DWs = 3, then bypass loop */
- bf 31,4f
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,8f /* if total DWs = 4, then bypass loop */
- b 4f
- .align 4
-1:
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,4f
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-4:
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srd 0,7,10
- sld 8,6,9
-#else
- sld 0,7,10
- srd 8,6,9
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srd 0,7,10
- sld 8,6,9
-#else
- sld 0,7,10
- srd 8,6,9
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ 4b
- .align 4
-8:
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srd 0,6,10
- sld 8,7,9
-#else
- sld 0,6,10
- srd 8,7,9
-#endif
- or 0,0,8
- std 0,0(4)
-3:
- rldicr 0,31,0,60
- mtcrf 0x01,31
- bne cr1,.L9 /* If the tail is 0 bytes we are done! */
- /* Return original dst pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- blr
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/power4/memset.S b/sysdeps/powerpc/powerpc64/power4/memset.S
deleted file mode 100644
index a57214e0b0..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/memset.S
+++ /dev/null
@@ -1,251 +0,0 @@
-/* Optimized memset implementation for PowerPC64.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
-/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
- Returns 's'.
-
- The memset is done in three sizes: byte (8 bits), word (32 bits),
- cache line (256 bits). There is a special case for setting cache lines
- to 0, to take advantage of the dcbz instruction. */
-
-#ifndef MEMSET
-# define MEMSET memset
-#endif
- .machine power4
-EALIGN (MEMSET, 5, 0)
- CALL_MCOUNT 3
-
-#define rTMP r0
-#define rRTN r3 /* Initial value of 1st argument. */
-#define rMEMP0 r3 /* Original value of 1st arg. */
-#define rCHR r4 /* Char to set in each byte. */
-#define rLEN r5 /* Length of region to set. */
-#define rMEMP r6 /* Address at which we are storing. */
-#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
-#define rMEMP2 r8
-
-#define rNEG64 r8 /* Constant -64 for clearing with dcbz. */
-#define rCLS r8 /* Cache line size obtained from static. */
-#define rCLM r9 /* Cache line size mask to check for cache alignment. */
-L(_memset):
-/* Take care of case for size <= 4. */
- cmpldi cr1, rLEN, 8
- andi. rALIGN, rMEMP0, 7
- mr rMEMP, rMEMP0
- ble- cr1, L(small)
-
-/* Align to doubleword boundary. */
- cmpldi cr5, rLEN, 31
- insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */
- beq+ L(aligned2)
- mtcrf 0x01, rMEMP0
- subfic rALIGN, rALIGN, 8
- cror 28,30,31 /* Detect odd word aligned. */
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
- bt 29, L(g4)
-/* Process the even word of doubleword. */
- bf+ 31, L(g2)
- stb rCHR, 0(rMEMP0)
- bt 30, L(g4x)
-L(g2):
- sth rCHR, -6(rMEMP)
-L(g4x):
- stw rCHR, -4(rMEMP)
- b L(aligned)
-/* Process the odd word of doubleword. */
-L(g4):
- bf 28, L(g4x) /* If false, word aligned on odd word. */
- bf+ 31, L(g0)
- stb rCHR, 0(rMEMP0)
- bt 30, L(aligned)
-L(g0):
- sth rCHR, -2(rMEMP)
-
-/* Handle the case of size < 31. */
-L(aligned2):
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
-L(aligned):
- mtcrf 0x01, rLEN
- ble cr5, L(medium)
-/* Align to 32-byte boundary. */
- andi. rALIGN, rMEMP, 0x18
- subfic rALIGN, rALIGN, 0x20
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- beq L(caligned)
- mtcrf 0x01, rALIGN
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- cmplwi cr1, rALIGN, 0x10
- mr rMEMP2, rMEMP
- bf 28, L(a1)
- stdu rCHR, -8(rMEMP2)
-L(a1): blt cr1, L(a2)
- std rCHR, -8(rMEMP2)
- stdu rCHR, -16(rMEMP2)
-L(a2):
-
-/* Now aligned to a 32 byte boundary. */
-L(caligned):
- cmpldi cr1, rCHR, 0
- clrrdi. rALIGN, rLEN, 5
- mtcrf 0x01, rLEN
- beq cr1, L(zloopstart) /* Special case for clearing memory using dcbz. */
-L(nondcbz):
- srdi rTMP, rALIGN, 5
- mtctr rTMP
- beq L(medium) /* We may not actually get to do a full line. */
- clrldi. rLEN, rLEN, 59
- add rMEMP, rMEMP, rALIGN
- li rNEG64, -0x40
- bdz L(cloopdone)
-
-L(c3): dcbtst rNEG64, rMEMP
- std rCHR, -8(rMEMP)
- std rCHR, -16(rMEMP)
- std rCHR, -24(rMEMP)
- stdu rCHR, -32(rMEMP)
- bdnz L(c3)
-L(cloopdone):
- std rCHR, -8(rMEMP)
- std rCHR, -16(rMEMP)
- cmpldi cr1, rLEN, 16
- std rCHR, -24(rMEMP)
- stdu rCHR, -32(rMEMP)
- beqlr
- add rMEMP, rMEMP, rALIGN
- b L(medium_tail2)
-
- .align 5
-/* Clear lines of memory in 128-byte chunks. */
-L(zloopstart):
-/* If the remaining length is less the 32 bytes, don't bother getting
- the cache line size. */
- beq L(medium)
- li rCLS,128 /* cache line size is 128 */
-
-/* Now we know the cache line size, and it is not 32-bytes, but
- we may not yet be aligned to the cache line. May have a partial
- line to fill, so touch it 1st. */
- dcbt 0,rMEMP
-L(getCacheAligned):
- cmpldi cr1,rLEN,32
- andi. rTMP,rMEMP,127
- blt cr1,L(handletail32)
- beq L(cacheAligned)
- addi rMEMP,rMEMP,32
- addi rLEN,rLEN,-32
- std rCHR,-32(rMEMP)
- std rCHR,-24(rMEMP)
- std rCHR,-16(rMEMP)
- std rCHR,-8(rMEMP)
- b L(getCacheAligned)
-
-/* Now we are aligned to the cache line and can use dcbz. */
-L(cacheAligned):
- cmpld cr1,rLEN,rCLS
- blt cr1,L(handletail32)
- dcbz 0,rMEMP
- subf rLEN,rCLS,rLEN
- add rMEMP,rMEMP,rCLS
- b L(cacheAligned)
-
-/* We are here because the cache line size was set and was not 32-bytes
- and the remainder (rLEN) is less than the actual cache line size.
- So set up the preconditions for L(nondcbz) and go there. */
-L(handletail32):
- clrrwi. rALIGN, rLEN, 5
- b L(nondcbz)
-
- .align 5
-L(small):
-/* Memset of 8 bytes or less. */
- cmpldi cr6, rLEN, 4
- cmpldi cr5, rLEN, 1
- ble cr6,L(le4)
- subi rLEN, rLEN, 4
- stb rCHR,0(rMEMP)
- stb rCHR,1(rMEMP)
- stb rCHR,2(rMEMP)
- stb rCHR,3(rMEMP)
- addi rMEMP,rMEMP, 4
- cmpldi cr5, rLEN, 1
-L(le4):
- cmpldi cr1, rLEN, 3
- bltlr cr5
- stb rCHR, 0(rMEMP)
- beqlr cr5
- stb rCHR, 1(rMEMP)
- bltlr cr1
- stb rCHR, 2(rMEMP)
- beqlr cr1
- stb rCHR, 3(rMEMP)
- blr
-
-/* Memset of 0-31 bytes. */
- .align 5
-L(medium):
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- cmpldi cr1, rLEN, 16
-L(medium_tail2):
- add rMEMP, rMEMP, rLEN
-L(medium_tail):
- bt- 31, L(medium_31t)
- bt- 30, L(medium_30t)
-L(medium_30f):
- bt- 29, L(medium_29t)
-L(medium_29f):
- bge- cr1, L(medium_27t)
- bflr- 28
- std rCHR, -8(rMEMP)
- blr
-
-L(medium_31t):
- stbu rCHR, -1(rMEMP)
- bf- 30, L(medium_30f)
-L(medium_30t):
- sthu rCHR, -2(rMEMP)
- bf- 29, L(medium_29f)
-L(medium_29t):
- stwu rCHR, -4(rMEMP)
- blt- cr1, L(medium_27f)
-L(medium_27t):
- std rCHR, -8(rMEMP)
- stdu rCHR, -16(rMEMP)
-L(medium_27f):
- bflr- 28
-L(medium_28t):
- std rCHR, -8(rMEMP)
- blr
-END_GEN_TB (MEMSET,TB_TOCLESS)
-libc_hidden_builtin_def (memset)
-
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. */
-ENTRY (__bzero)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END (__bzero)
-#ifndef __bzero
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power4/multiarch/Implies b/sysdeps/powerpc/powerpc64/power4/multiarch/Implies
deleted file mode 100644
index 30edcf7f9d..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power4/strncmp.S b/sysdeps/powerpc/powerpc64/power4/strncmp.S
deleted file mode 100644
index 2b0c00dfb2..0000000000
--- a/sysdeps/powerpc/powerpc64/power4/strncmp.S
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Optimized strcmp implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-#ifndef STRNCMP
-# define STRNCMP strncmp
-#endif
-
-/* See strlen.s for comments on how the end-of-string testing works. */
-
-/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
-
-EALIGN (STRNCMP, 4, 0)
- CALL_MCOUNT 3
-
-#define rTMP2 r0
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rN r5 /* max string length */
-#define rWORD1 r6 /* current word in s1 */
-#define rWORD2 r7 /* current word in s2 */
-#define rWORD3 r10
-#define rWORD4 r11
-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
-#define rBITDIF r11 /* bits that differ in s1 & s2 words */
-#define rTMP r12
-
- dcbt 0,rSTR1
- or rTMP, rSTR2, rSTR1
- lis r7F7F, 0x7f7f
- dcbt 0,rSTR2
- clrldi. rTMP, rTMP, 61
- cmpldi cr1, rN, 0
- lis rFEFE, -0x101
- bne L(unaligned)
-/* We are doubleword aligned so set up for two loops. first a double word
- loop, then fall into the byte loop if any residual. */
- srdi. rTMP, rN, 3
- clrldi rN, rN, 61
- addi rFEFE, rFEFE, -0x101
- addi r7F7F, r7F7F, 0x7f7f
- cmpldi cr1, rN, 0
- beq L(unaligned)
-
- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group. */
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
- sldi rTMP, rFEFE, 32
- insrdi r7F7F, r7F7F, 32, 0
- add rFEFE, rFEFE, rTMP
- b L(g1)
-
-L(g0):
- ldu rWORD1, 8(rSTR1)
- bne- cr1, L(different)
- ldu rWORD2, 8(rSTR2)
-L(g1): add rTMP, rFEFE, rWORD1
- nor rNEG, r7F7F, rWORD1
- bdz L(tail)
- and. rTMP, rTMP, rNEG
- cmpd cr1, rWORD1, rWORD2
- beq+ L(g0)
-
-/* OK. We've hit the end of the string. We need to be careful that
- we don't compare two strings as different because of gunk beyond
- the end of the strings... */
-
-#ifdef __LITTLE_ENDIAN__
-L(endstring):
- addi rTMP2, rTMP, -1
- beq cr1, L(equal)
- andc rTMP2, rTMP2, rTMP
- rldimi rTMP2, rTMP2, 1, 0
- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */
- and rWORD1, rWORD1, rTMP2
- cmpd cr1, rWORD1, rWORD2
- beq cr1, L(equal)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-
-#else
-L(endstring):
- and rTMP, r7F7F, rWORD1
- beq cr1, L(equal)
- add rTMP, rTMP, r7F7F
- xor. rBITDIF, rWORD1, rWORD2
- andc rNEG, rNEG, rTMP
- blt- L(highbit)
- cntlzd rBITDIF, rBITDIF
- cntlzd rNEG, rNEG
- addi rNEG, rNEG, 7
- cmpd cr1, rNEG, rBITDIF
- sub rRTN, rWORD1, rWORD2
- blt- cr1, L(equal)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-#endif
-
-/* Oh well. In this case, we just do a byte-by-byte comparison. */
- .align 4
-L(tail):
- and. rTMP, rTMP, rNEG
- cmpd cr1, rWORD1, rWORD2
- bne- L(endstring)
- addi rSTR1, rSTR1, 8
- bne- cr1, L(different)
- addi rSTR2, rSTR2, 8
- cmpldi cr1, rN, 0
-L(unaligned):
- mtctr rN /* Power4 wants mtctr 1st in dispatch group */
- ble cr1, L(ux)
-L(uz):
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- .align 4
-L(u1):
- cmpdi cr1, rWORD1, 0
- bdz L(u4)
- cmpd rWORD1, rWORD2
- beq- cr1, L(u4)
- bne- L(u4)
- lbzu rWORD3, 1(rSTR1)
- lbzu rWORD4, 1(rSTR2)
- cmpdi cr1, rWORD3, 0
- bdz L(u3)
- cmpd rWORD3, rWORD4
- beq- cr1, L(u3)
- bne- L(u3)
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- cmpdi cr1, rWORD1, 0
- bdz L(u4)
- cmpd rWORD1, rWORD2
- beq- cr1, L(u4)
- bne- L(u4)
- lbzu rWORD3, 1(rSTR1)
- lbzu rWORD4, 1(rSTR2)
- cmpdi cr1, rWORD3, 0
- bdz L(u3)
- cmpd rWORD3, rWORD4
- beq- cr1, L(u3)
- bne- L(u3)
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- b L(u1)
-
-L(u3): sub rRTN, rWORD3, rWORD4
- blr
-L(u4): sub rRTN, rWORD1, rWORD2
- blr
-L(ux):
- li rRTN, 0
- blr
-END (STRNCMP)
-libc_hidden_builtin_def (strncmp)
diff --git a/sysdeps/powerpc/powerpc64/power5+/Implies b/sysdeps/powerpc/powerpc64/power5+/Implies
deleted file mode 100644
index 565bc94471..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/Implies
+++ /dev/null
@@ -1,4 +0,0 @@
-powerpc/power5+/fpu
-powerpc/power5+
-powerpc/powerpc64/power5/fpu
-powerpc/powerpc64/power5
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/Implies b/sysdeps/powerpc/powerpc64/power5+/fpu/Implies
deleted file mode 100644
index f00c50fb49..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5/fpu
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power5+/fpu/multiarch/Implies
deleted file mode 100644
index c0e67848e2..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S
deleted file mode 100644
index 39b7ee78e5..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ceil function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .machine "power5"
-EALIGN (__ceil, 4, 0)
- CALL_MCOUNT 0
- frip fp1, fp1
- blr
- END (__ceil)
-
-weak_alias (__ceil, ceil)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__ceil, ceill)
-strong_alias (__ceil, __ceill)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __ceil, ceill, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S
deleted file mode 100644
index d1c6f26d6d..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* ceilf function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-
- .machine "power5"
-EALIGN (__ceilf, 4, 0)
- CALL_MCOUNT 0
- frip fp1, fp1 /* The rounding instructions are double. */
- frsp fp1, fp1 /* But we need to set ooverflow for float. */
- blr
- END (__ceilf)
-
-weak_alias (__ceilf, ceilf)
-
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S
deleted file mode 100644
index 6411f15633..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S
+++ /dev/null
@@ -1,37 +0,0 @@
-/* floor function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .machine "power5"
-EALIGN (__floor, 4, 0)
- CALL_MCOUNT 0
- frim fp1, fp1
- blr
- END (__floor)
-
-weak_alias (__floor, floor)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__floor, floorl)
-strong_alias (__floor, __floorl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __floor, floorl, GLIBC_2_0)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_floorf.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_floorf.S
deleted file mode 100644
index 26c3b2594b..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_floorf.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* floorf function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-
- .machine "power5"
-EALIGN (__floorf, 4, 0)
- CALL_MCOUNT 0
- frim fp1, fp1 /* The rounding instructions are double. */
- frsp fp1, fp1 /* But we need to set ooverflow for float. */
- blr
- END (__floorf)
-
-weak_alias (__floorf, floorf)
-
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_llround.S
deleted file mode 100644
index 909714b449..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_llround.S
+++ /dev/null
@@ -1,58 +0,0 @@
-/* llround function. POWER5+, PowerPC64 version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* long long [r3] llround (float x [fp1])
- IEEE 1003.1 llround function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we pre-round using the V2.02 Floating Round to Integer Nearest
- instruction before we use Floating Convert to Integer Word with
- round to zero instruction. */
-
- .machine "power5"
-EALIGN (__llround, 4, 0)
- CALL_MCOUNT 0
- frin fp2, fp1 /* Round to nearest +-0.5. */
- fctidz fp3, fp2 /* Convert To Integer DW round toward 0. */
- stfd fp3, -16(r1)
- nop /* Insure the following load is in a different dispatch group */
- nop /* to avoid pipe stall on POWER4&5. */
- nop
- ld r3, -16(r1)
- blr
- END (__llround)
-
-strong_alias (__llround, __lround)
-weak_alias (__llround, llround)
-weak_alias (__lround, lround)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__llround, llroundl)
-strong_alias (__llround, __llroundl)
-weak_alias (__lround, lroundl)
-strong_alias (__lround, __lroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llround, llroundl, GLIBC_2_1)
-compat_symbol (libm, __lround, lroundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_round.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_round.S
deleted file mode 100644
index dc46d20f4f..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_round.S
+++ /dev/null
@@ -1,37 +0,0 @@
-/* round function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .machine "power5"
-EALIGN (__round, 4, 0)
- CALL_MCOUNT 0
- frin fp1, fp1
- blr
- END (__round)
-
-weak_alias (__round, round)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__round, roundl)
-strong_alias (__round, __roundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __round, roundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_roundf.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_roundf.S
deleted file mode 100644
index 0a587843ad..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_roundf.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* roundf function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-
- .machine "power5"
-EALIGN (__roundf, 4, 0)
- CALL_MCOUNT 0
- frin fp1, fp1 /* The rounding instructions are double. */
- frsp fp1, fp1 /* But we need to set ooverflow for float. */
- blr
- END (__roundf)
-
-weak_alias (__roundf, roundf)
-
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_trunc.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_trunc.S
deleted file mode 100644
index 7f8290e408..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_trunc.S
+++ /dev/null
@@ -1,37 +0,0 @@
-/* trunc function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .machine "power5"
-EALIGN (__trunc, 4, 0)
- CALL_MCOUNT 0
- friz fp1, fp1
- blr
- END (__trunc)
-
-weak_alias (__trunc, trunc)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__trunc, truncl)
-strong_alias (__trunc, __truncl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __trunc, truncl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_truncf.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_truncf.S
deleted file mode 100644
index 07f5d33127..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_truncf.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/* truncf function. PowerPC64/power5+ version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-
- .machine "power5"
-EALIGN (__truncf, 4, 0)
- CALL_MCOUNT 0
- friz fp1, fp1 /* The rounding instructions are double. */
- frsp fp1, fp1 /* But we need to set ooverflow for float. */
- blr
- END (__truncf)
-
-weak_alias (__truncf, truncf)
-
diff --git a/sysdeps/powerpc/powerpc64/power5+/multiarch/Implies b/sysdeps/powerpc/powerpc64/power5+/multiarch/Implies
deleted file mode 100644
index 0851b19fa2..0000000000
--- a/sysdeps/powerpc/powerpc64/power5+/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power5/Implies b/sysdeps/powerpc/powerpc64/power5/Implies
deleted file mode 100644
index bedb20b65c..0000000000
--- a/sysdeps/powerpc/powerpc64/power5/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power4/fpu
-powerpc/powerpc64/power4
diff --git a/sysdeps/powerpc/powerpc64/power5/fpu/Implies b/sysdeps/powerpc/powerpc64/power5/fpu/Implies
deleted file mode 100644
index 6b8c23efa6..0000000000
--- a/sysdeps/powerpc/powerpc64/power5/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power4/fpu/
diff --git a/sysdeps/powerpc/powerpc64/power5/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power5/fpu/multiarch/Implies
deleted file mode 100644
index 3740d050a6..0000000000
--- a/sysdeps/powerpc/powerpc64/power5/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power4/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S
deleted file mode 100644
index d6a829ea37..0000000000
--- a/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S
+++ /dev/null
@@ -1,60 +0,0 @@
-/* isnan(). PowerPC64 version.
- Copyright (C) 2008-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isnan(x) */
- .machine power5
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- stfd fp1,-8(r1) /* copy FPR to GPR */
- lis r0,0x7ff0
- nop /* insure the following is in a different */
- nop /* dispatch group */
- ld r4,-8(r1)
- sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */
- clrldi r4,r4,1 /* x = fabs(x) */
- cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */
- li r3,0 /* then return 0 */
- blelr+ cr7
- li r3,1 /* else return 1 */
- blr
- END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
-
diff --git a/sysdeps/powerpc/powerpc64/power5/multiarch/Implies b/sysdeps/powerpc/powerpc64/power5/multiarch/Implies
deleted file mode 100644
index 9a3cbb0938..0000000000
--- a/sysdeps/powerpc/powerpc64/power5/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power4/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power6/Implies b/sysdeps/powerpc/powerpc64/power6/Implies
deleted file mode 100644
index 4c782d4122..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power5+/fpu
-powerpc/powerpc64/power5+
diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/Implies b/sysdeps/powerpc/powerpc64/power6/fpu/Implies
deleted file mode 100644
index f09854edb6..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5+/fpu
diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power6/fpu/multiarch/Implies
deleted file mode 100644
index fca8a4ef0f..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5+/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S b/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S
deleted file mode 100644
index ec36d1be5b..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S
+++ /dev/null
@@ -1,58 +0,0 @@
-/* copysign(). PowerPC64/POWER6 version.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* double [f1] copysign (double [f1] x, double [f2] y);
- copysign(x,y) returns a value with the magnitude of x and
- with the sign bit of y. */
-
- .section ".text"
- .type __copysign, @function
- .machine power6
-EALIGN (__copysign, 4, 0)
- CALL_MCOUNT 0
- fcpsgn fp1,fp2,fp1
- blr
-END (__copysign)
-
-hidden_def (__copysign)
-weak_alias (__copysign, copysign)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__copysign, __copysignf)
-hidden_def (__copysignf)
-weak_alias (__copysignf, copysignf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__copysign, __copysignl)
-weak_alias (__copysign, copysignl)
-#endif
-
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, copysign, copysignl, GLIBC_2_0)
-# endif
-#else
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, copysign, copysignl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/s_copysignf.S b/sysdeps/powerpc/powerpc64/power6/fpu/s_copysignf.S
deleted file mode 100644
index d4aa702d07..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/fpu/s_copysignf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_copysign.S. */
diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S
deleted file mode 100644
index 85187b45f3..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S
+++ /dev/null
@@ -1,59 +0,0 @@
-/* isnan(). PowerPC64 version.
- Copyright (C) 2008-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isnan(x) */
- .machine power6
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- stfd fp1,-8(r1) /* copy FPR to GPR */
- ori r1,r1,0
- ld r4,-8(r1)
- lis r0,0x7ff0
- sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */
- clrldi r4,r4,1 /* x = fabs(x) */
- cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */
- li r3,0 /* then return 0 */
- blelr+ cr7
- li r3,1 /* else return 1 */
- blr
- END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
-
diff --git a/sysdeps/powerpc/powerpc64/power6/memcpy.S b/sysdeps/powerpc/powerpc64/power6/memcpy.S
deleted file mode 100644
index 1f7294b8ed..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/memcpy.S
+++ /dev/null
@@ -1,1499 +0,0 @@
-/* Optimized memcpy implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
- Returns 'dst'.
-
- Memcpy handles short copies (< 32-bytes) using a binary move blocks
- (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled
- with the appropriate combination of byte and halfword load/stores.
- There is minimal effort to optimize the alignment of short moves.
- The 64-bit implementations of POWER3 and POWER4 do a reasonable job
- of handling unaligned load/stores that do not cross 32-byte boundaries.
-
- Longer moves (>= 32-bytes) justify the effort to get at least the
- destination doubleword (8-byte) aligned. Further optimization is
- possible when both source and destination are doubleword aligned.
- Each case has a optimized unrolled loop.
-
- For POWER6 unaligned loads will take a 20+ cycle hiccup for any
- L1 cache miss that crosses a 32- or 128-byte boundary. Store
- is more forgiving and does not take a hiccup until page or
- segment boundaries. So we require doubleword alignment for
- the source but may take a risk and only require word alignment
- for the destination. */
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
- .machine "power6"
-EALIGN (MEMCPY, 7, 0)
- CALL_MCOUNT 3
-
- cmpldi cr1,5,31
- neg 0,3
- std 3,-16(1)
- std 31,-8(1)
- andi. 11,3,7 /* check alignment of dst. */
- clrldi 0,0,61 /* Number of bytes until the 1st doubleword of dst. */
- clrldi 10,4,61 /* check alignment of src. */
- cmpldi cr6,5,8
- ble- cr1,.L2 /* If move < 32 bytes use short move code. */
- mtcrf 0x01,0
- cmpld cr6,10,11
- srdi 9,5,3 /* Number of full double words remaining. */
- beq .L0
-
- subf 5,0,5
- /* Move 0-7 bytes as needed to get the destination doubleword aligned.
- Duplicate some code to maximize fall-through and minimize agen delays. */
-1: bf 31,2f
- lbz 6,0(4)
- stb 6,0(3)
- bf 30,5f
- lhz 6,1(4)
- sth 6,1(3)
- bf 29,0f
- lwz 6,3(4)
- stw 6,3(3)
- b 0f
-5:
- bf 29,0f
- lwz 6,1(4)
- stw 6,1(3)
- b 0f
-
-2: bf 30,4f
- lhz 6,0(4)
- sth 6,0(3)
- bf 29,0f
- lwz 6,2(4)
- stw 6,2(3)
- b 0f
-
-4: bf 29,0f
- lwz 6,0(4)
- stw 6,0(3)
-0:
-/* Add the number of bytes until the 1st doubleword of dst to src and dst. */
- add 4,4,0
- add 3,3,0
-
- clrldi 10,4,61 /* check alignment of src again. */
- srdi 9,5,3 /* Number of full double words remaining. */
-
- /* Copy doublewords from source to destination, assuming the
- destination is aligned on a doubleword boundary.
-
- At this point we know there are at least 25 bytes left (32-7) to copy.
- The next step is to determine if the source is also doubleword aligned.
- If not branch to the unaligned move code at .L6. which uses
- a load, shift, store strategy.
-
- Otherwise source and destination are doubleword aligned, and we can
- the optimized doubleword copy loop. */
- .align 4
-.L0:
- clrldi 11,5,61
- andi. 0,5,0x78
- srdi 12,5,7 /* Number of 128-byte blocks to move. */
- cmpldi cr1,11,0 /* If the tail is 0 bytes */
- bne- cr6,.L6 /* If source is not DW aligned. */
-
- /* Move doublewords where destination and source are DW aligned.
- Use a unrolled loop to copy 16 doublewords (128-bytes) per iteration.
- If the copy is not an exact multiple of 128 bytes, 1-15
- doublewords are copied as needed to set up the main loop. After
- the main loop exits there may be a tail of 1-7 bytes. These byte
- are copied a word/halfword/byte at a time as needed to preserve
- alignment.
-
- For POWER6 the L1 is store-through and the L2 is store-in. The
- L2 is clocked at half CPU clock so we can store 16 bytes every
- other cycle. POWER6 also has a load/store bypass so we can do
- load, load, store, store every 2 cycles.
-
- The following code is sensitive to cache line alignment. Do not
- make any change with out first making sure they don't result in
- splitting ld/std pairs across a cache line. */
-
- mtcrf 0x02,5
- mtcrf 0x01,5
- cmpldi cr5,12,1
- beq L(das_loop)
-
- bf 25,4f
- .align 3
- ld 6,0(4)
- ld 7,8(4)
- mr 11,4
- mr 10,3
- std 6,0(3)
- std 7,8(3)
- ld 6,16(4)
- ld 7,24(4)
- std 6,16(3)
- std 7,24(3)
- ld 6,0+32(4)
- ld 7,8+32(4)
- addi 4,4,64
- addi 3,3,64
- std 6,0+32(10)
- std 7,8+32(10)
- ld 6,16+32(11)
- ld 7,24+32(11)
- std 6,16+32(10)
- std 7,24+32(10)
-4:
- mr 10,3
- bf 26,2f
- ld 6,0(4)
- ld 7,8(4)
- mr 11,4
- nop
- std 6,0(3)
- std 7,8(3)
- ld 6,16(4)
- ld 7,24(4)
- addi 4,4,32
- std 6,16(3)
- std 7,24(3)
- addi 3,3,32
-6:
- nop
- bf 27,5f
- ld 6,0+32(11)
- ld 7,8+32(11)
- addi 4,4,16
- addi 3,3,16
- std 6,0+32(10)
- std 7,8+32(10)
- bf 28,L(das_loop_s)
- ld 0,16+32(11)
- addi 4,4,8
- addi 3,3,8
- std 0,16+32(10)
- blt cr5,L(das_tail)
- b L(das_loop)
- .align 3
-5:
- nop
- bf 28,L(das_loop_s)
- ld 6,32(11)
- addi 4,4,8
- addi 3,3,8
- std 6,32(10)
- blt cr5,L(das_tail)
- b L(das_loop)
- .align 3
-2:
- mr 11,4
- bf 27,1f
- ld 6,0(4)
- ld 7,8(4)
- addi 4,4,16
- addi 3,3,16
- std 6,0(10)
- std 7,8(10)
- bf 28,L(das_loop_s)
- ld 0,16(11)
- addi 4,11,24
- addi 3,10,24
- std 0,16(10)
- blt cr5,L(das_tail)
- b L(das_loop)
- .align 3
-1:
- nop
- bf 28,L(das_loop_s)
- ld 6,0(4)
- addi 4,4,8
- addi 3,3,8
- std 6,0(10)
-L(das_loop_s):
- nop
- blt cr5,L(das_tail)
- .align 4
-L(das_loop):
- ld 6,0(4)
- ld 7,8(4)
- mr 10,3
- mr 11,4
- std 6,0(3)
- std 7,8(3)
- addi 12,12,-1
- nop
- ld 8,16(4)
- ld 0,24(4)
- std 8,16(3)
- std 0,24(3)
-
- ld 6,0+32(4)
- ld 7,8+32(4)
- std 6,0+32(3)
- std 7,8+32(3)
- ld 8,16+32(4)
- ld 0,24+32(4)
- std 8,16+32(3)
- std 0,24+32(3)
-
- ld 6,0+64(11)
- ld 7,8+64(11)
- std 6,0+64(10)
- std 7,8+64(10)
- ld 8,16+64(11)
- ld 0,24+64(11)
- std 8,16+64(10)
- std 0,24+64(10)
-
- ld 6,0+96(11)
- ld 7,8+96(11)
- addi 4,4,128
- addi 3,3,128
- std 6,0+96(10)
- std 7,8+96(10)
- ld 8,16+96(11)
- ld 0,24+96(11)
- std 8,16+96(10)
- std 0,24+96(10)
- ble cr5,L(das_loop_e)
-
- mtctr 12
- .align 4
-L(das_loop2):
- ld 6,0(4)
- ld 7,8(4)
- mr 10,3
- mr 11,4
- std 6,0(3)
- std 7,8(3)
- ld 8,16(4)
- ld 0,24(4)
- std 8,16(3)
- std 0,24(3)
-
- ld 6,0+32(4)
- ld 7,8+32(4)
- std 6,0+32(3)
- std 7,8+32(3)
- ld 8,16+32(4)
- ld 0,24+32(4)
- std 8,16+32(3)
- std 0,24+32(3)
-
- ld 6,0+64(11)
- ld 7,8+64(11)
- std 6,0+64(10)
- std 7,8+64(10)
- ld 8,16+64(11)
- ld 0,24+64(11)
- std 8,16+64(10)
- std 0,24+64(10)
-
- ld 6,0+96(11)
- ld 7,8+96(11)
- addi 4,4,128
- addi 3,3,128
- std 6,0+96(10)
- std 7,8+96(10)
- ld 8,16+96(11)
- ld 0,24+96(11)
- std 8,16+96(10)
- std 0,24+96(10)
- bdnz L(das_loop2)
-L(das_loop_e):
-/* Check of a 1-7 byte tail, return if none. */
- bne cr1,L(das_tail2)
-/* Return original dst pointer. */
- ld 3,-16(1)
- blr
- .align 4
-L(das_tail):
- beq cr1,0f
-
-L(das_tail2):
-/* At this point we have a tail of 0-7 bytes and we know that the
- destination is double word aligned. */
-4: bf 29,2f
- lwz 6,0(4)
- stw 6,0(3)
- bf 30,5f
- lhz 6,4(4)
- sth 6,4(3)
- bf 31,0f
- lbz 6,6(4)
- stb 6,6(3)
- b 0f
-5: bf 31,0f
- lbz 6,4(4)
- stb 6,4(3)
- b 0f
-
-2: bf 30,1f
- lhz 6,0(4)
- sth 6,0(3)
- bf 31,0f
- lbz 6,2(4)
- stb 6,2(3)
- b 0f
-
-1: bf 31,0f
- lbz 6,0(4)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
-/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31
- bytes. Each case is handled without loops, using binary (1,2,4,8)
- tests.
-
- In the short (0-8 byte) case no attempt is made to force alignment
- of either source or destination. The hardware will handle the
- unaligned load/stores with small delays for crossing 32- 128-byte,
- and 4096-byte boundaries. Since these short moves are unlikely to be
- unaligned or cross these boundaries, the overhead to force
- alignment is not justified.
-
- The longer (9-31 byte) move is more likely to cross 32- or 128-byte
- boundaries. Since only loads are sensitive to the 32-/128-byte
- boundaries it is more important to align the source then the
- destination. If the source is not already word aligned, we first
- move 1-3 bytes as needed. Since we are only word aligned we don't
- use double word load/stores to insure that all loads are aligned.
- While the destination and stores may still be unaligned, this
- is only an issue for page (4096 byte boundary) crossing, which
- should be rare for these short moves. The hardware handles this
- case automatically with a small (~20 cycle) delay. */
- .align 4
-.L2:
- mtcrf 0x01,5
- neg 8,4
- clrrdi 11,4,2
- andi. 0,8,3
- ble cr6,.LE8 /* Handle moves of 0-8 bytes. */
-/* At least 9 bytes left. Get the source word aligned. */
- cmpldi cr1,5,16
- mr 10,5
- mr 12,4
- cmpldi cr6,0,2
- beq L(dus_tail) /* If the source is already word aligned skip this. */
-/* Copy 1-3 bytes to get source address word aligned. */
- lwz 6,0(11)
- subf 10,0,5
- add 12,4,0
- blt cr6,5f
- srdi 7,6,16
- bgt cr6,3f
-#ifdef __LITTLE_ENDIAN__
- sth 7,0(3)
-#else
- sth 6,0(3)
-#endif
- b 7f
- .align 4
-3:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,24
- stb 6,0(3)
- sth 7,1(3)
-#else
- stb 7,0(3)
- sth 6,1(3)
-#endif
- b 7f
- .align 4
-5:
-#ifdef __LITTLE_ENDIAN__
- rotlwi 6,6,8
-#endif
- stb 6,0(3)
-7:
- cmpldi cr1,10,16
- add 3,3,0
- mtcrf 0x01,10
- .align 4
-L(dus_tail):
-/* At least 6 bytes left and the source is word aligned. This allows
- some speculative loads up front. */
-/* We need to special case the fall-through because the biggest delays
- are due to address computation not being ready in time for the
- AGEN. */
- lwz 6,0(12)
- lwz 7,4(12)
- blt cr1,L(dus_tail8)
- cmpldi cr0,10,24
-L(dus_tail16): /* Move 16 bytes. */
- stw 6,0(3)
- stw 7,4(3)
- lwz 6,8(12)
- lwz 7,12(12)
- stw 6,8(3)
- stw 7,12(3)
-/* Move 8 bytes more. */
- bf 28,L(dus_tail16p8)
- cmpldi cr1,10,28
- lwz 6,16(12)
- lwz 7,20(12)
- stw 6,16(3)
- stw 7,20(3)
-/* Move 4 bytes more. */
- bf 29,L(dus_tail16p4)
- lwz 6,24(12)
- stw 6,24(3)
- addi 12,12,28
- addi 3,3,28
- bgt cr1,L(dus_tail2)
- /* exactly 28 bytes. Return original dst pointer and exit. */
- ld 3,-16(1)
- blr
- .align 4
-L(dus_tail16p8): /* less than 8 bytes left. */
- beq cr1,L(dus_tailX) /* exactly 16 bytes, early exit. */
- cmpldi cr1,10,20
- bf 29,L(dus_tail16p2)
-/* Move 4 bytes more. */
- lwz 6,16(12)
- stw 6,16(3)
- addi 12,12,20
- addi 3,3,20
- bgt cr1,L(dus_tail2)
- /* exactly 20 bytes. Return original dst pointer and exit. */
- ld 3,-16(1)
- blr
- .align 4
-L(dus_tail16p4): /* less than 4 bytes left. */
- addi 12,12,24
- addi 3,3,24
- bgt cr0,L(dus_tail2)
- /* exactly 24 bytes. Return original dst pointer and exit. */
- ld 3,-16(1)
- blr
- .align 4
-L(dus_tail16p2): /* 16 bytes moved, less than 4 bytes left. */
- addi 12,12,16
- addi 3,3,16
- b L(dus_tail2)
-
- .align 4
-L(dus_tail8): /* Move 8 bytes. */
-/* r6, r7 already loaded speculatively. */
- cmpldi cr1,10,8
- cmpldi cr0,10,12
- bf 28,L(dus_tail4)
- .align 2
- stw 6,0(3)
- stw 7,4(3)
-/* Move 4 bytes more. */
- bf 29,L(dus_tail8p4)
- lwz 6,8(12)
- stw 6,8(3)
- addi 12,12,12
- addi 3,3,12
- bgt cr0,L(dus_tail2)
- /* exactly 12 bytes. Return original dst pointer and exit. */
- ld 3,-16(1)
- blr
- .align 4
-L(dus_tail8p4): /* less than 4 bytes left. */
- addi 12,12,8
- addi 3,3,8
- bgt cr1,L(dus_tail2)
- /* exactly 8 bytes. Return original dst pointer and exit. */
- ld 3,-16(1)
- blr
-
- .align 4
-L(dus_tail4): /* Move 4 bytes. */
-/* r6 already loaded speculatively. If we are here we know there is
- more than 4 bytes left. So there is no need to test. */
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-L(dus_tail2): /* Move 2-3 bytes. */
- bf 30,L(dus_tail1)
- lhz 6,0(12)
- sth 6,0(3)
- bf 31,L(dus_tailX)
- lbz 7,2(12)
- stb 7,2(3)
- ld 3,-16(1)
- blr
-L(dus_tail1): /* Move 1 byte. */
- bf 31,L(dus_tailX)
- lbz 6,0(12)
- stb 6,0(3)
-L(dus_tailX):
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
-/* Special case to copy 0-8 bytes. */
- .align 4
-.LE8:
- mr 12,4
- bne cr6,L(dus_4)
-/* Exactly 8 bytes. We may cross a 32-/128-byte boundary and take a ~20
- cycle delay. This case should be rare and any attempt to avoid this
- would take most of 20 cycles any way. */
- ld 6,0(4)
- std 6,0(3)
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
- .align 4
-L(dus_4):
- bf 29,L(dus_tail2)
- lwz 6,0(4)
- stw 6,0(3)
- bf 30,L(dus_5)
- lhz 7,4(4)
- sth 7,4(3)
- bf 31,L(dus_0)
- lbz 8,6(4)
- stb 8,6(3)
- ld 3,-16(1)
- blr
- .align 4
-L(dus_5):
- bf 31,L(dus_0)
- lbz 6,4(4)
- stb 6,4(3)
-L(dus_0):
- /* Return original dst pointer. */
- ld 3,-16(1)
- blr
-
- .align 4
-.L6:
- cfi_offset(31,-8)
- mr 12,4
- mr 31,5
- /* Copy doublewords where the destination is aligned but the source is
- not. Use aligned doubleword loads from the source, shifted to realign
- the data, to allow aligned destination stores. */
- addi 11,9,-1 /* loop DW count is one less than total */
- subf 5,10,12 /* Move source addr to previous full double word. */
- cmpldi cr5, 10, 2
- cmpldi cr0, 10, 4
- mr 4,3
- srdi 8,11,2 /* calculate the 32 byte loop count */
- ld 6,0(5) /* pre load 1st full doubleword. */
- mtcrf 0x01,11
- cmpldi cr6,9,4
- mtctr 8
- ld 7,8(5) /* pre load 2nd full doubleword. */
- bge cr0, L(du4_do)
- blt cr5, L(du1_do)
- beq cr5, L(du2_do)
- b L(du3_do)
-
- .align 4
-L(du1_do):
- bf 30,L(du1_1dw)
-
- /* there are at least two DWs to copy */
- /* FIXME: can combine last shift and "or" into "rldimi" */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 8
- sldi 8,6, 64-8
-#else
- sldi 0,7, 8
- srdi 8,6, 64-8
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du1_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du1_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du1_fini) /* if total DWs = 4, then bypass loop */
- b L(du1_loop)
- .align 4
-L(du1_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du1_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du1_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 8
- sldi 8,6, 64-8
-#else
- sldi 0,7, 8
- srdi 8,6, 64-8
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 8
- sldi 8,6, 64-8
-#else
- sldi 0,7, 8
- srdi 8,6, 64-8
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du1_loop)
- .align 4
-L(du1_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 8
- sldi 8,7, 64-8
-#else
- sldi 0,6, 8
- srdi 8,7, 64-8
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du2_do):
- bf 30,L(du2_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 16
- sldi 8,6, 64-16
-#else
- sldi 0,7, 16
- srdi 8,6, 64-16
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du2_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du2_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du2_fini) /* if total DWs = 4, then bypass loop */
- b L(du2_loop)
- .align 4
-L(du2_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du2_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du2_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 16
- sldi 8,6, 64-16
-#else
- sldi 0,7, 16
- srdi 8,6, 64-16
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 16
- sldi 8,6, 64-16
-#else
- sldi 0,7, 16
- srdi 8,6, 64-16
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du2_loop)
- .align 4
-L(du2_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 16
- sldi 8,7, 64-16
-#else
- sldi 0,6, 16
- srdi 8,7, 64-16
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du3_do):
- bf 30,L(du3_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 24
- sldi 8,6, 64-24
-#else
- sldi 0,7, 24
- srdi 8,6, 64-24
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du3_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du3_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du3_fini) /* if total DWs = 4, then bypass loop */
- b L(du3_loop)
- .align 4
-L(du3_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du3_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du3_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 24
- sldi 8,6, 64-24
-#else
- sldi 0,7, 24
- srdi 8,6, 64-24
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 24
- sldi 8,6, 64-24
-#else
- sldi 0,7, 24
- srdi 8,6, 64-24
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du3_loop)
- .align 4
-L(du3_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 24
- sldi 8,7, 64-24
-#else
- sldi 0,6, 24
- srdi 8,7, 64-24
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du4_do):
- cmpldi cr5, 10, 6
- beq cr0, L(du4_dox)
- blt cr5, L(du5_do)
- beq cr5, L(du6_do)
- b L(du7_do)
-L(du4_dox):
- bf 30,L(du4_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 32
- sldi 8,6, 64-32
-#else
- sldi 0,7, 32
- srdi 8,6, 64-32
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du4_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du4_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du4_fini) /* if total DWs = 4, then bypass loop */
- b L(du4_loop)
- .align 4
-L(du4_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du4_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du4_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 32
- sldi 8,6, 64-32
-#else
- sldi 0,7, 32
- srdi 8,6, 64-32
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 32
- sldi 8,6, 64-32
-#else
- sldi 0,7, 32
- srdi 8,6, 64-32
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du4_loop)
- .align 4
-L(du4_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 32
- sldi 8,7, 64-32
-#else
- sldi 0,6, 32
- srdi 8,7, 64-32
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du5_do):
- bf 30,L(du5_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 40
- sldi 8,6, 64-40
-#else
- sldi 0,7, 40
- srdi 8,6, 64-40
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du5_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du5_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du5_fini) /* if total DWs = 4, then bypass loop */
- b L(du5_loop)
- .align 4
-L(du5_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du5_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du5_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 40
- sldi 8,6, 64-40
-#else
- sldi 0,7, 40
- srdi 8,6, 64-40
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 40
- sldi 8,6, 64-40
-#else
- sldi 0,7, 40
- srdi 8,6, 64-40
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du5_loop)
- .align 4
-L(du5_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 40
- sldi 8,7, 64-40
-#else
- sldi 0,6, 40
- srdi 8,7, 64-40
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du6_do):
- bf 30,L(du6_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 48
- sldi 8,6, 64-48
-#else
- sldi 0,7, 48
- srdi 8,6, 64-48
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du6_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du6_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du6_fini) /* if total DWs = 4, then bypass loop */
- b L(du6_loop)
- .align 4
-L(du6_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du6_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du6_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 48
- sldi 8,6, 64-48
-#else
- sldi 0,7, 48
- srdi 8,6, 64-48
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 48
- sldi 8,6, 64-48
-#else
- sldi 0,7, 48
- srdi 8,6, 64-48
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du6_loop)
- .align 4
-L(du6_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 48
- sldi 8,7, 64-48
-#else
- sldi 0,6, 48
- srdi 8,7, 64-48
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du7_do):
- bf 30,L(du7_1dw)
-
- /* there are at least two DWs to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 56
- sldi 8,6, 64-56
-#else
- sldi 0,7, 56
- srdi 8,6, 64-56
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,8(4)
- addi 4,4,16
- addi 5,5,32
- blt cr6,L(du7_fini) /* if total DWs = 3, then bypass loop */
- bf 31,L(du7_loop)
- /* there is a third DW to copy */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- or 0,0,8
- std 0,0(4)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- addi 4,4,8
- beq cr6,L(du7_fini) /* if total DWs = 4, then bypass loop */
- b L(du7_loop)
- .align 4
-L(du7_1dw):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- addi 5,5,16
- or 0,0,8
- bf 31,L(du7_loop)
- mr 6,7
- ld 7,0(5)
- addi 5,5,8
- std 0,0(4)
- addi 4,4,8
- .align 4
-/* copy 32 bytes at a time */
-L(du7_loop):
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- or 0,0,8
- ld 6,0(5)
- std 0,0(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 56
- sldi 8,6, 64-56
-#else
- sldi 0,7, 56
- srdi 8,6, 64-56
-#endif
- or 0,0,8
- ld 7,8(5)
- std 0,8(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- or 0,0,8
- ld 6,16(5)
- std 0,16(4)
-#ifdef __LITTLE_ENDIAN__
- srdi 0,7, 56
- sldi 8,6, 64-56
-#else
- sldi 0,7, 56
- srdi 8,6, 64-56
-#endif
- or 0,0,8
- ld 7,24(5)
- std 0,24(4)
- addi 5,5,32
- addi 4,4,32
- bdnz+ L(du7_loop)
- .align 4
-L(du7_fini):
- /* calculate and store the final DW */
-#ifdef __LITTLE_ENDIAN__
- srdi 0,6, 56
- sldi 8,7, 64-56
-#else
- sldi 0,6, 56
- srdi 8,7, 64-56
-#endif
- or 0,0,8
- std 0,0(4)
- b L(du_done)
-
- .align 4
-L(du_done):
- rldicr 0,31,0,60
- mtcrf 0x01,31
- beq cr1,0f /* If the tail is 0 bytes we are done! */
-
- add 3,3,0
- add 12,12,0
-/* At this point we have a tail of 0-7 bytes and we know that the
- destination is double word aligned. */
-4: bf 29,2f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: bf 30,1f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: bf 31,0f
- lbz 6,0(12)
- stb 6,0(3)
-0:
- /* Return original dst pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- blr
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/power6/memset.S b/sysdeps/powerpc/powerpc64/power6/memset.S
deleted file mode 100644
index aee1c8eabb..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/memset.S
+++ /dev/null
@@ -1,395 +0,0 @@
-/* Optimized 64-bit memset implementation for POWER6.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
-/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
- Returns 's'.
-
- The memset is done in three sizes: byte (8 bits), word (32 bits),
- cache line (256 bits). There is a special case for setting cache lines
- to 0, to take advantage of the dcbz instruction. */
-
-#ifndef MEMSET
-# define MEMSET memset
-#endif
- .machine power6
-EALIGN (MEMSET, 7, 0)
- CALL_MCOUNT 3
-
-#define rTMP r0
-#define rRTN r3 /* Initial value of 1st argument. */
-#define rMEMP0 r3 /* Original value of 1st arg. */
-#define rCHR r4 /* Char to set in each byte. */
-#define rLEN r5 /* Length of region to set. */
-#define rMEMP r6 /* Address at which we are storing. */
-#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
-#define rMEMP2 r8
-#define rMEMP3 r9 /* Alt mem pointer. */
-L(_memset):
-/* Take care of case for size <= 4. */
- cmpldi cr1, rLEN, 8
- andi. rALIGN, rMEMP0, 7
- mr rMEMP, rMEMP0
- ble cr1, L(small)
-
-/* Align to doubleword boundary. */
- cmpldi cr5, rLEN, 31
- insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */
- beq+ L(aligned2)
- mtcrf 0x01, rMEMP0
- subfic rALIGN, rALIGN, 8
- cror 28,30,31 /* Detect odd word aligned. */
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
- bt 29, L(g4)
-/* Process the even word of doubleword. */
- bf+ 31, L(g2)
- stb rCHR, 0(rMEMP0)
- bt 30, L(g4x)
-L(g2):
- sth rCHR, -6(rMEMP)
-L(g4x):
- stw rCHR, -4(rMEMP)
- b L(aligned)
-/* Process the odd word of doubleword. */
-L(g4):
- bf 28, L(g4x) /* If false, word aligned on odd word. */
- bf+ 31, L(g0)
- stb rCHR, 0(rMEMP0)
- bt 30, L(aligned)
-L(g0):
- sth rCHR, -2(rMEMP)
-
-/* Handle the case of size < 31. */
-L(aligned2):
- insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */
-L(aligned):
- mtcrf 0x01, rLEN
- ble cr5, L(medium)
-/* Align to 32-byte boundary. */
- andi. rALIGN, rMEMP, 0x18
- subfic rALIGN, rALIGN, 0x20
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- beq L(caligned)
- mtcrf 0x01, rALIGN
- add rMEMP, rMEMP, rALIGN
- sub rLEN, rLEN, rALIGN
- cmplwi cr1, rALIGN, 0x10
- mr rMEMP2, rMEMP
- bf 28, L(a1)
- stdu rCHR, -8(rMEMP2)
-L(a1): blt cr1, L(a2)
- std rCHR, -8(rMEMP2)
- stdu rCHR, -16(rMEMP2)
-L(a2):
-
-/* Now aligned to a 32 byte boundary. */
- .align 4
-L(caligned):
- cmpldi cr1, rCHR, 0
- clrrdi. rALIGN, rLEN, 5
- mtcrf 0x01, rLEN
- beq cr1, L(zloopstart) /* Special case for clearing memory using dcbz. */
- beq L(medium) /* We may not actually get to do a full line. */
- .align 4
-/* Storing a non-zero "c" value. We are aligned at a sector (32-byte)
- boundary may not be at cache line (128-byte) boundary. */
-L(nzloopstart):
-/* memset in 32-byte chunks until we get to a cache line boundary.
- If rLEN is less than the distance to the next cache-line boundary use
- cacheAligned1 code to finish the tail. */
- cmpldi cr1,rLEN,128
-
- andi. rTMP,rMEMP,127
- blt cr1,L(cacheAligned1)
- addi rMEMP3,rMEMP,32
- beq L(nzCacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP)
- std rCHR,8(rMEMP)
- std rCHR,16(rMEMP)
- addi rMEMP,rMEMP,32
- andi. rTMP,rMEMP3,127
- std rCHR,-8(rMEMP3)
-
- beq L(nzCacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP3)
- addi rMEMP,rMEMP,32
- std rCHR,8(rMEMP3)
- andi. rTMP,rMEMP,127
- std rCHR,16(rMEMP3)
- std rCHR,24(rMEMP3)
-
- beq L(nzCacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,32(rMEMP3)
- addi rMEMP,rMEMP,32
- cmpldi cr1,rLEN,128
- std rCHR,40(rMEMP3)
- cmpldi cr6,rLEN,256
- li rMEMP2,128
- std rCHR,48(rMEMP3)
- std rCHR,56(rMEMP3)
- blt cr1,L(cacheAligned1)
- b L(nzCacheAligned128)
-
-/* Now we are aligned to the cache line and can use dcbtst. */
- .align 4
-L(nzCacheAligned):
- cmpldi cr1,rLEN,128
- blt cr1,L(cacheAligned1)
- b L(nzCacheAligned128)
- .align 5
-L(nzCacheAligned128):
- cmpldi cr1,rLEN,256
- addi rMEMP3,rMEMP,64
- std rCHR,0(rMEMP)
- std rCHR,8(rMEMP)
- std rCHR,16(rMEMP)
- std rCHR,24(rMEMP)
- std rCHR,32(rMEMP)
- std rCHR,40(rMEMP)
- std rCHR,48(rMEMP)
- std rCHR,56(rMEMP)
- addi rMEMP,rMEMP3,64
- addi rLEN,rLEN,-128
- std rCHR,0(rMEMP3)
- std rCHR,8(rMEMP3)
- std rCHR,16(rMEMP3)
- std rCHR,24(rMEMP3)
- std rCHR,32(rMEMP3)
- std rCHR,40(rMEMP3)
- std rCHR,48(rMEMP3)
- std rCHR,56(rMEMP3)
- bge cr1,L(nzCacheAligned128)
- dcbtst 0,rMEMP
- b L(cacheAligned1)
- .align 5
-/* Storing a zero "c" value. We are aligned at a sector (32-byte)
- boundary but may not be at cache line (128-byte) boundary. If the
- remaining length spans a full cache line we can use the Data cache
- block zero instruction. */
-L(zloopstart):
-/* memset in 32-byte chunks until we get to a cache line boundary.
- If rLEN is less than the distance to the next cache-line boundary use
- cacheAligned1 code to finish the tail. */
- cmpldi cr1,rLEN,128
- beq L(medium)
-L(getCacheAligned):
- andi. rTMP,rMEMP,127
- nop
- blt cr1,L(cacheAligned1)
- addi rMEMP3,rMEMP,32
- beq L(cacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP)
- std rCHR,8(rMEMP)
- std rCHR,16(rMEMP)
- addi rMEMP,rMEMP,32
- andi. rTMP,rMEMP3,127
- std rCHR,-8(rMEMP3)
-L(getCacheAligned2):
- beq L(cacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP3)
- std rCHR,8(rMEMP3)
- addi rMEMP,rMEMP,32
- andi. rTMP,rMEMP,127
- std rCHR,16(rMEMP3)
- std rCHR,24(rMEMP3)
-L(getCacheAligned3):
- beq L(cacheAligned)
- addi rLEN,rLEN,-32
- std rCHR,32(rMEMP3)
- addi rMEMP,rMEMP,32
- cmpldi cr1,rLEN,128
- std rCHR,40(rMEMP3)
- cmpldi cr6,rLEN,256
- li rMEMP2,128
- std rCHR,48(rMEMP3)
- std rCHR,56(rMEMP3)
- blt cr1,L(cacheAligned1)
- blt cr6,L(cacheAligned128)
- b L(cacheAlignedx)
-
-/* Now we are aligned to the cache line and can use dcbz. */
- .align 5
-L(cacheAligned):
- cmpldi cr1,rLEN,128
- cmpldi cr6,rLEN,256
- blt cr1,L(cacheAligned1)
- li rMEMP2,128
-L(cacheAlignedx):
- cmpldi cr5,rLEN,640
- blt cr6,L(cacheAligned128)
- bgt cr5,L(cacheAligned512)
- cmpldi cr6,rLEN,512
- dcbz 0,rMEMP
- cmpldi cr1,rLEN,384
- dcbz rMEMP2,rMEMP
- addi rMEMP,rMEMP,256
- addi rLEN,rLEN,-256
- blt cr1,L(cacheAligned1)
- blt cr6,L(cacheAligned128)
- b L(cacheAligned256)
- .align 5
-/* A simple loop for the longer (>640 bytes) lengths. This form limits
- the branch miss-predicted to exactly 1 at loop exit.*/
-L(cacheAligned512):
- cmpldi cr1,rLEN,128
- blt cr1,L(cacheAligned1)
- dcbz 0,rMEMP
- addi rLEN,rLEN,-128
- addi rMEMP,rMEMP,128
- b L(cacheAligned512)
- .align 5
-L(cacheAligned256):
-
- cmpldi cr6,rLEN,512
-
- dcbz 0,rMEMP
- cmpldi cr1,rLEN,384
- dcbz rMEMP2,rMEMP
- addi rMEMP,rMEMP,256
- addi rLEN,rLEN,-256
-
- bge cr6,L(cacheAligned256)
-
- blt cr1,L(cacheAligned1)
- .align 4
-L(cacheAligned128):
- dcbz 0,rMEMP
- addi rMEMP,rMEMP,128
- addi rLEN,rLEN,-128
- nop
-L(cacheAligned1):
- cmpldi cr1,rLEN,32
- blt cr1,L(handletail32)
- addi rMEMP3,rMEMP,32
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP)
- std rCHR,8(rMEMP)
- std rCHR,16(rMEMP)
- addi rMEMP,rMEMP,32
- cmpldi cr1,rLEN,32
- std rCHR,-8(rMEMP3)
-L(cacheAligned2):
- blt cr1,L(handletail32)
- addi rLEN,rLEN,-32
- std rCHR,0(rMEMP3)
- std rCHR,8(rMEMP3)
- addi rMEMP,rMEMP,32
- cmpldi cr1,rLEN,32
- std rCHR,16(rMEMP3)
- std rCHR,24(rMEMP3)
- nop
-L(cacheAligned3):
- blt cr1,L(handletail32)
- addi rMEMP,rMEMP,32
- addi rLEN,rLEN,-32
- std rCHR,32(rMEMP3)
- std rCHR,40(rMEMP3)
- std rCHR,48(rMEMP3)
- std rCHR,56(rMEMP3)
-
-/* We are here because the length or remainder (rLEN) is less than the
- cache line/sector size and does not justify aggressive loop unrolling.
- So set up the preconditions for L(medium) and go there. */
- .align 3
-L(handletail32):
- cmpldi cr1,rLEN,0
- beqlr cr1
- b L(medium)
-
- .align 5
-L(small):
-/* Memset of 8 bytes or less. */
- cmpldi cr6, rLEN, 4
- cmpldi cr5, rLEN, 1
- ble cr6,L(le4)
- subi rLEN, rLEN, 4
- stb rCHR,0(rMEMP)
- stb rCHR,1(rMEMP)
- stb rCHR,2(rMEMP)
- stb rCHR,3(rMEMP)
- addi rMEMP,rMEMP, 4
- cmpldi cr5, rLEN, 1
-L(le4):
- cmpldi cr1, rLEN, 3
- bltlr cr5
- stb rCHR, 0(rMEMP)
- beqlr cr5
- stb rCHR, 1(rMEMP)
- bltlr cr1
- stb rCHR, 2(rMEMP)
- beqlr cr1
- stb rCHR, 3(rMEMP)
- blr
-
-/* Memset of 0-31 bytes. */
- .align 5
-L(medium):
- insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */
- cmpldi cr1, rLEN, 16
-L(medium_tail2):
- add rMEMP, rMEMP, rLEN
-L(medium_tail):
- bt- 31, L(medium_31t)
- bt- 30, L(medium_30t)
-L(medium_30f):
- bt 29, L(medium_29t)
-L(medium_29f):
- bge cr1, L(medium_27t)
- bflr 28
- std rCHR, -8(rMEMP)
- blr
-
-L(medium_31t):
- stbu rCHR, -1(rMEMP)
- bf- 30, L(medium_30f)
-L(medium_30t):
- sthu rCHR, -2(rMEMP)
- bf- 29, L(medium_29f)
-L(medium_29t):
- stwu rCHR, -4(rMEMP)
- blt cr1, L(medium_27f)
-L(medium_27t):
- std rCHR, -8(rMEMP)
- stdu rCHR, -16(rMEMP)
-L(medium_27f):
- bflr 28
-L(medium_28t):
- std rCHR, -8(rMEMP)
- blr
-END_GEN_TB (MEMSET,TB_TOCLESS)
-libc_hidden_builtin_def (memset)
-
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. */
-ENTRY (__bzero)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END (__bzero)
-#ifndef __bzero
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power6/multiarch/Implies b/sysdeps/powerpc/powerpc64/power6/multiarch/Implies
deleted file mode 100644
index 2ebe304fa6..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power5+/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power6/wcschr.c b/sysdeps/powerpc/powerpc64/power6/wcschr.c
deleted file mode 100644
index ae04a130cc..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/wcschr.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power6/wcschr.c>
diff --git a/sysdeps/powerpc/powerpc64/power6/wcscpy.c b/sysdeps/powerpc/powerpc64/power6/wcscpy.c
deleted file mode 100644
index 722c8f995b..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/wcscpy.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power6/wcscpy.c>
diff --git a/sysdeps/powerpc/powerpc64/power6/wcsrchr.c b/sysdeps/powerpc/powerpc64/power6/wcsrchr.c
deleted file mode 100644
index b86472d7bd..0000000000
--- a/sysdeps/powerpc/powerpc64/power6/wcsrchr.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power6/wcsrchr.c>
diff --git a/sysdeps/powerpc/powerpc64/power6x/Implies b/sysdeps/powerpc/powerpc64/power6x/Implies
deleted file mode 100644
index 9d68f39d22..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power6/fpu
-powerpc/powerpc64/power6
diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/Implies b/sysdeps/powerpc/powerpc64/power6x/fpu/Implies
deleted file mode 100644
index 30fa17646e..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/fpu
diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power6x/fpu/multiarch/Implies
deleted file mode 100644
index 410d289a6d..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S
deleted file mode 100644
index b6e11ba0c3..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S
+++ /dev/null
@@ -1,58 +0,0 @@
-/* isnan(). PowerPC64 version.
- Copyright (C) 2008-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isnan(x) */
- .machine power6
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- mftgpr r4,fp1 /* copy FPR to GPR */
- lis r0,0x7ff0
- ori r1,r1,0
- clrldi r4,r4,1 /* x = fabs(x) */
- sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */
- cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */
- li r3,0 /* then return 0 */
- blelr+ cr7
- li r3,1 /* else return 1 */
- blr
- END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
-
diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/s_llrint.S b/sysdeps/powerpc/powerpc64/power6x/fpu/s_llrint.S
deleted file mode 100644
index 37aa69061c..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/fpu/s_llrint.S
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Round double to long int. POWER6x PowerPC64 version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
- .machine "power6"
-/* long long int[r3] __llrint (double x[fp1]) */
-ENTRY (__llrint)
- CALL_MCOUNT 0
- fctid fp13,fp1
- mftgpr r3,fp13
- blr
- END (__llrint)
-
-strong_alias (__llrint, __lrint)
-weak_alias (__llrint, llrint)
-weak_alias (__lrint, lrint)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__llrint, __llrintl)
-weak_alias (__llrint, llrintl)
-strong_alias (__lrint, __lrintl)
-weak_alias (__lrint, lrintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llrint, llrintl, GLIBC_2_1)
-compat_symbol (libm, __lrint, lrintl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/power6x/fpu/s_llround.S
deleted file mode 100644
index 62e1798785..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/fpu/s_llround.S
+++ /dev/null
@@ -1,54 +0,0 @@
-/* llround function. POWER6x PowerPC64 version.
- Copyright (C) 2006-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* long long [r3] llround (float x [fp1])
- IEEE 1003.1 llround function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we pre-round using the V2.02 Floating Round to Integer Nearest
- instruction before we use Floating Convert to Integer Word with
- round to zero instruction. */
-
- .machine "power6"
-ENTRY (__llround)
- CALL_MCOUNT 0
- frin fp2,fp1 /* Round to nearest +-0.5. */
- fctidz fp3,fp2 /* Convert To Integer DW round toward 0. */
- mftgpr r3,fp3 /* Transfer integer to R3. */
- blr
- END (__llround)
-
-strong_alias (__llround, __lround)
-weak_alias (__llround, llround)
-weak_alias (__lround, lround)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__llround, llroundl)
-strong_alias (__llround, __llroundl)
-weak_alias (__lround, lroundl)
-strong_alias (__lround, __lroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llround, llroundl, GLIBC_2_1)
-compat_symbol (libm, __lround, lroundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power6x/multiarch/Implies b/sysdeps/powerpc/powerpc64/power6x/multiarch/Implies
deleted file mode 100644
index bf5d6171a5..0000000000
--- a/sysdeps/powerpc/powerpc64/power6x/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power7/Implies b/sysdeps/powerpc/powerpc64/power7/Implies
deleted file mode 100644
index 9d68f39d22..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power6/fpu
-powerpc/powerpc64/power6
diff --git a/sysdeps/powerpc/powerpc64/power7/Makefile b/sysdeps/powerpc/powerpc64/power7/Makefile
deleted file mode 100644
index 89a2296085..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-ifeq ($(subdir),elf)
-# Prevent the use of VSX registers and insns in _dl_start, which under -O3
-# optimization may require a TOC reference before relocations are resolved.
-CFLAGS-rtld.c += -mno-vsx
-endif
-
-ifeq ($(subdir),string)
-sysdep_routines += strstr-ppc64
-CFLAGS-strncase.c += -funroll-loops
-CFLAGS-strncase_l.c += -funroll-loops
-endif
diff --git a/sysdeps/powerpc/powerpc64/power7/add_n.S b/sysdeps/powerpc/powerpc64/power7/add_n.S
deleted file mode 100644
index 6425afbc9f..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/add_n.S
+++ /dev/null
@@ -1,98 +0,0 @@
-/* PowerPC64 mpn_lshift -- mpn_add_n/mpn_sub_n -- mpn addition and
- subtraction.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* cycles/limb
- * POWER7 2.18
- */
-
-#ifdef USE_AS_SUB
-# define FUNC __mpn_sub_n
-# define ADDSUBC subfe
-#else
-# define FUNC __mpn_add_n
-# define ADDSUBC adde
-#endif
-
-#define RP r3
-#define UP r4
-#define VP r5
-#define N r6
-
-EALIGN(FUNC, 5, 0)
-#ifdef USE_AS_SUB
- addic r0, r0, 0
-#else
- addic r0, r1, -1
-#endif
- andi. r7, N, 1
- beq L(bx0)
-
- ld r7, 0(UP)
- ld r9, r0(VP)
- ADDSUBC r11, r9, r7
- std r11, r0(RP)
- cmpldi N, N, 1
- beq N, L(end)
- addi UP, UP, 8
- addi VP, VP, 8
- addi RP, RP, 8
-
-L(bx0): addi r0, N, 2
- srdi r0, r0, 2
- mtctr r0
-
- andi. r7, N, 2
- bne L(mid)
-
- addi UP, UP, 16
- addi VP, VP, 16
- addi RP, RP, 16
-
- .align 5
-L(top): ld r6, -16(UP)
- ld r7, -8(UP)
- ld r8, -16(VP)
- ld r9, -8(VP)
- ADDSUBC r10, r8, N
- ADDSUBC r11, r9, r7
- std r10, -16(RP)
- std r11, -8(RP)
-L(mid): ld r6, 0(UP)
- ld r7, 8(UP)
- ld r8, 0(VP)
- ld r9, 8(VP)
- ADDSUBC r10, r8, N
- ADDSUBC r11, r9, r7
- std r10, 0(RP)
- std r11, 8(RP)
- addi UP, UP, 32
- addi VP, VP, 32
- addi RP, RP, 32
- bdnz L(top)
-
-L(end): subfe r3, r0, r0
-#ifdef USE_AS_SUB
- neg r3, r3
-#else
- addi r3, r3, 1
-#endif
- blr
-END(FUNC)
diff --git a/sysdeps/powerpc/powerpc64/power7/bcopy.c b/sysdeps/powerpc/powerpc64/power7/bcopy.c
deleted file mode 100644
index 4a6a400e7a..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/bcopy.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Implemented at memmove.S */
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/Implies b/sysdeps/powerpc/powerpc64/power7/fpu/Implies
deleted file mode 100644
index 30fa17646e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/fpu
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power7/fpu/multiarch/Implies
deleted file mode 100644
index 410d289a6d..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S
deleted file mode 100644
index 9ccc758c9e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S
+++ /dev/null
@@ -1,70 +0,0 @@
-/* finite(). PowerPC64/POWER7 version.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __finite(x) */
- .section ".toc","aw"
-.LC0: /* 1.0 */
- .tc FD_ONE[TC],0x3ff0000000000000
- .section ".text"
- .type __finite, @function
- .machine power7
-EALIGN (__finite, 4, 0)
- CALL_MCOUNT 0
- lfd fp0,.LC0@toc(r2)
- ftdiv cr7,fp1,fp0
- li r3,1
- bflr 30
-
- /* If we are here, we either have +/-INF,
- NaN or denormal. */
-
- stfd fp1,-16(r1) /* Transfer FP to GPR's. */
- ori 2,2,0 /* Force a new dispatch group. */
- lhz r4,-16+HISHORT(r1) /* Fetch the upper 16 bits of the FP value
- (biased exponent and sign bit). */
- clrlwi r4,r4,17 /* r4 = abs(r4). */
- cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */
- bltlr cr7 /* LT means finite, other non-finite. */
- li r3,0
- blr
- END (__finite)
-
-hidden_def (__finite)
-weak_alias (__finite, finite)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__finite, __finitef)
-hidden_def (__finitef)
-weak_alias (__finitef, finitef)
-
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, __finite, __finitel, GLIBC_2_0)
-compat_symbol (libm, finite, finitel, GLIBC_2_0)
-# endif
-#else
-# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
-compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
-compat_symbol (libc, finite, finitel, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_finitef.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_finitef.S
deleted file mode 100644
index 54bd94176d..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_finitef.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_finite.S. */
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S
deleted file mode 100644
index 4482cddcfa..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S
+++ /dev/null
@@ -1,69 +0,0 @@
-/* isinf(). PowerPC64/POWER7 version.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isinf(x) */
- .section ".toc","aw"
-.LC0: /* 1.0 */
- .tc FD_ONE[TC],0x3ff0000000000000
- .section ".text"
- .type __isinf, @function
- .machine power7
-EALIGN (__isinf, 4, 0)
- CALL_MCOUNT 0
- lfd fp0,.LC0@toc(r2)
- ftdiv cr7,fp1,fp0
- li r3,0
- bflr 29 /* If not INF, return. */
-
- /* Either we have -INF/+INF or a denormal. */
-
- stfd fp1,-16(r1) /* Transfer FP to GPR's. */
- ori 2,2,0 /* Force a new dispatch group. */
- lhz r4,-16+HISHORT(r1) /* Fetch the upper 16 bits of the FP value
- (biased exponent and sign bit). */
- cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */
- li r3,1
- beqlr cr7 /* EQ means INF, otherwise -INF. */
- li r3,-1
- blr
- END (__isinf)
-
-hidden_def (__isinf)
-weak_alias (__isinf, isinf)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isinf, __isinff)
-hidden_def (__isinff)
-weak_alias (__isinff, isinff)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isinf, __isinfl)
-weak_alias (__isinf, isinfl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
-compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_isinff.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_isinff.S
deleted file mode 100644
index be759e091e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_isinff.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_isinf.S. */
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S
deleted file mode 100644
index 46b08a0d37..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/* isnan(). PowerPC64/POWER7 version.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-/* int __isnan(x) */
- .section ".toc","aw"
-.LC0: /* 1.0 */
- .tc FD_ONE[TC],0x3ff0000000000000
- .section ".text"
- .type __isnan, @function
- .machine power7
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- lfd fp0,.LC0@toc(r2)
- ftdiv cr7,fp1,fp0
- li r3,0
- bflr 30 /* If not NaN, finish. */
-
- stfd fp1,-16(r1) /* Transfer FP to GPR's. */
- ori 2,2,0 /* Force a new dispatch group. */
- ld r4,-16(r1) /* Load FP into GPR. */
- lis r0,0x7ff0
- sldi r0,r0,32 /* const long r0 0x7ff00000 00000000. */
- clrldi r4,r4,1 /* x = fabs(x) */
- cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */
- blelr cr7 /* LE means not NaN. */
- li r3,1 /* else return 1 */
- blr
- END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S b/sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S
deleted file mode 100644
index b48c85e0d3..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_isnan.S. */
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c
deleted file mode 100644
index 2599c771d9..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logb.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c
deleted file mode 100644
index 7a5a8032e0..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logbf.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c
deleted file mode 100644
index 524ae2c78d..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logbl.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/memchr.S b/sysdeps/powerpc/powerpc64/power7/memchr.S
deleted file mode 100644
index 5e9707aa02..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memchr.S
+++ /dev/null
@@ -1,199 +0,0 @@
-/* Optimized memchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-/* int [r3] memchr (char *s [r3], int byte [r4], int size [r5]) */
-
-#ifndef MEMCHR
-# define MEMCHR __memchr
-#endif
- .machine power7
-ENTRY (MEMCHR)
- CALL_MCOUNT 3
- dcbt 0,r3
- clrrdi r8,r3,3
- insrdi r4,r4,8,48
-
- /* Calculate the last acceptable address and check for possible
- addition overflow by using satured math:
- r7 = r3 + r5
- r7 |= -(r7 < x) */
- add r7,r3,r5
- subfc r6,r3,r7
- subfe r9,r9,r9
- extsw r6,r9
- or r7,r7,r6
-
- insrdi r4,r4,16,32
- cmpldi r5,32
- li r9, -1
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- insrdi r4,r4,32,0
- addi r7,r7,-1
-#ifdef __LITTLE_ENDIAN__
- sld r9,r9,r6
-#else
- srd r9,r9,r6
-#endif
- ble L(small_range)
-
- ld r12,0(r8) /* Load doubleword from memory. */
- cmpb r3,r12,r4 /* Check for BYTEs in DWORD1. */
- and r3,r3,r9
- clrldi r5,r7,61 /* Byte count - 1 in last dword. */
- clrrdi r7,r7,3 /* Address of last doubleword. */
- cmpldi cr7,r3,0 /* Does r3 indicate we got a hit? */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
- bt 28,L(loop_setup)
-
- /* Handle DWORD2 of pair. */
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr7,r3,0
- bne cr7,L(done)
-
-L(loop_setup):
- /* The last dword we want to read in the loop below is the one
- containing the last byte of the string, ie. the dword at
- (s + size - 1) & ~7, or r7. The first dword read is at
- r8 + 8, we read 2 * cnt dwords, so the last dword read will
- be at r8 + 8 + 16 * cnt - 8. Solving for cnt gives
- cnt = (r7 - r8) / 16 */
- sub r6,r7,r8
- srdi r6,r6,4 /* Number of loop iterations. */
- mtctr r6 /* Setup the counter. */
-
- /* Main loop to look for BYTE in the string. Since
- it's a small loop (8 instructions), align it to 32-bytes. */
- .align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the byte-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r3,r12,r4
- cmpb r9,r11,r4
- or r6,r9,r3 /* Merge everything in one doubleword. */
- cmpldi cr7,r6,0
- bne cr7,L(found)
- bdnz L(loop)
-
- /* We may have one more dword to read. */
- cmpld r8,r7
- beqlr
-
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr6,r3,0
- bne cr6,L(done)
- blr
-
- .align 4
-L(found):
- /* OK, one (or both) of the doublewords contains BYTE. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains BYTE. */
- cmpldi cr6,r3,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* BYTE must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r3 so we can calculate the
- pointer. */
-
- mr r3,r9
- addi r8,r8,8
-
- /* r3 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as BYTE in the original
- doubleword from the string. Use that to calculate the pointer.
- We need to make sure BYTE is *before* the end of the range. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r3,-1
- andc r0,r0,r3
- popcntd r0,r0 /* Count trailing zeros. */
-#else
- cntlzd r0,r3 /* Count leading zeros before the match. */
-#endif
- cmpld r8,r7 /* Are we on the last dword? */
- srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */
- add r3,r8,r0
- cmpld cr7,r0,r5 /* If on the last dword, check byte offset. */
- bnelr
- blelr cr7
- li r3,0
- blr
-
- .align 4
-L(null):
- li r3,0
- blr
-
-/* Deals with size <= 32. */
- .align 4
-L(small_range):
- cmpldi r5,0
- beq L(null)
- ld r12,0(r8) /* Load word from memory. */
- cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */
- and r3,r3,r9
- cmpldi cr7,r3,0
- clrldi r5,r7,61 /* Byte count - 1 in last dword. */
- clrrdi r7,r7,3 /* Address of last doubleword. */
- cmpld r8,r7 /* Are we done already? */
- bne cr7,L(done)
- beqlr
-
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr6,r3,0
- cmpld r8,r7
- bne cr6,L(done) /* Found something. */
- beqlr /* Hit end of string (length). */
-
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr6,r3,0
- cmpld r8,r7
- bne cr6,L(done)
- beqlr
-
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr6,r3,0
- cmpld r8,r7
- bne cr6,L(done)
- beqlr
-
- ldu r12,8(r8)
- cmpb r3,r12,r4
- cmpldi cr6,r3,0
- bne cr6,L(done)
- blr
-
-END (MEMCHR)
-weak_alias (__memchr, memchr)
-libc_hidden_builtin_def (memchr)
diff --git a/sysdeps/powerpc/powerpc64/power7/memcmp.S b/sysdeps/powerpc/powerpc64/power7/memcmp.S
deleted file mode 100644
index 96ce8cee25..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memcmp.S
+++ /dev/null
@@ -1,1061 +0,0 @@
-/* Optimized memcmp implementation for POWER7/PowerPC64.
- Copyright (C) 2010-2017 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 <sysdep.h>
-
-/* int [r3] memcmp (const char *s1 [r3],
- const char *s2 [r4],
- size_t size [r5]) */
-#ifndef MEMCMP
-# define MEMCMP memcmp
-#endif
- .machine power7
-EALIGN (MEMCMP, 4, 0)
- CALL_MCOUNT 3
-
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rN r5 /* max string length */
-#define rWORD1 r6 /* current word in s1 */
-#define rWORD2 r7 /* current word in s2 */
-#define rWORD3 r8 /* next word in s1 */
-#define rWORD4 r9 /* next word in s2 */
-#define rWORD5 r10 /* next word in s1 */
-#define rWORD6 r11 /* next word in s2 */
-
-#define rOFF8 r20 /* 8 bytes offset. */
-#define rOFF16 r21 /* 16 bytes offset. */
-#define rOFF24 r22 /* 24 bytes offset. */
-#define rOFF32 r23 /* 24 bytes offset. */
-#define rWORD6_SHIFT r24 /* Left rotation temp for rWORD8. */
-#define rWORD4_SHIFT r25 /* Left rotation temp for rWORD6. */
-#define rWORD2_SHIFT r26 /* Left rotation temp for rWORD4. */
-#define rWORD8_SHIFT r27 /* Left rotation temp for rWORD2. */
-#define rSHR r28 /* Unaligned shift right count. */
-#define rSHL r29 /* Unaligned shift left count. */
-#define rWORD7 r30 /* next word in s1 */
-#define rWORD8 r31 /* next word in s2 */
-
-#define rWORD8SAVE (-8)
-#define rWORD7SAVE (-16)
-#define rOFF8SAVE (-24)
-#define rOFF16SAVE (-32)
-#define rOFF24SAVE (-40)
-#define rOFF32SAVE (-48)
-#define rSHRSAVE (-56)
-#define rSHLSAVE (-64)
-#define rWORD8SHIFTSAVE (-72)
-#define rWORD2SHIFTSAVE (-80)
-#define rWORD4SHIFTSAVE (-88)
-#define rWORD6SHIFTSAVE (-96)
-
-#ifdef __LITTLE_ENDIAN__
-# define LD ldbrx
-#else
-# define LD ldx
-#endif
-
- xor r0, rSTR2, rSTR1
- cmpldi cr6, rN, 0
- cmpldi cr1, rN, 12
- clrldi. r0, r0, 61
- clrldi r12, rSTR1, 61
- cmpldi cr5, r12, 0
- beq- cr6, L(zeroLength)
- dcbt 0, rSTR1
- dcbt 0, rSTR2
-/* If less than 8 bytes or not aligned, use the unaligned
- byte loop. */
- blt cr1, L(bytealigned)
- std rWORD8, rWORD8SAVE(r1)
- std rWORD7, rWORD7SAVE(r1)
- std rOFF8, rOFF8SAVE(r1)
- std rOFF16, rOFF16SAVE(r1)
- std rOFF24, rOFF24SAVE(r1)
- std rOFF32, rOFF32SAVE(r1)
- cfi_offset(rWORD8, rWORD8SAVE)
- cfi_offset(rWORD7, rWORD7SAVE)
- cfi_offset(rOFF8, rOFF8SAVE)
- cfi_offset(rOFF16, rOFF16SAVE)
- cfi_offset(rOFF24, rOFF24SAVE)
- cfi_offset(rOFF32, rOFF32SAVE)
-
- li rOFF8,8
- li rOFF16,16
- li rOFF24,24
- li rOFF32,32
-
- bne L(unaligned)
-/* At this point we know both strings have the same alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then we are already double word
- aligned and can perform the DW aligned loop.
-
- Otherwise we know the two strings have the same alignment (but not
- yet DW). So we force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DW aligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected register pair. */
- .align 4
-L(samealignment):
- clrrdi rSTR1, rSTR1, 3
- clrrdi rSTR2, rSTR2, 3
- beq cr5, L(DWaligned)
- add rN, rN, r12
- sldi rWORD6, r12, 3
- srdi r0, rN, 5 /* Divide by 32 */
- andi. r12, rN, 24 /* Get the DW remainder */
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dPs4)
- mtctr r0
- bgt cr1, L(dPs3)
- beq cr1, L(dPs2)
-
-/* Remainder is 8 */
- .align 3
-L(dsP1):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
-/* Do something useful in this cycle since we have to branch anyway. */
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
- b L(dP1e)
-/* Remainder is 16 */
- .align 4
-L(dPs2):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
-/* Do something useful in this cycle since we have to branch anyway. */
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
- b L(dP2e)
-/* Remainder is 24 */
- .align 4
-L(dPs3):
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD2, rWORD6
- cmpld cr1, rWORD3, rWORD4
- b L(dP3e)
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(dPs4):
- mtctr r0
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD2, rWORD6
- cmpld cr7, rWORD1, rWORD2
- b L(dP4e)
-
-/* At this point we know both strings are double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWaligned):
- andi. r12, rN, 24 /* Get the DW remainder */
- srdi r0, rN, 5 /* Divide by 32 */
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dP4)
- bgt cr1, L(dP3)
- beq cr1, L(dP2)
-
-/* Remainder is 8 */
- .align 4
-L(dP1):
- mtctr r0
-/* Normally we'd use rWORD7/rWORD8 here, but since we might exit early
- (8-15 byte compare), we want to use only volatile registers. This
- means we can avoid restoring non-volatile registers since we did not
- change any on the early exit path. The key here is the non-early
- exit path only cares about the condition code (cr5), not about which
- register pair was used. */
- LD rWORD5, 0, rSTR1
- LD rWORD6, 0, rSTR2
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
-L(dP1e):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr1, rWORD3, rWORD4
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5x)
- bne cr7, L(dLcr7x)
-
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- bne cr1, L(dLcr1)
- cmpld cr5, rWORD7, rWORD8
- bdnz L(dLoop)
- bne cr6, L(dLcr6)
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- .align 3
-L(dP1x):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Remainder is 16 */
- .align 4
-L(dP2):
- mtctr r0
- LD rWORD5, 0, rSTR1
- LD rWORD6, 0, rSTR2
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
-L(dP2e):
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- LD rWORD3, rOFF24, rSTR1
- LD rWORD4, rOFF24, rSTR2
- cmpld cr1, rWORD3, rWORD4
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(dLcr6)
- bne cr5, L(dLcr5)
- b L(dLoop2)
- .align 4
-L(dP2x):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- sldi. r12, rN, 3
- bne cr6, L(dLcr6x)
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr1, L(dLcr1x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Remainder is 24 */
- .align 4
-L(dP3):
- mtctr r0
- LD rWORD3, 0, rSTR1
- LD rWORD4, 0, rSTR2
- cmpld cr1, rWORD3, rWORD4
-L(dP3e):
- LD rWORD5, rOFF8, rSTR1
- LD rWORD6, rOFF8, rSTR2
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP3x)
- LD rWORD7, rOFF16, rSTR1
- LD rWORD8, rOFF16, rSTR2
- cmpld cr5, rWORD7, rWORD8
- LD rWORD1, rOFF24, rSTR1
- LD rWORD2, rOFF24, rSTR2
- cmpld cr7, rWORD1, rWORD2
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- bne cr1, L(dLcr1)
- bne cr6, L(dLcr6)
- b L(dLoop1)
-/* Again we are on a early exit path (24-31 byte compare), we want to
- only use volatile registers and avoid restoring non-volatile
- registers. */
- .align 4
-L(dP3x):
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- sldi. r12, rN, 3
- bne cr1, L(dLcr1x)
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- bne cr6, L(dLcr6x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne cr7, L(dLcr7x)
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(dP4):
- mtctr r0
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpld cr7, rWORD1, rWORD2
-L(dP4e):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- LD rWORD5, rOFF16, rSTR1
- LD rWORD6, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- LD rWORD7, rOFF24, rSTR1
- LD rWORD8, rOFF24, rSTR2
- addi rSTR1, rSTR1, 24
- addi rSTR2, rSTR2, 24
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
- bne cr1, L(dLcr1)
- bdz- L(d24) /* Adjust CTR as we start with +4 */
-/* This is the primary loop */
- .align 4
-L(dLoop):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
-L(dLoop1):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
-L(dLoop2):
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
-L(dLoop3):
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- bne cr1, L(dLcr1)
- cmpld cr7, rWORD1, rWORD2
- bdnz L(dLoop)
-
-L(dL4):
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(d44):
- bne cr7, L(dLcr7)
-L(d34):
- bne cr1, L(dLcr1)
-L(d24):
- bne cr6, L(dLcr6)
-L(d14):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5)
-L(d04):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- beq L(duzeroLength)
-/* At this point we have a remainder of 1 to 7 bytes to compare. Since
- we are aligned it is safe to load the whole double word, and use
- shift right double to eliminate bits beyond the compare length. */
-L(d00):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- cmpld cr7, rWORD1, rWORD2
- bne cr7, L(dLcr7x)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
- .align 4
-L(dLcr7):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr7x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(dLcr1):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr1x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
- .align 4
-L(dLcr6):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr6x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
- .align 4
-L(dLcr5):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr5x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr5
- li rRTN, -1
- blr
-
- .align 4
-L(bytealigned):
- mtctr rN
-
-/* We need to prime this loop. This loop is swing modulo scheduled
- to avoid pipe delays. The dependent instruction latencies (load to
- compare to conditional branch) is 2 to 3 cycles. In this loop each
- dispatch group ends in a branch and takes 1 cycle. Effectively
- the first iteration of the loop only serves to load operands and
- branches based on compares are delayed until the next loop.
-
- So we must precondition some registers and condition codes so that
- we don't exit the loop early on the first iteration. */
-
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- bdz L(b11)
- cmpld cr7, rWORD1, rWORD2
- lbz rWORD3, 1(rSTR1)
- lbz rWORD4, 1(rSTR2)
- bdz L(b12)
- cmpld cr1, rWORD3, rWORD4
- lbzu rWORD5, 2(rSTR1)
- lbzu rWORD6, 2(rSTR2)
- bdz L(b13)
- .align 4
-L(bLoop):
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- bne cr7, L(bLcr7)
-
- cmpld cr6, rWORD5, rWORD6
- bdz L(b3i)
-
- lbzu rWORD3, 1(rSTR1)
- lbzu rWORD4, 1(rSTR2)
- bne cr1, L(bLcr1)
-
- cmpld cr7, rWORD1, rWORD2
- bdz L(b2i)
-
- lbzu rWORD5, 1(rSTR1)
- lbzu rWORD6, 1(rSTR2)
- bne cr6, L(bLcr6)
-
- cmpld cr1, rWORD3, rWORD4
- bdnz L(bLoop)
-
-/* We speculatively loading bytes before we have tested the previous
- bytes. But we must avoid overrunning the length (in the ctr) to
- prevent these speculative loads from causing a segfault. In this
- case the loop will exit early (before the all pending bytes are
- tested. In this case we must complete the pending operations
- before returning. */
-L(b1i):
- bne cr7, L(bLcr7)
- bne cr1, L(bLcr1)
- b L(bx56)
- .align 4
-L(b2i):
- bne cr6, L(bLcr6)
- bne cr7, L(bLcr7)
- b L(bx34)
- .align 4
-L(b3i):
- bne cr1, L(bLcr1)
- bne cr6, L(bLcr6)
- b L(bx12)
- .align 4
-L(bLcr7):
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
-L(bLcr1):
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
-L(bLcr6):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
-
-L(b13):
- bne cr7, L(bx12)
- bne cr1, L(bx34)
-L(bx56):
- sub rRTN, rWORD5, rWORD6
- blr
- nop
-L(b12):
- bne cr7, L(bx12)
-L(bx34):
- sub rRTN, rWORD3, rWORD4
- blr
-L(b11):
-L(bx12):
- sub rRTN, rWORD1, rWORD2
- blr
-
- .align 4
-L(zeroLength):
- li rRTN, 0
- blr
-
- .align 4
-/* At this point we know the strings have different alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then rStr1 is double word
- aligned and can perform the DWunaligned loop.
-
- Otherwise we know that rSTR1 is not already DW aligned yet.
- So we can force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DWaligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected resister pair. */
-L(unaligned):
- std rSHL, rSHLSAVE(r1)
- cfi_offset(rSHL, rSHLSAVE)
- clrldi rSHL, rSTR2, 61
- beq cr6, L(duzeroLength)
- std rSHR, rSHRSAVE(r1)
- cfi_offset(rSHR, rSHRSAVE)
- beq cr5, L(DWunaligned)
- std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE)
-/* Adjust the logical start of rSTR2 to compensate for the extra bits
- in the 1st rSTR1 DW. */
- sub rWORD8_SHIFT, rSTR2, r12
-/* But do not attempt to address the DW before that DW that contains
- the actual start of rSTR2. */
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
-/* Compute the left/right shift counts for the unaligned rSTR2,
- compensating for the logical (DW aligned) start of rSTR1. */
- clrldi rSHL, rWORD8_SHIFT, 61
- clrrdi rSTR1, rSTR1, 3
- std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- sldi rSHL, rSHL, 3
- cmpld cr5, rWORD8_SHIFT, rSTR2
- add rN, rN, r12
- sldi rWORD6, r12, 3
- std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE)
- cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE)
- cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE)
- subfic rSHR, rSHL, 64
- srdi r0, rN, 5 /* Divide by 32 */
- andi. r12, rN, 24 /* Get the DW remainder */
-/* We normally need to load 2 DWs to start the unaligned rSTR2, but in
- this special case those bits may be discarded anyway. Also we
- must avoid loading a DW where none of the bits are part of rSTR2 as
- this may cross a page boundary and cause a page fault. */
- li rWORD8, 0
- blt cr5, L(dus0)
- LD rWORD8, 0, rSTR2
- addi rSTR2, rSTR2, 8
- sld rWORD8, rWORD8, rSHL
-
-L(dus0):
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- srd r12, rWORD2, rSHR
- clrldi rN, rN, 61
- beq L(duPs4)
- mtctr r0
- or rWORD8, r12, rWORD8
- bgt cr1, L(duPs3)
- beq cr1, L(duPs2)
-
-/* Remainder is 8 */
- .align 4
-L(dusP1):
- sld rWORD8_SHIFT, rWORD2, rSHL
- sld rWORD7, rWORD1, rWORD6
- sld rWORD8, rWORD8, rWORD6
- bge cr7, L(duP1e)
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16 */
- .align 4
-L(duPs2):
- sld rWORD6_SHIFT, rWORD2, rSHL
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD8, rWORD6
- b L(duP2e)
-/* Remainder is 24 */
- .align 4
-L(duPs3):
- sld rWORD4_SHIFT, rWORD2, rSHL
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD8, rWORD6
- b L(duP3e)
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(duPs4):
- mtctr r0
- or rWORD8, r12, rWORD8
- sld rWORD2_SHIFT, rWORD2, rSHL
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD8, rWORD6
- b L(duP4e)
-
-/* At this point we know rSTR1 is double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWunaligned):
- std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- srdi r0, rN, 5 /* Divide by 32 */
- std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- andi. r12, rN, 24 /* Get the DW remainder */
- std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE)
- cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE)
- cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE)
- cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE)
- sldi rSHL, rSHL, 3
- LD rWORD6, 0, rSTR2
- LD rWORD8, rOFF8, rSTR2
- addi rSTR2, rSTR2, 8
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- subfic rSHR, rSHL, 64
- sld rWORD6_SHIFT, rWORD6, rSHL
- beq L(duP4)
- mtctr r0
- bgt cr1, L(duP3)
- beq cr1, L(duP2)
-
-/* Remainder is 8 */
- .align 4
-L(duP1):
- srd r12, rWORD8, rSHR
- LD rWORD7, 0, rSTR1
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP1x)
-L(duP1e):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- bne cr5, L(duLcr5)
- or rWORD4, r12, rWORD2_SHIFT
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- bne cr7, L(duLcr7)
- or rWORD6, r0, rWORD4_SHIFT
- cmpld cr6, rWORD5, rWORD6
- b L(duLoop3)
- .align 4
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
-L(duP1x):
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16 */
- .align 4
-L(duP2):
- srd r0, rWORD8, rSHR
- LD rWORD5, 0, rSTR1
- or rWORD6, r0, rWORD6_SHIFT
- sld rWORD6_SHIFT, rWORD8, rSHL
-L(duP2e):
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr6, rWORD5, rWORD6
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP2x)
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- LD rWORD3, rOFF24, rSTR1
- LD rWORD4, rOFF24, rSTR2
- cmpld cr7, rWORD1, rWORD2
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- cmpld cr1, rWORD3, rWORD4
- b L(duLoop2)
- .align 4
-L(duP2x):
- cmpld cr5, rWORD7, rWORD8
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Remainder is 24 */
- .align 4
-L(duP3):
- srd r12, rWORD8, rSHR
- LD rWORD3, 0, rSTR1
- sld rWORD4_SHIFT, rWORD8, rSHL
- or rWORD4, r12, rWORD6_SHIFT
-L(duP3e):
- LD rWORD5, rOFF8, rSTR1
- LD rWORD6, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
- LD rWORD7, rOFF16, rSTR1
- LD rWORD8, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP3x)
- LD rWORD1, rOFF24, rSTR1
- LD rWORD2, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- cmpld cr7, rWORD1, rWORD2
- b L(duLoop1)
- .align 4
-L(duP3x):
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Count is a multiple of 32, remainder is 0 */
- .align 4
-L(duP4):
- mtctr r0
- srd r0, rWORD8, rSHR
- LD rWORD1, 0, rSTR1
- sld rWORD2_SHIFT, rWORD8, rSHL
- or rWORD2, r0, rWORD6_SHIFT
-L(duP4e):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
- LD rWORD5, rOFF16, rSTR1
- LD rWORD6, rOFF16, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
- LD rWORD7, rOFF24, rSTR1
- LD rWORD8, rOFF24, rSTR2
- addi rSTR1, rSTR1, 24
- addi rSTR2, rSTR2, 24
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- cmpld cr5, rWORD7, rWORD8
- bdz L(du24) /* Adjust CTR as we start with +4 */
-/* This is the primary loop */
- .align 4
-L(duLoop):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-L(duLoop1):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
-L(duLoop2):
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
-L(duLoop3):
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- cmpld cr7, rWORD1, rWORD2
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- bdnz L(duLoop)
-
-L(duL4):
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(du44):
- bne cr7, L(duLcr7)
-L(du34):
- bne cr1, L(duLcr1)
-L(du24):
- bne cr6, L(duLcr6)
-L(du14):
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
-/* At this point we have a remainder of 1 to 7 bytes to compare. We use
- shift right double to eliminate bits beyond the compare length.
-
- However it may not be safe to load rWORD2 which may be beyond the
- string length. So we compare the bit length of the remainder to
- the right shift count (rSHR). If the bit count is less than or equal
- we do not need to load rWORD2 (all significant bits are already in
- rWORD8_SHIFT). */
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- .align 4
-L(dutrim):
- LD rWORD1, rOFF8, rSTR1
- ld rWORD8, -8(r1)
- subfic rN, rN, 64 /* Shift count is 64 - (rN * 8). */
- or rWORD2, r0, rWORD8_SHIFT
- ld rWORD7, rWORD7SAVE(r1)
- ld rSHL, rSHLSAVE(r1)
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- ld rSHR, rSHRSAVE(r1)
- ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- li rRTN, 0
- cmpld cr7, rWORD1, rWORD2
- ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- beq cr7, L(dureturn24)
- li rRTN, 1
- ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(duLcr7):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr7, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr1):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr1, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr6):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr6, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr5):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr5, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
-
- .align 3
-L(duZeroReturn):
- li rRTN, 0
- .align 4
-L(dureturn):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dureturn29):
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
-L(dureturn27):
- ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
-L(dureturn24):
- ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- blr
-
-L(duzeroLength):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-END (MEMCMP)
-libc_hidden_builtin_def (memcmp)
-weak_alias (memcmp, bcmp)
diff --git a/sysdeps/powerpc/powerpc64/power7/memcpy.S b/sysdeps/powerpc/powerpc64/power7/memcpy.S
deleted file mode 100644
index e08993cbc3..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memcpy.S
+++ /dev/null
@@ -1,430 +0,0 @@
-/* Optimized memcpy implementation for PowerPC64/POWER7.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-
-/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
- Returns 'dst'. */
-
-#ifndef MEMCPY
-# define MEMCPY memcpy
-#endif
-
-#define dst 11 /* Use r11 so r3 kept unchanged. */
-#define src 4
-#define cnt 5
-
- .machine power7
-EALIGN (MEMCPY, 5, 0)
- CALL_MCOUNT 3
-
- cmpldi cr1,cnt,31
- neg 0,3
- ble cr1, L(copy_LT_32) /* If move < 32 bytes use short move
- code. */
-
-/* Align copies using VSX instructions to quadword. It is to avoid alignment
- traps when memcpy is used on non-cacheable memory (for instance, memory
- mapped I/O). */
- andi. 10,3,15
- clrldi 11,4,60
- cmpld cr6,10,11 /* SRC and DST alignments match? */
-
- mr dst,3
- bne cr6,L(copy_GE_32_unaligned)
- beq L(aligned_copy)
-
- mtocrf 0x01,0
- clrldi 0,0,60
-
-/* Get the DST and SRC aligned to 16 bytes. */
-1:
- bf 31,2f
- lbz 6,0(src)
- addi src,src,1
- stb 6,0(dst)
- addi dst,dst,1
-2:
- bf 30,4f
- lhz 6,0(src)
- addi src,src,2
- sth 6,0(dst)
- addi dst,dst,2
-4:
- bf 29,8f
- lwz 6,0(src)
- addi src,src,4
- stw 6,0(dst)
- addi dst,dst,4
-8:
- bf 28,16f
- ld 6,0(src)
- addi src,src,8
- std 6,0(dst)
- addi dst,dst,8
-16:
- subf cnt,0,cnt
-
-/* Main aligned copy loop. Copies 128 bytes at a time. */
-L(aligned_copy):
- li 6,16
- li 7,32
- li 8,48
- mtocrf 0x02,cnt
- srdi 12,cnt,7
- cmpdi 12,0
- beq L(aligned_tail)
- lxvd2x 6,0,src
- lxvd2x 7,src,6
- mtctr 12
- b L(aligned_128loop)
-
- .align 4
-L(aligned_128head):
- /* for the 2nd + iteration of this loop. */
- lxvd2x 6,0,src
- lxvd2x 7,src,6
-L(aligned_128loop):
- lxvd2x 8,src,7
- lxvd2x 9,src,8
- stxvd2x 6,0,dst
- addi src,src,64
- stxvd2x 7,dst,6
- stxvd2x 8,dst,7
- stxvd2x 9,dst,8
- lxvd2x 6,0,src
- lxvd2x 7,src,6
- addi dst,dst,64
- lxvd2x 8,src,7
- lxvd2x 9,src,8
- addi src,src,64
- stxvd2x 6,0,dst
- stxvd2x 7,dst,6
- stxvd2x 8,dst,7
- stxvd2x 9,dst,8
- addi dst,dst,64
- bdnz L(aligned_128head)
-
-L(aligned_tail):
- mtocrf 0x01,cnt
- bf 25,32f
- lxvd2x 6,0,src
- lxvd2x 7,src,6
- lxvd2x 8,src,7
- lxvd2x 9,src,8
- addi src,src,64
- stxvd2x 6,0,dst
- stxvd2x 7,dst,6
- stxvd2x 8,dst,7
- stxvd2x 9,dst,8
- addi dst,dst,64
-32:
- bf 26,16f
- lxvd2x 6,0,src
- lxvd2x 7,src,6
- addi src,src,32
- stxvd2x 6,0,dst
- stxvd2x 7,dst,6
- addi dst,dst,32
-16:
- bf 27,8f
- lxvd2x 6,0,src
- addi src,src,16
- stxvd2x 6,0,dst
- addi dst,dst,16
-8:
- bf 28,4f
- ld 6,0(src)
- addi src,src,8
- std 6,0(dst)
- addi dst,dst,8
-4: /* Copies 4~7 bytes. */
- bf 29,L(tail2)
- lwz 6,0(src)
- stw 6,0(dst)
- bf 30,L(tail5)
- lhz 7,4(src)
- sth 7,4(dst)
- bflr 31
- lbz 8,6(src)
- stb 8,6(dst)
- /* Return original DST pointer. */
- blr
-
-
-/* Handle copies of 0~31 bytes. */
- .align 4
-L(copy_LT_32):
- mr dst,3
- cmpldi cr6,cnt,8
- mtocrf 0x01,cnt
- ble cr6,L(copy_LE_8)
-
- /* At least 9 bytes to go. */
- neg 8,4
- andi. 0,8,3
- cmpldi cr1,cnt,16
- beq L(copy_LT_32_aligned)
-
- /* Force 4-byte alignment for SRC. */
- mtocrf 0x01,0
- subf cnt,0,cnt
-2:
- bf 30,1f
- lhz 6,0(src)
- addi src,src,2
- sth 6,0(dst)
- addi dst,dst,2
-1:
- bf 31,L(end_4bytes_alignment)
- lbz 6,0(src)
- addi src,src,1
- stb 6,0(dst)
- addi dst,dst,1
-
- .align 4
-L(end_4bytes_alignment):
- cmpldi cr1,cnt,16
- mtocrf 0x01,cnt
-
-L(copy_LT_32_aligned):
- /* At least 6 bytes to go, and SRC is word-aligned. */
- blt cr1,8f
-
- /* Copy 16 bytes. */
- lwz 6,0(src)
- lwz 7,4(src)
- stw 6,0(dst)
- lwz 8,8(src)
- stw 7,4(dst)
- lwz 6,12(src)
- addi src,src,16
- stw 8,8(dst)
- stw 6,12(dst)
- addi dst,dst,16
-8: /* Copy 8 bytes. */
- bf 28,L(tail4)
- lwz 6,0(src)
- lwz 7,4(src)
- addi src,src,8
- stw 6,0(dst)
- stw 7,4(dst)
- addi dst,dst,8
-
- .align 4
-/* Copies 4~7 bytes. */
-L(tail4):
- bf 29,L(tail2)
- lwz 6,0(src)
- stw 6,0(dst)
- bf 30,L(tail5)
- lhz 7,4(src)
- sth 7,4(dst)
- bflr 31
- lbz 8,6(src)
- stb 8,6(dst)
- /* Return original DST pointer. */
- blr
-
- .align 4
-/* Copies 2~3 bytes. */
-L(tail2):
- bf 30,1f
- lhz 6,0(src)
- sth 6,0(dst)
- bflr 31
- lbz 7,2(src)
- stb 7,2(dst)
- blr
-
- .align 4
-L(tail5):
- bflr 31
- lbz 6,4(src)
- stb 6,4(dst)
- blr
-
- .align 4
-1:
- bflr 31
- lbz 6,0(src)
- stb 6,0(dst)
- /* Return original DST pointer. */
- blr
-
-
-/* Handles copies of 0~8 bytes. */
- .align 4
-L(copy_LE_8):
- bne cr6,L(tail4)
-
- /* Though we could've used ld/std here, they are still
- slow for unaligned cases. */
-
- lwz 6,0(src)
- lwz 7,4(src)
- stw 6,0(dst)
- stw 7,4(dst)
- blr
-
-
-/* Handle copies of 32+ bytes where DST is aligned (to quadword) but
- SRC is not. Use aligned quadword loads from SRC, shifted to realign
- the data, allowing for aligned DST stores. */
- .align 4
-L(copy_GE_32_unaligned):
- clrldi 0,0,60 /* Number of bytes until the 1st dst quadword. */
- srdi 9,cnt,4 /* Number of full quadwords remaining. */
-
- beq L(copy_GE_32_unaligned_cont)
-
- /* DST is not quadword aligned, get it aligned. */
-
- mtocrf 0x01,0
- subf cnt,0,cnt
-
- /* Vector instructions work best when proper alignment (16-bytes)
- is present. Move 0~15 bytes as needed to get DST quadword-aligned. */
-1:
- bf 31,2f
- lbz 6,0(src)
- addi src,src,1
- stb 6,0(dst)
- addi dst,dst,1
-2:
- bf 30,4f
- lhz 6,0(src)
- addi src,src,2
- sth 6,0(dst)
- addi dst,dst,2
-4:
- bf 29,8f
- lwz 6,0(src)
- addi src,src,4
- stw 6,0(dst)
- addi dst,dst,4
-8:
- bf 28,0f
- ld 6,0(src)
- addi src,src,8
- std 6,0(dst)
- addi dst,dst,8
-0:
- srdi 9,cnt,4 /* Number of full quadwords remaining. */
-
- /* The proper alignment is present, it is OK to copy the bytes now. */
-L(copy_GE_32_unaligned_cont):
-
- /* Setup two indexes to speed up the indexed vector operations. */
- clrldi 10,cnt,60
- li 6,16 /* Index for 16-bytes offsets. */
- li 7,32 /* Index for 32-bytes offsets. */
- cmpldi cr1,10,0
- srdi 8,cnt,5 /* Setup the loop counter. */
- mtocrf 0x01,9
- cmpldi cr6,9,1
-#ifdef __LITTLE_ENDIAN__
- lvsr 5,0,src
-#else
- lvsl 5,0,src
-#endif
- lvx 3,0,src
- li 0,0
- bf 31,L(setup_unaligned_loop)
-
- /* Copy another 16 bytes to align to 32-bytes due to the loop. */
- lvx 4,src,6
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- addi src,src,16
- stvx 6,0,dst
- addi dst,dst,16
- vor 3,4,4
- clrrdi 0,src,60
-
-L(setup_unaligned_loop):
- mtctr 8
- ble cr6,L(end_unaligned_loop)
-
- /* Copy 32 bytes at a time using vector instructions. */
- .align 4
-L(unaligned_loop):
-
- /* Note: vr6/vr10 may contain data that was already copied,
- but in order to get proper alignment, we may have to copy
- some portions again. This is faster than having unaligned
- vector instructions though. */
-
- lvx 4,src,6
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- lvx 3,src,7
-#ifdef __LITTLE_ENDIAN__
- vperm 10,3,4,5
-#else
- vperm 10,4,3,5
-#endif
- addi src,src,32
- stvx 6,0,dst
- stvx 10,dst,6
- addi dst,dst,32
- bdnz L(unaligned_loop)
-
- clrrdi 0,src,60
-
- .align 4
-L(end_unaligned_loop):
-
- /* Check for tail bytes. */
- mtocrf 0x01,cnt
- beqlr cr1
-
- add src,src,0
-
- /* We have 1~15 tail bytes to copy, and DST is quadword aligned. */
- /* Copy 8 bytes. */
- bf 28,4f
- lwz 6,0(src)
- lwz 7,4(src)
- addi src,src,8
- stw 6,0(dst)
- stw 7,4(dst)
- addi dst,dst,8
-4: /* Copy 4~7 bytes. */
- bf 29,L(tail2)
- lwz 6,0(src)
- stw 6,0(dst)
- bf 30,L(tail5)
- lhz 7,4(src)
- sth 7,4(dst)
- bflr 31
- lbz 8,6(src)
- stb 8,6(dst)
- /* Return original DST pointer. */
- blr
-
-END_GEN_TB (MEMCPY,TB_TOCLESS)
-libc_hidden_builtin_def (memcpy)
diff --git a/sysdeps/powerpc/powerpc64/power7/memmove.S b/sysdeps/powerpc/powerpc64/power7/memmove.S
deleted file mode 100644
index 4c0f7c3571..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memmove.S
+++ /dev/null
@@ -1,835 +0,0 @@
-/* Optimized memmove implementation for PowerPC64/POWER7.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-
-/* void* [r3] memmove (void *dest [r3], const void *src [r4], size_t len [r5])
-
- This optimization check if memory 'dest' overlaps with 'src'. If it does
- not then it calls an optimized memcpy call (similar to memcpy for POWER7,
- embedded here to gain some cycles).
- If source and destiny overlaps, a optimized backwards memcpy is used
- instead. */
-
-#ifndef MEMMOVE
-# define MEMMOVE memmove
-#endif
- .machine power7
-EALIGN (MEMMOVE, 5, 0)
- CALL_MCOUNT 3
-
-L(_memmove):
- subf r9,r4,r3
- cmpld cr7,r9,r5
- blt cr7,L(memmove_bwd)
-
- cmpldi cr1,r5,31
- neg 0,3
- ble cr1, L(copy_LT_32) /* If move < 32 bytes use short move
- code. */
-
- andi. 10,3,15
- clrldi 11,4,60
- cmpld cr6,10,11 /* SRC and DST alignments match? */
-
- mr r11,3
- bne cr6,L(copy_GE_32_unaligned)
- beq L(aligned_copy)
-
- mtocrf 0x01,0
- clrldi 0,0,60
-
-/* Get the DST and SRC aligned to 8 bytes (16 for little-endian). */
-1:
- bf 31,2f
- lbz 6,0(r4)
- addi r4,r4,1
- stb 6,0(r11)
- addi r11,r11,1
-2:
- bf 30,4f
- lhz 6,0(r4)
- addi r4,r4,2
- sth 6,0(r11)
- addi r11,r11,2
-4:
- bf 29,8f
- lwz 6,0(r4)
- addi r4,r4,4
- stw 6,0(r11)
- addi r11,r11,4
-8:
- bf 28,16f
- ld 6,0(r4)
- addi r4,r4,8
- std 6,0(r11)
- addi r11,r11,8
-16:
- subf r5,0,r5
-
-/* Main aligned copy loop. Copies 128 bytes at a time. */
-L(aligned_copy):
- li 6,16
- li 7,32
- li 8,48
- mtocrf 0x02,r5
- srdi 12,r5,7
- cmpdi 12,0
- beq L(aligned_tail)
- lxvd2x 6,0,r4
- lxvd2x 7,r4,6
- mtctr 12
- b L(aligned_128loop)
-
- .align 4
-L(aligned_128head):
- /* for the 2nd + iteration of this loop. */
- lxvd2x 6,0,r4
- lxvd2x 7,r4,6
-L(aligned_128loop):
- lxvd2x 8,r4,7
- lxvd2x 9,r4,8
- stxvd2x 6,0,r11
- addi r4,r4,64
- stxvd2x 7,r11,6
- stxvd2x 8,r11,7
- stxvd2x 9,r11,8
- lxvd2x 6,0,r4
- lxvd2x 7,r4,6
- addi r11,r11,64
- lxvd2x 8,r4,7
- lxvd2x 9,r4,8
- addi r4,r4,64
- stxvd2x 6,0,r11
- stxvd2x 7,r11,6
- stxvd2x 8,r11,7
- stxvd2x 9,r11,8
- addi r11,r11,64
- bdnz L(aligned_128head)
-
-L(aligned_tail):
- mtocrf 0x01,r5
- bf 25,32f
- lxvd2x 6,0,r4
- lxvd2x 7,r4,6
- lxvd2x 8,r4,7
- lxvd2x 9,r4,8
- addi r4,r4,64
- stxvd2x 6,0,r11
- stxvd2x 7,r11,6
- stxvd2x 8,r11,7
- stxvd2x 9,r11,8
- addi r11,r11,64
-32:
- bf 26,16f
- lxvd2x 6,0,r4
- lxvd2x 7,r4,6
- addi r4,r4,32
- stxvd2x 6,0,r11
- stxvd2x 7,r11,6
- addi r11,r11,32
-16:
- bf 27,8f
- lxvd2x 6,0,r4
- addi r4,r4,16
- stxvd2x 6,0,r11
- addi r11,r11,16
-8:
- bf 28,4f
- ld 6,0(r4)
- addi r4,r4,8
- std 6,0(r11)
- addi r11,r11,8
-4: /* Copies 4~7 bytes. */
- bf 29,L(tail2)
- lwz 6,0(r4)
- stw 6,0(r11)
- bf 30,L(tail5)
- lhz 7,4(r4)
- sth 7,4(r11)
- bflr 31
- lbz 8,6(r4)
- stb 8,6(r11)
- /* Return original DST pointer. */
- blr
-
-/* Handle copies of 0~31 bytes. */
- .align 4
-L(copy_LT_32):
- mr r11,3
- cmpldi cr6,r5,8
- mtocrf 0x01,r5
- ble cr6,L(copy_LE_8)
-
- /* At least 9 bytes to go. */
- neg 8,4
- andi. 0,8,3
- cmpldi cr1,r5,16
- beq L(copy_LT_32_aligned)
-
- /* Force 4-byte alignment for SRC. */
- mtocrf 0x01,0
- subf r5,0,r5
-2:
- bf 30,1f
- lhz 6,0(r4)
- addi r4,r4,2
- sth 6,0(r11)
- addi r11,r11,2
-1:
- bf 31,L(end_4bytes_alignment)
- lbz 6,0(r4)
- addi r4,r4,1
- stb 6,0(r11)
- addi r11,r11,1
-
- .align 4
-L(end_4bytes_alignment):
- cmpldi cr1,r5,16
- mtocrf 0x01,r5
-
-L(copy_LT_32_aligned):
- /* At least 6 bytes to go, and SRC is word-aligned. */
- blt cr1,8f
-
- /* Copy 16 bytes. */
- lwz 6,0(r4)
- lwz 7,4(r4)
- stw 6,0(r11)
- lwz 8,8(r4)
- stw 7,4(r11)
- lwz 6,12(r4)
- addi r4,r4,16
- stw 8,8(r11)
- stw 6,12(r11)
- addi r11,r11,16
-8: /* Copy 8 bytes. */
- bf 28,L(tail4)
- lwz 6,0(r4)
- lwz 7,4(r4)
- addi r4,r4,8
- stw 6,0(r11)
- stw 7,4(r11)
- addi r11,r11,8
-
- .align 4
-/* Copies 4~7 bytes. */
-L(tail4):
- bf 29,L(tail2)
- lwz 6,0(r4)
- stw 6,0(r11)
- bf 30,L(tail5)
- lhz 7,4(r4)
- sth 7,4(r11)
- bflr 31
- lbz 8,6(r4)
- stb 8,6(r11)
- /* Return original DST pointer. */
- blr
-
- .align 4
-/* Copies 2~3 bytes. */
-L(tail2):
- bf 30,1f
- lhz 6,0(r4)
- sth 6,0(r11)
- bflr 31
- lbz 7,2(r4)
- stb 7,2(r11)
- blr
-
- .align 4
-L(tail5):
- bflr 31
- lbz 6,4(r4)
- stb 6,4(r11)
- blr
-
- .align 4
-1:
- bflr 31
- lbz 6,0(r4)
- stb 6,0(r11)
- /* Return original DST pointer. */
- blr
-
-/* Handles copies of 0~8 bytes. */
- .align 4
-L(copy_LE_8):
- bne cr6,L(tail4)
-
- /* Though we could've used ld/std here, they are still
- slow for unaligned cases. */
-
- lwz 6,0(r4)
- lwz 7,4(r4)
- stw 6,0(r11)
- stw 7,4(r11)
- blr
-
-
-/* Handle copies of 32+ bytes where DST is aligned (to quadword) but
- SRC is not. Use aligned quadword loads from SRC, shifted to realign
- the data, allowing for aligned DST stores. */
- .align 4
-L(copy_GE_32_unaligned):
- clrldi 0,0,60 /* Number of bytes until the 1st r11 quadword. */
- srdi 9,r5,4 /* Number of full quadwords remaining. */
-
- beq L(copy_GE_32_unaligned_cont)
-
- /* DST is not quadword aligned, get it aligned. */
-
- mtocrf 0x01,0
- subf r5,0,r5
-
- /* Vector instructions work best when proper alignment (16-bytes)
- is present. Move 0~15 bytes as needed to get DST quadword-aligned. */
-1:
- bf 31,2f
- lbz 6,0(r4)
- addi r4,r4,1
- stb 6,0(r11)
- addi r11,r11,1
-2:
- bf 30,4f
- lhz 6,0(r4)
- addi r4,r4,2
- sth 6,0(r11)
- addi r11,r11,2
-4:
- bf 29,8f
- lwz 6,0(r4)
- addi r4,r4,4
- stw 6,0(r11)
- addi r11,r11,4
-8:
- bf 28,0f
- ld 6,0(r4)
- addi r4,r4,8
- std 6,0(r11)
- addi r11,r11,8
-0:
- srdi 9,r5,4 /* Number of full quadwords remaining. */
-
- /* The proper alignment is present, it is OK to copy the bytes now. */
-L(copy_GE_32_unaligned_cont):
-
- /* Setup two indexes to speed up the indexed vector operations. */
- clrldi 10,r5,60
- li 6,16 /* Index for 16-bytes offsets. */
- li 7,32 /* Index for 32-bytes offsets. */
- cmpldi cr1,10,0
- srdi 8,r5,5 /* Setup the loop counter. */
- mtocrf 0x01,9
- cmpldi cr6,9,1
-#ifdef __LITTLE_ENDIAN__
- lvsr 5,0,r4
-#else
- lvsl 5,0,r4
-#endif
- lvx 3,0,r4
- li 0,0
- bf 31,L(setup_unaligned_loop)
-
- /* Copy another 16 bytes to align to 32-bytes due to the loop. */
- lvx 4,r4,6
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- addi r4,r4,16
- stvx 6,0,r11
- addi r11,r11,16
- vor 3,4,4
- clrrdi 0,r4,60
-
-L(setup_unaligned_loop):
- mtctr 8
- ble cr6,L(end_unaligned_loop)
-
- /* Copy 32 bytes at a time using vector instructions. */
- .align 4
-L(unaligned_loop):
-
- /* Note: vr6/vr10 may contain data that was already copied,
- but in order to get proper alignment, we may have to copy
- some portions again. This is faster than having unaligned
- vector instructions though. */
-
- lvx 4,r4,6
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- lvx 3,r4,7
-#ifdef __LITTLE_ENDIAN__
- vperm 10,3,4,5
-#else
- vperm 10,4,3,5
-#endif
- addi r4,r4,32
- stvx 6,0,r11
- stvx 10,r11,6
- addi r11,r11,32
- bdnz L(unaligned_loop)
-
- clrrdi 0,r4,60
-
- .align 4
-L(end_unaligned_loop):
-
- /* Check for tail bytes. */
- mtocrf 0x01,r5
- beqlr cr1
-
- add r4,r4,0
-
- /* We have 1~15 tail bytes to copy, and DST is quadword aligned. */
- /* Copy 8 bytes. */
- bf 28,4f
- lwz 6,0(r4)
- lwz 7,4(r4)
- addi r4,r4,8
- stw 6,0(r11)
- stw 7,4(r11)
- addi r11,r11,8
-4: /* Copy 4~7 bytes. */
- bf 29,L(tail2)
- lwz 6,0(r4)
- stw 6,0(r11)
- bf 30,L(tail5)
- lhz 7,4(r4)
- sth 7,4(r11)
- bflr 31
- lbz 8,6(r4)
- stb 8,6(r11)
- /* Return original DST pointer. */
- blr
-
- /* Start to memcpy backward implementation: the algorith first check if
- src and dest have the same alignment and if it does align both to 16
- bytes and copy using VSX instructions.
- If does not, align dest to 16 bytes and use VMX (altivec) instruction
- to read two 16 bytes at time, shift/permute the bytes read and write
- aligned to dest. */
-L(memmove_bwd):
- cmpldi cr1,r5,31
- /* Copy is done backwards: update the pointers and check alignment. */
- add r11,r3,r5
- add r4,r4,r5
- mr r0,r11
- ble cr1, L(copy_LT_32_bwd) /* If move < 32 bytes use short move
- code. */
-
- andi. r10,r11,15 /* Check if r11 is aligned to 16 bytes */
- clrldi r9,r4,60 /* Check if r4 is aligned to 16 bytes */
- cmpld cr6,r10,r9 /* SRC and DST alignments match? */
-
- bne cr6,L(copy_GE_32_unaligned_bwd)
- beq L(aligned_copy_bwd)
-
- mtocrf 0x01,r0
- clrldi r0,r0,60
-
-/* Get the DST and SRC aligned to 16 bytes. */
-1:
- bf 31,2f
- lbz r6,-1(r4)
- subi r4,r4,1
- stb r6,-1(r11)
- subi r11,r11,1
-2:
- bf 30,4f
- lhz r6,-2(r4)
- subi r4,r4,2
- sth r6,-2(r11)
- subi r11,r11,2
-4:
- bf 29,8f
- lwz r6,-4(r4)
- subi r4,r4,4
- stw r6,-4(r11)
- subi r11,r11,4
-8:
- bf 28,16f
- ld r6,-8(r4)
- subi r4,r4,8
- std r6,-8(r11)
- subi r11,r11,8
-16:
- subf r5,0,r5
-
-/* Main aligned copy loop. Copies 128 bytes at a time. */
-L(aligned_copy_bwd):
- li r6,-16
- li r7,-32
- li r8,-48
- li r9,-64
- mtocrf 0x02,r5
- srdi r12,r5,7
- cmpdi r12,0
- beq L(aligned_tail_bwd)
- lxvd2x v6,r4,r6
- lxvd2x v7,r4,r7
- mtctr 12
- b L(aligned_128loop_bwd)
-
- .align 4
-L(aligned_128head_bwd):
- /* for the 2nd + iteration of this loop. */
- lxvd2x v6,r4,r6
- lxvd2x v7,r4,r7
-L(aligned_128loop_bwd):
- lxvd2x v8,r4,r8
- lxvd2x v9,r4,r9
- stxvd2x v6,r11,r6
- subi r4,r4,64
- stxvd2x v7,r11,r7
- stxvd2x v8,r11,r8
- stxvd2x v9,r11,r9
- lxvd2x v6,r4,r6
- lxvd2x v7,r4,7
- subi r11,r11,64
- lxvd2x v8,r4,r8
- lxvd2x v9,r4,r9
- subi r4,r4,64
- stxvd2x v6,r11,r6
- stxvd2x v7,r11,r7
- stxvd2x v8,r11,r8
- stxvd2x v9,r11,r9
- subi r11,r11,64
- bdnz L(aligned_128head_bwd)
-
-L(aligned_tail_bwd):
- mtocrf 0x01,r5
- bf 25,32f
- lxvd2x v6,r4,r6
- lxvd2x v7,r4,r7
- lxvd2x v8,r4,r8
- lxvd2x v9,r4,r9
- subi r4,r4,64
- stxvd2x v6,r11,r6
- stxvd2x v7,r11,r7
- stxvd2x v8,r11,r8
- stxvd2x v9,r11,r9
- subi r11,r11,64
-32:
- bf 26,16f
- lxvd2x v6,r4,r6
- lxvd2x v7,r4,r7
- subi r4,r4,32
- stxvd2x v6,r11,r6
- stxvd2x v7,r11,r7
- subi r11,r11,32
-16:
- bf 27,8f
- lxvd2x v6,r4,r6
- subi r4,r4,16
- stxvd2x v6,r11,r6
- subi r11,r11,16
-8:
- bf 28,4f
- ld r6,-8(r4)
- subi r4,r4,8
- std r6,-8(r11)
- subi r11,r11,8
-4: /* Copies 4~7 bytes. */
- bf 29,L(tail2_bwd)
- lwz r6,-4(r4)
- stw r6,-4(r11)
- bf 30,L(tail5_bwd)
- lhz r7,-6(r4)
- sth r7,-6(r11)
- bflr 31
- lbz r8,-7(r4)
- stb r8,-7(r11)
- /* Return original DST pointer. */
- blr
-
-/* Handle copies of 0~31 bytes. */
- .align 4
-L(copy_LT_32_bwd):
- cmpldi cr6,r5,8
- mtocrf 0x01,r5
- ble cr6,L(copy_LE_8_bwd)
-
- /* At least 9 bytes to go. */
- neg r8,r4
- andi. r0,r8,3
- cmpldi cr1,r5,16
- beq L(copy_LT_32_aligned_bwd)
-
- /* Force 4-byte alignment for SRC. */
- mtocrf 0x01,0
- subf r5,0,r5
-2:
- bf 30,1f
- lhz r6,-2(r4)
- subi r4,r4,2
- sth r6,-2(r11)
- subi r11,r11,2
-1:
- bf 31,L(end_4bytes_alignment_bwd)
- lbz 6,-1(r4)
- subi r4,r4,1
- stb 6,-1(r11)
- subi r11,r11,1
-
- .align 4
-L(end_4bytes_alignment_bwd):
- cmpldi cr1,r5,16
- mtocrf 0x01,r5
-
-L(copy_LT_32_aligned_bwd):
- /* At least 6 bytes to go, and SRC is word-aligned. */
- blt cr1,8f
-
- /* Copy 16 bytes. */
- lwz r6,-4(r4)
- lwz r7,-8(r4)
- stw r6,-4(r11)
- lwz r8,-12(r4)
- stw r7,-8(r11)
- lwz r6,-16(r4)
- subi r4,r4,16
- stw r8,-12(r11)
- stw r6,-16(r11)
- subi r11,r11,16
-8: /* Copy 8 bytes. */
- bf 28,L(tail4_bwd)
- lwz r6,-4(r4)
- lwz r7,-8(r4)
- subi r4,r4,8
- stw r6,-4(r11)
- stw r7,-8(r11)
- subi r11,r11,8
-
- .align 4
-/* Copies 4~7 bytes. */
-L(tail4_bwd):
- bf 29,L(tail2_bwd)
- lwz 6,-4(r4)
- stw 6,-4(r11)
- bf 30,L(tail5_bwd)
- lhz 7,-6(r4)
- sth 7,-6(r11)
- bflr 31
- lbz 8,-7(r4)
- stb 8,-7(r11)
- /* Return original DST pointer. */
- blr
-
- .align 4
-/* Copies 2~3 bytes. */
-L(tail2_bwd):
- bf 30,1f
- lhz 6,-2(r4)
- sth 6,-2(r11)
- bflr 31
- lbz 7,-3(r4)
- stb 7,-3(r11)
- blr
-
- .align 4
-L(tail5_bwd):
- bflr 31
- lbz 6,-5(r4)
- stb 6,-5(r11)
- blr
-
- .align 4
-1:
- bflr 31
- lbz 6,-1(r4)
- stb 6,-1(r11)
- /* Return original DST pointer. */
- blr
-
-
-/* Handles copies of 0~8 bytes. */
- .align 4
-L(copy_LE_8_bwd):
- bne cr6,L(tail4_bwd)
-
- /* Though we could've used ld/std here, they are still
- slow for unaligned cases. */
- lwz 6,-8(r4)
- lwz 7,-4(r4)
- stw 6,-8(r11)
- stw 7,-4(r11)
- blr
-
-
-/* Handle copies of 32+ bytes where DST is aligned (to quadword) but
- SRC is not. Use aligned quadword loads from SRC, shifted to realign
- the data, allowing for aligned DST stores. */
- .align 4
-L(copy_GE_32_unaligned_bwd):
- andi. r10,r11,15 /* Check alignment of DST against 16 bytes.. */
- srdi r9,r5,4 /* Number of full quadwords remaining. */
-
- beq L(copy_GE_32_unaligned_cont_bwd)
-
- /* DST is not quadword aligned and r10 holds the address masked to
- compare alignments. */
- mtocrf 0x01,r10
- subf r5,r10,r5
-
- /* Vector instructions work best when proper alignment (16-bytes)
- is present. Move 0~15 bytes as needed to get DST quadword-aligned. */
-1:
- bf 31,2f
- lbz r6,-1(r4)
- subi r4,r4,1
- stb r6,-1(r11)
- subi r11,r11,1
-2:
- bf 30,4f
- lhz r6,-2(r4)
- subi r4,r4,2
- sth r6,-2(r11)
- subi r11,r11,2
-4:
- bf 29,8f
- lwz r6,-4(r4)
- subi r4,r4,4
- stw r6,-4(r11)
- subi r11,r11,4
-8:
- bf 28,0f
- ld r6,-8(r4)
- subi r4,r4,8
- std r6,-8(r11)
- subi r11,r11,8
-0:
- srdi r9,r5,4 /* Number of full quadwords remaining. */
-
- /* The proper alignment is present, it is OK to copy the bytes now. */
-L(copy_GE_32_unaligned_cont_bwd):
-
- /* Setup two indexes to speed up the indexed vector operations. */
- clrldi r10,r5,60
- li r6,-16 /* Index for 16-bytes offsets. */
- li r7,-32 /* Index for 32-bytes offsets. */
- cmpldi cr1,10,0
- srdi r8,r5,5 /* Setup the loop counter. */
- mtocrf 0x01,9
- cmpldi cr6,r9,1
-#ifdef __LITTLE_ENDIAN__
- lvsr v5,r0,r4
-#else
- lvsl v5,r0,r4
-#endif
- lvx v3,0,r4
- li r0,0
- bf 31,L(setup_unaligned_loop_bwd)
-
- /* Copy another 16 bytes to align to 32-bytes due to the loop. */
- lvx v4,r4,r6
-#ifdef __LITTLE_ENDIAN__
- vperm v6,v3,v4,v5
-#else
- vperm v6,v4,v3,v5
-#endif
- subi r4,r4,16
- stvx v6,r11,r6
- subi r11,r11,16
- vor v3,v4,v4
- clrrdi r0,r4,60
-
-L(setup_unaligned_loop_bwd):
- mtctr r8
- ble cr6,L(end_unaligned_loop_bwd)
-
- /* Copy 32 bytes at a time using vector instructions. */
- .align 4
-L(unaligned_loop_bwd):
-
- /* Note: vr6/vr10 may contain data that was already copied,
- but in order to get proper alignment, we may have to copy
- some portions again. This is faster than having unaligned
- vector instructions though. */
-
- lvx v4,r4,r6
-#ifdef __LITTLE_ENDIAN__
- vperm v6,v3,v4,v5
-#else
- vperm v6,v4,v3,v5
-#endif
- lvx v3,r4,r7
-#ifdef __LITTLE_ENDIAN__
- vperm v10,v4,v3,v5
-#else
- vperm v10,v3,v4,v5
-#endif
- subi r4,r4,32
- stvx v6,r11,r6
- stvx v10,r11,r7
- subi r11,r11,32
- bdnz L(unaligned_loop_bwd)
-
- clrrdi r0,r4,60
-
- .align 4
-L(end_unaligned_loop_bwd):
-
- /* Check for tail bytes. */
- mtocrf 0x01,r5
- beqlr cr1
-
- add r4,r4,0
-
- /* We have 1~15 tail bytes to copy, and DST is quadword aligned. */
- /* Copy 8 bytes. */
- bf 28,4f
- lwz r6,-4(r4)
- lwz r7,-8(r4)
- subi r4,r4,8
- stw r6,-4(r11)
- stw r7,-8(r11)
- subi r11,r11,8
-4: /* Copy 4~7 bytes. */
- bf 29,L(tail2_bwd)
- lwz r6,-4(r4)
- stw r6,-4(r11)
- bf 30,L(tail5_bwd)
- lhz r7,-6(r4)
- sth r7,-6(r11)
- bflr 31
- lbz r8,-7(r4)
- stb r8,-7(r11)
- /* Return original DST pointer. */
- blr
-END_GEN_TB (MEMMOVE, TB_TOCLESS)
-libc_hidden_builtin_def (memmove)
-
-
-/* void bcopy(const void *src [r3], void *dest [r4], size_t n [r5])
- Implemented in this file to avoid linker create a stub function call
- in the branch to '_memmove'. */
-ENTRY (__bcopy)
- mr r6,r3
- mr r3,r4
- mr r4,r6
- b L(_memmove)
-END (__bcopy)
-weak_alias (__bcopy, bcopy)
diff --git a/sysdeps/powerpc/powerpc64/power7/mempcpy.S b/sysdeps/powerpc/powerpc64/power7/mempcpy.S
deleted file mode 100644
index 4e15d1e40c..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/mempcpy.S
+++ /dev/null
@@ -1,472 +0,0 @@
-/* Optimized mempcpy implementation for POWER7.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-
-/* __ptr_t [r3] __mempcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
- Returns 'dst' + 'len'. */
-
-#ifndef MEMPCPY
-# define MEMPCPY __mempcpy
-#endif
- .machine power7
-EALIGN (MEMPCPY, 5, 0)
- CALL_MCOUNT 3
-
- cmpldi cr1,5,31
- neg 0,3
- std 3,-16(1)
- std 31,-8(1)
- cfi_offset(31,-8)
- ble cr1,L(copy_LT_32) /* If move < 32 bytes use short move
- code. */
-
- andi. 11,3,7 /* Check alignment of DST. */
-
-
- clrldi 10,4,61 /* Check alignment of SRC. */
- cmpld cr6,10,11 /* SRC and DST alignments match? */
- mr 12,4
- mr 31,5
- bne cr6,L(copy_GE_32_unaligned)
-
- srdi 9,5,3 /* Number of full quadwords remaining. */
-
- beq L(copy_GE_32_aligned_cont)
-
- clrldi 0,0,61
- mtcrf 0x01,0
- subf 31,0,5
-
- /* Get the SRC aligned to 8 bytes. */
-
-1: bf 31,2f
- lbz 6,0(12)
- addi 12,12,1
- stb 6,0(3)
- addi 3,3,1
-2: bf 30,4f
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-4: bf 29,0f
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-0:
- clrldi 10,12,61 /* Check alignment of SRC again. */
- srdi 9,31,3 /* Number of full doublewords remaining. */
-
-L(copy_GE_32_aligned_cont):
-
- clrldi 11,31,61
- mtcrf 0x01,9
-
- srdi 8,31,5
- cmpldi cr1,9,4
- cmpldi cr6,11,0
- mr 11,12
-
- /* Copy 1~3 doublewords so the main loop starts
- at a multiple of 32 bytes. */
-
- bf 30,1f
- ld 6,0(12)
- ld 7,8(12)
- addi 11,12,16
- mtctr 8
- std 6,0(3)
- std 7,8(3)
- addi 10,3,16
- bf 31,4f
- ld 0,16(12)
- std 0,16(3)
- blt cr1,3f
- addi 11,12,24
- addi 10,3,24
- b 4f
-
- .align 4
-1: /* Copy 1 doubleword and set the counter. */
- mr 10,3
- mtctr 8
- bf 31,4f
- ld 6,0(12)
- addi 11,12,8
- std 6,0(3)
- addi 10,3,8
-
- /* Main aligned copy loop. Copies 32-bytes at a time. */
- .align 4
-4:
- ld 6,0(11)
- ld 7,8(11)
- ld 8,16(11)
- ld 0,24(11)
- addi 11,11,32
-
- std 6,0(10)
- std 7,8(10)
- std 8,16(10)
- std 0,24(10)
- addi 10,10,32
- bdnz 4b
-3:
-
- /* Check for tail bytes. */
- rldicr 0,31,0,60
- mtcrf 0x01,31
- beq cr6,0f
-
-.L9:
- add 3,3,0
- add 12,12,0
-
- /* At this point we have a tail of 0-7 bytes and we know that the
- destination is doubleword-aligned. */
-4: /* Copy 4 bytes. */
- bf 29,2f
-
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: /* Copy 2 bytes. */
- bf 30,1f
-
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: /* Copy 1 byte. */
- bf 31,0f
-
- lbz 6,0(12)
- stb 6,0(3)
-0: /* Return DST + LEN pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- add 3,3,5
- blr
-
- /* Handle copies of 0~31 bytes. */
- .align 4
-L(copy_LT_32):
- cmpldi cr6,5,8
- mr 12,4
- mtcrf 0x01,5
- ble cr6,L(copy_LE_8)
-
- /* At least 9 bytes to go. */
- neg 8,4
- clrrdi 11,4,2
- andi. 0,8,3
- cmpldi cr1,5,16
- mr 10,5
- beq L(copy_LT_32_aligned)
-
- /* Force 4-bytes alignment for SRC. */
- mtocrf 0x01,0
- subf 10,0,5
-2: bf 30,1f
-
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: bf 31,L(end_4bytes_alignment)
-
- lbz 6,0(12)
- addi 12,12,1
- stb 6,0(3)
- addi 3,3,1
-
- .align 4
-L(end_4bytes_alignment):
- cmpldi cr1,10,16
- mtcrf 0x01,10
-
-L(copy_LT_32_aligned):
- /* At least 6 bytes to go, and SRC is word-aligned. */
- blt cr1,8f
-
- /* Copy 16 bytes. */
- lwz 6,0(12)
- lwz 7,4(12)
- stw 6,0(3)
- lwz 8,8(12)
- stw 7,4(3)
- lwz 6,12(12)
- addi 12,12,16
- stw 8,8(3)
- stw 6,12(3)
- addi 3,3,16
-8: /* Copy 8 bytes. */
- bf 28,4f
-
- lwz 6,0(12)
- lwz 7,4(12)
- addi 12,12,8
- stw 6,0(3)
- stw 7,4(3)
- addi 3,3,8
-4: /* Copy 4 bytes. */
- bf 29,2f
-
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: /* Copy 2-3 bytes. */
- bf 30,1f
-
- lhz 6,0(12)
- sth 6,0(3)
- bf 31,0f
- lbz 7,2(12)
- stb 7,2(3)
- ld 3,-16(1)
- add 3,3,5
- blr
-
- .align 4
-1: /* Copy 1 byte. */
- bf 31,0f
-
- lbz 6,0(12)
- stb 6,0(3)
-0: /* Return DST + LEN pointer. */
- ld 3,-16(1)
- add 3,3,5
- blr
-
- /* Handles copies of 0~8 bytes. */
- .align 4
-L(copy_LE_8):
- bne cr6,4f
-
- /* Though we could've used ld/std here, they are still
- slow for unaligned cases. */
-
- lwz 6,0(4)
- lwz 7,4(4)
- stw 6,0(3)
- stw 7,4(3)
- ld 3,-16(1) /* Return DST + LEN pointer. */
- add 3,3,5
- blr
-
- .align 4
-4: /* Copies 4~7 bytes. */
- bf 29,2b
-
- lwz 6,0(4)
- stw 6,0(3)
- bf 30,5f
- lhz 7,4(4)
- sth 7,4(3)
- bf 31,0f
- lbz 8,6(4)
- stb 8,6(3)
- ld 3,-16(1)
- add 3,3,5
- blr
-
- .align 4
-5: /* Copy 1 byte. */
- bf 31,0f
-
- lbz 6,4(4)
- stb 6,4(3)
-
-0: /* Return DST + LEN pointer. */
- ld 3,-16(1)
- add 3,3,5
- blr
-
- /* Handle copies of 32+ bytes where DST is aligned (to quadword) but
- SRC is not. Use aligned quadword loads from SRC, shifted to realign
- the data, allowing for aligned DST stores. */
- .align 4
-L(copy_GE_32_unaligned):
- clrldi 0,0,60 /* Number of bytes until the 1st
- quadword. */
- andi. 11,3,15 /* Check alignment of DST (against
- quadwords). */
- srdi 9,5,4 /* Number of full quadwords remaining. */
-
- beq L(copy_GE_32_unaligned_cont)
-
- /* SRC is not quadword aligned, get it aligned. */
-
- mtcrf 0x01,0
- subf 31,0,5
-
- /* Vector instructions work best when proper alignment (16-bytes)
- is present. Move 0~15 bytes as needed to get DST quadword-aligned. */
-1: /* Copy 1 byte. */
- bf 31,2f
-
- lbz 6,0(12)
- addi 12,12,1
- stb 6,0(3)
- addi 3,3,1
-2: /* Copy 2 bytes. */
- bf 30,4f
-
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-4: /* Copy 4 bytes. */
- bf 29,8f
-
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-8: /* Copy 8 bytes. */
- bf 28,0f
-
- ld 6,0(12)
- addi 12,12,8
- std 6,0(3)
- addi 3,3,8
-0:
- clrldi 10,12,60 /* Check alignment of SRC. */
- srdi 9,31,4 /* Number of full quadwords remaining. */
-
- /* The proper alignment is present, it is OK to copy the bytes now. */
-L(copy_GE_32_unaligned_cont):
-
- /* Setup two indexes to speed up the indexed vector operations. */
- clrldi 11,31,60
- li 6,16 /* Index for 16-bytes offsets. */
- li 7,32 /* Index for 32-bytes offsets. */
- cmpldi cr1,11,0
- srdi 8,31,5 /* Setup the loop counter. */
- mr 10,3
- mr 11,12
- mtcrf 0x01,9
- cmpldi cr6,9,1
-#ifdef __LITTLE_ENDIAN__
- lvsr 5,0,12
-#else
- lvsl 5,0,12
-#endif
- lvx 3,0,12
- bf 31,L(setup_unaligned_loop)
-
- /* Copy another 16 bytes to align to 32-bytes due to the loop . */
- lvx 4,12,6
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- addi 11,12,16
- addi 10,3,16
- stvx 6,0,3
- vor 3,4,4
-
-L(setup_unaligned_loop):
- mtctr 8
- ble cr6,L(end_unaligned_loop)
-
- /* Copy 32 bytes at a time using vector instructions. */
- .align 4
-L(unaligned_loop):
-
- /* Note: vr6/vr10 may contain data that was already copied,
- but in order to get proper alignment, we may have to copy
- some portions again. This is faster than having unaligned
- vector instructions though. */
-
- lvx 4,11,6 /* vr4 = r11+16. */
-#ifdef __LITTLE_ENDIAN__
- vperm 6,4,3,5
-#else
- vperm 6,3,4,5
-#endif
- lvx 3,11,7 /* vr3 = r11+32. */
-#ifdef __LITTLE_ENDIAN__
- vperm 10,3,4,5
-#else
- vperm 10,4,3,5
-#endif
- addi 11,11,32
- stvx 6,0,10
- stvx 10,10,6
- addi 10,10,32
-
- bdnz L(unaligned_loop)
-
- .align 4
-L(end_unaligned_loop):
-
- /* Check for tail bytes. */
- rldicr 0,31,0,59
- mtcrf 0x01,31
- beq cr1,0f
-
- add 3,3,0
- add 12,12,0
-
- /* We have 1~15 tail bytes to copy, and DST is quadword aligned. */
-8: /* Copy 8 bytes. */
- bf 28,4f
-
- lwz 6,0(12)
- lwz 7,4(12)
- addi 12,12,8
- stw 6,0(3)
- stw 7,4(3)
- addi 3,3,8
-4: /* Copy 4 bytes. */
- bf 29,2f
-
- lwz 6,0(12)
- addi 12,12,4
- stw 6,0(3)
- addi 3,3,4
-2: /* Copy 2~3 bytes. */
- bf 30,1f
-
- lhz 6,0(12)
- addi 12,12,2
- sth 6,0(3)
- addi 3,3,2
-1: /* Copy 1 byte. */
- bf 31,0f
-
- lbz 6,0(12)
- stb 6,0(3)
-0: /* Return DST + LEN pointer. */
- ld 31,-8(1)
- ld 3,-16(1)
- add 3,3,5
- blr
-
-END_GEN_TB (MEMPCPY,TB_TOCLESS)
-libc_hidden_def (__mempcpy)
-weak_alias (__mempcpy, mempcpy)
-libc_hidden_builtin_def (mempcpy)
diff --git a/sysdeps/powerpc/powerpc64/power7/memrchr.S b/sysdeps/powerpc/powerpc64/power7/memrchr.S
deleted file mode 100644
index 4276768915..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memrchr.S
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Optimized memrchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-/* int [r3] memrchr (char *s [r3], int byte [r4], int size [r5]) */
-
-#ifndef MEMRCHR
-# define MEMRCHR __memrchr
-#endif
- .machine power7
-ENTRY (MEMRCHR)
- CALL_MCOUNT 3
- add r7,r3,r5 /* Calculate the last acceptable address. */
- neg r0,r7
- addi r7,r7,-1
- mr r10,r3
- clrrdi r6,r7,7
- li r9,3<<5
- dcbt r9,r6,8 /* Stream hint, decreasing addresses. */
-
- /* Replicate BYTE to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
- li r6,-8
- li r9,-1
- rlwinm r0,r0,3,26,28 /* Calculate padding. */
- clrrdi r8,r7,3
- srd r9,r9,r0
- cmpldi r5,32
- clrrdi r0,r10,3
- ble L(small_range)
-
-#ifdef __LITTLE_ENDIAN__
- ldx r12,0,r8
-#else
- ldbrx r12,0,r8 /* Load reversed doubleword from memory. */
-#endif
- cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */
- and r3,r3,r9
- cmpldi cr7,r3,0 /* If r3 == 0, no BYTEs have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
- bf 28,L(loop_setup)
-
- /* Handle DWORD2 of pair. */
-#ifdef __LITTLE_ENDIAN__
- ldx r12,r8,r6
-#else
- ldbrx r12,r8,r6
-#endif
- addi r8,r8,-8
- cmpb r3,r12,r4
- cmpldi cr7,r3,0
- bne cr7,L(done)
-
-L(loop_setup):
- /* The last dword we want to read in the loop below is the one
- containing the first byte of the string, ie. the dword at
- s & ~7, or r0. The first dword read is at r8 - 8, we
- read 2 * cnt dwords, so the last dword read will be at
- r8 - 8 - 16 * cnt + 8. Solving for cnt gives
- cnt = (r8 - r0) / 16 */
- sub r5,r8,r0
- addi r8,r8,-8
- srdi r9,r5,4 /* Number of loop iterations. */
- mtctr r9 /* Setup the counter. */
-
- /* Main loop to look for BYTE backwards in the string.
- FIXME: Investigate whether 32 byte align helps with this
- 9 instruction loop. */
- .align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the byte-checking process for bigger strings. */
-
-#ifdef __LITTLE_ENDIAN__
- ldx r12,0,r8
- ldx r11,r8,r6
-#else
- ldbrx r12,0,r8
- ldbrx r11,r8,r6
-#endif
- cmpb r3,r12,r4
- cmpb r9,r11,r4
- or r5,r9,r3 /* Merge everything in one doubleword. */
- cmpldi cr7,r5,0
- bne cr7,L(found)
- addi r8,r8,-16
- bdnz L(loop)
-
- /* We may have one more word to read. */
- cmpld r8,r0
- bnelr
-
-#ifdef __LITTLE_ENDIAN__
- ldx r12,0,r8
-#else
- ldbrx r12,0,r8
-#endif
- cmpb r3,r12,r4
- cmpldi cr7,r3,0
- bne cr7,L(done)
- blr
-
- .align 4
-L(found):
- /* OK, one (or both) of the dwords contains BYTE. Check
- the first dword. */
- cmpldi cr6,r3,0
- bne cr6,L(done)
-
- /* BYTE must be in the second word. Adjust the address
- again and move the result of cmpb to r3 so we can calculate the
- pointer. */
-
- mr r3,r9
- addi r8,r8,-8
-
- /* r3 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as BYTE in the original
- word from the string. Use that to calculate the pointer.
- We need to make sure BYTE is *before* the end of the
- range. */
-L(done):
- cntlzd r9,r3 /* Count leading zeros before the match. */
- cmpld r8,r0 /* Are we on the last word? */
- srdi r6,r9,3 /* Convert leading zeros to bytes. */
- addi r0,r6,-7
- sub r3,r8,r0
- cmpld cr7,r3,r10
- bnelr
- bgelr cr7
- li r3,0
- blr
-
- .align 4
-L(null):
- li r3,0
- blr
-
-/* Deals with size <= 32. */
- .align 4
-L(small_range):
- cmpldi r5,0
- beq L(null)
-
-#ifdef __LITTLE_ENDIAN__
- ldx r12,0,r8
-#else
- ldbrx r12,0,r8 /* Load reversed doubleword from memory. */
-#endif
- cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */
- and r3,r3,r9
- cmpldi cr7,r3,0
- bne cr7,L(done)
-
- /* Are we done already? */
- cmpld r8,r0
- addi r8,r8,-8
- beqlr
-
- .align 5
-L(loop_small):
-#ifdef __LITTLE_ENDIAN__
- ldx r12,0,r8
-#else
- ldbrx r12,0,r8
-#endif
- cmpb r3,r12,r4
- cmpld r8,r0
- cmpldi cr7,r3,0
- bne cr7,L(done)
- addi r8,r8,-8
- bne L(loop_small)
- blr
-
-END (MEMRCHR)
-weak_alias (__memrchr, memrchr)
-libc_hidden_builtin_def (memrchr)
diff --git a/sysdeps/powerpc/powerpc64/power7/memset.S b/sysdeps/powerpc/powerpc64/power7/memset.S
deleted file mode 100644
index 21933c0672..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/memset.S
+++ /dev/null
@@ -1,399 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER7.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
- Returns 's'. */
-
-#ifndef MEMSET
-# define MEMSET memset
-#endif
- .machine power7
-EALIGN (MEMSET, 5, 0)
- CALL_MCOUNT 3
-
-L(_memset):
- cmpldi cr7,5,31
- cmpldi cr6,5,8
- mr 10,3
-
- /* Replicate byte to word. */
- insrdi 4,4,8,48
- insrdi 4,4,16,32
- ble cr6,L(small) /* If length <= 8, use short copy code. */
-
- neg 0,3
- ble cr7,L(medium) /* If length < 32, use medium copy code. */
-
- andi. 11,10,7 /* Check alignment of SRC. */
- insrdi 4,4,32,0 /* Replicate word to double word. */
-
- mr 12,5
- beq L(big_aligned)
-
- clrldi 0,0,61
- mtocrf 0x01,0
- subf 5,0,5
-
- /* Get DST aligned to 8 bytes. */
-1: bf 31,2f
-
- stb 4,0(10)
- addi 10,10,1
-2: bf 30,4f
-
- sth 4,0(10)
- addi 10,10,2
-4: bf 29,L(big_aligned)
-
- stw 4,0(10)
- addi 10,10,4
-
- .align 4
-L(big_aligned):
-
- cmpldi cr5,5,255
- li 0,32
- dcbtst 0,10
- cmpldi cr6,4,0
- srdi 9,5,3 /* Number of full doublewords remaining. */
- crand 27,26,21
- mtocrf 0x01,9
- bt 27,L(huge)
-
- /* From this point on, we'll copy 32+ bytes and the value
- isn't 0 (so we can't use dcbz). */
-
- srdi 8,5,5
- clrldi 11,5,61
- cmpldi cr6,11,0
- cmpldi cr1,9,4
- mtctr 8
-
- /* Copy 1~3 doublewords so the main loop starts
- at a multiple of 32 bytes. */
-
- bf 30,1f
-
- std 4,0(10)
- std 4,8(10)
- addi 10,10,16
- bf 31,L(big_loop)
-
- std 4,0(10)
- addi 10,10,8
- mr 12,10
- blt cr1,L(tail_bytes)
- b L(big_loop)
-
- .align 4
-1: /* Copy 1 doubleword. */
- bf 31,L(big_loop)
-
- std 4,0(10)
- addi 10,10,8
-
- /* Main aligned copy loop. Copies 32-bytes at a time and
- ping-pong through r10 and r12 to avoid AGEN delays. */
- .align 4
-L(big_loop):
- addi 12,10,32
- std 4,0(10)
- std 4,8(10)
- std 4,16(10)
- std 4,24(10)
- bdz L(tail_bytes)
-
- addi 10,10,64
- std 4,0(12)
- std 4,8(12)
- std 4,16(12)
- std 4,24(12)
- bdnz L(big_loop)
-
- mr 12,10
- b L(tail_bytes)
-
- .align 4
-L(tail_bytes):
-
- /* Check for tail bytes. */
- beqlr cr6
-
- clrldi 0,5,61
- mtocrf 0x01,0
-
- /* At this point we have a tail of 0-7 bytes and we know that the
- destination is doubleword-aligned. */
-4: /* Copy 4 bytes. */
- bf 29,2f
-
- stw 4,0(12)
- addi 12,12,4
-2: /* Copy 2 bytes. */
- bf 30,1f
-
- sth 4,0(12)
- addi 12,12,2
-1: /* Copy 1 byte. */
- bflr 31
-
- stb 4,0(12)
- blr
-
- /* Special case when value is 0 and we have a long length to deal
- with. Use dcbz to zero out 128-bytes at a time. Before using
- dcbz though, we need to get the destination 128-bytes aligned. */
- .align 4
-L(huge):
- andi. 11,10,127
- neg 0,10
- beq L(huge_aligned)
-
- clrldi 0,0,57
- subf 5,0,5
- srdi 0,0,3
- mtocrf 0x01,0
-
- /* Get DST aligned to 128 bytes. */
-8: bf 28,4f
-
- std 4,0(10)
- std 4,8(10)
- std 4,16(10)
- std 4,24(10)
- std 4,32(10)
- std 4,40(10)
- std 4,48(10)
- std 4,56(10)
- addi 10,10,64
- .align 4
-4: bf 29,2f
-
- std 4,0(10)
- std 4,8(10)
- std 4,16(10)
- std 4,24(10)
- addi 10,10,32
- .align 4
-2: bf 30,1f
-
- std 4,0(10)
- std 4,8(10)
- addi 10,10,16
- .align 4
-1: bf 31,L(huge_aligned)
-
- std 4,0(10)
- addi 10,10,8
-
-
-L(huge_aligned):
- srdi 8,5,7
- clrldi 11,5,57
- cmpldi cr6,11,0
- mtctr 8
-
- .align 4
-L(huge_loop):
- dcbz 0,10
- addi 10,10,128
- bdnz L(huge_loop)
-
- /* Check how many bytes are still left. */
- beqlr cr6
-
- subf 9,3,10
- subf 5,9,12
- srdi 8,5,3
- cmpldi cr6,8,0
- mtocrf 0x01,8
-
- /* We have a tail o 1~127 bytes. Copy up to 15 doublewords for
- speed. We'll handle the resulting tail bytes later. */
- beq cr6,L(tail)
-
-8: bf 28,4f
-
- std 4,0(10)
- std 4,8(10)
- std 4,16(10)
- std 4,24(10)
- std 4,32(10)
- std 4,40(10)
- std 4,48(10)
- std 4,56(10)
- addi 10,10,64
- .align 4
-4: bf 29,2f
-
- std 4,0(10)
- std 4,8(10)
- std 4,16(10)
- std 4,24(10)
- addi 10,10,32
- .align 4
-2: bf 30,1f
-
- std 4,0(10)
- std 4,8(10)
- addi 10,10,16
- .align 4
-1: bf 31,L(tail)
-
- std 4,0(10)
- addi 10,10,8
-
- /* Handle the rest of the tail bytes here. */
-L(tail):
- mtocrf 0x01,5
-
- .align 4
-4: bf 29,2f
-
- stw 4,0(10)
- addi 10,10,4
- .align 4
-2: bf 30,1f
-
- sth 4,0(10)
- addi 10,10,2
- .align 4
-1: bflr 31
-
- stb 4,0(10)
- blr
-
- /* Expanded tree to copy tail bytes without increments. */
- .align 4
-L(copy_tail):
- bf 29,L(FXX)
-
- stw 4,0(10)
- bf 30,L(TFX)
-
- sth 4,4(10)
- bflr 31
-
- stb 4,6(10)
- blr
-
- .align 4
-L(FXX): bf 30,L(FFX)
-
- sth 4,0(10)
- bflr 31
-
- stb 4,2(10)
- blr
-
- .align 4
-L(TFX): bflr 31
-
- stb 4,4(10)
- blr
-
- .align 4
-L(FFX): bflr 31
-
- stb 4,0(10)
- blr
-
- /* Handle copies of 9~31 bytes. */
- .align 4
-L(medium):
- /* At least 9 bytes to go. */
- andi. 11,10,3
- clrldi 0,0,62
- beq L(medium_aligned)
-
- /* Force 4-bytes alignment for DST. */
- mtocrf 0x01,0
- subf 5,0,5
-1: /* Copy 1 byte. */
- bf 31,2f
-
- stb 4,0(10)
- addi 10,10,1
-2: /* Copy 2 bytes. */
- bf 30,L(medium_aligned)
-
- sth 4,0(10)
- addi 10,10,2
-
- .align 4
-L(medium_aligned):
- /* At least 6 bytes to go, and DST is word-aligned. */
- cmpldi cr1,5,16
- mtocrf 0x01,5
- blt cr1,8f
-
- /* Copy 16 bytes. */
- stw 4,0(10)
- stw 4,4(10)
- stw 4,8(10)
- stw 4,12(10)
- addi 10,10,16
-8: /* Copy 8 bytes. */
- bf 28,4f
-
- stw 4,0(10)
- stw 4,4(10)
- addi 10,10,8
-4: /* Copy 4 bytes. */
- bf 29,2f
-
- stw 4,0(10)
- addi 10,10,4
-2: /* Copy 2-3 bytes. */
- bf 30,1f
-
- sth 4,0(10)
- addi 10,10,2
-1: /* Copy 1 byte. */
- bflr 31
-
- stb 4,0(10)
- blr
-
- /* Handles copies of 0~8 bytes. */
- .align 4
-L(small):
- mtocrf 0x01,5
- bne cr6,L(copy_tail)
-
- stw 4,0(10)
- stw 4,4(10)
- blr
-
-END_GEN_TB (MEMSET,TB_TOCLESS)
-libc_hidden_builtin_def (memset)
-
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. */
-ENTRY (__bzero)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END (__bzero)
-#ifndef __bzero
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power7/multiarch/Implies b/sysdeps/powerpc/powerpc64/power7/multiarch/Implies
deleted file mode 100644
index bf5d6171a5..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power6/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power7/rawmemchr.S b/sysdeps/powerpc/powerpc64/power7/rawmemchr.S
deleted file mode 100644
index 48afb75943..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/rawmemchr.S
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Optimized rawmemchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-/* int [r3] rawmemchr (void *s [r3], int c [r4]) */
-
-#ifndef RAWMEMCHR
-# define RAWMEMCHR __rawmemchr
-#endif
- .machine power7
-ENTRY (RAWMEMCHR)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- /* Now r4 has a doubleword of c bytes. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- ld r12,0(r8) /* Load doubleword from memory. */
- cmpb r5,r12,r4 /* Compare each byte against c byte. */
-#ifdef __LITTLE_ENDIAN__
- srd r5,r5,r6
- sld r5,r5,r6
-#else
- sld r5,r5,r6 /* Move left to discard ignored bits. */
- srd r5,r5,r6 /* Bring the bits back as zeros. */
-#endif
- cmpdi cr7,r5,0 /* If r5 == 0, no c bytes have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle DWORD2 of pair. */
- ldu r12,8(r8)
- cmpb r5,r12,r4
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the byte-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r5,r12,r4
- cmpb r6,r11,r4
- or r7,r5,r6
- cmpdi cr7,r7,0
- beq cr7,L(loop)
-
- /* OK, one (or both) of the doublewords contains a 'c' byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The 'c' byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- pointer. */
- mr r5,r6
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the 'c' byte in the original
- doubleword from the string. Use that fact to find out what is
- the position of the byte inside the string. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0 /* Count trailing zeros. */
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching char. */
- blr
-END (RAWMEMCHR)
-weak_alias (__rawmemchr,rawmemchr)
-libc_hidden_builtin_def (__rawmemchr)
diff --git a/sysdeps/powerpc/powerpc64/power7/stpncpy.S b/sysdeps/powerpc/powerpc64/power7/stpncpy.S
deleted file mode 100644
index a346dd7e28..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/stpncpy.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Optimized stpncpy implementation for PowerPC64/POWER7.
- Copyright (C) 2014-2017 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 USE_AS_STPNCPY
-#include <sysdeps/powerpc/powerpc64/power7/strncpy.S>
-
-weak_alias (__stpncpy, stpncpy)
-libc_hidden_def (__stpncpy)
-libc_hidden_builtin_def (stpncpy)
diff --git a/sysdeps/powerpc/powerpc64/power7/strcasecmp.S b/sysdeps/powerpc/powerpc64/power7/strcasecmp.S
deleted file mode 100644
index e856b8a593..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strcasecmp.S
+++ /dev/null
@@ -1,126 +0,0 @@
-/* Optimized strcasecmp implementation for PowerPC64.
- Copyright (C) 2011-2017 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 <sysdep.h>
-#include <locale-defines.h>
-
-/* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] )
-
- or if defined USE_IN_EXTENDED_LOCALE_MODEL:
-
- int [r3] strcasecmp_l (const char *s1 [r3], const char *s2 [r4],
- __locale_t loc [r5]) */
-
-#ifndef STRCMP
-# define __STRCMP __strcasecmp
-# define STRCMP strcasecmp
-#endif
-
-ENTRY (__STRCMP)
-#ifndef USE_IN_EXTENDED_LOCALE_MODEL
- CALL_MCOUNT 2
-#else
- CALL_MCOUNT 3
-#endif
-
-#define rRTN r3 /* Return value */
-#define rSTR1 r5 /* 1st string */
-#define rSTR2 r4 /* 2nd string */
-#define rLOCARG r5 /* 3rd argument: locale_t */
-#define rCHAR1 r6 /* Byte read from 1st string */
-#define rCHAR2 r7 /* Byte read from 2nd string */
-#define rADDR1 r8 /* Address of tolower(rCHAR1) */
-#define rADDR2 r12 /* Address of tolower(rCHAR2) */
-#define rLWR1 r8 /* Word tolower(rCHAR1) */
-#define rLWR2 r12 /* Word tolower(rCHAR2) */
-#define rTMP r9
-#define rLOC r11 /* Default locale address */
-
- cmpd cr7, r3, r4
-#ifndef USE_IN_EXTENDED_LOCALE_MODEL
- ld rTMP, __libc_tsd_LOCALE@got@tprel(r2)
- add rLOC, rTMP, __libc_tsd_LOCALE@tls
- ld rLOC, 0(rLOC)
-#else
- mr rLOC, rLOCARG
-#endif
- ld rLOC, LOCALE_CTYPE_TOLOWER(rLOC)
- mr rSTR1, rRTN
- li rRTN, 0
- beqlr cr7
-
-
- /* Unrolling loop for POWER: loads are done with 'lbz' plus
- offset and string descriptors are only updated in the end
- of loop unrolling. */
-
- lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
- lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
-L(loop):
- cmpdi rCHAR1, 0 /* *s1 == '\0' ? */
- sldi rADDR1, rCHAR1, 2 /* Calculate address for tolower(*s1) */
- sldi rADDR2, rCHAR2, 2 /* Calculate address for tolower(*s2) */
- lwzx rLWR1, rLOC, rADDR1 /* Load tolower(*s1) */
- lwzx rLWR2, rLOC, rADDR2 /* Load tolower(*s2) */
- cmpw cr1, rLWR1, rLWR2 /* r = tolower(*s1) == tolower(*s2) ? */
- crorc 4*cr1+eq,eq,4*cr1+eq /* (*s1 != '\0') || (r == 1) */
- beq cr1, L(done)
- lbz rCHAR1, 1(rSTR1)
- lbz rCHAR2, 1(rSTR2)
- cmpdi rCHAR1, 0
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- lbz rCHAR1, 2(rSTR1)
- lbz rCHAR2, 2(rSTR2)
- cmpdi rCHAR1, 0
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- lbz rCHAR1, 3(rSTR1)
- lbz rCHAR2, 3(rSTR2)
- cmpdi rCHAR1, 0
- /* Increment both string descriptors */
- addi rSTR1, rSTR1, 4
- addi rSTR2, rSTR2, 4
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1,L(done)
- lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
- lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
- b L(loop)
-L(done):
- subf r0, rLWR2, rLWR1
- extsw rRTN, r0
- blr
-END (__STRCMP)
-
-weak_alias (__STRCMP, STRCMP)
-libc_hidden_builtin_def (__STRCMP)
diff --git a/sysdeps/powerpc/powerpc64/power7/strcasecmp_l.S b/sysdeps/powerpc/powerpc64/power7/strcasecmp_l.S
deleted file mode 100644
index c13c4ebcb8..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strcasecmp_l.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#define USE_IN_EXTENDED_LOCALE_MODEL
-#define STRCMP strcasecmp_l
-#define __STRCMP __strcasecmp_l
-
-#include "strcasecmp.S"
diff --git a/sysdeps/powerpc/powerpc64/power7/strchr.S b/sysdeps/powerpc/powerpc64/power7/strchr.S
deleted file mode 100644
index a18e2e101c..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strchr.S
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Optimized strchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-#ifndef STRCHR
-# define STRCHR strchr
-#endif
-
-/* int [r3] strchr (char *s [r3], int c [r4]) */
- .machine power7
-ENTRY (STRCHR)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
- cmpdi cr7,r4,0
- ld r12,0(r8) /* Load doubleword from memory. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
-
- beq cr7,L(null_match)
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- /* Now r4 has a doubleword of c bytes and r0 has
- a doubleword of null bytes. */
-
- cmpb r10,r12,r4 /* Compare each byte against c byte. */
- cmpb r11,r12,r0 /* Compare each byte against null byte. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- srd r11,r11,r6
- sld r10,r10,r6
- sld r11,r11,r6
-#else
- sld r10,r10,r6
- sld r11,r11,r6
- srd r10,r10,r6
- srd r11,r11,r6
-#endif
- or r5,r10,r11 /* OR the results to speed things up. */
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a doubleword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r9,16(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- cmpb r6,r9,r4
- cmpb r7,r9,r0
- or r12,r10,r11
- or r9,r6,r7
- or r5,r12,r9
- cmpdi cr7,r5,0
- beq cr7,L(loop)
-
- /* OK, one (or both) of the doublewords contains a c/null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c/null byte. */
-
- cmpdi cr6,r12,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The c/null byte must be in the second doubleword. Adjust the
- address again and move the result of cmpb to r10 so we can calculate
- the pointer. */
-
- mr r10,r6
- mr r11,r7
- addi r8,r8,8
-
- /* r10/r11 have the output of the cmpb instructions, that is,
- 0xff in the same position as the c/null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r3,r10,-1
- andc r3,r3,r10
- popcntd r0,r3
- addi r4,r11,-1
- andc r4,r4,r11
- cmpld cr7,r3,r4
- bgt cr7,L(no_match)
-#else
- cntlzd r0,r10 /* Count leading zeros before c matches. */
- cmpld cr7,r11,r10
- bgt cr7,L(no_match)
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching c byte
- or null in case c was not found. */
- blr
-
- .align 4
-L(no_match):
- li r3,0
- blr
-
-/* We are here because strchr was called with a null byte. */
- .align 4
-L(null_match):
- /* r0 has a doubleword of null bytes. */
-
- cmpb r5,r12,r0 /* Compare each byte against null bytes. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r5,r5,r6
- sld r5,r5,r6
-#else
- sld r5,r5,r6
- srd r5,r5,r6
-#endif
- cmpdi cr7,r5,0 /* If r10 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done_null)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop_null)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r5,r12,r0
- cmpdi cr7,r5,0
- bne cr7,L(done_null)
- b L(loop_null) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop_null):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r5,r12,r0
- cmpb r10,r11,r0
- or r6,r5,r10
- cmpdi cr7,r6,0
- beq cr7,L(loop_null)
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done_null)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- pointer. */
-
- mr r5,r10
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done_null):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching null byte. */
- blr
-END (STRCHR)
-weak_alias (strchr, index)
-libc_hidden_builtin_def (strchr)
diff --git a/sysdeps/powerpc/powerpc64/power7/strchrnul.S b/sysdeps/powerpc/powerpc64/power7/strchrnul.S
deleted file mode 100644
index 27bc1f0682..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strchrnul.S
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Optimized strchrnul implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-#ifndef STRCHRNUL
-# define STRCHRNUL __strchrnul
-#endif
-/* int [r3] strchrnul (char *s [r3], int c [r4]) */
- .machine power7
-ENTRY (STRCHRNUL)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- ld r12,0(r8) /* Load doubleword from memory. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- /* Now r4 has a doubleword of c bytes and r0 has
- a doubleword of null bytes. */
-
- cmpb r10,r12,r0 /* Compare each byte against c byte. */
- cmpb r9,r12,r4 /* Compare each byte against null byte. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and to bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- srd r9,r9,r6
- sld r10,r10,r6
- sld r9,r9,r6
-#else
- sld r10,r10,r6
- sld r9,r9,r6
- srd r10,r10,r6
- srd r9,r9,r6
-#endif
- or r5,r9,r10 /* OR the results to speed things up. */
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle DWORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r0
- cmpb r9,r12,r4
- or r5,r9,r10
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r10,r12,r0
- cmpb r9,r12,r4
- cmpb r6,r11,r0
- cmpb r7,r11,r4
- or r5,r9,r10
- or r10,r6,r7
- or r11,r5,r10
- cmpdi cr7,r11,0
- beq cr7,L(loop)
-
- /* OK, one (or both) of the doublewords contains a c/null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c/null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The c/null byte must be in the second doubleword. Adjust the
- address again and move the result of cmpb to r5 so we can calculate
- the pointer. */
- mr r5,r10
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the c/null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of matching c/null byte. */
- blr
-END (STRCHRNUL)
-weak_alias (STRCHRNUL, strchrnul)
-libc_hidden_builtin_def (STRCHRNUL)
diff --git a/sysdeps/powerpc/powerpc64/power7/strcmp.S b/sysdeps/powerpc/powerpc64/power7/strcmp.S
deleted file mode 100644
index 14e14f457e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strcmp.S
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Optimized strcmp implementation for Power7 using 'cmpb' instruction
- Copyright (C) 2014-2017 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 optimization is achieved here through cmpb instruction.
- 8byte aligned strings are processed with double word comparision
- and unaligned strings are handled effectively with loop unrolling
- technique */
-
-#include <sysdep.h>
-
-#ifndef STRCMP
-# define STRCMP strcmp
-#endif
-
-/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
-
- .machine power7
-EALIGN (STRCMP, 4, 0)
- CALL_MCOUNT 2
-
- or r9, r3, r4
- rldicl. r10, r9, 0, 61 /* are s1 and s2 8 byte aligned..? */
- bne cr0, L(process_unaligned_bytes)
- li r5, 0
-
- .align 4
-/* process input parameters on double word aligned boundary */
-L(unrollDword):
- ld r8,0(r3)
- ld r10,0(r4)
- cmpb r7,r8,r5
- cmpdi cr7,r7,0
- mr r9,r7
- bne cr7,L(null_found)
- cmpld cr7,r8,r10
- bne cr7,L(different)
-
- ld r8,8(r3)
- ld r10,8(r4)
- cmpb r7,r8,r5
- cmpdi cr7,r7,0
- mr r9,r7
- bne cr7,L(null_found)
- cmpld cr7,r8,r10
- bne cr7,L(different)
-
- ld r8,16(r3)
- ld r10,16(r4)
- cmpb r7,r8,r5
- cmpdi cr7,r7,0
- mr r9,r7
- bne cr7,L(null_found)
- cmpld cr7,r8,r10
- bne cr7,L(different)
-
- ld r8,24(r3)
- ld r10,24(r4)
- cmpb r7,r8,r5
- cmpdi cr7,r7,0
- mr r9,r7
- bne cr7,L(null_found)
- cmpld cr7,r8,r10
- bne cr7,L(different)
-
- addi r3, r3, 32
- addi r4, r4, 32
- beq cr7, L(unrollDword)
-
- .align 4
-L(null_found):
-#ifdef __LITTLE_ENDIAN__
- neg r7,r9
- and r9,r9,r7
- li r7,-1
- cntlzd r9,r9
- subfic r9,r9,71
- sld r9,r7,r9
-#else
- cntlzd r9,r9
- li r7,-1
- addi r9,r9,8
- srd r9,r7,r9
-#endif
- or r8,r8,r9
- or r10,r10,r9
-
-L(different):
- cmpb r9,r8,r10
-#ifdef __LITTLE_ENDIAN__
- addi r7,r9,1
- andc r9,r7,r9
- cntlzd r9,r9
- subfic r9,r9,63
-#else
- not r9,r9
- cntlzd r9,r9
- subfic r9,r9,56
-#endif
- srd r3,r8,r9
- srd r10,r10,r9
- rldicl r10,r10,0,56
- rldicl r3,r3,0,56
- subf r3,r10,r3
- blr
-
- .align 4
-L(process_unaligned_bytes):
- lbz r9, 0(r3) /* load byte from s1 */
- lbz r10, 0(r4) /* load byte from s2 */
- cmpdi cr7, r9, 0 /* compare *s1 with NULL */
- beq cr7, L(diffOfNULL) /* if *s1 is NULL , return *s1 - *s2 */
- cmplw cr7, r9, r10 /* compare *s1 and *s2 */
- bne cr7, L(ComputeDiff) /* branch to compute difference and return */
-
- lbz r9, 1(r3) /* load next byte from s1 */
- lbz r10, 1(r4) /* load next byte from s2 */
- cmpdi cr7, r9, 0 /* compare *s1 with NULL */
- beq cr7, L(diffOfNULL) /* if *s1 is NULL , return *s1 - *s2 */
- cmplw cr7, r9, r10 /* compare *s1 and *s2 */
- bne cr7, L(ComputeDiff) /* branch to compute difference and return */
-
- lbz r9, 2(r3) /* unroll 3rd byte here */
- lbz r10, 2(r4)
- cmpdi cr7, r9, 0
- beq cr7, L(diffOfNULL)
- cmplw cr7, r9, r10
- bne 7, L(ComputeDiff)
-
- lbz r9, 3(r3) /* unroll 4th byte now */
- lbz r10, 3(r4)
- addi r3, r3, 4 /* increment s1 by unroll factor */
- cmpdi cr7, r9, 0
- cmplw cr6, 9, r10
- beq cr7, L(diffOfNULL)
- addi r4, r4, 4 /* increment s2 by unroll factor */
- beq cr6, L(process_unaligned_bytes) /* unroll byte processing */
-
- .align 4
-L(ComputeDiff):
- extsw r9, r9
- subf r10, r10, r9 /* compute s1 - s2 */
- extsw r3, r10
- blr /* return */
-
- .align 4
-L(diffOfNULL):
- li r9, 0
- subf r10, r10, r9 /* compute s1 - s2 */
- extsw r3, r10 /* sign extend result */
- blr /* return */
-
-END (STRCMP)
-libc_hidden_builtin_def (strcmp)
diff --git a/sysdeps/powerpc/powerpc64/power7/strlen.S b/sysdeps/powerpc/powerpc64/power7/strlen.S
deleted file mode 100644
index 63848c460c..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strlen.S
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Optimized strlen implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-/* int [r3] strlen (char *s [r3]) */
-
-#ifndef STRLEN
-# define STRLEN strlen
-#endif
- .machine power7
-ENTRY (STRLEN)
- CALL_MCOUNT 1
- dcbt 0,r3
- clrrdi r4,r3,3 /* Align the address to doubleword boundary. */
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
- li r5,-1 /* MASK = 0xffffffffffffffff. */
- ld r12,0(r4) /* Load doubleword from memory. */
-#ifdef __LITTLE_ENDIAN__
- sld r5,r5,r6
-#else
- srd r5,r5,r6 /* MASK = MASK >> padding. */
-#endif
- orc r9,r12,r5 /* Mask bits that are not part of the string. */
- cmpb r10,r9,r0 /* Check for null bytes in DWORD1. */
- cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r4
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle DWORD2 of pair. */
- ldu r12,8(r4)
- cmpb r10,r12,r0
- cmpdi cr7,r10,0
- bne cr7,L(done)
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
-
- ld r12, 8(r4)
- ldu r11, 16(r4)
- cmpb r10,r12,r0
- cmpb r9,r11,r0
- or r8,r9,r10 /* Merge everything in one doubleword. */
- cmpdi cr7,r8,0
- beq cr7,L(loop)
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r10,0
- addi r4,r4,-8
- bne cr6,L(done)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- length. */
-
- mr r10,r9
- addi r4,r4,8
-
- /* r10 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the length. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r9, r10, -1 /* Form a mask from trailing zeros. */
- andc r9, r9, r10
- popcntd r0, r9 /* Count the bits in the mask. */
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- subf r5,r3,r4
- srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */
- add r3,r5,r0 /* Compute final length. */
- blr
-END (STRLEN)
-libc_hidden_builtin_def (strlen)
diff --git a/sysdeps/powerpc/powerpc64/power7/strncmp.S b/sysdeps/powerpc/powerpc64/power7/strncmp.S
deleted file mode 100644
index d53b31be8e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strncmp.S
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Optimized strcmp implementation for POWER7/PowerPC64.
- Copyright (C) 2010-2017 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 <sysdep.h>
-
-#ifndef STRNCMP
-# define STRNCMP strncmp
-#endif
-
-/* See strlen.s for comments on how the end-of-string testing works. */
-
-/* int [r3] strncmp (const char *s1 [r3],
- const char *s2 [r4],
- size_t size [r5]) */
-
-EALIGN (STRNCMP,5,0)
- CALL_MCOUNT 3
-
-#define rTMP2 r0
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rN r5 /* max string length */
-#define rWORD1 r6 /* current word in s1 */
-#define rWORD2 r7 /* current word in s2 */
-#define rWORD3 r10
-#define rWORD4 r11
-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
-#define rBITDIF r11 /* bits that differ in s1 & s2 words */
-#define rTMP r12
-
- dcbt 0,rSTR1
- nop
- or rTMP,rSTR2,rSTR1
- lis r7F7F,0x7f7f
- dcbt 0,rSTR2
- nop
- clrldi. rTMP,rTMP,61
- cmpldi cr1,rN,0
- lis rFEFE,-0x101
- bne L(unaligned)
-/* We are doubleword aligned so set up for two loops. first a double word
- loop, then fall into the byte loop if any residual. */
- srdi. rTMP,rN,3
- clrldi rN,rN,61
- addi rFEFE,rFEFE,-0x101
- addi r7F7F,r7F7F,0x7f7f
- cmpldi cr1,rN,0
- beq L(unaligned)
-
- mtctr rTMP
- ld rWORD1,0(rSTR1)
- ld rWORD2,0(rSTR2)
- sldi rTMP,rFEFE,32
- insrdi r7F7F,r7F7F,32,0
- add rFEFE,rFEFE,rTMP
- b L(g1)
-
-L(g0):
- ldu rWORD1,8(rSTR1)
- bne cr1,L(different)
- ldu rWORD2,8(rSTR2)
-L(g1): add rTMP,rFEFE,rWORD1
- nor rNEG,r7F7F,rWORD1
- bdz L(tail)
- and. rTMP,rTMP,rNEG
- cmpd cr1,rWORD1,rWORD2
- beq L(g0)
-
-/* OK. We've hit the end of the string. We need to be careful that
- we don't compare two strings as different because of gunk beyond
- the end of the strings... */
-
-#ifdef __LITTLE_ENDIAN__
-L(endstring):
- addi rTMP2, rTMP, -1
- beq cr1, L(equal)
- andc rTMP2, rTMP2, rTMP
- rldimi rTMP2, rTMP2, 1, 0
- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */
- and rWORD1, rWORD1, rTMP2
- cmpd cr1, rWORD1, rWORD2
- beq cr1, L(equal)
- cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */
- addi rNEG, rBITDIF, 1
- orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */
- sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */
- andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */
- andc rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt L(highbit)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */
- addi rNEG, rBITDIF, 1
- orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */
- sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */
- andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */
- andc rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-
-#else
-L(endstring):
- and rTMP,r7F7F,rWORD1
- beq cr1,L(equal)
- add rTMP,rTMP,r7F7F
- xor. rBITDIF,rWORD1,rWORD2
- andc rNEG,rNEG,rTMP
- blt L(highbit)
- cntlzd rBITDIF,rBITDIF
- cntlzd rNEG,rNEG
- addi rNEG,rNEG,7
- cmpd cr1,rNEG,rBITDIF
- sub rRTN,rWORD1,rWORD2
- blt cr1,L(equal)
- sradi rRTN,rRTN,63 /* must return an int. */
- ori rRTN,rRTN,1
- blr
-L(equal):
- li rRTN,0
- blr
-
-L(different):
- ld rWORD1,-8(rSTR1)
- xor. rBITDIF,rWORD1,rWORD2
- sub rRTN,rWORD1,rWORD2
- blt L(highbit)
- sradi rRTN,rRTN,63
- ori rRTN,rRTN,1
- blr
-L(highbit):
- sradi rRTN,rWORD2,63
- ori rRTN,rRTN,1
- blr
-#endif
-
-/* Oh well. In this case, we just do a byte-by-byte comparison. */
- .align 4
-L(tail):
- and. rTMP,rTMP,rNEG
- cmpd cr1,rWORD1,rWORD2
- bne L(endstring)
- addi rSTR1,rSTR1,8
- bne cr1,L(different)
- addi rSTR2,rSTR2,8
- cmpldi cr1,rN,0
-L(unaligned):
- mtctr rN
- ble cr1,L(ux)
-L(uz):
- lbz rWORD1,0(rSTR1)
- lbz rWORD2,0(rSTR2)
- .align 4
-L(u1):
- cmpdi cr1,rWORD1,0
- bdz L(u4)
- cmpd rWORD1,rWORD2
- beq cr1,L(u4)
- bne L(u4)
- lbzu rWORD3,1(rSTR1)
- lbzu rWORD4,1(rSTR2)
- cmpdi cr1,rWORD3,0
- bdz L(u3)
- cmpd rWORD3,rWORD4
- beq cr1,L(u3)
- bne L(u3)
- lbzu rWORD1,1(rSTR1)
- lbzu rWORD2,1(rSTR2)
- cmpdi cr1,rWORD1,0
- bdz L(u4)
- cmpd rWORD1,rWORD2
- beq cr1,L(u4)
- bne L(u4)
- lbzu rWORD3,1(rSTR1)
- lbzu rWORD4,1(rSTR2)
- cmpdi cr1,rWORD3,0
- bdz L(u3)
- cmpd rWORD3,rWORD4
- beq cr1,L(u3)
- bne L(u3)
- lbzu rWORD1,1(rSTR1)
- lbzu rWORD2,1(rSTR2)
- b L(u1)
-
-L(u3): sub rRTN,rWORD3,rWORD4
- blr
-L(u4): sub rRTN,rWORD1,rWORD2
- blr
-L(ux):
- li rRTN,0
- blr
-END (STRNCMP)
-libc_hidden_builtin_def (strncmp)
diff --git a/sysdeps/powerpc/powerpc64/power7/strncpy.S b/sysdeps/powerpc/powerpc64/power7/strncpy.S
deleted file mode 100644
index 0224f74898..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strncpy.S
+++ /dev/null
@@ -1,722 +0,0 @@
-/* Copyright (C) 2014-2017 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 <sysdep.h>
-
-/* Implements the functions
-
- char * [r3] strncpy (char *dst [r3], const char *src [r4], size_t n [r5])
-
- AND
-
- char * [r3] stpncpy (char *dst [r3], const char *src [r4], size_t n [r5])
-
- The algorithm is as follows:
- > if src and dest are 8 byte aligned, perform double word copy
- else
- > copy byte by byte on unaligned addresses.
-
- The aligned comparison are made using cmpb instructions. */
-
-/* The focus on optimization for performance improvements are as follows:
- 1. data alignment [gain from aligned memory access on read/write]
- 2. POWER7 gains performance with loop unrolling/unwinding
- [gain by reduction of branch penalty].
- 3. The final pad with null bytes is done by calling an optimized
- memset. */
-
-#ifdef USE_AS_STPNCPY
-# ifndef STPNCPY
-# define FUNC_NAME __stpncpy
-# else
-# define FUNC_NAME STPNCPY
-# endif
-#else
-# ifndef STRNCPY
-# define FUNC_NAME strncpy
-# else
-# define FUNC_NAME STRNCPY
-# endif
-#endif /* !USE_AS_STPNCPY */
-
-#define FRAMESIZE (FRAME_MIN_SIZE+32)
-
-#ifndef MEMSET
-/* For builds with no IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define MEMSET __GI_memset
-# else
-# define MEMSET memset
-# endif
-#endif
-
- .machine power7
-EALIGN(FUNC_NAME, 4, 0)
- CALL_MCOUNT 3
-
- mflr r0 /* load link register LR to r0 */
- or r10, r3, r4 /* to verify source and destination */
- rldicl. r8, r10, 0, 61 /* is double word aligned .. ? */
-
- std r19, -8(r1) /* save callers register , r19 */
- std r18, -16(r1) /* save callers register , r18 */
- std r0, 16(r1) /* store the link register */
- stdu r1, -FRAMESIZE(r1) /* create the stack frame */
-
- mr r9, r3 /* save r3 into r9 for use */
- mr r18, r3 /* save r3 for retCode of strncpy */
- bne 0, L(unaligned)
-
-L(aligned):
- srdi r11, r5, 3 /* compute count for CTR ; count = n/8 */
- cmpldi cr7, r11, 3 /* if count > 4 ; perform unrolling 4 times */
- ble 7, L(update1)
-
- ld r10, 0(r4) /* load doubleWord from src */
- cmpb r8, r10, r8 /* compare src with NULL ,we read just now */
- cmpdi cr7, r8, 0 /* if cmpb returned NULL ; we continue */
- bne cr7, L(update3)
-
- std r10, 0(r3) /* copy doubleword at offset=0 */
- ld r10, 8(r4) /* load next doubleword from offset=8 */
- cmpb r8, r10, r8 /* compare src with NULL , we read just now */
- cmpdi cr7, r8, 0 /* if cmpb returned NULL ; we continue */
- bne 7,L(HopBy8)
-
- addi r8, r11, -4
- mr r7, r3
- srdi r8, r8, 2
- mr r6, r4
- addi r8, r8, 1
- li r12, 0
- mtctr r8
- b L(dwordCopy)
-
- .p2align 4
-L(dWordUnroll):
- std r8, 16(r9)
- ld r8, 24(r4) /* load dword,perform loop unrolling again */
- cmpb r10, r8, r10
- cmpdi cr7, r10, 0
- bne cr7, L(HopBy24)
-
- std r8, 24(r7) /* copy dword at offset=24 */
- addi r9, r9, 32
- addi r4, r4, 32
- bdz L(leftDwords) /* continue with loop on counter */
-
- ld r3, 32(r6)
- cmpb r8, r3, r10
- cmpdi cr7, r8, 0
- bne cr7, L(update2)
-
- std r3, 32(r7)
- ld r10, 40(r6)
- cmpb r8, r10, r8
- cmpdi cr7, r8, 0
- bne cr7, L(HopBy40)
-
- mr r6, r4 /* update values */
- mr r7, r9
- mr r11, r0
- mr r5, r19
-
-L(dwordCopy):
- std r10, 8(r9) /* copy dword at offset=8 */
- addi r19, r5, -32
- addi r0, r11, -4
- ld r8, 16(r4)
- cmpb r10, r8, r12
- cmpdi cr7, r10, 0
- beq cr7, L(dWordUnroll)
-
- addi r9, r9, 16 /* increment dst by 16 */
- addi r4, r4, 16 /* increment src by 16 */
- addi r5, r5, -16 /* decrement length 'n' by 16 */
- addi r0, r11, -2 /* decrement loop counter */
-
-L(dWordUnrollOFF):
- ld r10, 0(r4) /* load first dword */
- li r8, 0 /* load mask */
- cmpb r8, r10, r8
- cmpdi cr7, r8, 0
- bne cr7, L(byte_by_byte)
- mtctr r0
- li r7, 0
- b L(CopyDword)
-
- .p2align 4
-L(loadDWordandCompare):
- ld r10, 0(r4)
- cmpb r8, r10, r7
- cmpdi cr7, r8, 0
- bne cr7, L(byte_by_byte)
-
-L(CopyDword):
- addi r9, r9, 8
- std r10, -8(r9)
- addi r4, r4, 8
- addi r5, r5, -8
- bdnz L(loadDWordandCompare)
-
-L(byte_by_byte):
- cmpldi cr7, r5, 3
- ble cr7, L(verifyByte)
- srdi r10, r5, 2
- mr r19, r9
- mtctr r10
- b L(firstByteUnroll)
-
- .p2align 4
-L(bytes_unroll):
- lbz r10, 1(r4) /* load byte from src */
- cmpdi cr7, r10, 0 /* compare for NULL */
- stb r10, 1(r19) /* store byte to dst */
- beq cr7, L(updtDestComputeN2ndByte)
-
- addi r4, r4, 4 /* advance src */
-
- lbz r10, -2(r4) /* perform loop unrolling for byte r/w */
- cmpdi cr7, r10, 0
- stb r10, 2(r19)
- beq cr7, L(updtDestComputeN3rdByte)
-
- lbz r10, -1(r4) /* perform loop unrolling for byte r/w */
- addi r19, r19, 4
- cmpdi cr7, r10, 0
- stb r10, -1(r19)
- beq cr7, L(ComputeNByte)
-
- bdz L(update0)
-
-L(firstByteUnroll):
- lbz r10, 0(r4) /* perform loop unrolling for byte r/w */
- cmpdi cr7, 10, 0
- stb r10, 0(r19)
- bne cr7, L(bytes_unroll)
- addi r19, r19, 1
-
-L(ComputeNByte):
- subf r9, r19, r9 /* compute 'n'n bytes to fill */
- add r8, r9, r5
-
-L(zeroFill):
- cmpdi cr7, r8, 0 /* compare if length is zero */
- beq cr7, L(update3return)
-
- mr r3, r19 /* fill buffer with */
- li r4, 0 /* zero fill buffer */
- mr r5, r8 /* how many bytes to fill buffer with */
- bl MEMSET /* call optimized memset */
- nop
-
-L(update3return):
-#ifdef USE_AS_STPNCPY
- addi r3, r19, -1 /* update return value */
-#endif
-
-L(hop2return):
-#ifndef USE_AS_STPNCPY
- mr r3, r18 /* set return value */
-#endif
- addi r1, r1, FRAMESIZE /* restore stack pointer */
- ld r0, 16(r1) /* read the saved link register */
- ld r18, -16(r1) /* restore callers save register, r18 */
- ld r19, -8(r1) /* restore callers save register, r19 */
- mtlr r0 /* branch to link register */
- blr /* return */
-
- .p2align 4
-L(update0):
- mr r9, r19
-
- .p2align 4
-L(verifyByte):
- rldicl. r8, r5, 0, 62
-#ifdef USE_AS_STPNCPY
- mr r3, r9
-#endif
- beq cr0, L(hop2return)
- mtctr r8
- addi r4, r4, -1
- mr r19, r9
- b L(oneBYone)
-
- .p2align 4
-L(proceed):
- bdz L(done)
-
-L(oneBYone):
- lbzu r10, 1(r4) /* copy byte */
- addi r19, r19, 1
- addi r8, r8, -1
- cmpdi cr7, r10, 0
- stb r10, -1(r19)
- bne cr7, L(proceed)
- b L(zeroFill)
-
- .p2align 4
-L(done):
- addi r1, r1, FRAMESIZE /* restore stack pointer */
-#ifdef USE_AS_STPNCPY
- mr r3, r19 /* set the return value */
-#else
- mr r3, r18 /* set the return value */
-#endif
- ld r0, 16(r1) /* read the saved link register */
- ld r18, -16(r1) /* restore callers save register, r18 */
- ld r19, -8(r1) /* restore callers save register, r19 */
- mtlr r0 /* branch to link register */
- blr /* return */
-
-L(update1):
- mr r0, r11
- mr r19, r5
-
- .p2align 4
-L(leftDwords):
- cmpdi cr7, r0, 0
- mr r5, r19
- bne cr7, L(dWordUnrollOFF)
- b L(byte_by_byte)
-
- .p2align 4
-L(updtDestComputeN2ndByte):
- addi r19, r19, 2 /* update dst by 2 */
- subf r9, r19, r9 /* compute distance covered */
- add r8, r9, r5
- b L(zeroFill)
-
- .p2align 4
-L(updtDestComputeN3rdByte):
- addi r19, r19, 3 /* update dst by 3 */
- subf r9, r19, r9 /* compute distance covered */
- add r8, r9, r5
- b L(zeroFill)
-
- .p2align 4
-L(HopBy24):
- addi r9, r9, 24 /* increment dst by 24 */
- addi r4, r4, 24 /* increment src by 24 */
- addi r5, r5, -24 /* decrement length 'n' by 24 */
- addi r0, r11, -3 /* decrement loop counter */
- b L(dWordUnrollOFF)
-
- .p2align 4
-L(update2):
- mr r5, r19
- b L(dWordUnrollOFF)
-
- .p2align 4
-L(HopBy40):
- addi r9, r7, 40 /* increment dst by 40 */
- addi r4, r6, 40 /* increment src by 40 */
- addi r5, r5, -40 /* decrement length 'n' by 40 */
- addi r0, r11, -5 /* decrement loop counter */
- b L(dWordUnrollOFF)
-
-L(update3):
- mr r0, r11
- b L(dWordUnrollOFF)
-
-L(HopBy8):
- addi r9, r3, 8 /* increment dst by 8 */
- addi r4, r4, 8 /* increment src by 8 */
- addi r5, r5, -8 /* decrement length 'n' by 8 */
- addi r0, r11, -1 /* decrement loop counter */
- b L(dWordUnrollOFF)
-
-L(unaligned):
- cmpdi r5, 16 /* Proceed byte by byte for less than 16 */
- ble L(byte_by_byte)
- rldicl r7, r3, 0, 61
- rldicl r6, r4, 0, 61
- cmpdi r6, 0 /* Check src alignment */
- beq L(srcaligndstunalign)
- /* src is unaligned */
- rlwinm r10, r4, 3,26,28 /* Calculate padding. */
- clrrdi r4, r4, 3 /* Align the addr to dw boundary */
- ld r8, 0(r4) /* Load doubleword from memory. */
- li r0, 0
- /* Discard bits not part of the string */
-#ifdef __LITTLE_ENDIAN__
- srd r7, r8, r10
-#else
- sld r7, r8, r10
-#endif
- cmpb r0, r7, r0 /* Compare each byte against null */
- /* Discard bits not part of the string */
-#ifdef __LITTLE_ENDIAN__
- sld r0, r0, r10
-#else
- srd r0, r0, r10
-#endif
- cmpdi r0, 0
- bne L(bytebybyte) /* if it has null, copy byte by byte */
- subfic r6, r6, 8
- rlwinm r12, r3, 3,26,28 /* Calculate padding in bits. */
- rldicl r9, r3, 0, 61 /* Calculate padding in bytes. */
- addi r3, r3, -1
-
- cmpdi r12, 0 /* check dest alignment */
- beq L(srcunaligndstalign)
-
- /* both src and dst unaligned */
-#ifdef __LITTLE_ENDIAN__
- sld r8, r7, r10
- mr r11, r10
- addi r11, r11, -8 /* Adjust byte pointer on loaded dw */
-#else
- srd r8, r7, r10
- subfic r11, r10, 64
-#endif
- /* dst alignment is greater then src alignment? */
- cmpd cr7, r12, r10
- ble cr7, L(dst_align_small)
- /* src alignment is less than dst */
-
- /* Calculate the dst alignment difference */
- subfic r7, r9, 8
- mtctr r7
-
- /* Write until dst is aligned */
- cmpdi r0, r7, 4
- blt L(storebyte1) /* less than 4, store byte by byte */
- beq L(equal1) /* if its 4, store word */
- addi r0, r7, -4 /* greater than 4, so stb and stw */
- mtctr r0
-L(storebyte1):
-#ifdef __LITTLE_ENDIAN__
- addi r11, r11, 8 /* Adjust byte pointer on loaded dw */
-#else
- addi r11, r11, -8
-#endif
- srd r7, r8, r11
- stbu r7, 1(r3)
- addi r5, r5, -1
- bdnz L(storebyte1)
-
- subfic r7, r9, 8 /* Check the remaining bytes */
- cmpdi r0, r7, 4
- blt L(proceed1)
-
- .align 4
-L(equal1):
-#ifdef __LITTLE_ENDIAN__
- addi r11, r11, 8 /* Adjust byte pointer on loaded dw */
- srd r7, r8, r11
-#else
- subfic r11, r11, 64
- sld r7, r8, r11
- srdi r7, r7, 32
-#endif
- stw r7, 1(r3)
- addi r3, r3, 4
- addi r5, r5, -4
-
-L(proceed1):
- mr r7, r8
- /* calculate the Left over bytes to be written */
- subfic r11, r10, 64
- subfic r12, r12, 64
- subf r12, r12, r11 /* remaining bytes on second dw */
- subfic r10, r12, 64 /* remaining bytes on first dw */
- subfic r9, r9, 8
- subf r6, r9, r6 /* recalculate padding */
-L(srcunaligndstalign):
- addi r3, r3, 1
- subfic r12, r10, 64 /* remaining bytes on second dw */
- addi r4, r4, 8
- li r0,0
- b L(storedouble)
-
- .align 4
-L(dst_align_small):
- mtctr r6
- /* Write until src is aligned */
-L(storebyte2):
-#ifdef __LITTLE_ENDIAN__
- addi r11, r11, 8 /* Adjust byte pointer on dw */
-#else
- addi r11, r11, -8
-#endif
- srd r7, r8, r11
- stbu r7, 1(r3)
- addi r5, r5, -1
- bdnz L(storebyte2)
-
- addi r4, r4, 8 /* Increment src pointer */
- addi r3, r3, 1 /* Increment dst pointer */
- mr r9, r3
- li r8, 0
- cmpd cr7, r12, r10
- beq cr7, L(aligned)
- rldicl r6, r3, 0, 61 /* Recalculate padding */
- mr r7, r6
-
- /* src is algined */
-L(srcaligndstunalign):
- mr r9, r3
- mr r6, r7
- ld r8, 0(r4)
- subfic r10, r7, 8
- mr r7, r8
- li r0, 0 /* Check null */
- cmpb r0, r8, r0
- cmpdi r0, 0
- bne L(byte_by_byte) /* Do byte by byte if there is NULL */
- rlwinm r12, r3, 3,26,28 /* Calculate padding */
- addi r3, r3, -1
- /* write byte by byte until aligned */
-#ifdef __LITTLE_ENDIAN__
- li r11, -8
-#else
- li r11, 64
-#endif
- mtctr r10
- cmpdi r0, r10, 4
- blt L(storebyte)
- beq L(equal)
- addi r0, r10, -4
- mtctr r0
-L(storebyte):
-#ifdef __LITTLE_ENDIAN__
- addi r11, r11, 8 /* Adjust byte pointer on dw */
-#else
- addi r11, r11, -8
-#endif
- srd r7, r8, r11
- stbu r7, 1(r3)
- addi r5, r5, -1
- bdnz L(storebyte)
-
- cmpdi r0, r10, 4
- blt L(align)
-
- .align 4
-L(equal):
-#ifdef __LITTLE_ENDIAN__
- addi r11, r11, 8
- srd r7, r8, r11
-#else
- subfic r11, r11, 64
- sld r7, r8, r11
- srdi r7, r7, 32
-#endif
- stw r7, 1(r3)
- addi r5, r5, -4
- addi r3, r3, 4
-L(align):
- addi r3, r3, 1
- addi r4, r4, 8 /* Increment src pointer */
- subfic r10, r12, 64
- li r0, 0
- /* dst addr aligned to 8 */
-L(storedouble):
- cmpdi r5, 8
- ble L(null1)
- ld r7, 0(r4) /* load next dw */
- cmpb r0, r7, r0
- cmpdi r0, 0 /* check for null on each new dw */
- bne L(null)
-#ifdef __LITTLE_ENDIAN__
- srd r9, r8, r10 /* bytes from first dw */
- sld r11, r7, r12 /* bytes from second dw */
-#else
- sld r9, r8, r10
- srd r11, r7, r12
-#endif
- or r11, r9, r11 /* make as a single dw */
- std r11, 0(r3) /* store as std on aligned addr */
- mr r8, r7 /* still few bytes left to be written */
- addi r3, r3, 8 /* increment dst addr */
- addi r4, r4, 8 /* increment src addr */
- addi r5, r5, -8
- b L(storedouble) /* Loop until NULL */
-
- .align 4
-
-/* We've hit the end of the string. Do the rest byte-by-byte. */
-L(null):
- addi r3, r3, -1
- mr r10, r12
- mtctr r6
-#ifdef __LITTLE_ENDIAN__
- subfic r10, r10, 64
- addi r10, r10, -8
-#endif
- cmpdi r0, r5, 4
- blt L(loop)
- cmpdi r0, r6, 4
- blt L(loop)
-
- /* we can still use stw if leftover >= 4 */
-#ifdef __LITTLE_ENDIAN__
- addi r10, r10, 8
- srd r11, r8, r10
-#else
- subfic r10, r10, 64
- sld r11, r8, r10
- srdi r11, r11, 32
-#endif
- stw r11, 1(r3)
- addi r5, r5, -4
- addi r3, r3, 4
- cmpdi r0, r5, 0
- beq L(g1)
- cmpdi r0, r6, 4
- beq L(bytebybyte1)
- addi r10, r10, 32
-#ifdef __LITTLE_ENDIAN__
- addi r10, r10, -8
-#else
- subfic r10, r10, 64
-#endif
- addi r0, r6, -4
- mtctr r0
- /* remaining byte by byte part of first dw */
-L(loop):
-#ifdef __LITTLE_ENDIAN__
- addi r10, r10, 8
-#else
- addi r10, r10, -8
-#endif
- srd r0, r8, r10
- stbu r0, 1(r3)
- addi r5, r5, -1
- cmpdi r0, r5, 0
- beq L(g1)
- bdnz L(loop)
-L(bytebybyte1):
- addi r3, r3, 1
- /* remaining byte by byte part of second dw */
-L(bytebybyte):
- addi r3, r3, -8
- addi r4, r4, -1
-
-#ifdef __LITTLE_ENDIAN__
- extrdi. r0, r7, 8, 56
- stbu r7, 8(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 48
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 40
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 32
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 24
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 16
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 8
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi r0, r7, 8, 0
- stbu r0, 1(r3)
- addi r5, r5, -1
- b L(g2)
-#else
- extrdi. r0, r7, 8, 0
- stbu r0, 8(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 8
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 16
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 24
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 32
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 40
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- extrdi. r0, r7, 8, 48
- stbu r0, 1(r3)
- addi r5, r5, -1
- beq L(g2)
- cmpdi r5, 0
- beq L(g1)
- stbu r7, 1(r3)
- addi r5, r5, -1
- b L(g2)
-#endif
-L(g1):
-#ifdef USE_AS_STPNCPY
- addi r3, r3, 1
-#endif
-L(g2):
- addi r3, r3, 1
- mr r19, r3
- mr r8, r5
- b L(zeroFill)
-L(null1):
- mr r9, r3
- subf r4, r6, r4
- b L(byte_by_byte)
-END(FUNC_NAME)
-#ifndef USE_AS_STPNCPY
-libc_hidden_builtin_def (strncpy)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power7/strnlen.S b/sysdeps/powerpc/powerpc64/power7/strnlen.S
deleted file mode 100644
index a970b6ce30..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strnlen.S
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Optimized strnlen implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by Luis Machado <luisgpm@br.ibm.com>.
- 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 <sysdep.h>
-
-#ifndef STRNLEN
-# define STRNLEN __strnlen
-#endif
-
-/* int [r3] strnlen (char *s [r3], int size [r4]) */
- .machine power7
-ENTRY (STRNLEN)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3
- add r7,r3,r4 /* Calculate the last acceptable address. */
- cmpldi r4,32
- li r0,0 /* Doubleword with null chars. */
- addi r7,r7,-1
-
- /* If we have less than 33 bytes to search, skip to a faster code. */
- ble L(small_range)
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- ld r12,0(r8) /* Load doubleword from memory. */
- cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- sld r10,r10,r6
-#else
- sld r10,r10,r6
- srd r10,r10,r6
-#endif
- cmpldi cr7,r10,0 /* If r10 == 0, no null's have been found. */
- bne cr7,L(done)
-
- clrrdi r7,r7,3 /* Address of last doubleword. */
- mtcrf 0x01,r8
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop_setup)
-
- /* Handle DWORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r0
- cmpldi cr7,r10,0
- bne cr7,L(done)
-
-L(loop_setup):
- /* The last dword we want to read in the loop below is the one
- containing the last byte of the string, ie. the dword at
- (s + size - 1) & ~7, or r7. The first dword read is at
- r8 + 8, we read 2 * cnt dwords, so the last dword read will
- be at r8 + 8 + 16 * cnt - 8. Solving for cnt gives
- cnt = (r7 - r8) / 16 */
- sub r5,r7,r8
- srdi r6,r5,4 /* Number of loop iterations. */
- mtctr r6 /* Setup the counter. */
-
- /* Main loop to look for the null byte in the string. Since
- it's a small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
-
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r10,r12,r0
- cmpb r9,r11,r0
- or r5,r9,r10 /* Merge everything in one doubleword. */
- cmpldi cr7,r5,0
- bne cr7,L(found)
- bdnz L(loop)
-
- /* We may have one more dword to read. */
- cmpld cr6,r8,r7
- beq cr6,L(end_max)
-
- ldu r12,8(r8)
- cmpb r10,r12,r0
- cmpldi cr6,r10,0
- bne cr6,L(done)
-
-L(end_max):
- mr r3,r4
- blr
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
- .align 4
-L(found):
- cmpldi cr6,r10,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- length. */
-
- mr r10,r9
- addi r8,r8,8
-
- /* r10 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the length.
- We need to make sure the null char is *before* the end of the
- range. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r10,-1
- andc r0,r0,r10
- popcntd r0,r0
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- sub r3,r8,r3
- srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */
- add r3,r3,r0 /* Length until the match. */
- cmpld r3,r4
- blelr
- mr r3,r4
- blr
-
-/* Deals with size <= 32. */
- .align 4
-L(small_range):
- cmpldi r4,0
- beq L(end_max)
-
- clrrdi r7,r7,3 /* Address of last doubleword. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- ld r12,0(r8) /* Load doubleword from memory. */
- cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- sld r10,r10,r6
-#else
- sld r10,r10,r6
- srd r10,r10,r6
-#endif
- cmpldi cr7,r10,0
- bne cr7,L(done)
-
- cmpld r8,r7
- beq L(end_max)
-
- .p2align 5
-L(loop_small):
- ldu r12,8(r8)
- cmpb r10,r12,r0
- cmpldi cr6,r10,0
- bne cr6,L(done)
- cmpld r8,r7
- bne L(loop_small)
- mr r3,r4
- blr
-
-END (STRNLEN)
-libc_hidden_def (__strnlen)
-weak_alias (__strnlen, strnlen)
-libc_hidden_def (strnlen)
diff --git a/sysdeps/powerpc/powerpc64/power7/strrchr.S b/sysdeps/powerpc/powerpc64/power7/strrchr.S
deleted file mode 100644
index c22393deb5..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strrchr.S
+++ /dev/null
@@ -1,260 +0,0 @@
-/* Optimized strrchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-/* int [r3] strrchr (char *s [r3], int c [r4]) */
-
-#ifndef STRRCHR
-# define STRRCHR strrchr
-#endif
-
- .machine power7
-ENTRY (STRRCHR)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
- cmpdi cr7,r4,0
- ld r12,0(r8) /* Load doubleword from memory. */
- li r9,0 /* used to store last occurence */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
-
- beq cr7,L(null_match)
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- /* r4 is changed now ,if its passed as more chars
- check for null again */
- cmpdi cr7,r4,0
- beq cr7,L(null_match)
- /* Now r4 has a doubleword of c bytes and r0 has
- a doubleword of null bytes. */
-
- cmpb r10,r12,r4 /* Compare each byte against c byte. */
- cmpb r11,r12,r0 /* Compare each byte against null byte. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- srd r11,r11,r6
- sld r10,r10,r6
- sld r11,r11,r6
-#else
- sld r10,r10,r6
- sld r11,r11,r6
- srd r10,r10,r6
- srd r11,r11,r6
-#endif
- or r5,r10,r11 /* OR the results to speed things up. */
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done)
-
-L(align):
- mtcrf 0x01,r8
-
- /* Are we now aligned to a doubleword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r7,16(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- cmpb r6,r7,r4
- cmpb r7,r7,r0
- or r12,r10,r11
- or r5,r6,r7
- or r5,r12,r5
- cmpdi cr7,r5,0
- beq cr7,L(loop)
-
- /* OK, one (or both) of the doublewords contains a c/null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c/null byte. */
- cmpdi cr6,r12,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The c/null byte must be in the second doubleword. Adjust the
- address again and move the result of cmpb to r10 so we can calculate
- the pointer. */
-
- mr r10,r6
- mr r11,r7
- addi r8,r8,8
-
- /* r10/r11 have the output of the cmpb instructions, that is,
- 0xff in the same position as the c/null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-
-L(done):
- /* if there are more than one 0xff in r11, find the first pos of ff
- in r11 and fill r10 with 0 from that position */
- cmpdi cr7,r11,0
- beq cr7,L(no_null)
-#ifdef __LITTLE_ENDIAN__
- addi r3,r11,-1
- andc r3,r3,r11
- popcntd r0,r3
-#else
- cntlzd r0,r11
-#endif
- subfic r0,r0,63
- li r6,-1
-#ifdef __LITTLE_ENDIAN__
- srd r0,r6,r0
-#else
- sld r0,r6,r0
-#endif
- and r10,r0,r10
-L(no_null):
-#ifdef __LITTLE_ENDIAN__
- cntlzd r0,r10 /* Count leading zeros before c matches. */
- addi r3,r10,-1
- andc r3,r3,r10
- addi r10,r11,-1
- andc r10,r10,r11
- cmpld cr7,r3,r10
- bgt cr7,L(no_match)
-#else
- addi r3,r10,-1 /* Count trailing zeros before c matches. */
- andc r3,r3,r10
- popcntd r0,r3
- cmpld cr7,r11,r10
- bgt cr7,L(no_match)
-#endif
- srdi r0,r0,3 /* Convert trailing zeros to bytes. */
- subfic r0,r0,7
- add r9,r8,r0 /* Return address of the matching c byte
- or null in case c was not found. */
- li r0,0
- cmpdi cr7,r11,0 /* If r11 == 0, no null's have been found. */
- beq cr7,L(align)
-
- .align 4
-L(no_match):
- mr r3,r9
- blr
-
-/* We are here because strrchr was called with a null byte. */
- .align 4
-L(null_match):
- /* r0 has a doubleword of null bytes. */
-
- cmpb r5,r12,r0 /* Compare each byte against null bytes. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r5,r5,r6
- sld r5,r5,r6
-#else
- sld r5,r5,r6
- srd r5,r5,r6
-#endif
- cmpdi cr7,r5,0 /* If r10 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done_null)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop_null)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r5,r12,r0
- cmpdi cr7,r5,0
- bne cr7,L(done_null)
- b L(loop_null) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop_null):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r5,r12,r0
- cmpb r10,r11,r0
- or r6,r5,r10
- cmpdi cr7,r6,0
- beq cr7,L(loop_null)
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done_null)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- pointer. */
-
- mr r5,r10
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done_null):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert trailing zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching null byte. */
- blr
-END (STRRCHR)
-weak_alias (strrchr, rindex)
-libc_hidden_builtin_def (strrchr)
diff --git a/sysdeps/powerpc/powerpc64/power7/strstr-ppc64.c b/sysdeps/powerpc/powerpc64/power7/strstr-ppc64.c
deleted file mode 100644
index a917b2157e..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strstr-ppc64.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Optimized strstr implementation for PowerPC64/POWER7.
- Copyright (C) 2015-2017 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 <string.h>
-
-#define STRSTR __strstr_ppc
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(__name)
-
-extern __typeof (strstr) __strstr_ppc attribute_hidden;
-
-#include <string/strstr.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/strstr.S b/sysdeps/powerpc/powerpc64/power7/strstr.S
deleted file mode 100644
index 260db2ed6d..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/strstr.S
+++ /dev/null
@@ -1,521 +0,0 @@
-/* Optimized strstr implementation for PowerPC64/POWER7.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-/* Char * [r3] strstr (char *s [r3], char * pat[r4]) */
-
-/* The performance gain is obtained using aligned memory access, load
- * doubleword and usage of cmpb instruction for quicker comparison. */
-
-#define ITERATIONS 64
-
-#ifndef STRSTR
-# define STRSTR strstr
-#endif
-
-#ifndef STRLEN
-/* For builds with no IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define STRLEN __GI_strlen
-# else
-# define STRLEN strlen
-# endif
-#endif
-
-#ifndef STRNLEN
-/* For builds with no IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define STRNLEN __GI_strnlen
-# else
-# define STRNLEN __strnlen
-# endif
-#endif
-
-#ifndef STRCHR
-# ifdef SHARED
-# define STRCHR __GI_strchr
-# else
-# define STRCHR strchr
-# endif
-#endif
-
-#define FRAMESIZE (FRAME_MIN_SIZE+32)
- .machine power7
-EALIGN (STRSTR, 4, 0)
- CALL_MCOUNT 2
- mflr r0 /* Load link register LR to r0. */
- std r31, -8(r1) /* Save callers register r31. */
- std r30, -16(r1) /* Save callers register r30. */
- std r29, -24(r1) /* Save callers register r29. */
- std r28, -32(r1) /* Save callers register r28. */
- std r0, 16(r1) /* Store the link register. */
- cfi_offset(r31, -8)
- cfi_offset(r30, -16)
- cfi_offset(r28, -32)
- cfi_offset(r29, -24)
- cfi_offset(lr, 16)
- stdu r1, -FRAMESIZE(r1) /* Create the stack frame. */
- cfi_adjust_cfa_offset(FRAMESIZE)
-
- dcbt 0, r3
- dcbt 0, r4
- cmpdi cr7, r3, 0
- beq cr7, L(retnull)
- cmpdi cr7, r4, 0
- beq cr7, L(retnull)
-
- mr r29, r3
- mr r30, r4
- mr r3, r4
- bl STRLEN
- nop
-
- cmpdi cr7, r3, 0 /* If search str is null. */
- beq cr7, L(ret_r3)
-
- mr r31, r3
- mr r4, r3
- mr r3, r29
- bl STRNLEN
- nop
-
- cmpd cr7, r3, r31 /* If len(r3) < len(r4). */
- blt cr7, L(retnull)
- mr r3, r29
- lbz r4, 0(r30)
- bl STRCHR
- nop
-
- mr r11, r3
- /* If first char of search str is not present. */
- cmpdi cr7, r3, 0
- ble cr7, L(end)
- /* Reg r28 is used to count the number of iterations. */
- li r28, 0
- rldicl r8, r3, 0, 52 /* Page cross check. */
- cmpldi cr7, r8, 4096-16
- bgt cr7, L(bytebybyte)
-
- rldicl r8, r30, 0, 52
- cmpldi cr7, r8, 4096-16
- bgt cr7, L(bytebybyte)
-
- /* If len(r4) < 8 handle in a different way. */
- /* Shift position based on null and use cmpb. */
- cmpdi cr7, r31, 8
- blt cr7, L(lessthan8)
-
- /* Len(r4) >= 8 reaches here. */
- mr r8, r3 /* Save r3 for future use. */
- mr r4, r30 /* Restore r4. */
- li r0, 0
- rlwinm r10, r30, 3, 26, 28 /* Calculate padding in bits. */
- clrrdi r4, r4, 3 /* Make r4 aligned to 8. */
- ld r6, 0(r4)
- addi r4, r4, 8
- cmpdi cr7, r10, 0 /* Check if its already aligned? */
- beq cr7, L(begin1)
-#ifdef __LITTLE_ENDIAN__
- srd r6, r6, r10 /* Discard unwanted bits. */
-#else
- sld r6, r6, r10
-#endif
- ld r9, 0(r4)
- subfic r10, r10, 64
-#ifdef __LITTLE_ENDIAN__
- sld r9, r9, r10 /* Discard unwanted bits. */
-#else
- srd r9, r9, r10
-#endif
- or r6, r6, r9 /* Form complete search str. */
-L(begin1):
- mr r29, r6
- rlwinm r10, r3, 3, 26, 28
- clrrdi r3, r3, 3
- ld r5, 0(r3)
- cmpb r9, r0, r6 /* Check if input has null. */
- cmpdi cr7, r9, 0
- bne cr7, L(return3)
- cmpb r9, r0, r5 /* Check if input has null. */
-#ifdef __LITTLE_ENDIAN__
- srd r9, r9, r10
-#else
- sld r9, r9, r10
-#endif
- cmpdi cr7, r9, 0
- bne cr7, L(retnull)
-
- li r12, -8 /* Shift values. */
- li r11, 72 /* Shift values. */
- cmpdi cr7, r10, 0
- beq cr7, L(nextbyte1)
- mr r12, r10
- addi r12, r12, -8
- subfic r11, r12, 64
-
-L(nextbyte1):
- ldu r7, 8(r3) /* Load next dw. */
- addi r12, r12, 8 /* Shift one byte and compare. */
- addi r11, r11, -8
-#ifdef __LITTLE_ENDIAN__
- srd r9, r5, r12 /* Rotate based on mask. */
- sld r10, r7, r11
-#else
- sld r9, r5, r12
- srd r10, r7, r11
-#endif
- /* Form single dw from few bytes on first load and second load. */
- or r10, r9, r10
- /* Check for null in the formed dw. */
- cmpb r9, r0, r10
- cmpdi cr7, r9, 0
- bne cr7, L(retnull)
- /* Cmpb search str and input str. */
- cmpb r9, r10, r6
- cmpdi cr7, r9, -1
- beq cr7, L(match)
- addi r8, r8, 1
- b L(begin)
-
- .align 4
-L(match):
- /* There is a match of 8 bytes, check next bytes. */
- cmpdi cr7, r31, 8
- beq cr7, L(return)
- /* Update next starting point r8. */
- srdi r9, r11, 3
- subf r9, r9, r3
- mr r8, r9
-
-L(secondmatch):
- mr r5, r7
- rlwinm r10, r30, 3, 26, 28 /* Calculate padding in bits. */
- ld r6, 0(r4)
- addi r4, r4, 8
- cmpdi cr7, r10, 0 /* Check if its already aligned? */
- beq cr7, L(proceed3)
-#ifdef __LITTLE_ENDIAN__
- srd r6, r6, r10 /* Discard unwanted bits. */
- cmpb r9, r0, r6
- sld r9, r9, r10
-#else
- sld r6, r6, r10
- cmpb r9, r0, r6
- srd r9, r9, r10
-#endif
- cmpdi cr7, r9, 0
- bne cr7, L(proceed3)
- ld r9, 0(r4)
- subfic r10, r10, 64
-#ifdef __LITTLE_ENDIAN__
- sld r9, r9, r10 /* Discard unwanted bits. */
-#else
- srd r9, r9, r10
-#endif
- or r6, r6, r9 /* Form complete search str. */
-
-L(proceed3):
- li r7, 0
- addi r3, r3, 8
- cmpb r9, r0, r5
- cmpdi cr7, r9, 0
- bne cr7, L(proceed4)
- ld r7, 0(r3)
-L(proceed4):
-#ifdef __LITTLE_ENDIAN__
- srd r9, r5, r12
- sld r10, r7, r11
-#else
- sld r9, r5, r12
- srd r10, r7, r11
-#endif
- /* Form single dw with few bytes from first and second load. */
- or r10, r9, r10
- cmpb r9, r0, r6
- cmpdi cr7, r9, 0
- bne cr7, L(return4)
- /* Check for null in the formed dw. */
- cmpb r9, r0, r10
- cmpdi cr7, r9, 0
- bne cr7, L(retnull)
- /* If the next 8 bytes dont match, start search again. */
- cmpb r9, r10, r6
- cmpdi cr7, r9, -1
- bne cr7, L(reset)
- /* If the next 8 bytes match, load and compare next 8. */
- b L(secondmatch)
-
- .align 4
-L(reset):
- /* Start the search again. */
- addi r8, r8, 1
- b L(begin)
-
- .align 4
-L(return3):
- /* Count leading zeros and compare partial dw. */
-#ifdef __LITTLE_ENDIAN__
- addi r7, r9, -1
- andc r7, r7, r9
- popcntd r7, r7
- subfic r7, r7, 64
- sld r10, r5, r7
- sld r6, r6, r7
-#else
- cntlzd r7, r9
- subfic r7, r7, 64
- srd r10, r5, r7
- srd r6, r6, r7
-#endif
- cmpb r9, r10, r6
- cmpdi cr7, r9, -1
- addi r8, r8, 1
- /* Start search again if there is no match. */
- bne cr7, L(begin)
- /* If the words match, update return values. */
- subfic r7, r7, 64
- srdi r7, r7, 3
- add r3, r3, r7
- subf r3, r31, r3
- b L(end)
-
- .align 4
-L(return4):
- /* Count leading zeros and compare partial dw. */
-#ifdef __LITTLE_ENDIAN__
- addi r7, r9, -1
- andc r7, r7, r9
- popcntd r7, r7
- subfic r7, r7, 64
- sld r10, r10, r7
- sld r6, r6, r7
-#else
- cntlzd r7, r9
- subfic r7, r7, 64
- srd r10, r10, r7
- srd r6, r6, r7
-#endif
- cmpb r9, r10, r6
- cmpdi cr7, r9, -1
- addi r8, r8, 1
- bne cr7, L(begin)
- subfic r7, r7, 64
- srdi r11, r11, 3
- subf r3, r11, r3
- srdi r7, r7, 3
- add r3, r3, r7
- subf r3, r31, r3
- b L(end)
-
- .align 4
-L(begin):
- mr r3, r8
- /* When our iterations exceed ITERATIONS,fall back to default. */
- addi r28, r28, 1
- cmpdi cr7, r28, ITERATIONS
- beq cr7, L(default)
- lbz r4, 0(r30)
- bl STRCHR
- nop
- /* If first char of search str is not present. */
- cmpdi cr7, r3, 0
- ble cr7, L(end)
- mr r8, r3
- mr r4, r30 /* Restore r4. */
- li r0, 0
- mr r6, r29
- clrrdi r4, r4, 3
- addi r4, r4, 8
- b L(begin1)
-
- /* Handle less than 8 search string. */
- .align 4
-L(lessthan8):
- mr r4, r3
- mr r9, r30
- li r0, 0
-
- rlwinm r10, r9, 3, 26, 28 /* Calculate padding in bits. */
- srdi r8, r10, 3 /* Padding in bytes. */
- clrrdi r9, r9, 3 /* Make r4 aligned to 8. */
- ld r6, 0(r9)
- cmpdi cr7, r10, 0 /* Check if its already aligned? */
- beq cr7, L(proceed2)
-#ifdef __LITTLE_ENDIAN__
- srd r6, r6, r10 /* Discard unwanted bits. */
-#else
- sld r6, r6, r10
-#endif
- subfic r8, r8, 8
- cmpd cr7, r8, r31 /* Next load needed? */
- bge cr7, L(proceed2)
- ld r7, 8(r9)
- subfic r10, r10, 64
-#ifdef __LITTLE_ENDIAN__
- sld r7, r7, r10 /* Discard unwanted bits. */
-#else
- srd r7, r7, r10
-#endif
- or r6, r6, r7 /* Form complete search str. */
-L(proceed2):
- mr r29, r6
- rlwinm r10, r3, 3, 26, 28
- clrrdi r7, r3, 3 /* Make r3 aligned. */
- ld r5, 0(r7)
- sldi r8, r31, 3
- subfic r8, r8, 64
-#ifdef __LITTLE_ENDIAN__
- sld r6, r6, r8
- cmpb r9, r0, r5
- srd r9, r9, r10
-#else
- srd r6, r6, r8
- cmpb r9, r0, r5
- sld r9, r9, r10
-#endif
- cmpdi cr7, r9, 0
- bne cr7, L(noload)
- cmpdi cr7, r10, 0
- beq cr7, L(continue)
- ld r7, 8(r7)
-L(continue1):
- mr r12, r10
- addi r12, r12, -8
- subfic r11, r12, 64
- b L(nextbyte)
-
- .align 4
-L(continue):
- ld r7, 8(r7)
- li r12, -8 /* Shift values. */
- li r11, 72 /* Shift values. */
-L(nextbyte):
- addi r12, r12, 8 /* Mask for rotation. */
- addi r11, r11, -8
-#ifdef __LITTLE_ENDIAN__
- srd r9, r5, r12
- sld r10, r7, r11
- or r10, r9, r10
- sld r10, r10, r8
- cmpb r9, r0, r10
- srd r9, r9, r8
-#else
- sld r9, r5, r12
- srd r10, r7, r11
- or r10, r9, r10
- srd r10, r10, r8
- cmpb r9, r0, r10
- sld r9, r9, r8
-#endif
- cmpdi cr7, r9, 0
- bne cr7, L(retnull)
- cmpb r9, r10, r6
- cmpdi cr7, r9, -1
- beq cr7, L(end)
- addi r3, r4, 1
- /* When our iterations exceed ITERATIONS,fall back to default. */
- addi r28, r28, 1
- cmpdi cr7, r28, ITERATIONS
- beq cr7, L(default)
- lbz r4, 0(r30)
- bl STRCHR
- nop
- /* If first char of search str is not present. */
- cmpdi cr7, r3, 0
- ble cr7, L(end)
- mr r4, r3
- mr r6, r29
- li r0, 0
- b L(proceed2)
-
- .align 4
-L(noload):
- /* Reached null in r3, so skip next load. */
- li r7, 0
- b L(continue1)
-
- .align 4
-L(return):
- /* Update return values. */
- srdi r9, r11, 3
- subf r3, r9, r3
- b L(end)
-
- /* Handling byte by byte. */
- .align 4
-L(bytebybyte):
- mr r8, r3
- addi r8, r8, -1
-L(loop1):
- addi r8, r8, 1
- mr r3, r8
- mr r4, r30
- lbz r6, 0(r4)
- cmpdi cr7, r6, 0
- beq cr7, L(updater3)
-L(loop):
- lbz r5, 0(r3)
- cmpdi cr7, r5, 0
- beq cr7, L(retnull)
- cmpld cr7, r6, r5
- bne cr7, L(loop1)
- addi r3, r3, 1
- addi r4, r4, 1
- lbz r6, 0(r4)
- cmpdi cr7, r6, 0
- beq cr7, L(updater3)
- b L(loop)
-
- /* Handling return values. */
- .align 4
-L(updater3):
- subf r3, r31, r3 /* Reduce len of r4 from r3. */
- b L(end)
-
- .align 4
-L(ret_r3):
- mr r3, r29 /* Return r3. */
- b L(end)
-
- .align 4
-L(retnull):
- li r3, 0 /* Return NULL. */
- b L(end)
-
- .align 4
-L(default):
- mr r4, r30
- bl __strstr_ppc
- nop
-
- .align 4
-L(end):
- addi r1, r1, FRAMESIZE /* Restore stack pointer. */
- cfi_adjust_cfa_offset(-FRAMESIZE)
- ld r0, 16(r1) /* Restore the saved link register. */
- ld r28, -32(r1) /* Restore callers save register r28. */
- ld r29, -24(r1) /* Restore callers save register r29. */
- ld r30, -16(r1) /* Restore callers save register r30. */
- ld r31, -8(r1) /* Restore callers save register r31. */
- mtlr r0 /* Branch to link register. */
- blr
-END (STRSTR)
-libc_hidden_builtin_def (strstr)
diff --git a/sysdeps/powerpc/powerpc64/power7/sub_n.S b/sysdeps/powerpc/powerpc64/power7/sub_n.S
deleted file mode 100644
index 848dad5718..0000000000
--- a/sysdeps/powerpc/powerpc64/power7/sub_n.S
+++ /dev/null
@@ -1,23 +0,0 @@
-/* PowerPC64 mpn_lshift -- mpn_add_n/mpn_sub_n -- mpn addition and
- subtraction.
- Copyright (C) 2013-2017 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 <sysdep.h>
-
-#define USE_AS_SUB
-#include "add_n.S"
diff --git a/sysdeps/powerpc/powerpc64/power8/Implies b/sysdeps/powerpc/powerpc64/power8/Implies
deleted file mode 100644
index 9a5e3c7277..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power7/fpu
-powerpc/powerpc64/power7
diff --git a/sysdeps/powerpc/powerpc64/power8/Makefile b/sysdeps/powerpc/powerpc64/power8/Makefile
deleted file mode 100644
index 71a59529f3..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),string)
-sysdep_routines += strcasestr-ppc64
-endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/Implies b/sysdeps/powerpc/powerpc64/power8/fpu/Implies
deleted file mode 100644
index 1187cdfb0a..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power7/fpu/
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/e_expf.S b/sysdeps/powerpc/powerpc64/power8/fpu/e_expf.S
deleted file mode 100644
index 4c42926a74..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/e_expf.S
+++ /dev/null
@@ -1,303 +0,0 @@
-/* Optimized expf(). PowerPC64/POWER8 version.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-/* Short algorithm description:
- *
- * Let K = 64 (table size).
- * e^x = 2^(x/log(2)) = 2^n * T[j] * (1 + P(y))
- * where:
- * x = m*log(2)/K + y, y in [0.0..log(2)/K]
- * m = n*K + j, m,n,j - signed integer, j in [0..K-1]
- * values of 2^(j/K) are tabulated as T[j].
- *
- * P(y) is a minimax polynomial approximation of expf(y)-1
- * on small interval [0.0..log(2)/K].
- *
- * P(y) = P3*y*y*y*y + P2*y*y*y + P1*y*y + P0*y, calculated as
- * z = y*y; P(y) = (P3*z + P1)*z + (P2*z + P0)*y
- *
- * Special cases:
- * expf(NaN) = NaN
- * expf(+INF) = +INF
- * expf(-INF) = 0
- * expf(x) = 1 for subnormals
- * for finite argument, only expf(0)=1 is exact
- * expf(x) overflows if x>88.7228317260742190
- * expf(x) underflows if x<-103.972076416015620
- */
-
-#define C1 0x42ad496b /* Single precision 125*log(2). */
-#define C2 0x31800000 /* Single precision 2^(-28). */
-#define SP_INF 0x7f800000 /* Single precision Inf. */
-#define SP_EXP_BIAS 0x1fc0 /* Single precision exponent bias. */
-
-#define DATA_OFFSET r9
-
-/* Implements the function
-
- float [fp1] expf (float [fp1] x) */
-
- .machine power8
-EALIGN(__ieee754_expf, 4, 0)
- addis DATA_OFFSET,r2,.Lanchor@toc@ha
- addi DATA_OFFSET,DATA_OFFSET,.Lanchor@toc@l
-
- xscvdpspn v0,v1
- mfvsrd r8,v0 /* r8 = x */
- lfd fp2,(.KLN2-.Lanchor)(DATA_OFFSET)
- lfd fp3,(.P2-.Lanchor)(DATA_OFFSET)
- rldicl r3,r8,32,33 /* r3 = |x| */
- lis r4,C1@ha /* r4 = 125*log(2) */
- ori r4,r4,C1@l
- cmpw r3,r4
- lfd fp5,(.P3-.Lanchor)(DATA_OFFSET)
- lfd fp4,(.RS-.Lanchor)(DATA_OFFSET)
- fmadd fp2,fp1,fp2,fp4 /* fp2 = x * K/log(2) + (2^23 + 2^22) */
- bge L(special_paths) /* |x| >= 125*log(2) ? */
-
- lis r4,C2@ha
- ori r4,r4,C2@l
- cmpw r3,r4
- blt L(small_args) /* |x| < 2^(-28) ? */
-
- /* Main path: here if 2^(-28) <= |x| < 125*log(2) */
- frsp fp6,fp2
- xscvdpsp v2,v2
- mfvsrd r8,v2
- mr r3,r8 /* r3 = m */
- rldicl r8,r8,32,58 /* r8 = j */
- lfs fp4,(.SP_RS-.Lanchor)(DATA_OFFSET)
- fsubs fp2,fp6,fp4 /* fp2 = m = x * K/log(2) */
- srdi r3,r3,32
- clrrwi r3,r3,6 /* r3 = n */
- lfd fp6,(.NLN2K-.Lanchor)(DATA_OFFSET)
- fmadd fp0,fp2,fp6,fp1 /* fp0 = y = x - m*log(2)/K */
- fmul fp2,fp0,fp0 /* fp2 = z = y^2 */
- lfd fp4,(.P1-.Lanchor)(DATA_OFFSET)
- lfd fp6,(.P0-.Lanchor)(DATA_OFFSET)
- lis r4,SP_EXP_BIAS@ha
- ori r4,r4,SP_EXP_BIAS@l
- add r3,r3,r4
- rldic r3,r3,49,1 /* r3 = 2^n */
- fmadd fp4,fp5,fp2,fp4 /* fp4 = P3 * z + P1 */
- fmadd fp6,fp3,fp2,fp6 /* fp6 = P2 * z + P0 */
- mtvsrd v1,r3
- xscvspdp v1,v1
- fmul fp4,fp4,fp2 /* fp4 = (P3 * z + P1)*z */
- fmadd fp0,fp0,fp6,fp4 /* fp0 = P(y) */
- sldi r8,r8,3 /* Access doublewords from T[j]. */
- addi r6,DATA_OFFSET,(.Ttable-.Lanchor)
- lfdx fp3,r6,r8
- fmadd fp0,fp0,fp3,fp3 /* fp0 = T[j] * (1 + P(y)) */
- fmul fp1,fp1,fp0 /* fp1 = 2^n * T[j] * (1 + P(y)) */
- frsp fp1,fp1
- blr
-
- .align 4
-/* x is either underflow, overflow, infinite or NaN. */
-L(special_paths):
- srdi r8,r8,32
- rlwinm r8,r8,3,29,29 /* r8 = 0, if x positive.
- r8 = 4, otherwise. */
- addi r6,DATA_OFFSET,(.SPRANGE-.Lanchor)
- lwzx r4,r6,r8 /* r4 = .SPRANGE[signbit(x)] */
- cmpw r3,r4
- /* |x| <= .SPRANGE[signbit(x)] */
- ble L(near_under_or_overflow)
-
- lis r4,SP_INF@ha
- ori r4,r4,SP_INF@l
- cmpw r3,r4
- bge L(arg_inf_or_nan) /* |x| > Infinite ? */
-
- addi r6,DATA_OFFSET,(.SPLARGE_SMALL-.Lanchor)
- lfsx fp1,r6,r8
- fmuls fp1,fp1,fp1
- blr
-
-
- .align 4
-L(small_args):
- /* expf(x) = 1.0, where |x| < |2^(-28)| */
- lfs fp2,(.SPone-.Lanchor)(DATA_OFFSET)
- fadds fp1,fp1,fp2
- blr
-
-
- .align 4
-L(arg_inf_or_nan:)
- bne L(arg_nan)
-
- /* expf(+INF) = +INF
- expf(-INF) = 0 */
- addi r6,DATA_OFFSET,(.INF_ZERO-.Lanchor)
- lfsx fp1,r6,r8
- blr
-
-
- .align 4
-L(arg_nan):
- /* expf(NaN) = NaN */
- fadd fp1,fp1,fp1
- frsp fp1,fp1
- blr
-
- .align 4
-L(near_under_or_overflow):
- frsp fp6,fp2
- xscvdpsp v2,v2
- mfvsrd r8,v2
- mr r3,r8 /* r3 = m */
- rldicl r8,r8,32,58 /* r8 = j */
- lfs fp4,(.SP_RS-.Lanchor)(DATA_OFFSET)
- fsubs fp2,fp6,fp4 /* fp2 = m = x * K/log(2) */
- srdi r3,r3,32
- clrrwi r3,r3,6 /* r3 = n */
- lfd fp6,(.NLN2K-.Lanchor)(DATA_OFFSET)
- fmadd fp0,fp2,fp6,fp1 /* fp0 = y = x - m*log(2)/K */
- fmul fp2,fp0,fp0 /* fp2 = z = y^2 */
- lfd fp4,(.P1-.Lanchor)(DATA_OFFSET)
- lfd fp6,(.P0-.Lanchor)(DATA_OFFSET)
- ld r4,(.DP_EXP_BIAS-.Lanchor)(DATA_OFFSET)
- add r3,r3,r4
- rldic r3,r3,46,1 /* r3 = 2 */
- fmadd fp4,fp5,fp2,fp4 /* fp4 = P3 * z + P1 */
- fmadd fp6,fp3,fp2,fp6 /* fp6 = P2 * z + P0 */
- mtvsrd v1,r3
- fmul fp4,fp4,fp2 /* fp4 = (P3*z + P1)*z */
- fmadd fp0,fp0,fp6,fp4 /* fp0 = P(y) */
- sldi r8,r8,3 /* Access doublewords from T[j]. */
- addi r6,DATA_OFFSET,(.Ttable-.Lanchor)
- lfdx fp3,r6,r8
- fmadd fp0,fp0,fp3,fp3 /* fp0 = T[j] * (1 + T[j]) */
- fmul fp1,fp1,fp0 /* fp1 = 2^n * T[j] * (1 + T[j]) */
- frsp fp1,fp1
- blr
-END(__ieee754_expf)
-
- .section .rodata, "a",@progbits
-.Lanchor:
- .balign 8
-/* Table T[j] = 2^(j/K). Double precision. */
-.Ttable:
- .8byte 0x3ff0000000000000
- .8byte 0x3ff02c9a3e778061
- .8byte 0x3ff059b0d3158574
- .8byte 0x3ff0874518759bc8
- .8byte 0x3ff0b5586cf9890f
- .8byte 0x3ff0e3ec32d3d1a2
- .8byte 0x3ff11301d0125b51
- .8byte 0x3ff1429aaea92de0
- .8byte 0x3ff172b83c7d517b
- .8byte 0x3ff1a35beb6fcb75
- .8byte 0x3ff1d4873168b9aa
- .8byte 0x3ff2063b88628cd6
- .8byte 0x3ff2387a6e756238
- .8byte 0x3ff26b4565e27cdd
- .8byte 0x3ff29e9df51fdee1
- .8byte 0x3ff2d285a6e4030b
- .8byte 0x3ff306fe0a31b715
- .8byte 0x3ff33c08b26416ff
- .8byte 0x3ff371a7373aa9cb
- .8byte 0x3ff3a7db34e59ff7
- .8byte 0x3ff3dea64c123422
- .8byte 0x3ff4160a21f72e2a
- .8byte 0x3ff44e086061892d
- .8byte 0x3ff486a2b5c13cd0
- .8byte 0x3ff4bfdad5362a27
- .8byte 0x3ff4f9b2769d2ca7
- .8byte 0x3ff5342b569d4f82
- .8byte 0x3ff56f4736b527da
- .8byte 0x3ff5ab07dd485429
- .8byte 0x3ff5e76f15ad2148
- .8byte 0x3ff6247eb03a5585
- .8byte 0x3ff6623882552225
- .8byte 0x3ff6a09e667f3bcd
- .8byte 0x3ff6dfb23c651a2f
- .8byte 0x3ff71f75e8ec5f74
- .8byte 0x3ff75feb564267c9
- .8byte 0x3ff7a11473eb0187
- .8byte 0x3ff7e2f336cf4e62
- .8byte 0x3ff82589994cce13
- .8byte 0x3ff868d99b4492ed
- .8byte 0x3ff8ace5422aa0db
- .8byte 0x3ff8f1ae99157736
- .8byte 0x3ff93737b0cdc5e5
- .8byte 0x3ff97d829fde4e50
- .8byte 0x3ff9c49182a3f090
- .8byte 0x3ffa0c667b5de565
- .8byte 0x3ffa5503b23e255d
- .8byte 0x3ffa9e6b5579fdbf
- .8byte 0x3ffae89f995ad3ad
- .8byte 0x3ffb33a2b84f15fb
- .8byte 0x3ffb7f76f2fb5e47
- .8byte 0x3ffbcc1e904bc1d2
- .8byte 0x3ffc199bdd85529c
- .8byte 0x3ffc67f12e57d14b
- .8byte 0x3ffcb720dcef9069
- .8byte 0x3ffd072d4a07897c
- .8byte 0x3ffd5818dcfba487
- .8byte 0x3ffda9e603db3285
- .8byte 0x3ffdfc97337b9b5f
- .8byte 0x3ffe502ee78b3ff6
- .8byte 0x3ffea4afa2a490da
- .8byte 0x3ffefa1bee615a27
- .8byte 0x3fff50765b6e4540
- .8byte 0x3fffa7c1819e90d8
-
-.KLN2:
- .8byte 0x40571547652b82fe /* Double precision K/log(2). */
-
-/* Double precision polynomial coefficients. */
-.P0:
- .8byte 0x3fefffffffffe7c6
-.P1:
- .8byte 0x3fe00000008d6118
-.P2:
- .8byte 0x3fc55550da752d4f
-.P3:
- .8byte 0x3fa56420eb78fa85
-
-.RS:
- .8byte 0x4168000000000000 /* Double precision 2^23 + 2^22. */
-.NLN2K:
- .8byte 0xbf862e42fefa39ef /* Double precision -log(2)/K. */
-.DP_EXP_BIAS:
- .8byte 0x000000000000ffc0 /* Double precision exponent bias. */
-
- .balign 4
-.SPone:
- .4byte 0x3f800000 /* Single precision 1.0. */
-.SP_RS:
- .4byte 0x4b400000 /* Single precision 2^23 + 2^22. */
-
-.SPRANGE: /* Single precision overflow/underflow bounds. */
- .4byte 0x42b17217 /* if x>this bound, then result overflows. */
- .4byte 0x42cff1b4 /* if x<this bound, then result underflows. */
-
-.SPLARGE_SMALL:
- .4byte 0x71800000 /* 2^100. */
- .4byte 0x0d800000 /* 2^-100. */
-
-.INF_ZERO:
- .4byte 0x7f800000 /* Single precision Inf. */
- .4byte 0 /* Single precision zero. */
-
-strong_alias (__ieee754_expf, __expf_finite)
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power8/fpu/multiarch/Implies
deleted file mode 100644
index 7fd86fdf87..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power7/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_cosf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_cosf.S
deleted file mode 100644
index 8dfa0076e0..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_cosf.S
+++ /dev/null
@@ -1,508 +0,0 @@
-/* Optimized cosf(). PowerPC64/POWER8 version.
- Copyright (C) 2017 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 <sysdep.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-#define FRAMESIZE (FRAME_MIN_SIZE+16)
-
-#define FLOAT_EXPONENT_SHIFT 23
-#define FLOAT_EXPONENT_BIAS 127
-#define INTEGER_BITS 3
-
-#define PI_4 0x3f490fdb /* PI/4 */
-#define NINEPI_4 0x40e231d6 /* 9 * PI/4 */
-#define TWO_PN5 0x3d000000 /* 2^-5 */
-#define TWO_PN27 0x32000000 /* 2^-27 */
-#define INFINITY 0x7f800000
-#define TWO_P23 0x4b000000 /* 2^23 */
-#define FX_FRACTION_1_28 0x9249250 /* 0x100000000 / 28 + 1 */
-
- /* Implements the function
-
- float [fp1] cosf (float [fp1] x) */
-
- .machine power8
-EALIGN(__cosf, 4, 0)
- addis r9,r2,L(anchor)@toc@ha
- addi r9,r9,L(anchor)@toc@l
-
- lis r4,PI_4@h
- ori r4,r4,PI_4@l
-
- xscvdpspn v0,v1
- mfvsrd r8,v0
- rldicl r3,r8,32,33 /* Remove sign bit. */
-
- cmpw r3,r4
- bge L(greater_or_equal_pio4)
-
- lis r4,TWO_PN5@h
- ori r4,r4,TWO_PN5@l
-
- cmpw r3,r4
- blt L(less_2pn5)
-
- /* Chebyshev polynomial of the form:
- * 1.0+x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))). */
-
- lfd fp9,(L(C0)-L(anchor))(r9)
- lfd fp10,(L(C1)-L(anchor))(r9)
- lfd fp11,(L(C2)-L(anchor))(r9)
- lfd fp12,(L(C3)-L(anchor))(r9)
- lfd fp13,(L(C4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- lfd fp3,(L(DPone)-L(anchor))(r9)
-
- fmadd fp4,fp2,fp13,fp12 /* C3+x^2*C4 */
- fmadd fp4,fp2,fp4,fp11 /* C2+x^2*(C3+x^2*C4) */
- fmadd fp4,fp2,fp4,fp10 /* C1+x^2*(C2+x^2*(C3+x^2*C4)) */
- fmadd fp4,fp2,fp4,fp9 /* C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4))) */
- fmadd fp1,fp2,fp4,fp3 /* 1.0+x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))) */
- frsp fp1,fp1 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(greater_or_equal_pio4):
- lis r4,NINEPI_4@h
- ori r4,r4,NINEPI_4@l
- cmpw r3,r4
- bge L(greater_or_equal_9pio4)
-
- /* Calculate quotient of |x|/(PI/4). */
- lfd fp2,(L(invpio4)-L(anchor))(r9)
- fabs fp1,fp1 /* |x| */
- fmul fp2,fp1,fp2 /* |x|/(PI/4) */
- fctiduz fp2,fp2
- mfvsrd r3,v2 /* n = |x| mod PI/4 */
-
- /* Now use that quotient to find |x| mod (PI/2). */
- addi r7,r3,1
- rldicr r5,r7,2,60 /* ((n+1) >> 1) << 3 */
- addi r6,r9,(L(pio2_table)-L(anchor))
- lfdx fp4,r5,r6
- fsub fp1,fp1,fp4
-
- .balign 16
-L(reduced):
- /* Now we are in the range -PI/4 to PI/4. */
-
- /* Work out if we are in a positive or negative primary interval. */
- addi r7,r7,2
- rldicl r4,r7,62,63 /* ((n+3) >> 2) & 1 */
-
- /* Load a 1.0 or -1.0. */
- addi r5,r9,(L(ones)-L(anchor))
- sldi r4,r4,3
- lfdx fp0,r4,r5
-
- /* Are we in the primary interval of sin or cos? */
- andi. r4,r7,0x2
- bne L(cos)
-
- /* Chebyshev polynomial of the form:
- x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))). */
-
- lfd fp9,(L(S0)-L(anchor))(r9)
- lfd fp10,(L(S1)-L(anchor))(r9)
- lfd fp11,(L(S2)-L(anchor))(r9)
- lfd fp12,(L(S3)-L(anchor))(r9)
- lfd fp13,(L(S4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- fmul fp3,fp2,fp1 /* x^3 */
-
- fmadd fp4,fp2,fp13,fp12 /* S3+x^2*S4 */
- fmadd fp4,fp2,fp4,fp11 /* S2+x^2*(S3+x^2*S4) */
- fmadd fp4,fp2,fp4,fp10 /* S1+x^2*(S2+x^2*(S3+x^2*S4)) */
- fmadd fp4,fp2,fp4,fp9 /* S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4))) */
- fmadd fp4,fp3,fp4,fp1 /* x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))) */
- fmul fp4,fp4,fp0 /* Add in the sign. */
- frsp fp1,fp4 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(cos):
- /* Chebyshev polynomial of the form:
- 1.0+x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))). */
-
- lfd fp9,(L(C0)-L(anchor))(r9)
- lfd fp10,(L(C1)-L(anchor))(r9)
- lfd fp11,(L(C2)-L(anchor))(r9)
- lfd fp12,(L(C3)-L(anchor))(r9)
- lfd fp13,(L(C4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- lfd fp3,(L(DPone)-L(anchor))(r9)
-
- fmadd fp4,fp2,fp13,fp12 /* C3+x^2*C4 */
- fmadd fp4,fp2,fp4,fp11 /* C2+x^2*(C3+x^2*C4) */
- fmadd fp4,fp2,fp4,fp10 /* C1+x^2*(C2+x^2*(C3+x^2*C4)) */
- fmadd fp4,fp2,fp4,fp9 /* C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4))) */
- fmadd fp4,fp2,fp4,fp3 /* 1.0 + x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))) */
- fmul fp4,fp4,fp0 /* Add in the sign. */
- frsp fp1,fp4 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(greater_or_equal_9pio4):
- lis r4,INFINITY@h
- ori r4,r4,INFINITY@l
- cmpw r3,r4
- bge L(inf_or_nan)
-
- lis r4,TWO_P23@h
- ori r4,r4,TWO_P23@l
- cmpw r3,r4
- bge L(greater_or_equal_2p23)
-
- fabs fp1,fp1 /* |x| */
-
- /* Calculate quotient of |x|/(PI/4). */
- lfd fp2,(L(invpio4)-L(anchor))(r9)
-
- lfd fp3,(L(DPone)-L(anchor))(r9)
- lfd fp4,(L(DPhalf)-L(anchor))(r9)
- fmul fp2,fp1,fp2 /* |x|/(PI/4) */
- friz fp2,fp2 /* n = floor(|x|/(PI/4)) */
-
- /* Calculate (n + 1) / 2. */
- fadd fp2,fp2,fp3 /* n + 1 */
- fmul fp3,fp2,fp4 /* (n + 1) / 2 */
- friz fp3,fp3
-
- lfd fp4,(L(pio2hi)-L(anchor))(r9)
- lfd fp5,(L(pio2lo)-L(anchor))(r9)
-
- fmul fp6,fp4,fp3
- fadd fp6,fp6,fp1
- fmadd fp1,fp5,fp3,fp6
-
- fctiduz fp2,fp2
- mfvsrd r7,v2 /* n + 1 */
-
- b L(reduced)
-
- .balign 16
-L(inf_or_nan):
- bne L(skip_errno_setting) /* Is a NAN? */
-
- /* We delayed the creation of the stack frame, as well as the saving of
- the link register, because only at this point, we are sure that
- doing so is actually needed. */
-
- stfd fp1,-8(r1)
-
- /* Save the link register. */
- mflr r0
- std r0,16(r1)
- cfi_offset(lr, 16)
-
- /* Create the stack frame. */
- stdu r1,-FRAMESIZE(r1)
- cfi_adjust_cfa_offset(FRAMESIZE)
-
- bl JUMPTARGET(__errno_location)
- nop
-
- /* Restore the stack frame. */
- addi r1,r1,FRAMESIZE
- cfi_adjust_cfa_offset(-FRAMESIZE)
- /* Restore the link register. */
- ld r0,16(r1)
- mtlr r0
-
- lfd fp1,-8(r1)
-
- /* errno = EDOM */
- li r4,EDOM
- stw r4,0(r3)
-
-L(skip_errno_setting):
- fsub fp1,fp1,fp1 /* x - x */
- blr
-
- .balign 16
-L(greater_or_equal_2p23):
- fabs fp1,fp1
-
- srwi r4,r3,FLOAT_EXPONENT_SHIFT
- subi r4,r4,FLOAT_EXPONENT_BIAS
-
- /* We reduce the input modulo pi/4, so we need 3 bits of integer
- to determine where in 2*pi we are. Index into our array
- accordingly. */
- addi r4,r4,INTEGER_BITS
-
- /* To avoid an expensive divide, for the range we care about (0 - 127)
- we can transform x/28 into:
-
- x/28 = (x * ((0x100000000 / 28) + 1)) >> 32
-
- mulhwu returns the top 32 bits of the 64 bit result, doing the
- shift for us in the same instruction. The top 32 bits are undefined,
- so we have to mask them. */
-
- lis r6,FX_FRACTION_1_28@h
- ori r6,r6,FX_FRACTION_1_28@l
- mulhwu r5,r4,r6
- clrldi r5,r5,32
-
- /* Get our pointer into the invpio4_table array. */
- sldi r4,r5,3
- addi r6,r9,(L(invpio4_table)-L(anchor))
- add r4,r4,r6
-
- lfd fp2,0(r4)
- lfd fp3,8(r4)
- lfd fp4,16(r4)
- lfd fp5,24(r4)
-
- fmul fp6,fp2,fp1
- fmul fp7,fp3,fp1
- fmul fp8,fp4,fp1
- fmul fp9,fp5,fp1
-
- /* Mask off larger integer bits in highest double word that we don't
- care about to avoid losing precision when combining with smaller
- values. */
- fctiduz fp10,fp6
- mfvsrd r7,v10
- rldicr r7,r7,0,(63-INTEGER_BITS)
- mtvsrd v10,r7
- fcfidu fp10,fp10 /* Integer bits. */
-
- fsub fp6,fp6,fp10 /* highest -= integer bits */
-
- /* Work out the integer component, rounded down. Use the top two
- limbs for this. */
- fadd fp10,fp6,fp7 /* highest + higher */
-
- fctiduz fp10,fp10
- mfvsrd r7,v10
- andi. r0,r7,1
- fcfidu fp10,fp10
-
- /* Subtract integer component from highest limb. */
- fsub fp12,fp6,fp10
-
- beq L(even_integer)
-
- /* Our integer component is odd, so we are in the -PI/4 to 0 primary
- region. We need to shift our result down by PI/4, and to do this
- in the mod (4/PI) space we simply subtract 1. */
- lfd fp11,(L(DPone)-L(anchor))(r9)
- fsub fp12,fp12,fp11
-
- /* Now add up all the limbs in order. */
- fadd fp12,fp12,fp7
- fadd fp12,fp12,fp8
- fadd fp12,fp12,fp9
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
-L(even_integer):
- lfd fp11,(L(DPone)-L(anchor))(r9)
-
- /* Now add up all the limbs in order. */
- fadd fp12,fp12,fp7
- fadd fp12,r12,fp8
- fadd fp12,r12,fp9
-
- /* We need to check if the addition of all the limbs resulted in us
- overflowing 1.0. */
- fcmpu 0,fp12,fp11
- bgt L(greater_than_one)
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
-L(greater_than_one):
- /* We did overflow 1.0 when adding up all the limbs. Add 1.0 to our
- integer, and subtract 1.0 from our result. Since that makes the
- integer component odd, we need to subtract another 1.0 as
- explained above. */
- addi r7,r7,1
-
- lfd fp11,(L(DPtwo)-L(anchor))(r9)
- fsub fp12,fp12,fp11
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
- .balign 16
-L(less_2pn5):
- lis r4,TWO_PN27@h
- ori r4,r4,TWO_PN27@l
-
- cmpw r3,r4
- blt L(less_2pn27)
-
- /* A simpler Chebyshev approximation is close enough for this range:
- 1.0+x^2*(CC0+x^3*CC1). */
-
- lfd fp10,(L(CC0)-L(anchor))(r9)
- lfd fp11,(L(CC1)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- fmul fp3,fp2,fp1 /* x^3 */
- lfd fp1,(L(DPone)-L(anchor))(r9)
-
- fmadd fp4,fp3,fp11,fp10 /* CC0+x^3*CC1 */
- fmadd fp1,fp2,fp4,fp1 /* 1.0+x^2*(CC0+x^3*CC1) */
-
- frsp fp1,fp1 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(less_2pn27):
- /* Handle some special cases:
-
- cosf(subnormal) raises inexact
- cosf(min_normalized) raises inexact
- cosf(normalized) raises inexact. */
-
- lfd fp2,(L(DPone)-L(anchor))(r9)
-
- fabs fp1,fp1 /* |x| */
- fsub fp1,fp2,fp1 /* 1.0-|x| */
-
- frsp fp1,fp1
-
- blr
-
-END (__cosf)
-
- .section .rodata, "a"
-
- .balign 8
-
-L(anchor):
-
- /* Chebyshev constants for sin, range -PI/4 - PI/4. */
-L(S0): .8byte 0xbfc5555555551cd9
-L(S1): .8byte 0x3f81111110c2688b
-L(S2): .8byte 0xbf2a019f8b4bd1f9
-L(S3): .8byte 0x3ec71d7264e6b5b4
-L(S4): .8byte 0xbe5a947e1674b58a
-
- /* Chebyshev constants for cos, range 2^-27 - 2^-5. */
-L(CC0): .8byte 0xbfdfffffff5cc6fd
-L(CC1): .8byte 0x3fa55514b178dac5
-
- /* Chebyshev constants for cos, range -PI/4 - PI/4. */
-L(C0): .8byte 0xbfdffffffffe98ae
-L(C1): .8byte 0x3fa55555545c50c7
-L(C2): .8byte 0xbf56c16b348b6874
-L(C3): .8byte 0x3efa00eb9ac43cc0
-L(C4): .8byte 0xbe923c97dd8844d7
-
-L(invpio2):
- .8byte 0x3fe45f306dc9c883 /* 2/PI */
-
-L(invpio4):
- .8byte 0x3ff45f306dc9c883 /* 4/PI */
-
-L(invpio4_table):
- .8byte 0x0000000000000000
- .8byte 0x3ff45f306c000000
- .8byte 0x3e3c9c882a000000
- .8byte 0x3c54fe13a8000000
- .8byte 0x3aaf47d4d0000000
- .8byte 0x38fbb81b6c000000
- .8byte 0x3714acc9e0000000
- .8byte 0x3560e4107c000000
- .8byte 0x33bca2c756000000
- .8byte 0x31fbd778ac000000
- .8byte 0x300b7246e0000000
- .8byte 0x2e5d2126e8000000
- .8byte 0x2c97003248000000
- .8byte 0x2ad77504e8000000
- .8byte 0x290921cfe0000000
- .8byte 0x274deb1cb0000000
- .8byte 0x25829a73e0000000
- .8byte 0x23fd1046be000000
- .8byte 0x2224baed10000000
- .8byte 0x20709d338e000000
- .8byte 0x1e535a2f80000000
- .8byte 0x1cef904e64000000
- .8byte 0x1b0d639830000000
- .8byte 0x1964ce7d24000000
- .8byte 0x17b908bf16000000
-
-L(pio4):
- .8byte 0x3fe921fb54442d18 /* PI/4 */
-
-/* PI/2 as a sum of two doubles. We only use 32 bits of the upper limb
- to avoid losing significant bits when multiplying with up to
- (2^22)/(pi/2). */
-L(pio2hi):
- .8byte 0xbff921fb54400000
-
-L(pio2lo):
- .8byte 0xbdd0b4611a626332
-
-L(pio2_table):
- .8byte 0
- .8byte 0x3ff921fb54442d18 /* 1 * PI/2 */
- .8byte 0x400921fb54442d18 /* 2 * PI/2 */
- .8byte 0x4012d97c7f3321d2 /* 3 * PI/2 */
- .8byte 0x401921fb54442d18 /* 4 * PI/2 */
- .8byte 0x401f6a7a2955385e /* 5 * PI/2 */
- .8byte 0x4022d97c7f3321d2 /* 6 * PI/2 */
- .8byte 0x4025fdbbe9bba775 /* 7 * PI/2 */
- .8byte 0x402921fb54442d18 /* 8 * PI/2 */
- .8byte 0x402c463abeccb2bb /* 9 * PI/2 */
- .8byte 0x402f6a7a2955385e /* 10 * PI/2 */
-
-L(small):
- .8byte 0x3cd0000000000000 /* 2^-50 */
-
-L(ones):
- .8byte 0x3ff0000000000000 /* +1.0 */
- .8byte 0xbff0000000000000 /* -1.0 */
-
-L(DPhalf):
- .8byte 0x3fe0000000000000 /* 0.5 */
-
-L(DPone):
- .8byte 0x3ff0000000000000 /* 1.0 */
-
-L(DPtwo):
- .8byte 0x4000000000000000 /* 2.0 */
-
-weak_alias(__cosf, cosf)
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S
deleted file mode 100644
index fcdcb60293..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* isfinite(). PowerPC64/POWER8 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
-
-/* int [r3] __finite ([fp1] x) */
-
-EALIGN (__finite, 4, 0)
- CALL_MCOUNT 0
- MFVSRD_R3_V1
- lis r9,0x8010
- clrldi r3,r3,1 /* r3 = r3 & 0x8000000000000000 */
- rldicr r9,r9,32,31 /* r9 = (r9 << 32) & 0xffffffff */
- add r3,r3,r9
- rldicl r3,r3,1,63
- blr
-END (__finite)
-
-hidden_def (__finite)
-weak_alias (__finite, finite)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__finite, __finitef)
-hidden_def (__finitef)
-weak_alias (__finitef, finitef)
-
-#if IS_IN (libm)
-# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, __finite, __finitel, GLIBC_2_0)
-compat_symbol (libm, finite, finitel, GLIBC_2_0)
-# endif
-#else
-# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
-compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
-compat_symbol (libc, finite, finitel, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S
deleted file mode 100644
index 54bd94176d..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_finite.S. */
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S
deleted file mode 100644
index 32814e4525..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S
+++ /dev/null
@@ -1,61 +0,0 @@
-/* isinf(). PowerPC64/POWER8 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
-
-/* int [r3] __isinf([fp1] x) */
-
-EALIGN (__isinf, 4, 0)
- CALL_MCOUNT 0
- MFVSRD_R3_V1
- lis r9,0x7ff0 /* r9 = 0x7ff0 */
- rldicl r10,r3,0,1 /* r10 = r3 & (0x8000000000000000) */
- sldi r9,r9,32 /* r9 = r9 << 52 */
- cmpd cr7,r10,r9 /* fp1 & 0x7ff0000000000000 ? */
- beq cr7,L(inf)
- li r3,0 /* Not inf */
- blr
-L(inf):
- sradi r3,r3,63 /* r3 = r3 >> 63 */
- ori r3,r3,1 /* r3 = r3 | 0x1 */
- blr
-END (__isinf)
-
-hidden_def (__isinf)
-weak_alias (__isinf, isinf)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isinf, __isinff)
-hidden_def (__isinff)
-weak_alias (__isinff, isinff)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isinf, __isinfl)
-weak_alias (__isinf, isinfl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
-compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S
deleted file mode 100644
index be759e091e..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_isinf.S. */
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S
deleted file mode 100644
index af52e502b7..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* isnan(). PowerPC64/POWER8 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
-
-/* int [r3] __isnan([f1] x) */
-
-EALIGN (__isnan, 4, 0)
- CALL_MCOUNT 0
- MFVSRD_R3_V1
- lis r9,0x7ff0
- clrldi r3,r3,1 /* r3 = r3 & 0x8000000000000000 */
- rldicr r9,r9,32,31 /* r9 = (r9 << 32) & 0xffffffff */
- subf r3,r3,r9
- rldicl r3,r3,1,63
- blr
-END (__isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-/* It turns out that the 'double' version will also always work for
- single-precision. */
-strong_alias (__isnan, __isnanf)
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__isnan, __isnanl)
-weak_alias (__isnan, isnanl)
-#endif
-
-#if !IS_IN (libm)
-# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
-# endif
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S
deleted file mode 100644
index b48c85e0d3..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* This function uses the same code as s_isnan.S. */
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S
deleted file mode 100644
index aa180b6901..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Round double to long int. POWER8 PowerPC64 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
-
-/* long long int[r3] __llrint (double x[fp1]) */
-ENTRY (__llrint)
- CALL_MCOUNT 0
- fctid fp1,fp1
- MFVSRD_R3_V1
- blr
-END (__llrint)
-
-strong_alias (__llrint, __lrint)
-weak_alias (__llrint, llrint)
-weak_alias (__lrint, lrint)
-
-#ifdef NO_LONG_DOUBLE
-strong_alias (__llrint, __llrintl)
-weak_alias (__llrint, llrintl)
-strong_alias (__lrint, __lrintl)
-weak_alias (__lrint, lrintl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llrint, llrintl, GLIBC_2_1)
-compat_symbol (libm, __lrint, lrintl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S
deleted file mode 100644
index 043fc6a089..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S
+++ /dev/null
@@ -1,48 +0,0 @@
-/* llround function. POWER8 PowerPC64 version.
- Copyright (C) 2014-2017 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 <sysdep.h>
-#include <endian.h>
-#include <math_ldbl_opt.h>
-
-#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
-
-/* long long [r3] llround (float x [fp1]) */
-
-ENTRY (__llround)
- CALL_MCOUNT 0
- frin fp1,fp1 /* Round to nearest +-0.5. */
- fctidz fp1,fp1 /* Convert To Integer DW round toward 0. */
- MFVSRD_R3_V1
- blr
-END (__llround)
-
-strong_alias (__llround, __lround)
-weak_alias (__llround, llround)
-weak_alias (__lround, lround)
-
-#ifdef NO_LONG_DOUBLE
-weak_alias (__llround, llroundl)
-strong_alias (__llround, __llroundl)
-weak_alias (__lround, lroundl)
-strong_alias (__lround, __lroundl)
-#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llround, llroundl, GLIBC_2_1)
-compat_symbol (libm, __lround, lroundl, GLIBC_2_1)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_sinf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_sinf.S
deleted file mode 100644
index fb0add3462..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_sinf.S
+++ /dev/null
@@ -1,519 +0,0 @@
-/* Optimized sinf(). PowerPC64/POWER8 version.
- Copyright (C) 2016-2017 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 <sysdep.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-#define FRAMESIZE (FRAME_MIN_SIZE+16)
-
-#define FLOAT_EXPONENT_SHIFT 23
-#define FLOAT_EXPONENT_BIAS 127
-#define INTEGER_BITS 3
-
-#define PI_4 0x3f490fdb /* PI/4 */
-#define NINEPI_4 0x40e231d6 /* 9 * PI/4 */
-#define TWO_PN5 0x3d000000 /* 2^-5 */
-#define TWO_PN27 0x32000000 /* 2^-27 */
-#define INFINITY 0x7f800000
-#define TWO_P23 0x4b000000 /* 2^27 */
-#define FX_FRACTION_1_28 0x9249250 /* 0x100000000 / 28 + 1 */
-
- /* Implements the function
-
- float [fp1] sinf (float [fp1] x) */
-
- .machine power8
-EALIGN(__sinf, 4, 0)
- addis r9,r2,L(anchor)@toc@ha
- addi r9,r9,L(anchor)@toc@l
-
- lis r4,PI_4@h
- ori r4,r4,PI_4@l
-
- xscvdpspn v0,v1
- mfvsrd r8,v0
- rldicl r3,r8,32,33 /* Remove sign bit. */
-
- cmpw r3,r4
- bge L(greater_or_equal_pio4)
-
- lis r4,TWO_PN5@h
- ori r4,r4,TWO_PN5@l
-
- cmpw r3,r4
- blt L(less_2pn5)
-
- /* Chebyshev polynomial of the form:
- * x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))). */
-
- lfd fp9,(L(S0)-L(anchor))(r9)
- lfd fp10,(L(S1)-L(anchor))(r9)
- lfd fp11,(L(S2)-L(anchor))(r9)
- lfd fp12,(L(S3)-L(anchor))(r9)
- lfd fp13,(L(S4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- fmul fp3,fp2,fp1 /* x^3 */
-
- fmadd fp4,fp2,fp13,fp12 /* S3+x^2*S4 */
- fmadd fp4,fp2,fp4,fp11 /* S2+x^2*(S3+x^2*S4) */
- fmadd fp4,fp2,fp4,fp10 /* S1+x^2*(S2+x^2*(S3+x^2*S4)) */
- fmadd fp4,fp2,fp4,fp9 /* S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4))) */
- fmadd fp1,fp3,fp4,fp1 /* x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))) */
- frsp fp1,fp1 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(greater_or_equal_pio4):
- lis r4,NINEPI_4@h
- ori r4,r4,NINEPI_4@l
- cmpw r3,r4
- bge L(greater_or_equal_9pio4)
-
- /* Calculate quotient of |x|/(PI/4). */
- lfd fp2,(L(invpio4)-L(anchor))(r9)
- fabs fp1,fp1 /* |x| */
- fmul fp2,fp1,fp2 /* |x|/(PI/4) */
- fctiduz fp2,fp2
- mfvsrd r3,v2 /* n = |x| mod PI/4 */
-
- /* Now use that quotient to find |x| mod (PI/2). */
- addi r7,r3,1
- rldicr r5,r7,2,60 /* ((n+1) >> 1) << 3 */
- addi r6,r9,(L(pio2_table)-L(anchor))
- lfdx fp4,r5,r6
- fsub fp1,fp1,fp4
-
- .balign 16
-L(reduced):
- /* Now we are in the range -PI/4 to PI/4. */
-
- /* Work out if we are in a positive or negative primary interval. */
- rldicl r4,r7,62,63 /* ((n+1) >> 2) & 1 */
-
- /* We are operating on |x|, so we need to add back the original
- sign. */
- rldicl r8,r8,33,63 /* (x >> 31) & 1, ie the sign bit. */
- xor r4,r4,r8 /* 0 if result should be positive,
- 1 if negative. */
-
- /* Load a 1.0 or -1.0. */
- addi r5,r9,(L(ones)-L(anchor))
- sldi r4,r4,3
- lfdx fp0,r4,r5
-
- /* Are we in the primary interval of sin or cos? */
- andi. r4,r7,0x2
- bne L(cos)
-
- /* Chebyshev polynomial of the form:
- x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))). */
-
- lfd fp9,(L(S0)-L(anchor))(r9)
- lfd fp10,(L(S1)-L(anchor))(r9)
- lfd fp11,(L(S2)-L(anchor))(r9)
- lfd fp12,(L(S3)-L(anchor))(r9)
- lfd fp13,(L(S4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- fmul fp3,fp2,fp1 /* x^3 */
-
- fmadd fp4,fp2,fp13,fp12 /* S3+x^2*S4 */
- fmadd fp4,fp2,fp4,fp11 /* S2+x^2*(S3+x^2*S4) */
- fmadd fp4,fp2,fp4,fp10 /* S1+x^2*(S2+x^2*(S3+x^2*S4)) */
- fmadd fp4,fp2,fp4,fp9 /* S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4))) */
- fmadd fp4,fp3,fp4,fp1 /* x+x^3*(S0+x^2*(S1+x^2*(S2+x^2*(S3+x^2*S4)))) */
- fmul fp4,fp4,fp0 /* Add in the sign. */
- frsp fp1,fp4 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(cos):
- /* Chebyshev polynomial of the form:
- 1.0+x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))). */
-
- lfd fp9,(L(C0)-L(anchor))(r9)
- lfd fp10,(L(C1)-L(anchor))(r9)
- lfd fp11,(L(C2)-L(anchor))(r9)
- lfd fp12,(L(C3)-L(anchor))(r9)
- lfd fp13,(L(C4)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- lfd fp3,(L(DPone)-L(anchor))(r9)
-
- fmadd fp4,fp2,fp13,fp12 /* C3+x^2*C4 */
- fmadd fp4,fp2,fp4,fp11 /* C2+x^2*(C3+x^2*C4) */
- fmadd fp4,fp2,fp4,fp10 /* C1+x^2*(C2+x^2*(C3+x^2*C4)) */
- fmadd fp4,fp2,fp4,fp9 /* C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4))) */
- fmadd fp4,fp2,fp4,fp3 /* 1.0 + x^2*(C0+x^2*(C1+x^2*(C2+x^2*(C3+x^2*C4)))) */
- fmul fp4,fp4,fp0 /* Add in the sign. */
- frsp fp1,fp4 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(greater_or_equal_9pio4):
- lis r4,INFINITY@h
- ori r4,r4,INFINITY@l
- cmpw r3,r4
- bge L(inf_or_nan)
-
- lis r4,TWO_P23@h
- ori r4,r4,TWO_P23@l
- cmpw r3,r4
- bge L(greater_or_equal_2p23)
-
- fabs fp1,fp1 /* |x| */
-
- /* Calculate quotient of |x|/(PI/4). */
- lfd fp2,(L(invpio4)-L(anchor))(r9)
-
- lfd fp3,(L(DPone)-L(anchor))(r9)
- lfd fp4,(L(DPhalf)-L(anchor))(r9)
- fmul fp2,fp1,fp2 /* |x|/(PI/4) */
- friz fp2,fp2 /* n = floor(|x|/(PI/4)) */
-
- /* Calculate (n + 1) / 2. */
- fadd fp2,fp2,fp3 /* n + 1 */
- fmul fp3,fp2,fp4 /* (n + 1) / 2 */
- friz fp3,fp3
-
- lfd fp4,(L(pio2hi)-L(anchor))(r9)
- lfd fp5,(L(pio2lo)-L(anchor))(r9)
-
- fmul fp6,fp4,fp3
- fadd fp6,fp6,fp1
- fmadd fp1,fp5,fp3,fp6
-
- fctiduz fp2,fp2
- mfvsrd r7,v2 /* n + 1 */
-
- b L(reduced)
-
- .balign 16
-L(inf_or_nan):
- bne L(skip_errno_setting) /* Is a NAN? */
-
- /* We delayed the creation of the stack frame, as well as the saving of
- the link register, because only at this point, we are sure that
- doing so is actually needed. */
-
- stfd fp1,-8(r1)
-
- /* Save the link register. */
- mflr r0
- std r0,16(r1)
- cfi_offset(lr, 16)
-
- /* Create the stack frame. */
- stdu r1,-FRAMESIZE(r1)
- cfi_adjust_cfa_offset(FRAMESIZE)
-
- bl JUMPTARGET(__errno_location)
- nop
-
- /* Restore the stack frame. */
- addi r1,r1,FRAMESIZE
- cfi_adjust_cfa_offset(-FRAMESIZE)
- /* Restore the link register. */
- ld r0,16(r1)
- mtlr r0
-
- lfd fp1,-8(r1)
-
- /* errno = EDOM */
- li r4,EDOM
- stw r4,0(r3)
-
-L(skip_errno_setting):
- fsub fp1,fp1,fp1 /* x - x */
- blr
-
- .balign 16
-L(greater_or_equal_2p23):
- fabs fp1,fp1
-
- srwi r4,r3,FLOAT_EXPONENT_SHIFT
- subi r4,r4,FLOAT_EXPONENT_BIAS
-
- /* We reduce the input modulo pi/4, so we need 3 bits of integer
- to determine where in 2*pi we are. Index into our array
- accordingly. */
- addi r4,r4,INTEGER_BITS
-
- /* To avoid an expensive divide, for the range we care about (0 - 127)
- we can transform x/28 into:
-
- x/28 = (x * ((0x100000000 / 28) + 1)) >> 32
-
- mulhwu returns the top 32 bits of the 64 bit result, doing the
- shift for us in the same instruction. The top 32 bits are undefined,
- so we have to mask them. */
-
- lis r6,FX_FRACTION_1_28@h
- ori r6,r6,FX_FRACTION_1_28@l
- mulhwu r5,r4,r6
- clrldi r5,r5,32
-
- /* Get our pointer into the invpio4_table array. */
- sldi r4,r5,3
- addi r6,r9,(L(invpio4_table)-L(anchor))
- add r4,r4,r6
-
- lfd fp2,0(r4)
- lfd fp3,8(r4)
- lfd fp4,16(r4)
- lfd fp5,24(r4)
-
- fmul fp6,fp2,fp1
- fmul fp7,fp3,fp1
- fmul fp8,fp4,fp1
- fmul fp9,fp5,fp1
-
- /* Mask off larger integer bits in highest double word that we don't
- care about to avoid losing precision when combining with smaller
- values. */
- fctiduz fp10,fp6
- mfvsrd r7,v10
- rldicr r7,r7,0,(63-INTEGER_BITS)
- mtvsrd v10,r7
- fcfidu fp10,fp10 /* Integer bits. */
-
- fsub fp6,fp6,fp10 /* highest -= integer bits */
-
- /* Work out the integer component, rounded down. Use the top two
- limbs for this. */
- fadd fp10,fp6,fp7 /* highest + higher */
-
- fctiduz fp10,fp10
- mfvsrd r7,v10
- andi. r0,r7,1
- fcfidu fp10,fp10
-
- /* Subtract integer component from highest limb. */
- fsub fp12,fp6,fp10
-
- beq L(even_integer)
-
- /* Our integer component is odd, so we are in the -PI/4 to 0 primary
- region. We need to shift our result down by PI/4, and to do this
- in the mod (4/PI) space we simply subtract 1. */
- lfd fp11,(L(DPone)-L(anchor))(r9)
- fsub fp12,fp12,fp11
-
- /* Now add up all the limbs in order. */
- fadd fp12,fp12,fp7
- fadd fp12,fp12,fp8
- fadd fp12,fp12,fp9
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
-L(even_integer):
- lfd fp11,(L(DPone)-L(anchor))(r9)
-
- /* Now add up all the limbs in order. */
- fadd fp12,fp12,fp7
- fadd fp12,r12,fp8
- fadd fp12,r12,fp9
-
- /* We need to check if the addition of all the limbs resulted in us
- overflowing 1.0. */
- fcmpu 0,fp12,fp11
- bgt L(greater_than_one)
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
-L(greater_than_one):
- /* We did overflow 1.0 when adding up all the limbs. Add 1.0 to our
- integer, and subtract 1.0 from our result. Since that makes the
- integer component odd, we need to subtract another 1.0 as
- explained above. */
- addi r7,r7,1
-
- lfd fp11,(L(DPtwo)-L(anchor))(r9)
- fsub fp12,fp12,fp11
-
- /* And finally multiply by pi/4. */
- lfd fp13,(L(pio4)-L(anchor))(r9)
- fmul fp1,fp12,fp13
-
- addi r7,r7,1
- b L(reduced)
-
- .balign 16
-L(less_2pn5):
- lis r4,TWO_PN27@h
- ori r4,r4,TWO_PN27@l
-
- cmpw r3,r4
- blt L(less_2pn27)
-
- /* A simpler Chebyshev approximation is close enough for this range:
- x+x^3*(SS0+x^2*SS1). */
-
- lfd fp10,(L(SS0)-L(anchor))(r9)
- lfd fp11,(L(SS1)-L(anchor))(r9)
-
- fmul fp2,fp1,fp1 /* x^2 */
- fmul fp3,fp2,fp1 /* x^3 */
-
- fmadd fp4,fp2,fp11,fp10 /* SS0+x^2*SS1 */
- fmadd fp1,fp3,fp4,fp1 /* x+x^3*(SS0+x^2*SS1) */
-
- frsp fp1,fp1 /* Round to single precision. */
-
- blr
-
- .balign 16
-L(less_2pn27):
- cmpwi r3,0
- beq L(zero)
-
- /* Handle some special cases:
-
- sinf(subnormal) raises inexact/underflow
- sinf(min_normalized) raises inexact/underflow
- sinf(normalized) raises inexact. */
-
- lfd fp2,(L(small)-L(anchor))(r9)
-
- fmul fp2,fp1,fp2 /* x * small */
- fsub fp1,fp1,fp2 /* x - x * small */
-
- frsp fp1,fp1
-
- blr
-
- .balign 16
-L(zero):
- blr
-
-END (__sinf)
-
- .section .rodata, "a"
-
- .balign 8
-
-L(anchor):
-
- /* Chebyshev constants for sin, range -PI/4 - PI/4. */
-L(S0): .8byte 0xbfc5555555551cd9
-L(S1): .8byte 0x3f81111110c2688b
-L(S2): .8byte 0xbf2a019f8b4bd1f9
-L(S3): .8byte 0x3ec71d7264e6b5b4
-L(S4): .8byte 0xbe5a947e1674b58a
-
- /* Chebyshev constants for sin, range 2^-27 - 2^-5. */
-L(SS0): .8byte 0xbfc555555543d49d
-L(SS1): .8byte 0x3f8110f475cec8c5
-
- /* Chebyshev constants for cos, range -PI/4 - PI/4. */
-L(C0): .8byte 0xbfdffffffffe98ae
-L(C1): .8byte 0x3fa55555545c50c7
-L(C2): .8byte 0xbf56c16b348b6874
-L(C3): .8byte 0x3efa00eb9ac43cc0
-L(C4): .8byte 0xbe923c97dd8844d7
-
-L(invpio2):
- .8byte 0x3fe45f306dc9c883 /* 2/PI */
-
-L(invpio4):
- .8byte 0x3ff45f306dc9c883 /* 4/PI */
-
-L(invpio4_table):
- .8byte 0x0000000000000000
- .8byte 0x3ff45f306c000000
- .8byte 0x3e3c9c882a000000
- .8byte 0x3c54fe13a8000000
- .8byte 0x3aaf47d4d0000000
- .8byte 0x38fbb81b6c000000
- .8byte 0x3714acc9e0000000
- .8byte 0x3560e4107c000000
- .8byte 0x33bca2c756000000
- .8byte 0x31fbd778ac000000
- .8byte 0x300b7246e0000000
- .8byte 0x2e5d2126e8000000
- .8byte 0x2c97003248000000
- .8byte 0x2ad77504e8000000
- .8byte 0x290921cfe0000000
- .8byte 0x274deb1cb0000000
- .8byte 0x25829a73e0000000
- .8byte 0x23fd1046be000000
- .8byte 0x2224baed10000000
- .8byte 0x20709d338e000000
- .8byte 0x1e535a2f80000000
- .8byte 0x1cef904e64000000
- .8byte 0x1b0d639830000000
- .8byte 0x1964ce7d24000000
- .8byte 0x17b908bf16000000
-
-L(pio4):
- .8byte 0x3fe921fb54442d18 /* PI/4 */
-
-/* PI/2 as a sum of two doubles. We only use 32 bits of the upper limb
- to avoid losing significant bits when multiplying with up to
- (2^22)/(pi/2). */
-L(pio2hi):
- .8byte 0xbff921fb54400000
-
-L(pio2lo):
- .8byte 0xbdd0b4611a626332
-
-L(pio2_table):
- .8byte 0
- .8byte 0x3ff921fb54442d18 /* 1 * PI/2 */
- .8byte 0x400921fb54442d18 /* 2 * PI/2 */
- .8byte 0x4012d97c7f3321d2 /* 3 * PI/2 */
- .8byte 0x401921fb54442d18 /* 4 * PI/2 */
- .8byte 0x401f6a7a2955385e /* 5 * PI/2 */
- .8byte 0x4022d97c7f3321d2 /* 6 * PI/2 */
- .8byte 0x4025fdbbe9bba775 /* 7 * PI/2 */
- .8byte 0x402921fb54442d18 /* 8 * PI/2 */
- .8byte 0x402c463abeccb2bb /* 9 * PI/2 */
- .8byte 0x402f6a7a2955385e /* 10 * PI/2 */
-
-L(small):
- .8byte 0x3cd0000000000000 /* 2^-50 */
-
-L(ones):
- .8byte 0x3ff0000000000000 /* +1.0 */
- .8byte 0xbff0000000000000 /* -1.0 */
-
-L(DPhalf):
- .8byte 0x3fe0000000000000 /* 0.5 */
-
-L(DPone):
- .8byte 0x3ff0000000000000 /* 1.0 */
-
-L(DPtwo):
- .8byte 0x4000000000000000 /* 2.0 */
-
-weak_alias(__sinf, sinf)
diff --git a/sysdeps/powerpc/powerpc64/power8/memcmp.S b/sysdeps/powerpc/powerpc64/power8/memcmp.S
deleted file mode 100644
index 46b9c0067a..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/memcmp.S
+++ /dev/null
@@ -1,1447 +0,0 @@
-/* Optimized memcmp implementation for POWER7/PowerPC64.
- Copyright (C) 2010-2017 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 <sysdep.h>
-
-/* int [r3] memcmp (const char *s1 [r3],
- const char *s2 [r4],
- size_t size [r5]) */
-
-/* TODO: change these to the actual instructions when the minimum required
- binutils allows it. */
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#ifndef MEMCMP
-# define MEMCMP memcmp
-#endif
- .machine power7
-EALIGN (MEMCMP, 4, 0)
- CALL_MCOUNT 3
-
-#define rRTN r3
-#define rSTR1 r3 /* First string arg. */
-#define rSTR2 r4 /* Second string arg. */
-#define rN r5 /* Max string length. */
-#define rWORD1 r6 /* Current word in s1. */
-#define rWORD2 r7 /* Current word in s2. */
-#define rWORD3 r8 /* Next word in s1. */
-#define rWORD4 r9 /* Next word in s2. */
-#define rWORD5 r10 /* Next word in s1. */
-#define rWORD6 r11 /* Next word in s2. */
-
-#define rOFF8 r20 /* 8 bytes offset. */
-#define rOFF16 r21 /* 16 bytes offset. */
-#define rOFF24 r22 /* 24 bytes offset. */
-#define rOFF32 r23 /* 24 bytes offset. */
-#define rWORD6_SHIFT r24 /* Left rotation temp for rWORD8. */
-#define rWORD4_SHIFT r25 /* Left rotation temp for rWORD6. */
-#define rWORD2_SHIFT r26 /* Left rotation temp for rWORD4. */
-#define rWORD8_SHIFT r27 /* Left rotation temp for rWORD2. */
-#define rSHR r28 /* Unaligned shift right count. */
-#define rSHL r29 /* Unaligned shift left count. */
-#define rWORD7 r30 /* Next word in s1. */
-#define rWORD8 r31 /* Next word in s2. */
-
-#define rWORD8SAVE (-8)
-#define rWORD7SAVE (-16)
-#define rOFF8SAVE (-24)
-#define rOFF16SAVE (-32)
-#define rOFF24SAVE (-40)
-#define rOFF32SAVE (-48)
-#define rSHRSAVE (-56)
-#define rSHLSAVE (-64)
-#define rWORD8SHIFTSAVE (-72)
-#define rWORD2SHIFTSAVE (-80)
-#define rWORD4SHIFTSAVE (-88)
-#define rWORD6SHIFTSAVE (-96)
-
-#ifdef __LITTLE_ENDIAN__
-# define LD ldbrx
-#else
-# define LD ldx
-#endif
-
- xor r10, rSTR2, rSTR1
- cmpldi cr6, rN, 0
- cmpldi cr1, rN, 8
- clrldi. r0, r10, 61
- clrldi r12, rSTR1, 61
- cmpldi cr5, r12, 0
- beq- cr6, L(zeroLength)
- dcbt 0, rSTR1
- dcbt 0, rSTR2
- /* If less than 8 bytes or not aligned, use the unaligned
- byte loop. */
- blt cr1, L(bytealigned)
- bne L(unalignedqw)
-/* At this point we know both strings have the same alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then we are already double word
- aligned and can perform the DW aligned loop. */
-
- .align 4
-L(samealignment):
- or r11, rSTR2, rSTR1
- clrldi. r11, r11, 60
- beq L(qw_align)
- /* Try to align to QW else proceed to DW loop. */
- clrldi. r10, r10, 60
- bne L(DW)
- /* For the difference to reach QW alignment, load as DW. */
- clrrdi rSTR1, rSTR1, 3
- clrrdi rSTR2, rSTR2, 3
- subfic r10, r12, 8
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- sldi r9, r10, 3
- subfic r9, r9, 64
- sld rWORD1, rWORD1, r9
- sld rWORD2, rWORD2, r9
- cmpld cr6, rWORD1, rWORD2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(ret_diff)
- subf rN, r10, rN
-
- cmpld cr6, r11, r12
- bgt cr6, L(qw_align)
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpld cr6, rWORD1, rWORD2
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(different)
- cmpldi cr6, rN, 8
- ble cr6, L(zeroLength)
- addi rN, rN, -8
- /* Now both rSTR1 and rSTR2 are aligned to QW. */
- .align 4
-L(qw_align):
- vspltisb v0, 0
- srdi. r6, rN, 6
- li r8, 16
- li r10, 32
- li r11, 48
- ble cr0, L(lessthan64)
- mtctr r6
- vspltisb v8, 0
- vspltisb v6, 0
- /* Aligned vector loop. */
- .align 4
-L(aligned_loop):
- lvx v4, 0, rSTR1
- lvx v5, 0, rSTR2
- vcmpequb. v7, v6, v8
- bnl cr6, L(different3)
- lvx v6, rSTR1, r8
- lvx v8, rSTR2, r8
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- lvx v4, rSTR1, r10
- lvx v5, rSTR2, r10
- vcmpequb. v7, v6, v8
- bnl cr6, L(different3)
- lvx v6, rSTR1, r11
- lvx v8, rSTR2, r11
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- addi rSTR1, rSTR1, 64
- addi rSTR2, rSTR2, 64
- bdnz L(aligned_loop)
- vcmpequb. v7, v6, v8
- bnl cr6, L(different3)
- clrldi rN, rN, 58
- /* Handle remainder for aligned loop. */
- .align 4
-L(lessthan64):
- mr r9, rSTR1
- cmpdi cr6, rN, 0
- li rSTR1, 0
- blelr cr6
- lvx v4, 0, r9
- lvx v5, 0, rSTR2
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r8
- lvx v5, rSTR2, r8
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r10
- lvx v5, rSTR2, r10
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r11
- lvx v5, rSTR2, r11
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- blr
-
- /* Calculate and return the difference. */
- .align 4
-L(different1):
- cmpdi cr6, rN, 16
- bge cr6, L(different2)
- /* Discard unwanted bytes. */
-#ifdef __LITTLE_ENDIAN__
- lvsr v1, 0, rN
- vperm v4, v4, v0, v1
- vperm v5, v5, v0, v1
-#else
- lvsl v1, 0, rN
- vperm v4, v0, v4, v1
- vperm v5, v0, v5, v1
-#endif
- vcmpequb. v7, v4, v5
- li rRTN, 0
- bltlr cr6
- .align 4
-L(different2):
-#ifdef __LITTLE_ENDIAN__
- /* Reverse bytes for direct comparison. */
- lvsl v10, r0, r0
- vspltisb v8, 15
- vsububm v9, v8, v10
- vperm v4, v4, v0, v9
- vperm v5, v5, v0, v9
-#endif
- MFVRD(r7, v4)
- MFVRD(r9, v5)
- cmpld cr6, r7, r9
- bne cr6, L(ret_diff)
- /* Difference in second DW. */
- vsldoi v4, v4, v4, 8
- vsldoi v5, v5, v5, 8
- MFVRD(r7, v4)
- MFVRD(r9, v5)
- cmpld cr6, r7, r9
-L(ret_diff):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
- .align 4
-L(different3):
-#ifdef __LITTLE_ENDIAN__
- /* Reverse bytes for direct comparison. */
- vspltisb v9, 15
- lvsl v10, r0, r0
- vsububm v9, v9, v10
- vperm v6, v6, v0, v9
- vperm v8, v8, v0, v9
-#endif
- MFVRD(r7, v6)
- MFVRD(r9, v8)
- cmpld cr6, r7, r9
- bne cr6, L(ret_diff)
- /* Difference in second DW. */
- vsldoi v6, v6, v6, 8
- vsldoi v8, v8, v8, 8
- MFVRD(r7, v6)
- MFVRD(r9, v8)
- cmpld cr6, r7, r9
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
-
- .align 4
-L(different):
- cmpldi cr7, rN, 8
- bgt cr7, L(end)
- /* Skip unwanted bytes. */
- sldi r8, rN, 3
- subfic r8, r8, 64
- srd rWORD1, rWORD1, r8
- srd rWORD2, rWORD2, r8
- cmpld cr6, rWORD1, rWORD2
- li rRTN, 0
- beqlr cr6
-L(end):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
-
- .align 4
-L(unalignedqw):
- /* Proceed to DW unaligned loop,if there is a chance of pagecross. */
- rldicl r9, rSTR1, 0, 52
- add r9, r9, rN
- cmpldi cr0, r9, 4096-16
- bgt cr0, L(unaligned)
- rldicl r9, rSTR2, 0, 52
- add r9, r9, rN
- cmpldi cr0, r9, 4096-16
- bgt cr0, L(unaligned)
- li r0, 0
- li r8, 16
- vspltisb v0, 0
- /* Check if rSTR1 is aligned to QW. */
- andi. r11, rSTR1, 0xF
- beq L(s1_align)
-
- /* Compare 16B and align S1 to QW. */
-#ifdef __LITTLE_ENDIAN__
- lvsr v10, 0, rSTR1 /* Compute mask. */
- lvsr v6, 0, rSTR2 /* Compute mask. */
-#else
- lvsl v10, 0, rSTR1 /* Compute mask. */
- lvsl v6, 0, rSTR2 /* Compute mask. */
-#endif
- lvx v5, 0, rSTR2
- lvx v9, rSTR2, r8
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v9, v5, v6
-#else
- vperm v5, v5, v9, v6
-#endif
- lvx v4, 0, rSTR1
- lvx v9, rSTR1, r8
-#ifdef __LITTLE_ENDIAN__
- vperm v4, v9, v4, v10
-#else
- vperm v4, v4, v9, v10
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- cmpldi cr6, rN, 16
- ble cr6, L(zeroLength)
- subfic r11, r11, 16
- subf rN, r11, rN
- add rSTR1, rSTR1, r11
- add rSTR2, rSTR2, r11
-
- /* As s1 is QW aligned prepare for unaligned loop. */
- .align 4
-L(s1_align):
-#ifdef __LITTLE_ENDIAN__
- lvsr v6, 0, rSTR2
-#else
- lvsl v6, 0, rSTR2
-#endif
- lvx v5, 0, rSTR2
- srdi. r6, rN, 6
- li r10, 32
- li r11, 48
- ble cr0, L(lessthan64_unalign)
- mtctr r6
- li r9, 64
- /* Unaligned vector loop. */
- .align 4
-L(unalign_qwloop):
- lvx v4, 0, rSTR1
- lvx v10, rSTR2, r8
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- vor v5, v10, v10
- lvx v4, rSTR1, r8
- lvx v10, rSTR2, r10
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- vor v5, v10, v10
- lvx v4, rSTR1, r10
- lvx v10, rSTR2, r11
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- vor v5, v10, v10
- lvx v4, rSTR1, r11
- lvx v10, rSTR2, r9
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different2)
- vor v5, v10, v10
- addi rSTR1, rSTR1, 64
- addi rSTR2, rSTR2, 64
- bdnz L(unalign_qwloop)
- clrldi rN, rN, 58
- /* Handle remainder for unaligned loop. */
- .align 4
-L(lessthan64_unalign):
- mr r9, rSTR1
- cmpdi cr6, rN, 0
- li rSTR1, 0
- blelr cr6
- lvx v4, 0, r9
- lvx v10, rSTR2, r8
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- vor v5, v10, v10
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r8
- lvx v10, rSTR2, r10
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- vor v5, v10, v10
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r10
- lvx v10, rSTR2, r11
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- vor v5, v10, v10
- addi rN, rN, -16
-
- cmpdi cr6, rN, 0
- blelr cr6
- lvx v4, r9, r11
- addi r11, r11, 16
- lvx v10, rSTR2, r11
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v10, v5, v6
-#else
- vperm v5, v5, v10, v6
-#endif
- vcmpequb. v7, v5, v4
- bnl cr6, L(different1)
- blr
-
-/* Otherwise we know the two strings have the same alignment (but not
- yet DW). So we force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DW aligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected register pair. */
- .align 4
-L(DW):
- std rWORD8, rWORD8SAVE(r1)
- std rWORD7, rWORD7SAVE(r1)
- std rOFF8, rOFF8SAVE(r1)
- std rOFF16, rOFF16SAVE(r1)
- std rOFF24, rOFF24SAVE(r1)
- std rOFF32, rOFF32SAVE(r1)
- cfi_offset(rWORD8, rWORD8SAVE)
- cfi_offset(rWORD7, rWORD7SAVE)
- cfi_offset(rOFF8, rOFF8SAVE)
- cfi_offset(rOFF16, rOFF16SAVE)
- cfi_offset(rOFF24, rOFF24SAVE)
- cfi_offset(rOFF32, rOFF32SAVE)
-
- li rOFF8,8
- li rOFF16,16
- li rOFF24,24
- li rOFF32,32
- clrrdi rSTR1, rSTR1, 3
- clrrdi rSTR2, rSTR2, 3
- beq cr5, L(DWaligned)
- add rN, rN, r12
- sldi rWORD6, r12, 3
- srdi r0, rN, 5 /* Divide by 32. */
- andi. r12, rN, 24 /* Get the DW remainder. */
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dPs4)
- mtctr r0
- bgt cr1, L(dPs3)
- beq cr1, L(dPs2)
-
-/* Remainder is 8. */
- .align 3
-L(dsP1):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
-/* Do something useful in this cycle since we have to branch anyway. */
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
- b L(dP1e)
-/* Remainder is 16. */
- .align 4
-L(dPs2):
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD2, rWORD6
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
-/* Do something useful in this cycle since we have to branch anyway. */
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
- b L(dP2e)
-/* Remainder is 24. */
- .align 4
-L(dPs3):
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD2, rWORD6
- cmpld cr1, rWORD3, rWORD4
- b L(dP3e)
-/* Count is a multiple of 32, remainder is 0. */
- .align 4
-L(dPs4):
- mtctr r0
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD2, rWORD6
- cmpld cr7, rWORD1, rWORD2
- b L(dP4e)
-
-/* At this point we know both strings are double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWaligned):
- andi. r12, rN, 24 /* Get the DW remainder. */
- srdi r0, rN, 5 /* Divide by 32. */
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- beq L(dP4)
- bgt cr1, L(dP3)
- beq cr1, L(dP2)
-
-/* Remainder is 8. */
- .align 4
-L(dP1):
- mtctr r0
-/* Normally we'd use rWORD7/rWORD8 here, but since we might exit early
- (8-15 byte compare), we want to use only volatile registers. This
- means we can avoid restoring non-volatile registers since we did not
- change any on the early exit path. The key here is the non-early
- exit path only cares about the condition code (cr5), not about which
- register pair was used. */
- LD rWORD5, 0, rSTR1
- LD rWORD6, 0, rSTR2
- cmpld cr5, rWORD5, rWORD6
- blt cr7, L(dP1x)
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
-L(dP1e):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr1, rWORD3, rWORD4
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5x)
- bne cr7, L(dLcr7x)
-
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- bne cr1, L(dLcr1)
- cmpld cr5, rWORD7, rWORD8
- bdnz L(dLoop)
- bne cr6, L(dLcr6)
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- .align 3
-L(dP1x):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Remainder is 16. */
- .align 4
-L(dP2):
- mtctr r0
- LD rWORD5, 0, rSTR1
- LD rWORD6, 0, rSTR2
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP2x)
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
-L(dP2e):
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- LD rWORD3, rOFF24, rSTR1
- LD rWORD4, rOFF24, rSTR2
- cmpld cr1, rWORD3, rWORD4
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(dLcr6)
- bne cr5, L(dLcr5)
- b L(dLoop2)
- .align 4
-L(dP2x):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- sldi. r12, rN, 3
- bne cr6, L(dLcr6x)
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr1, L(dLcr1x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Remainder is 24. */
- .align 4
-L(dP3):
- mtctr r0
- LD rWORD3, 0, rSTR1
- LD rWORD4, 0, rSTR2
- cmpld cr1, rWORD3, rWORD4
-L(dP3e):
- LD rWORD5, rOFF8, rSTR1
- LD rWORD6, rOFF8, rSTR2
- cmpld cr6, rWORD5, rWORD6
- blt cr7, L(dP3x)
- LD rWORD7, rOFF16, rSTR1
- LD rWORD8, rOFF16, rSTR2
- cmpld cr5, rWORD7, rWORD8
- LD rWORD1, rOFF24, rSTR1
- LD rWORD2, rOFF24, rSTR2
- cmpld cr7, rWORD1, rWORD2
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- bne cr1, L(dLcr1)
- bne cr6, L(dLcr6)
- b L(dLoop1)
-/* Again we are on a early exit path (24-31 byte compare), we want to
- only use volatile registers and avoid restoring non-volatile
- registers. */
- .align 4
-L(dP3x):
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- sldi. r12, rN, 3
- bne cr1, L(dLcr1x)
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- bne cr6, L(dLcr6x)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- bne cr7, L(dLcr7x)
- bne L(d00)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-/* Count is a multiple of 32, remainder is 0. */
- .align 4
-L(dP4):
- mtctr r0
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpld cr7, rWORD1, rWORD2
-L(dP4e):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- LD rWORD5, rOFF16, rSTR1
- LD rWORD6, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- LD rWORD7, rOFF24, rSTR1
- LD rWORD8, rOFF24, rSTR2
- addi rSTR1, rSTR1, 24
- addi rSTR2, rSTR2, 24
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
- bne cr1, L(dLcr1)
- bdz- L(d24) /* Adjust CTR as we start with +4. */
-/* This is the primary loop. */
- .align 4
-L(dLoop):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
-L(dLoop1):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
-L(dLoop2):
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(dLcr7)
-L(dLoop3):
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- bne cr1, L(dLcr1)
- cmpld cr7, rWORD1, rWORD2
- bdnz L(dLoop)
-
-L(dL4):
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(dLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(dLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(d44):
- bne cr7, L(dLcr7)
-L(d34):
- bne cr1, L(dLcr1)
-L(d24):
- bne cr6, L(dLcr6)
-L(d14):
- sldi. r12, rN, 3
- bne cr5, L(dLcr5)
-L(d04):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */
- beq L(duzeroLength)
-/* At this point we have a remainder of 1 to 7 bytes to compare. Since
- we are aligned it is safe to load the whole double word, and use
- shift right double to eliminate bits beyond the compare length. */
-L(d00):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- cmpld cr7, rWORD1, rWORD2
- bne cr7, L(dLcr7x)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
- .align 4
-L(dLcr7):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr7x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(dLcr1):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr1x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
- .align 4
-L(dLcr6):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr6x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
- .align 4
-L(dLcr5):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dLcr5x):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 1
- bgtlr cr5
- li rRTN, -1
- blr
-
- .align 4
-L(bytealigned):
- mtctr rN
-
-/* We need to prime this loop. This loop is swing modulo scheduled
- to avoid pipe delays. The dependent instruction latencies (load to
- compare to conditional branch) is 2 to 3 cycles. In this loop each
- dispatch group ends in a branch and takes 1 cycle. Effectively
- the first iteration of the loop only serves to load operands and
- branches based on compares are delayed until the next loop.
-
- So we must precondition some registers and condition codes so that
- we don't exit the loop early on the first iteration. */
-
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- bdz L(b11)
- cmpld cr7, rWORD1, rWORD2
- lbz rWORD3, 1(rSTR1)
- lbz rWORD4, 1(rSTR2)
- bdz L(b12)
- cmpld cr1, rWORD3, rWORD4
- lbzu rWORD5, 2(rSTR1)
- lbzu rWORD6, 2(rSTR2)
- bdz L(b13)
- .align 4
-L(bLoop):
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- bne cr7, L(bLcr7)
-
- cmpld cr6, rWORD5, rWORD6
- bdz L(b3i)
-
- lbzu rWORD3, 1(rSTR1)
- lbzu rWORD4, 1(rSTR2)
- bne cr1, L(bLcr1)
-
- cmpld cr7, rWORD1, rWORD2
- bdz L(b2i)
-
- lbzu rWORD5, 1(rSTR1)
- lbzu rWORD6, 1(rSTR2)
- bne cr6, L(bLcr6)
-
- cmpld cr1, rWORD3, rWORD4
- bdnz L(bLoop)
-
-/* We speculatively loading bytes before we have tested the previous
- bytes. But we must avoid overrunning the length (in the ctr) to
- prevent these speculative loads from causing a segfault. In this
- case the loop will exit early (before the all pending bytes are
- tested. In this case we must complete the pending operations
- before returning. */
-L(b1i):
- bne cr7, L(bLcr7)
- bne cr1, L(bLcr1)
- b L(bx56)
- .align 4
-L(b2i):
- bne cr6, L(bLcr6)
- bne cr7, L(bLcr7)
- b L(bx34)
- .align 4
-L(b3i):
- bne cr1, L(bLcr1)
- bne cr6, L(bLcr6)
- b L(bx12)
- .align 4
-L(bLcr7):
- li rRTN, 1
- bgtlr cr7
- li rRTN, -1
- blr
-L(bLcr1):
- li rRTN, 1
- bgtlr cr1
- li rRTN, -1
- blr
-L(bLcr6):
- li rRTN, 1
- bgtlr cr6
- li rRTN, -1
- blr
-
-L(b13):
- bne cr7, L(bx12)
- bne cr1, L(bx34)
-L(bx56):
- sub rRTN, rWORD5, rWORD6
- blr
- nop
-L(b12):
- bne cr7, L(bx12)
-L(bx34):
- sub rRTN, rWORD3, rWORD4
- blr
-L(b11):
-L(bx12):
- sub rRTN, rWORD1, rWORD2
- blr
-
- .align 4
-L(zeroLength):
- li rRTN, 0
- blr
-
- .align 4
-/* At this point we know the strings have different alignment and the
- compare length is at least 8 bytes. r12 contains the low order
- 3 bits of rSTR1 and cr5 contains the result of the logical compare
- of r12 to 0. If r12 == 0 then rStr1 is double word
- aligned and can perform the DWunaligned loop.
-
- Otherwise we know that rSTR1 is not already DW aligned yet.
- So we can force the string addresses to the next lower DW
- boundary and special case this first DW using shift left to
- eliminate bits preceding the first byte. Since we want to join the
- normal (DWaligned) compare loop, starting at the second double word,
- we need to adjust the length (rN) and special case the loop
- versioning for the first DW. This ensures that the loop count is
- correct and the first DW (shifted) is in the expected resister pair. */
-L(unaligned):
- std rWORD8, rWORD8SAVE(r1)
- std rWORD7, rWORD7SAVE(r1)
- std rOFF8, rOFF8SAVE(r1)
- std rOFF16, rOFF16SAVE(r1)
- std rOFF24, rOFF24SAVE(r1)
- std rOFF32, rOFF32SAVE(r1)
- cfi_offset(rWORD8, rWORD8SAVE)
- cfi_offset(rWORD7, rWORD7SAVE)
- cfi_offset(rOFF8, rOFF8SAVE)
- cfi_offset(rOFF16, rOFF16SAVE)
- cfi_offset(rOFF24, rOFF24SAVE)
- cfi_offset(rOFF32, rOFF32SAVE)
- li rOFF8,8
- li rOFF16,16
- li rOFF24,24
- li rOFF32,32
- std rSHL, rSHLSAVE(r1)
- cfi_offset(rSHL, rSHLSAVE)
- clrldi rSHL, rSTR2, 61
- beq cr6, L(duzeroLength)
- std rSHR, rSHRSAVE(r1)
- cfi_offset(rSHR, rSHRSAVE)
- beq cr5, L(DWunaligned)
- std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE)
-/* Adjust the logical start of rSTR2 to compensate for the extra bits
- in the 1st rSTR1 DW. */
- sub rWORD8_SHIFT, rSTR2, r12
-/* But do not attempt to address the DW before that DW that contains
- the actual start of rSTR2. */
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
-/* Compute the left/right shift counts for the unaligned rSTR2,
- compensating for the logical (DW aligned) start of rSTR1. */
- clrldi rSHL, rWORD8_SHIFT, 61
- clrrdi rSTR1, rSTR1, 3
- std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- sldi rSHL, rSHL, 3
- cmpld cr5, rWORD8_SHIFT, rSTR2
- add rN, rN, r12
- sldi rWORD6, r12, 3
- std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE)
- cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE)
- cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE)
- subfic rSHR, rSHL, 64
- srdi r0, rN, 5 /* Divide by 32. */
- andi. r12, rN, 24 /* Get the DW remainder. */
-/* We normally need to load 2 DWs to start the unaligned rSTR2, but in
- this special case those bits may be discarded anyway. Also we
- must avoid loading a DW where none of the bits are part of rSTR2 as
- this may cross a page boundary and cause a page fault. */
- li rWORD8, 0
- blt cr5, L(dus0)
- LD rWORD8, 0, rSTR2
- addi rSTR2, rSTR2, 8
- sld rWORD8, rWORD8, rSHL
-
-L(dus0):
- LD rWORD1, 0, rSTR1
- LD rWORD2, 0, rSTR2
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- srd r12, rWORD2, rSHR
- clrldi rN, rN, 61
- beq L(duPs4)
- mtctr r0
- or rWORD8, r12, rWORD8
- bgt cr1, L(duPs3)
- beq cr1, L(duPs2)
-
-/* Remainder is 8. */
- .align 4
-L(dusP1):
- sld rWORD8_SHIFT, rWORD2, rSHL
- sld rWORD7, rWORD1, rWORD6
- sld rWORD8, rWORD8, rWORD6
- bge cr7, L(duP1e)
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16. */
- .align 4
-L(duPs2):
- sld rWORD6_SHIFT, rWORD2, rSHL
- sld rWORD5, rWORD1, rWORD6
- sld rWORD6, rWORD8, rWORD6
- b L(duP2e)
-/* Remainder is 24. */
- .align 4
-L(duPs3):
- sld rWORD4_SHIFT, rWORD2, rSHL
- sld rWORD3, rWORD1, rWORD6
- sld rWORD4, rWORD8, rWORD6
- b L(duP3e)
-/* Count is a multiple of 32, remainder is 0. */
- .align 4
-L(duPs4):
- mtctr r0
- or rWORD8, r12, rWORD8
- sld rWORD2_SHIFT, rWORD2, rSHL
- sld rWORD1, rWORD1, rWORD6
- sld rWORD2, rWORD8, rWORD6
- b L(duP4e)
-
-/* At this point we know rSTR1 is double word aligned and the
- compare length is at least 8 bytes. */
- .align 4
-L(DWunaligned):
- std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- clrrdi rSTR2, rSTR2, 3
- std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- srdi r0, rN, 5 /* Divide by 32. */
- std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- andi. r12, rN, 24 /* Get the DW remainder. */
- std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE)
- cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE)
- cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE)
- cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE)
- sldi rSHL, rSHL, 3
- LD rWORD6, 0, rSTR2
- LD rWORD8, rOFF8, rSTR2
- addi rSTR2, rSTR2, 8
- cmpldi cr1, r12, 16
- cmpldi cr7, rN, 32
- clrldi rN, rN, 61
- subfic rSHR, rSHL, 64
- sld rWORD6_SHIFT, rWORD6, rSHL
- beq L(duP4)
- mtctr r0
- bgt cr1, L(duP3)
- beq cr1, L(duP2)
-
-/* Remainder is 8. */
- .align 4
-L(duP1):
- srd r12, rWORD8, rSHR
- LD rWORD7, 0, rSTR1
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP1x)
-L(duP1e):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr5, rWORD7, rWORD8
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- bne cr5, L(duLcr5)
- or rWORD4, r12, rWORD2_SHIFT
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- bne cr7, L(duLcr7)
- or rWORD6, r0, rWORD4_SHIFT
- cmpld cr6, rWORD5, rWORD6
- b L(duLoop3)
- .align 4
-/* At this point we exit early with the first double word compare
- complete and remainder of 0 to 7 bytes. See L(du14) for details on
- how we handle the remaining bytes. */
-L(duP1x):
- cmpld cr5, rWORD7, rWORD8
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-/* Remainder is 16. */
- .align 4
-L(duP2):
- srd r0, rWORD8, rSHR
- LD rWORD5, 0, rSTR1
- or rWORD6, r0, rWORD6_SHIFT
- sld rWORD6_SHIFT, rWORD8, rSHL
-L(duP2e):
- LD rWORD7, rOFF8, rSTR1
- LD rWORD8, rOFF8, rSTR2
- cmpld cr6, rWORD5, rWORD6
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP2x)
- LD rWORD1, rOFF16, rSTR1
- LD rWORD2, rOFF16, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- LD rWORD3, rOFF24, rSTR1
- LD rWORD4, rOFF24, rSTR2
- cmpld cr7, rWORD1, rWORD2
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- cmpld cr1, rWORD3, rWORD4
- b L(duLoop2)
- .align 4
-L(duP2x):
- cmpld cr5, rWORD7, rWORD8
- addi rSTR1, rSTR1, 8
- addi rSTR2, rSTR2, 8
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Remainder is 24. */
- .align 4
-L(duP3):
- srd r12, rWORD8, rSHR
- LD rWORD3, 0, rSTR1
- sld rWORD4_SHIFT, rWORD8, rSHL
- or rWORD4, r12, rWORD6_SHIFT
-L(duP3e):
- LD rWORD5, rOFF8, rSTR1
- LD rWORD6, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
- LD rWORD7, rOFF16, rSTR1
- LD rWORD8, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- blt cr7, L(duP3x)
- LD rWORD1, rOFF24, rSTR1
- LD rWORD2, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- cmpld cr7, rWORD1, rWORD2
- b L(duLoop1)
- .align 4
-L(duP3x):
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
- cmpld cr5, rWORD7, rWORD8
- bne cr6, L(duLcr6)
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- b L(dutrim)
-
-/* Count is a multiple of 32, remainder is 0. */
- .align 4
-L(duP4):
- mtctr r0
- srd r0, rWORD8, rSHR
- LD rWORD1, 0, rSTR1
- sld rWORD2_SHIFT, rWORD8, rSHL
- or rWORD2, r0, rWORD6_SHIFT
-L(duP4e):
- LD rWORD3, rOFF8, rSTR1
- LD rWORD4, rOFF8, rSTR2
- cmpld cr7, rWORD1, rWORD2
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
- LD rWORD5, rOFF16, rSTR1
- LD rWORD6, rOFF16, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
- LD rWORD7, rOFF24, rSTR1
- LD rWORD8, rOFF24, rSTR2
- addi rSTR1, rSTR1, 24
- addi rSTR2, rSTR2, 24
- cmpld cr6, rWORD5, rWORD6
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- cmpld cr5, rWORD7, rWORD8
- bdz L(du24) /* Adjust CTR as we start with +4. */
-/* This is the primary loop. */
- .align 4
-L(duLoop):
- LD rWORD1, rOFF8, rSTR1
- LD rWORD2, rOFF8, rSTR2
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- srd r0, rWORD2, rSHR
- sld rWORD2_SHIFT, rWORD2, rSHL
- or rWORD2, r0, rWORD8_SHIFT
-L(duLoop1):
- LD rWORD3, rOFF16, rSTR1
- LD rWORD4, rOFF16, rSTR2
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- srd r12, rWORD4, rSHR
- sld rWORD4_SHIFT, rWORD4, rSHL
- or rWORD4, r12, rWORD2_SHIFT
-L(duLoop2):
- LD rWORD5, rOFF24, rSTR1
- LD rWORD6, rOFF24, rSTR2
- cmpld cr5, rWORD7, rWORD8
- bne cr7, L(duLcr7)
- srd r0, rWORD6, rSHR
- sld rWORD6_SHIFT, rWORD6, rSHL
- or rWORD6, r0, rWORD4_SHIFT
-L(duLoop3):
- LD rWORD7, rOFF32, rSTR1
- LD rWORD8, rOFF32, rSTR2
- addi rSTR1, rSTR1, 32
- addi rSTR2, rSTR2, 32
- cmpld cr7, rWORD1, rWORD2
- bne cr1, L(duLcr1)
- srd r12, rWORD8, rSHR
- sld rWORD8_SHIFT, rWORD8, rSHL
- or rWORD8, r12, rWORD6_SHIFT
- bdnz L(duLoop)
-
-L(duL4):
- cmpld cr1, rWORD3, rWORD4
- bne cr6, L(duLcr6)
- cmpld cr6, rWORD5, rWORD6
- bne cr5, L(duLcr5)
- cmpld cr5, rWORD7, rWORD8
-L(du44):
- bne cr7, L(duLcr7)
-L(du34):
- bne cr1, L(duLcr1)
-L(du24):
- bne cr6, L(duLcr6)
-L(du14):
- sldi. rN, rN, 3
- bne cr5, L(duLcr5)
-/* At this point we have a remainder of 1 to 7 bytes to compare. We use
- shift right double to eliminate bits beyond the compare length.
-
- However it may not be safe to load rWORD2 which may be beyond the
- string length. So we compare the bit length of the remainder to
- the right shift count (rSHR). If the bit count is less than or equal
- we do not need to load rWORD2 (all significant bits are already in
- rWORD8_SHIFT). */
- cmpld cr7, rN, rSHR
- beq L(duZeroReturn)
- li r0, 0
- ble cr7, L(dutrim)
- LD rWORD2, rOFF8, rSTR2
- srd r0, rWORD2, rSHR
- .align 4
-L(dutrim):
- LD rWORD1, rOFF8, rSTR1
- ld rWORD8, -8(r1)
- subfic rN, rN, 64 /* Shift count is 64 - (rN * 8). */
- or rWORD2, r0, rWORD8_SHIFT
- ld rWORD7, rWORD7SAVE(r1)
- ld rSHL, rSHLSAVE(r1)
- srd rWORD1, rWORD1, rN
- srd rWORD2, rWORD2, rN
- ld rSHR, rSHRSAVE(r1)
- ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- li rRTN, 0
- cmpld cr7, rWORD1, rWORD2
- ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
- beq cr7, L(dureturn24)
- li rRTN, 1
- ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- bgtlr cr7
- li rRTN, -1
- blr
- .align 4
-L(duLcr7):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr7, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr1):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr1, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr6):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr6, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
- .align 4
-L(duLcr5):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
- li rRTN, 1
- bgt cr5, L(dureturn29)
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
- li rRTN, -1
- b L(dureturn27)
-
- .align 3
-L(duZeroReturn):
- li rRTN, 0
- .align 4
-L(dureturn):
- ld rWORD8, rWORD8SAVE(r1)
- ld rWORD7, rWORD7SAVE(r1)
-L(dureturn29):
- ld rSHL, rSHLSAVE(r1)
- ld rSHR, rSHRSAVE(r1)
-L(dureturn27):
- ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1)
- ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1)
- ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1)
-L(dureturn24):
- ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1)
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- blr
-
-L(duzeroLength):
- ld rOFF8, rOFF8SAVE(r1)
- ld rOFF16, rOFF16SAVE(r1)
- ld rOFF24, rOFF24SAVE(r1)
- ld rOFF32, rOFF32SAVE(r1)
- li rRTN, 0
- blr
-
-END (MEMCMP)
-libc_hidden_builtin_def (memcmp)
-weak_alias (memcmp, bcmp)
diff --git a/sysdeps/powerpc/powerpc64/power8/memset.S b/sysdeps/powerpc/powerpc64/power8/memset.S
deleted file mode 100644
index bc734c9f4f..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/memset.S
+++ /dev/null
@@ -1,458 +0,0 @@
-/* Optimized memset implementation for PowerPC64/POWER8.
- Copyright (C) 2014-2017 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 <sysdep.h>
-
-#define MTVSRD_V1_R4 .long 0x7c240166 /* mtvsrd v1,r4 */
-
-/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
- Returns 's'. */
-
-#ifndef MEMSET
-# define MEMSET memset
-#endif
-
- /* No need to use .machine power8 since mtvsrd is already
- handled by the define. It avoid breakage on binutils
- that does not support this machine specifier. */
- .machine power7
-EALIGN (MEMSET, 5, 0)
- CALL_MCOUNT 3
-
-L(_memset):
- cmpldi cr7,r5,31
- neg r0,r3
- mr r10,r3
-
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32 /* Replicate byte to word. */
- ble cr7,L(write_LT_32)
-
- andi. r11,r10,15 /* Check alignment of DST. */
- insrdi r4,r4,32,0 /* Replicate word to double word. */
-
- beq L(big_aligned)
-
- mtocrf 0x01,r0
- clrldi r0,r0,60
-
- /* Get DST aligned to 16 bytes. */
-1: bf 31,2f
- stb r4,0(r10)
- addi r10,r10,1
-
-2: bf 30,4f
- sth r4,0(r10)
- addi r10,r10,2
-
-4: bf 29,8f
- stw r4,0(r10)
- addi r10,r10,4
-
-8: bf 28,16f
- std r4,0(r10)
- addi r10,r10,8
-
-16: subf r5,r0,r5
-
- .align 4
-L(big_aligned):
- /* For sizes larger than 255 two possible paths:
- - if constant is '0', zero full cache lines with dcbz
- - otherwise uses vector instructions. */
- cmpldi cr5,r5,255
- dcbtst 0,r10
- cmpldi cr6,r4,0
- crand 27,26,21
- bt 27,L(huge_dcbz)
- bge cr5,L(huge_vector)
-
-
- /* Size between 32 and 255 bytes with constant different than 0, use
- doubleword store instruction to achieve best throughput. */
- srdi r8,r5,5
- clrldi r11,r5,59
- cmpldi cr6,r11,0
- cmpdi r8,0
- beq L(tail_bytes)
- mtctr r8
-
- /* Main aligned write loop, writes 32-bytes at a time. */
- .align 4
-L(big_loop):
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- addi r10,r10,32
- bdz L(tail_bytes)
-
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- addi r10,10,32
- bdnz L(big_loop)
-
- b L(tail_bytes)
-
- /* Write remaining 1~31 bytes. */
- .align 4
-L(tail_bytes):
- beqlr cr6
-
- srdi r7,r11,4
- clrldi r8,r11,60
- mtocrf 0x01,r7
-
- .align 4
- bf 31,8f
- std r4,0(r10)
- std r4,8(r10)
- addi r10,r10,16
-
- .align 4
-8: mtocrf 0x1,r8
- bf 28,4f
- std r4,0(r10)
- addi r10,r10,8
-
- .align 4
-4: bf 29,2f
- stw 4,0(10)
- addi 10,10,4
-
- .align 4
-2: bf 30,1f
- sth 4,0(10)
- addi 10,10,2
-
- .align 4
-1: bflr 31
- stb 4,0(10)
- blr
-
- /* Size larger than 255 bytes with constant different than 0, use
- vector instruction to achieve best throughput. */
-L(huge_vector):
- /* Replicate set byte to quadword in VMX register. */
- MTVSRD_V1_R4
- xxpermdi 32,v0,v1,0
- vspltb v2,v0,15
-
- /* Main aligned write loop: 128 bytes at a time. */
- li r6,16
- li r7,32
- li r8,48
- mtocrf 0x02,r5
- srdi r12,r5,7
- cmpdi r12,0
- beq L(aligned_tail)
- mtctr r12
- b L(aligned_128loop)
-
- .align 4
-L(aligned_128loop):
- stvx v2,0,r10
- stvx v2,r10,r6
- stvx v2,r10,r7
- stvx v2,r10,r8
- addi r10,r10,64
- stvx v2,0,r10
- stvx v2,r10,r6
- stvx v2,r10,r7
- stvx v2,r10,r8
- addi r10,r10,64
- bdnz L(aligned_128loop)
-
- /* Write remaining 1~127 bytes. */
-L(aligned_tail):
- mtocrf 0x01,r5
- bf 25,32f
- stvx v2,0,r10
- stvx v2,r10,r6
- stvx v2,r10,r7
- stvx v2,r10,r8
- addi r10,r10,64
-
-32: bf 26,16f
- stvx v2,0,r10
- stvx v2,r10,r6
- addi r10,r10,32
-
-16: bf 27,8f
- stvx v2,0,r10
- addi r10,r10,16
-
-8: bf 28,4f
- std r4,0(r10)
- addi r10,r10,8
-
- /* Copies 4~7 bytes. */
-4: bf 29,L(tail2)
- stw r4,0(r10)
- bf 30,L(tail5)
- sth r4,4(r10)
- bflr 31
- stb r4,6(r10)
- /* Return original DST pointer. */
- blr
-
- /* Special case when value is 0 and we have a long length to deal
- with. Use dcbz to zero out a full cacheline of 128 bytes at a time.
- Before using dcbz though, we need to get the destination 128-byte
- aligned. */
- .align 4
-L(huge_dcbz):
- andi. r11,r10,127
- neg r0,r10
- beq L(huge_dcbz_aligned)
-
- clrldi r0,r0,57
- subf r5,r0,r5
- srdi r0,r0,3
- mtocrf 0x01,r0
-
- /* Write 1~128 bytes until DST is aligned to 128 bytes. */
-8: bf 28,4f
-
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- std r4,32(r10)
- std r4,40(r10)
- std r4,48(r10)
- std r4,56(r10)
- addi r10,r10,64
-
- .align 4
-4: bf 29,2f
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- addi r10,r10,32
-
- .align 4
-2: bf 30,1f
- std r4,0(r10)
- std r4,8(r10)
- addi r10,r10,16
-
- .align 4
-1: bf 31,L(huge_dcbz_aligned)
- std r4,0(r10)
- addi r10,r10,8
-
-L(huge_dcbz_aligned):
- /* Setup dcbz unroll offsets and count numbers. */
- srdi r8,r5,9
- clrldi r11,r5,55
- cmpldi cr6,r11,0
- li r9,128
- cmpdi r8,0
- beq L(huge_tail)
- li r7,256
- li r6,384
- mtctr r8
-
- .align 4
-L(huge_loop):
- /* Sets 512 bytes to zero in each iteration, the loop unrolling shows
- a throughput boost for large sizes (2048 bytes or higher). */
- dcbz 0,r10
- dcbz r9,r10
- dcbz r7,r10
- dcbz r6,r10
- addi r10,r10,512
- bdnz L(huge_loop)
-
- beqlr cr6
-
-L(huge_tail):
- srdi r6,r11,8
- srdi r7,r11,4
- clrldi r8,r11,4
- cmpldi cr6,r8,0
- mtocrf 0x01,r6
-
- beq cr6,L(tail)
-
- /* We have 1~511 bytes remaining. */
- .align 4
-32: bf 31,16f
- dcbz 0,r10
- dcbz r9,r10
- addi r10,r10,256
-
- .align 4
-16: mtocrf 0x01,r7
- bf 28,8f
- dcbz 0,r10
- addi r10,r10,128
-
- .align 4
-8: bf 29,4f
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- std r4,32(r10)
- std r4,40(r10)
- std r4,48(r10)
- std r4,56(r10)
- addi r10,r10,64
-
- .align 4
-4: bf 30,2f
- std r4,0(r10)
- std r4,8(r10)
- std r4,16(r10)
- std r4,24(r10)
- addi r10,r10,32
-
- .align 4
-2: bf 31,L(tail)
- std r4,0(r10)
- std r4,8(r10)
- addi r10,r10,16
- .align 4
-
- /* Remaining 1~15 bytes. */
-L(tail):
- mtocrf 0x01,r8
-
- .align
-8: bf 28,4f
- std r4,0(r10)
- addi r10,r10,8
-
- .align 4
-4: bf 29,2f
- stw r4,0(r10)
- addi r10,r10,4
-
- .align 4
-2: bf 30,1f
- sth r4,0(r10)
- addi r10,r10,2
-
- .align 4
-1: bflr 31
- stb r4,0(r10)
- blr
-
- /* Handle short copies of 0~31 bytes. Best throughput is achieved
- by just unrolling all operations. */
- .align 4
-L(write_LT_32):
- cmpldi cr6,5,8
- mtocrf 0x01,r5
- ble cr6,L(write_LE_8)
-
- /* At least 9 bytes to go. */
- neg r8,r4
- andi. r0,r8,3
- cmpldi cr1,r5,16
- beq L(write_LT_32_aligned)
-
- /* Force 4-byte alignment for SRC. */
- mtocrf 0x01,r0
- subf r5,r0,r5
-
-2: bf 30,1f
- sth r4,0(r10)
- addi r10,r10,2
-
-1: bf 31,L(end_4bytes_alignment)
- stb r4,0(r10)
- addi r10,r10,1
-
- .align 4
-L(end_4bytes_alignment):
- cmpldi cr1,r5,16
- mtocrf 0x01,r5
-
-L(write_LT_32_aligned):
- blt cr1,8f
-
- stw r4,0(r10)
- stw r4,4(r10)
- stw r4,8(r10)
- stw r4,12(r10)
- addi r10,r10,16
-
-8: bf 28,L(tail4)
- stw r4,0(r10)
- stw r4,4(r10)
- addi r10,r10,8
-
- .align 4
- /* Copies 4~7 bytes. */
-L(tail4):
- bf 29,L(tail2)
- stw r4,0(r10)
- bf 30,L(tail5)
- sth r4,4(r10)
- bflr 31
- stb r4,6(r10)
- blr
-
- .align 4
- /* Copies 2~3 bytes. */
-L(tail2):
- bf 30,1f
- sth r4,0(r10)
- bflr 31
- stb r4,2(r10)
- blr
-
- .align 4
-L(tail5):
- bflr 31
- stb r4,4(r10)
- blr
-
- .align 4
-1: bflr 31
- stb r4,0(r10)
- blr
-
- /* Handles copies of 0~8 bytes. */
- .align 4
-L(write_LE_8):
- bne cr6,L(tail4)
-
- stw r4,0(r10)
- stw r4,4(r10)
- blr
-END_GEN_TB (MEMSET,TB_TOCLESS)
-libc_hidden_builtin_def (memset)
-
-/* Copied from bzero.S to prevent the linker from inserting a stub
- between bzero and memset. */
-ENTRY (__bzero)
- CALL_MCOUNT 3
- mr r5,r4
- li r4,0
- b L(_memset)
-END (__bzero)
-#ifndef __bzero
-weak_alias (__bzero, bzero)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/multiarch/Implies b/sysdeps/powerpc/powerpc64/power8/multiarch/Implies
deleted file mode 100644
index 1fc7b7cd39..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power7/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power8/stpcpy.S b/sysdeps/powerpc/powerpc64/power8/stpcpy.S
deleted file mode 100644
index 955e738cee..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/stpcpy.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Optimized stpcpy implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 USE_AS_STPCPY
-#include <sysdeps/powerpc/powerpc64/power8/strcpy.S>
-
-weak_alias (__stpcpy, stpcpy)
-libc_hidden_def (__stpcpy)
-libc_hidden_builtin_def (stpcpy)
diff --git a/sysdeps/powerpc/powerpc64/power8/stpncpy.S b/sysdeps/powerpc/powerpc64/power8/stpncpy.S
deleted file mode 100644
index c14d984dd0..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/stpncpy.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Optimized stpncpy implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 USE_AS_STPNCPY
-#include <sysdeps/powerpc/powerpc64/power8/strncpy.S>
-
-weak_alias (__stpncpy, stpncpy)
-libc_hidden_def (__stpncpy)
-libc_hidden_builtin_def (stpncpy)
diff --git a/sysdeps/powerpc/powerpc64/power8/strcasecmp.S b/sysdeps/powerpc/powerpc64/power8/strcasecmp.S
deleted file mode 100644
index 88b17a6eb1..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcasecmp.S
+++ /dev/null
@@ -1,457 +0,0 @@
-/* Optimized strcasecmp implementation for PowerPC64.
- Copyright (C) 2016-2017 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 <sysdep.h>
-#include <locale-defines.h>
-
-/* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] ) */
-
-#ifndef USE_AS_STRNCASECMP
-# define __STRCASECMP __strcasecmp
-# define STRCASECMP strcasecmp
-#else
-# define __STRCASECMP __strncasecmp
-# define STRCASECMP strncasecmp
-#endif
-/* Convert 16 bytes to lowercase and compare */
-#define TOLOWER() \
- vaddubm v8, v4, v1; \
- vaddubm v7, v4, v3; \
- vcmpgtub v8, v8, v2; \
- vsel v4, v7, v4, v8; \
- vaddubm v8, v5, v1; \
- vaddubm v7, v5, v3; \
- vcmpgtub v8, v8, v2; \
- vsel v5, v7, v5, v8; \
- vcmpequb. v7, v5, v4;
-
-/*
- * Get 16 bytes for unaligned case.
- * reg1: Vector to hold next 16 bytes.
- * reg2: Address to read from.
- * reg3: Permute control vector.
- * v8: Tmp vector used to mask unwanted bytes.
- * v9: Tmp vector,0 when null is found on first 16 bytes
- */
-#ifdef __LITTLE_ENDIAN__
-#define GET16BYTES(reg1, reg2, reg3) \
- lvx reg1, 0, reg2; \
- vspltisb v8, -1; \
- vperm v8, v8, reg1, reg3; \
- vcmpequb. v8, v0, v8; \
- beq cr6, 1f; \
- vspltisb v9, 0; \
- b 2f; \
- .align 4; \
-1: \
- addi r6, reg2, 16; \
- lvx v9, 0, r6; \
-2: \
- vperm reg1, v9, reg1, reg3;
-#else
-#define GET16BYTES(reg1, reg2, reg3) \
- lvx reg1, 0, reg2; \
- vspltisb v8, -1; \
- vperm v8, reg1, v8, reg3; \
- vcmpequb. v8, v0, v8; \
- beq cr6, 1f; \
- vspltisb v9, 0; \
- b 2f; \
- .align 4; \
-1: \
- addi r6, reg2, 16; \
- lvx v9, 0, r6; \
-2: \
- vperm reg1, reg1, v9, reg3;
-#endif
-
-/* Check null in v4, v5 and convert to lower. */
-#define CHECKNULLANDCONVERT() \
- vcmpequb. v7, v0, v5; \
- beq cr6, 3f; \
- vcmpequb. v7, v0, v4; \
- beq cr6, 3f; \
- b L(null_found); \
- .align 4; \
-3: \
- TOLOWER()
-
-#ifdef _ARCH_PWR8
-# define VCLZD_V8_v7 vclzd v8, v7;
-# define MFVRD_R3_V1 mfvrd r3, v1;
-# define VSUBUDM_V9_V8 vsubudm v9, v9, v8;
-# define VPOPCNTD_V8_V8 vpopcntd v8, v8;
-# define VADDUQM_V7_V8 vadduqm v9, v7, v8;
-#else
-# define VCLZD_V8_v7 .long 0x11003fc2
-# define MFVRD_R3_V1 .long 0x7c230067
-# define VSUBUDM_V9_V8 .long 0x112944c0
-# define VPOPCNTD_V8_V8 .long 0x110047c3
-# define VADDUQM_V7_V8 .long 0x11274100
-#endif
-
- .machine power7
-
-ENTRY (__STRCASECMP)
-#ifdef USE_AS_STRNCASECMP
- CALL_MCOUNT 3
-#else
- CALL_MCOUNT 2
-#endif
-#define rRTN r3 /* Return value */
-#define rSTR1 r10 /* 1st string */
-#define rSTR2 r4 /* 2nd string */
-#define rCHAR1 r6 /* Byte read from 1st string */
-#define rCHAR2 r7 /* Byte read from 2nd string */
-#define rADDR1 r8 /* Address of tolower(rCHAR1) */
-#define rADDR2 r12 /* Address of tolower(rCHAR2) */
-#define rLWR1 r8 /* Word tolower(rCHAR1) */
-#define rLWR2 r12 /* Word tolower(rCHAR2) */
-#define rTMP r9
-#define rLOC r11 /* Default locale address */
-
- cmpd cr7, rRTN, rSTR2
-
- /* Get locale address. */
- ld rTMP, __libc_tsd_LOCALE@got@tprel(r2)
- add rLOC, rTMP, __libc_tsd_LOCALE@tls
- ld rLOC, 0(rLOC)
-
- mr rSTR1, rRTN
- li rRTN, 0
- beqlr cr7
-#ifdef USE_AS_STRNCASECMP
- cmpdi cr7, r5, 0
- beq cr7, L(retnull)
- cmpdi cr7, r5, 16
- blt cr7, L(bytebybyte)
-#endif
- vspltisb v0, 0
- vspltisb v8, -1
- /* Check for null in initial characters.
- Check max of 16 char depending on the alignment.
- If null is present, proceed byte by byte. */
- lvx v4, 0, rSTR1
-#ifdef __LITTLE_ENDIAN__
- lvsr v10, 0, rSTR1 /* Compute mask. */
- vperm v9, v8, v4, v10 /* Mask bits that are not part of string. */
-#else
- lvsl v10, 0, rSTR1
- vperm v9, v4, v8, v10
-#endif
- vcmpequb. v9, v0, v9 /* Check for null bytes. */
- bne cr6, L(bytebybyte)
- lvx v5, 0, rSTR2
- /* Calculate alignment. */
-#ifdef __LITTLE_ENDIAN__
- lvsr v6, 0, rSTR2
- vperm v9, v8, v5, v6 /* Mask bits that are not part of string. */
-#else
- lvsl v6, 0, rSTR2
- vperm v9, v5, v8, v6
-#endif
- vcmpequb. v9, v0, v9 /* Check for null bytes. */
- bne cr6, L(bytebybyte)
- /* Check if locale has non ascii characters. */
- ld rTMP, 0(rLOC)
- addi r6, rTMP,LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES
- lwz rTMP, 0(r6)
- cmpdi cr7, rTMP, 1
- beq cr7, L(bytebybyte)
-
- /* Load vector registers with values used for TOLOWER. */
- /* Load v1 = 0xbf, v2 = 0x19 v3 = 0x20 in each byte. */
- vspltisb v3, 2
- vspltisb v9, 4
- vsl v3, v3, v9
- vaddubm v1, v3, v3
- vnor v1, v1, v1
- vspltisb v2, 7
- vsububm v2, v3, v2
-
- andi. rADDR1, rSTR1, 0xF
- beq cr0, L(align)
- addi r6, rSTR1, 16
- lvx v9, 0, r6
- /* Compute 16 bytes from previous two loads. */
-#ifdef __LITTLE_ENDIAN__
- vperm v4, v9, v4, v10
-#else
- vperm v4, v4, v9, v10
-#endif
-L(align):
- andi. rADDR2, rSTR2, 0xF
- beq cr0, L(align1)
- addi r6, rSTR2, 16
- lvx v9, 0, r6
- /* Compute 16 bytes from previous two loads. */
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v9, v5, v6
-#else
- vperm v5, v5, v9, v6
-#endif
-L(align1):
- CHECKNULLANDCONVERT()
- blt cr6, L(match)
- b L(different)
- .align 4
-L(match):
- clrldi r6, rSTR1, 60
- subfic r7, r6, 16
-#ifdef USE_AS_STRNCASECMP
- sub r5, r5, r7
-#endif
- add rSTR1, rSTR1, r7
- add rSTR2, rSTR2, r7
- andi. rADDR2, rSTR2, 0xF
- addi rSTR1, rSTR1, -16
- addi rSTR2, rSTR2, -16
- beq cr0, L(aligned)
-#ifdef __LITTLE_ENDIAN__
- lvsr v6, 0, rSTR2
-#else
- lvsl v6, 0, rSTR2
-#endif
- /* There are 2 loops depending on the input alignment.
- Each loop gets 16 bytes from s1 and s2, check for null,
- convert to lowercase and compare. Loop till difference
- or null occurs. */
-L(s1_align):
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#ifdef USE_AS_STRNCASECMP
- cmpdi cr7, r5, 16
- blt cr7, L(bytebybyte)
- addi r5, r5, -16
-#endif
- lvx v4, 0, rSTR1
- GET16BYTES(v5, rSTR2, v6)
- CHECKNULLANDCONVERT()
- blt cr6, L(s1_align)
- b L(different)
- .align 4
-L(aligned):
- addi rSTR1, rSTR1, 16
- addi rSTR2, rSTR2, 16
-#ifdef USE_AS_STRNCASECMP
- cmpdi cr7, r5, 16
- blt cr7, L(bytebybyte)
- addi r5, r5, -16
-#endif
- lvx v4, 0, rSTR1
- lvx v5, 0, rSTR2
- CHECKNULLANDCONVERT()
- blt cr6, L(aligned)
-
- /* Calculate and return the difference. */
-L(different):
- vaddubm v1, v3, v3
- vcmpequb v7, v0, v7
-#ifdef __LITTLE_ENDIAN__
- /* Count trailing zero. */
- vspltisb v8, -1
- VADDUQM_V7_V8
- vandc v8, v9, v7
- VPOPCNTD_V8_V8
- vspltb v6, v8, 15
- vcmpequb. v6, v6, v1
- blt cr6, L(shift8)
-#else
- /* Count leading zero. */
- VCLZD_V8_v7
- vspltb v6, v8, 7
- vcmpequb. v6, v6, v1
- blt cr6, L(shift8)
- vsro v8, v8, v1
-#endif
- b L(skipsum)
- .align 4
-L(shift8):
- vsumsws v8, v8, v0
-L(skipsum):
-#ifdef __LITTLE_ENDIAN__
- /* Shift registers based on leading zero count. */
- vsro v6, v5, v8
- vsro v7, v4, v8
- /* Merge and move to GPR. */
- vmrglb v6, v6, v7
- vslo v1, v6, v1
- MFVRD_R3_V1
- /* Place the characters that are different in first position. */
- sldi rSTR2, rRTN, 56
- srdi rSTR2, rSTR2, 56
- sldi rSTR1, rRTN, 48
- srdi rSTR1, rSTR1, 56
-#else
- vslo v6, v5, v8
- vslo v7, v4, v8
- vmrghb v1, v6, v7
- MFVRD_R3_V1
- srdi rSTR2, rRTN, 48
- sldi rSTR2, rSTR2, 56
- srdi rSTR2, rSTR2, 56
- srdi rSTR1, rRTN, 56
-#endif
- subf rRTN, rSTR1, rSTR2
- extsw rRTN, rRTN
- blr
-
- .align 4
- /* OK. We've hit the end of the string. We need to be careful that
- we don't compare two strings as different because of junk beyond
- the end of the strings... */
-L(null_found):
- vaddubm v10, v3, v3
-#ifdef __LITTLE_ENDIAN__
- /* Count trailing zero. */
- vspltisb v8, -1
- VADDUQM_V7_V8
- vandc v8, v9, v7
- VPOPCNTD_V8_V8
- vspltb v6, v8, 15
- vcmpequb. v6, v6, v10
- blt cr6, L(shift_8)
-#else
- /* Count leading zero. */
- VCLZD_V8_v7
- vspltb v6, v8, 7
- vcmpequb. v6, v6, v10
- blt cr6, L(shift_8)
- vsro v8, v8, v10
-#endif
- b L(skipsum1)
- .align 4
-L(shift_8):
- vsumsws v8, v8, v0
-L(skipsum1):
- /* Calculate shift count based on count of zero. */
- vspltisb v10, 7
- vslb v10, v10, v10
- vsldoi v9, v0, v10, 1
- VSUBUDM_V9_V8
- vspltisb v8, 8
- vsldoi v8, v0, v8, 1
- VSUBUDM_V9_V8
- /* Shift and remove junk after null character. */
-#ifdef __LITTLE_ENDIAN__
- vslo v5, v5, v9
- vslo v4, v4, v9
-#else
- vsro v5, v5, v9
- vsro v4, v4, v9
-#endif
- /* Convert and compare 16 bytes. */
- TOLOWER()
- blt cr6, L(retnull)
- b L(different)
- .align 4
-L(retnull):
- li rRTN, 0
- blr
- .align 4
-L(bytebybyte):
- /* Unrolling loop for POWER: loads are done with 'lbz' plus
- offset and string descriptors are only updated in the end
- of loop unrolling. */
- ld rLOC, LOCALE_CTYPE_TOLOWER(rLOC)
- lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
- lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
-#ifdef USE_AS_STRNCASECMP
- rldicl rTMP, r5, 62, 2
- cmpdi cr7, rTMP, 0
- beq cr7, L(lessthan4)
- mtctr rTMP
-#endif
-L(loop):
- cmpdi rCHAR1, 0 /* *s1 == '\0' ? */
- sldi rADDR1, rCHAR1, 2 /* Calculate address for tolower(*s1) */
- sldi rADDR2, rCHAR2, 2 /* Calculate address for tolower(*s2) */
- lwzx rLWR1, rLOC, rADDR1 /* Load tolower(*s1) */
- lwzx rLWR2, rLOC, rADDR2 /* Load tolower(*s2) */
- cmpw cr1, rLWR1, rLWR2 /* r = tolower(*s1) == tolower(*s2) ? */
- crorc 4*cr1+eq,eq,4*cr1+eq /* (*s1 != '\0') || (r == 1) */
- beq cr1, L(done)
- lbz rCHAR1, 1(rSTR1)
- lbz rCHAR2, 1(rSTR2)
- cmpdi rCHAR1, 0
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- lbz rCHAR1, 2(rSTR1)
- lbz rCHAR2, 2(rSTR2)
- cmpdi rCHAR1, 0
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- lbz rCHAR1, 3(rSTR1)
- lbz rCHAR2, 3(rSTR2)
- cmpdi rCHAR1, 0
- /* Increment both string descriptors */
- addi rSTR1, rSTR1, 4
- addi rSTR2, rSTR2, 4
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- lbz rCHAR1, 0(rSTR1) /* Load char from s1 */
- lbz rCHAR2, 0(rSTR2) /* Load char from s2 */
-#ifdef USE_AS_STRNCASECMP
- bdnz L(loop)
-#else
- b L(loop)
-#endif
-#ifdef USE_AS_STRNCASECMP
-L(lessthan4):
- clrldi r5, r5, 62
- cmpdi cr7, r5, 0
- beq cr7, L(retnull)
- mtctr r5
-L(loop1):
- cmpdi rCHAR1, 0
- sldi rADDR1, rCHAR1, 2
- sldi rADDR2, rCHAR2, 2
- lwzx rLWR1, rLOC, rADDR1
- lwzx rLWR2, rLOC, rADDR2
- cmpw cr1, rLWR1, rLWR2
- crorc 4*cr1+eq,eq,4*cr1+eq
- beq cr1, L(done)
- addi rSTR1, rSTR1, 1
- addi rSTR2, rSTR2, 1
- lbz rCHAR1, 0(rSTR1)
- lbz rCHAR2, 0(rSTR2)
- bdnz L(loop1)
-#endif
-L(done):
- subf r0, rLWR2, rLWR1
- extsw rRTN, r0
- blr
-END (__STRCASECMP)
-
-weak_alias (__STRCASECMP, STRCASECMP)
-libc_hidden_builtin_def (__STRCASECMP)
diff --git a/sysdeps/powerpc/powerpc64/power8/strcasestr-ppc64.c b/sysdeps/powerpc/powerpc64/power8/strcasestr-ppc64.c
deleted file mode 100644
index 0e746b7718..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcasestr-ppc64.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Optimized strcasestr implementation for PowerPC64/POWER8.
- Copyright (C) 2016-2017 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 <string.h>
-
-#define STRCASESTR __strcasestr_ppc
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(__name)
-
-#undef weak_alias
-#define weak_alias(a,b)
-extern __typeof (strcasestr) __strcasestr_ppc attribute_hidden;
-
-#include <string/strcasestr.c>
diff --git a/sysdeps/powerpc/powerpc64/power8/strcasestr.S b/sysdeps/powerpc/powerpc64/power8/strcasestr.S
deleted file mode 100644
index 6ac6572f3b..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcasestr.S
+++ /dev/null
@@ -1,538 +0,0 @@
-/* Optimized strcasestr implementation for PowerPC64/POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-#include <locale-defines.h>
-
-/* Char * [r3] strcasestr (char *s [r3], char * pat[r4]) */
-
-/* The performance gain is obtained by comparing 16 bytes. */
-
-/* When the first char of r4 is hit ITERATIONS times in r3
- fallback to default. */
-#define ITERATIONS 64
-
-#ifndef STRCASESTR
-# define STRCASESTR __strcasestr
-#endif
-
-#ifndef STRLEN
-/* For builds without IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define STRLEN __GI_strlen
-# else
-# define STRLEN strlen
-# endif
-#endif
-
-#ifndef STRNLEN
-/* For builds without IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define STRNLEN __GI_strnlen
-# else
-# define STRNLEN __strnlen
-# endif
-#endif
-
-#ifndef STRCHR
-# ifdef SHARED
-# define STRCHR __GI_strchr
-# else
-# define STRCHR strchr
-# endif
-#endif
-
-/* Convert 16 bytes of v4 and reg to lowercase and compare. */
-#define TOLOWER(reg) \
- vcmpgtub v6, v4, v1; \
- vcmpgtub v7, v2, v4; \
- vand v8, v7, v6; \
- vand v8, v8, v3; \
- vor v4, v8, v4; \
- vcmpgtub v6, reg, v1; \
- vcmpgtub v7, v2, reg; \
- vand v8, v7, v6; \
- vand v8, v8, v3; \
- vor reg, v8, reg; \
- vcmpequb. v6, reg, v4;
-
-/* TODO: change these to the actual instructions when the minimum required
- binutils allows it. */
-#ifdef _ARCH_PWR8
-#define VCLZD_V8_v7 vclzd v8, v7;
-#else
-#define VCLZD_V8_v7 .long 0x11003fc2
-#endif
-
-#define FRAMESIZE (FRAME_MIN_SIZE+48)
-/* TODO: change this to .machine power8 when the minimum required binutils
- allows it. */
- .machine power7
-EALIGN (STRCASESTR, 4, 0)
- CALL_MCOUNT 2
- mflr r0 /* Load link register LR to r0. */
- std r31, -8(r1) /* Save callers register r31. */
- std r30, -16(r1) /* Save callers register r30. */
- std r29, -24(r1) /* Save callers register r29. */
- std r28, -32(r1) /* Save callers register r28. */
- std r27, -40(r1) /* Save callers register r27. */
- std r0, 16(r1) /* Store the link register. */
- cfi_offset(r31, -8)
- cfi_offset(r30, -16)
- cfi_offset(r29, -24)
- cfi_offset(r28, -32)
- cfi_offset(r27, -40)
- cfi_offset(lr, 16)
- stdu r1, -FRAMESIZE(r1) /* Create the stack frame. */
- cfi_adjust_cfa_offset(FRAMESIZE)
-
- dcbt 0, r3
- dcbt 0, r4
- cmpdi cr7, r3, 0 /* Input validation. */
- beq cr7, L(retnull)
- cmpdi cr7, r4, 0
- beq cr7, L(retnull)
-
- mr r29, r3
- mr r30, r4
- /* Load first byte from r4 and check if its null. */
- lbz r6, 0(r4)
- cmpdi cr7, r6, 0
- beq cr7, L(ret_r3)
-
- ld r10, __libc_tsd_LOCALE@got@tprel(r2)
- add r9, r10, __libc_tsd_LOCALE@tls
- ld r9, 0(r9)
- ld r9, LOCALE_CTYPE_TOUPPER(r9)
- sldi r10, r6, 2 /* Convert to upper case. */
- lwzx r28, r9, r10
-
- ld r10, __libc_tsd_LOCALE@got@tprel(r2)
- add r11, r10, __libc_tsd_LOCALE@tls
- ld r11, 0(r11)
- ld r11, LOCALE_CTYPE_TOLOWER(r11)
- sldi r10, r6, 2 /* Convert to lower case. */
- lwzx r27, r11, r10
-
- /* Check if the first char is present. */
- mr r4, r27
- bl STRCHR
- nop
- mr r5, r3
- mr r3, r29
- mr r29, r5
- mr r4, r28
- bl STRCHR
- nop
- cmpdi cr7, r29, 0
- beq cr7, L(firstpos)
- cmpdi cr7, r3, 0
- beq cr7, L(skipcheck)
- cmpw cr7, r3, r29
- ble cr7, L(firstpos)
- /* Move r3 to the first occurence. */
-L(skipcheck):
- mr r3, r29
-L(firstpos):
- mr r29, r3
-
- sldi r9, r27, 8
- or r28, r9, r28
- /* Reg r27 is used to count the number of iterations. */
- li r27, 0
- /* If first char of search str is not present. */
- cmpdi cr7, r3, 0
- ble cr7, L(end)
-
- /* Find the length of pattern. */
- mr r3, r30
- bl STRLEN
- nop
-
- cmpdi cr7, r3, 0 /* If search str is null. */
- beq cr7, L(ret_r3)
-
- mr r31, r3
- mr r4, r3
- mr r3, r29
- bl STRNLEN
- nop
-
- cmpd cr7, r3, r31 /* If len(r3) < len(r4). */
- blt cr7, L(retnull)
-
- mr r3, r29
-
- /* Locales not matching ASCII for single bytes. */
- ld r10, __libc_tsd_LOCALE@got@tprel(r2)
- add r9, r10, __libc_tsd_LOCALE@tls
- ld r9, 0(r9)
- ld r7, 0(r9)
- addi r7, r7, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES
- lwz r8, 0(r7)
- cmpdi cr7, r8, 1
- beq cr7, L(bytebybyte)
-
- /* If len(r4) < 16 handle byte by byte. */
- /* For shorter strings we will not use vector registers. */
- cmpdi cr7, r31, 16
- blt cr7, L(bytebybyte)
-
- /* Comparison values used for TOLOWER. */
- /* Load v1 = 64('A' - 1), v2 = 91('Z' + 1), v3 = 32 in each byte. */
- vspltish v0, 0
- vspltisb v5, 2
- vspltisb v4, 4
- vsl v3, v5, v4
- vaddubm v1, v3, v3
- vspltisb v5, 15
- vaddubm v2, v5, v5
- vaddubm v2, v1, v2
- vspltisb v4, -3
- vaddubm v2, v2, v4
-
- /*
- 1. Load 16 bytes from r3 and r4
- 2. Check if there is null, If yes, proceed byte by byte path.
- 3. Else,Convert both to lowercase and compare.
- 4. If they are same proceed to 1.
- 5. If they dont match, find if first char of r4 is present in the
- loaded 16 byte of r3.
- 6. If yes, move position, load next 16 bytes of r3 and proceed to 2.
- */
-
- mr r8, r3 /* Save r3 for future use. */
- mr r4, r30 /* Restore r4. */
- clrldi r10, r4, 60
- lvx v5, 0, r4 /* Load 16 bytes from r4. */
- cmpdi cr7, r10, 0
- beq cr7, L(begin2)
- /* If r4 is unaligned, load another 16 bytes. */
-#ifdef __LITTLE_ENDIAN__
- lvsr v7, 0, r4
-#else
- lvsl v7, 0, r4
-#endif
- addi r5, r4, 16
- lvx v9, 0, r5
-#ifdef __LITTLE_ENDIAN__
- vperm v5, v9, v5, v7
-#else
- vperm v5, v5, v9, v7
-#endif
-L(begin2):
- lvx v4, 0, r3
- vcmpequb. v7, v0, v4 /* Check for null. */
- beq cr6, L(nullchk6)
- b L(trailcheck)
-
- .align 4
-L(nullchk6):
- clrldi r10, r3, 60
- cmpdi cr7, r10, 0
- beq cr7, L(next16)
-#ifdef __LITTLE_ENDIAN__
- lvsr v7, 0, r3
-#else
- lvsl v7, 0, r3
-#endif
- addi r5, r3, 16
- /* If r3 is unaligned, load another 16 bytes. */
- lvx v10, 0, r5
-#ifdef __LITTLE_ENDIAN__
- vperm v4, v10, v4, v7
-#else
- vperm v4, v4, v10, v7
-#endif
-L(next16):
- vcmpequb. v6, v0, v5 /* Check for null. */
- beq cr6, L(nullchk)
- b L(trailcheck)
-
- .align 4
-L(nullchk):
- vcmpequb. v6, v0, v4
- beq cr6, L(nullchk1)
- b L(retnull)
-
- .align 4
-L(nullchk1):
- /* Convert both v3 and v4 to lower. */
- TOLOWER(v5)
- /* If both are same, branch to match. */
- blt cr6, L(match)
- /* Find if the first char is present in next 15 bytes. */
-#ifdef __LITTLE_ENDIAN__
- vspltb v6, v5, 15
- vsldoi v7, v0, v4, 15
-#else
- vspltb v6, v5, 0
- vspltisb v7, 8
- vslo v7, v4, v7
-#endif
- vcmpequb v7, v6, v7
- vcmpequb. v6, v0, v7
- /* Shift r3 by 16 bytes and proceed. */
- blt cr6, L(shift16)
- VCLZD_V8_v7
-#ifdef __LITTLE_ENDIAN__
- vspltb v6, v8, 15
-#else
- vspltb v6, v8, 7
-#endif
- vcmpequb. v6, v6, v1
- /* Shift r3 by 8 bytes and proceed. */
- blt cr6, L(shift8)
- b L(begin)
-
- .align 4
-L(match):
- /* There is a match of 16 bytes, check next bytes. */
- cmpdi cr7, r31, 16
- mr r29, r3
- beq cr7, L(ret_r3)
-
-L(secondmatch):
- addi r3, r3, 16
- addi r4, r4, 16
- /* Load next 16 bytes of r3 and r4 and compare. */
- clrldi r10, r4, 60
- cmpdi cr7, r10, 0
- beq cr7, L(nextload)
- /* Handle unaligned case. */
- vor v6, v9, v9
- vcmpequb. v7, v0, v6
- beq cr6, L(nullchk2)
- b L(trailcheck)
-
- .align 4
-L(nullchk2):
-#ifdef __LITTLE_ENDIAN__
- lvsr v7, 0, r4
-#else
- lvsl v7, 0, r4
-#endif
- addi r5, r4, 16
- /* If r4 is unaligned, load another 16 bytes. */
- lvx v9, 0, r5
-#ifdef __LITTLE_ENDIAN__
- vperm v11, v9, v6, v7
-#else
- vperm v11, v6, v9, v7
-#endif
- b L(compare)
-
- .align 4
-L(nextload):
- lvx v11, 0, r4
-L(compare):
- vcmpequb. v7, v0, v11
- beq cr6, L(nullchk3)
- b L(trailcheck)
-
- .align 4
-L(nullchk3):
- clrldi r10, r3, 60
- cmpdi cr7, r10, 0
- beq cr7, L(nextload1)
- /* Handle unaligned case. */
- vor v4, v10, v10
- vcmpequb. v7, v0, v4
- beq cr6, L(nullchk4)
- b L(retnull)
-
- .align 4
-L(nullchk4):
-#ifdef __LITTLE_ENDIAN__
- lvsr v7, 0, r3
-#else
- lvsl v7, 0, r3
-#endif
- addi r5, r3, 16
- /* If r3 is unaligned, load another 16 bytes. */
- lvx v10, 0, r5
-#ifdef __LITTLE_ENDIAN__
- vperm v4, v10, v4, v7
-#else
- vperm v4, v4, v10, v7
-#endif
- b L(compare1)
-
- .align 4
-L(nextload1):
- lvx v4, 0, r3
-L(compare1):
- vcmpequb. v7, v0, v4
- beq cr6, L(nullchk5)
- b L(retnull)
-
- .align 4
-L(nullchk5):
- /* Convert both v3 and v4 to lower. */
- TOLOWER(v11)
- /* If both are same, branch to secondmatch. */
- blt cr6, L(secondmatch)
- /* Continue the search. */
- b L(begin)
-
- .align 4
-L(trailcheck):
- ld r10, __libc_tsd_LOCALE@got@tprel(r2)
- add r11, r10, __libc_tsd_LOCALE@tls
- ld r11, 0(r11)
- ld r11, LOCALE_CTYPE_TOLOWER(r11)
-L(loop2):
- lbz r5, 0(r3) /* Load byte from r3. */
- lbz r6, 0(r4) /* Load next byte from r4. */
- cmpdi cr7, r6, 0 /* Is it null? */
- beq cr7, L(updater3)
- cmpdi cr7, r5, 0 /* Is it null? */
- beq cr7, L(retnull) /* If yes, return. */
- addi r3, r3, 1
- addi r4, r4, 1 /* Increment r4. */
- sldi r10, r5, 2 /* Convert to lower case. */
- lwzx r10, r11, r10
- sldi r7, r6, 2 /* Convert to lower case. */
- lwzx r7, r11, r7
- cmpw cr7, r7, r10 /* Compare with byte from r4. */
- bne cr7, L(begin)
- b L(loop2)
-
- .align 4
-L(shift8):
- addi r8, r8, 7
- b L(begin)
- .align 4
-L(shift16):
- addi r8, r8, 15
- .align 4
-L(begin):
- addi r8, r8, 1
- mr r3, r8
- /* When our iterations exceed ITERATIONS,fall back to default. */
- addi r27, r27, 1
- cmpdi cr7, r27, ITERATIONS
- beq cr7, L(default)
- mr r4, r30 /* Restore r4. */
- b L(begin2)
-
- /* Handling byte by byte. */
- .align 4
-L(loop1):
- mr r3, r8
- addi r27, r27, 1
- cmpdi cr7, r27, ITERATIONS
- beq cr7, L(default)
- mr r29, r8
- srdi r4, r28, 8
- /* Check if the first char is present. */
- bl STRCHR
- nop
- mr r5, r3
- mr r3, r29
- mr r29, r5
- sldi r4, r28, 56
- srdi r4, r4, 56
- bl STRCHR
- nop
- cmpdi cr7, r29, 0
- beq cr7, L(nextpos)
- cmpdi cr7, r3, 0
- beq cr7, L(skipcheck1)
- cmpw cr7, r3, r29
- ble cr7, L(nextpos)
- /* Move r3 to first occurence. */
-L(skipcheck1):
- mr r3, r29
-L(nextpos):
- mr r29, r3
- cmpdi cr7, r3, 0
- ble cr7, L(retnull)
-L(bytebybyte):
- ld r10, __libc_tsd_LOCALE@got@tprel(r2)
- add r11, r10, __libc_tsd_LOCALE@tls
- ld r11, 0(r11)
- ld r11, LOCALE_CTYPE_TOLOWER(r11)
- mr r4, r30 /* Restore r4. */
- mr r8, r3 /* Save r3. */
- addi r8, r8, 1
-
-L(loop):
- addi r3, r3, 1
- lbz r5, 0(r3) /* Load byte from r3. */
- addi r4, r4, 1 /* Increment r4. */
- lbz r6, 0(r4) /* Load next byte from r4. */
- cmpdi cr7, r6, 0 /* Is it null? */
- beq cr7, L(updater3)
- cmpdi cr7, r5, 0 /* Is it null? */
- beq cr7, L(retnull) /* If yes, return. */
- sldi r10, r5, 2 /* Convert to lower case. */
- lwzx r10, r11, r10
- sldi r7, r6, 2 /* Convert to lower case. */
- lwzx r7, r11, r7
- cmpw cr7, r7, r10 /* Compare with byte from r4. */
- bne cr7, L(loop1)
- b L(loop)
-
- /* Handling return values. */
- .align 4
-L(updater3):
- subf r3, r31, r3 /* Reduce r31 (len of r4) from r3. */
- b L(end)
-
- .align 4
-L(ret_r3):
- mr r3, r29 /* Return point of match. */
- b L(end)
-
- .align 4
-L(retnull):
- li r3, 0 /* Substring was not found. */
- b L(end)
-
- .align 4
-L(default):
- mr r4, r30
- bl __strcasestr_ppc
- nop
-
- .align 4
-L(end):
- addi r1, r1, FRAMESIZE /* Restore stack pointer. */
- cfi_adjust_cfa_offset(-FRAMESIZE)
- ld r0, 16(r1) /* Restore the saved link register. */
- ld r27, -40(r1)
- ld r28, -32(r1)
- ld r29, -24(r1) /* Restore callers save register r29. */
- ld r30, -16(r1) /* Restore callers save register r30. */
- ld r31, -8(r1) /* Restore callers save register r31. */
- cfi_restore(lr)
- cfi_restore(r27)
- cfi_restore(r28)
- cfi_restore(r29)
- cfi_restore(r30)
- cfi_restore(r31)
- mtlr r0 /* Branch to link register. */
- blr
-END (STRCASESTR)
-
-weak_alias (__strcasestr, strcasestr)
-libc_hidden_def (__strcasestr)
-libc_hidden_builtin_def (strcasestr)
diff --git a/sysdeps/powerpc/powerpc64/power8/strchr.S b/sysdeps/powerpc/powerpc64/power8/strchr.S
deleted file mode 100644
index e0c185c162..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strchr.S
+++ /dev/null
@@ -1,377 +0,0 @@
-/* Optimized strchr implementation for PowerPC64/POWER8.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-#ifdef USE_AS_STRCHRNUL
-# ifndef STRCHRNUL
-# define FUNC_NAME __strchrnul
-# else
-# define FUNC_NAME STRCHRNUL
-# endif
-#else
-# ifndef STRCHR
-# define FUNC_NAME strchr
-# else
-# define FUNC_NAME STRCHR
-# endif
-#endif /* !USE_AS_STRCHRNUL */
-
-/* int [r3] strchr (char *s [r3], int c [r4]) */
-/* TODO: change these to the actual instructions when the minimum required
- binutils allows it. */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b) .long (0x1000054c \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-/* TODO: change this to .machine power8 when the minimum required binutils
- allows it. */
- .machine power7
-ENTRY (FUNC_NAME)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
- cmpdi cr7,r4,0
- ld r12,0(r8) /* Load doubleword from memory. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
-
- beq cr7,L(null_match)
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- /* Now r4 has a doubleword of c bytes and r0 has
- a doubleword of null bytes. */
-
- cmpb r10,r12,r4 /* Compare each byte against c byte. */
- cmpb r11,r12,r0 /* Compare each byte against null byte. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- srd r11,r11,r6
- sld r10,r10,r6
- sld r11,r11,r6
-#else
- sld r10,r10,r6
- sld r11,r11,r6
- srd r10,r10,r6
- srd r11,r11,r6
-#endif
- or r5,r10,r11 /* OR the results to speed things up. */
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a doubleword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r9,16(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- cmpb r6,r9,r4
- cmpb r7,r9,r0
- or r5,r10,r11
- or r9,r6,r7
- or r12,r5,r9
- cmpdi cr7,r12,0
- beq cr7,L(vector)
- /* OK, one (or both) of the doublewords contains a c/null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c/null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The c/null byte must be in the second doubleword. Adjust the
- address again and move the result of cmpb to r10 so we can calculate
- the pointer. */
-
- mr r10,r6
- mr r11,r7
- addi r8,r8,8
-#ifdef USE_AS_STRCHRNUL
- mr r5, r9
-#endif
- /* r10/r11 have the output of the cmpb instructions, that is,
- 0xff in the same position as the c/null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done):
-#ifdef USE_AS_STRCHRNUL
- mr r10, r5
-#endif
-#ifdef __LITTLE_ENDIAN__
- addi r3,r10,-1
- andc r3,r3,r10
- popcntd r0,r3
-# ifndef USE_AS_STRCHRNUL
- addi r4,r11,-1
- andc r4,r4,r11
- cmpld cr7,r3,r4
- bgt cr7,L(no_match)
-# endif
-#else
- cntlzd r0,r10 /* Count leading zeros before c matches. */
-# ifndef USE_AS_STRCHRNUL
- cmpld cr7,r11,r10
- bgt cr7,L(no_match)
-# endif
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching c byte
- or null in case c was not found. */
- blr
-
- /* Check the first 32B in GPR's and move to vectorized loop. */
- .p2align 5
-L(vector):
- addi r3, r8, 8
- andi. r10, r3, 31
- bne cr0, L(loop)
- vspltisb v0, 0
- /* Precompute vbpermq constant. */
- vspltisb v10, 3
- lvsl v11, r0, r0
- vslb v10, v11, v10
- MTVRD(v1,r4)
- li r5, 16
- vspltb v1, v1, 7
- /* Compare 32 bytes in each loop. */
-L(continue):
- lvx v4, 0, r3
- lvx v5, r3, r5
- vcmpequb v2, v0, v4
- vcmpequb v3, v0, v5
- vcmpequb v6, v1, v4
- vcmpequb v7, v1, v5
- vor v8, v2, v3
- vor v9, v6, v7
- vor v11, v8, v9
- vcmpequb. v11, v0, v11
- addi r3, r3, 32
- blt cr6, L(continue)
- /* One (or both) of the quadwords contains a c/null byte. */
- addi r3, r3, -32
-#ifndef USE_AS_STRCHRNUL
- vcmpequb. v11, v0, v9
- blt cr6, L(no_match)
-#endif
- /* Permute the first bit of each byte into bits 48-63. */
- VBPERMQ(v2, v2, v10)
- VBPERMQ(v3, v3, v10)
- VBPERMQ(v6, v6, v10)
- VBPERMQ(v7, v7, v10)
- /* Shift each component into its correct position for merging. */
-#ifdef __LITTLE_ENDIAN__
- vsldoi v3, v3, v3, 2
- vsldoi v7, v7, v7, 2
-#else
- vsldoi v2, v2, v2, 6
- vsldoi v3, v3, v3, 4
- vsldoi v6, v6, v6, 6
- vsldoi v7, v7, v7, 4
-#endif
-
- /* Merge the results and move to a GPR. */
- vor v1, v3, v2
- vor v2, v6, v7
- vor v4, v1, v2
- MFVRD(r5, v4)
-#ifdef __LITTLE_ENDIAN__
- addi r6, r5, -1
- andc r6, r6, r5
- popcntd r6, r6
-#else
- cntlzd r6, r5 /* Count leading zeros before the match. */
-#endif
- add r3, r3, r6 /* Compute final length. */
- /* Return NULL if null found before c. */
-#ifndef USE_AS_STRCHRNUL
- lbz r4, 0(r3)
- cmpdi cr7, r4, 0
- beq cr7, L(no_match)
-#endif
- blr
-
-#ifndef USE_AS_STRCHRNUL
- .align 4
-L(no_match):
- li r3,0
- blr
-#endif
-
-/* We are here because strchr was called with a null byte. */
- .align 4
-L(null_match):
- /* r0 has a doubleword of null bytes. */
-
- cmpb r5,r12,r0 /* Compare each byte against null bytes. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r5,r5,r6
- sld r5,r5,r6
-#else
- sld r5,r5,r6
- srd r5,r5,r6
-#endif
- cmpdi cr7,r5,0 /* If r10 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done_null)
-
- mtcrf 0x01,r8
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bt 28,L(loop_null)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r5,r12,r0
- cmpdi cr7,r5,0
- bne cr7,L(done_null)
- b L(loop_null) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop_null):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r5,r12,r0
- cmpb r10,r11,r0
- or r6,r5,r10
- cmpdi cr7,r6,0
- beq cr7,L(vector1)
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done_null)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- pointer. */
-
- mr r5,r10
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done_null):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert leading zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching null byte. */
- blr
- .p2align 5
-L(vector1):
- addi r3, r8, 8
- andi. r10, r3, 31
- bne cr0, L(loop_null)
- vspltisb v8, -1
- vspltisb v0, 0
- vspltisb v10, 3
- lvsl v11, r0, r0
- vslb v10, v11, v10
- li r5, 16
-L(continue1):
- lvx v4, 0, r3
- lvx v5, r3, r5
- vcmpequb v2, v0, v4
- vcmpequb v3, v0, v5
- vor v8, v2, v3
- vcmpequb. v11, v0, v8
- addi r3, r3, 32
- blt cr6, L(continue1)
- addi r3, r3, -32
-L(end1):
- VBPERMQ(v2, v2, v10)
- VBPERMQ(v3, v3, v10)
- /* Shift each component into its correct position for merging. */
-#ifdef __LITTLE_ENDIAN__
- vsldoi v3, v3, v3, 2
-#else
- vsldoi v2, v2, v2, 6
- vsldoi v3, v3, v3, 4
-#endif
-
- /* Merge the results and move to a GPR. */
- vor v4, v3, v2
- MFVRD(r5, v4)
-#ifdef __LITTLE_ENDIAN__
- addi r6, r5, -1
- andc r6, r6, r5
- popcntd r6, r6
-#else
- cntlzd r6, r5 /* Count leading zeros before the match. */
-#endif
- add r3, r3, r6 /* Compute final length. */
- blr
-END (FUNC_NAME)
-
-#ifndef USE_AS_STRCHRNUL
-weak_alias (strchr, index)
-libc_hidden_builtin_def (strchr)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/strchrnul.S b/sysdeps/powerpc/powerpc64/power8/strchrnul.S
deleted file mode 100644
index 3bf4b275dd..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strchrnul.S
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Optimized strchrnul implementation for PowerPC64/POWER8.
- Copyright (C) 2016-2017 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 USE_AS_STRCHRNUL 1
-#include <sysdeps/powerpc/powerpc64/power8/strchr.S>
-
-weak_alias (__strchrnul,strchrnul)
-libc_hidden_builtin_def (__strchrnul)
diff --git a/sysdeps/powerpc/powerpc64/power8/strcmp.S b/sysdeps/powerpc/powerpc64/power8/strcmp.S
deleted file mode 100644
index 770484f1e1..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcmp.S
+++ /dev/null
@@ -1,247 +0,0 @@
-/* Optimized strcmp implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#ifndef STRCMP
-# define STRCMP strcmp
-#endif
-
-/* Implements the function
-
- size_t [r3] strcmp (const char *s1 [r3], const char *s2 [r4])
-
- The implementation uses unaligned doubleword access to avoid specialized
- code paths depending of data alignment. Although recent powerpc64 uses
- 64K as default, the page cross handling assumes minimum page size of
- 4k. */
-
-EALIGN (STRCMP, 4, 0)
- li r0,0
-
- /* Check if [s1]+16 or [s2]+16 will cross a 4K page boundary using
- the code:
-
- (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE))
-
- with PAGE_SIZE being 4096 and ITER_SIZE begin 16. */
-
- rldicl r7,r3,0,52
- rldicl r9,r4,0,52
- cmpldi cr7,r7,4096-16
- bgt cr7,L(pagecross_check)
- cmpldi cr5,r9,4096-16
- bgt cr5,L(pagecross_check)
-
- /* For short string up to 16 bytes, load both s1 and s2 using
- unaligned dwords and compare. */
- ld r8,0(r3)
- ld r10,0(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- ld r8,8(r3)
- ld r10,8(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- addi r7,r3,16
- addi r4,r4,16
-
-L(align_8b):
- /* Now it has checked for first 16 bytes, align source1 to doubleword
- and adjust source2 address. */
- rldicl r9,r7,0,61 /* source1 alignment to doubleword */
- subf r4,r9,r4 /* Adjust source2 address based on source1
- alignment. */
- rldicr r7,r7,0,60 /* Align source1 to doubleword. */
-
- /* At this point, source1 alignment is 0 and source2 alignment is
- between 0 and 7. Check is source2 alignment is 0, meaning both
- sources have the same alignment. */
- andi. r9,r4,0x7
- bne cr0,L(loop_diff_align)
-
- /* If both source1 and source2 are doubleword aligned, there is no
- need for page boundary cross checks. */
-
- ld r8,0(r7)
- ld r10,0(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- .align 4
-L(loop_equal_align):
- ld r8,8(r7)
- ld r10,8(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- ld r8,16(r7)
- ld r10,16(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- ldu r8,24(r7)
- ldu r10,24(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
-
- b L(loop_equal_align)
-
- /* A zero byte was found in r8 (s1 dword), r9 contains the cmpb
- result and r10 the dword from s2. To code isolate the byte
- up to end (including the '\0'), masking with 0xFF the remaining
- ones:
-
- #if __LITTLE_ENDIAN__
- (__builtin_ffsl (x) - 1) = counting trailing zero bits
- r9 = (__builtin_ffsl (r9) - 1) + 8;
- r9 = -1UL << r9
- #else
- r9 = __builtin_clzl (r9) + 8;
- r9 = -1UL >> r9
- #endif
- r8 = r8 | r9
- r10 = r10 | r9 */
-
-#ifdef __LITTLE_ENDIAN__
- nor r9,r9,r9
-L(different_nocmpb):
- neg r3,r9
- and r9,r9,r3
- cntlzd r9,r9
- subfic r9,r9,63
-#else
- not r9,r9
-L(different_nocmpb):
- cntlzd r9,r9
- subfic r9,r9,56
-#endif
- srd r3,r8,r9
- srd r10,r10,r9
- rldicl r10,r10,0,56
- rldicl r3,r3,0,56
- subf r3,r10,r3
- extsw r3,r3
- blr
-
- .align 4
-L(pagecross_check):
- subfic r9,r9,4096
- subfic r7,r7,4096
- cmpld cr7,r7,r9
- bge cr7,L(pagecross)
- mr r7,r9
-
- /* If unaligned 16 bytes reads across a 4K page boundary, it uses
- a simple byte a byte comparison until the page alignment for s1
- is reached. */
-L(pagecross):
- add r7,r3,r7
- subf r9,r3,r7
- mtctr r9
-
- .align 4
-L(pagecross_loop):
- /* Loads a byte from s1 and s2, compare if *s1 is equal to *s2
- and if *s1 is '\0'. */
- lbz r9,0(r3)
- lbz r10,0(r4)
- addi r3,r3,1
- addi r4,r4,1
- cmplw cr7,r9,r10
- cmpdi cr5,r9,r0
- bne cr7,L(pagecross_ne)
- beq cr5,L(pagecross_nullfound)
- bdnz L(pagecross_loop)
- b L(align_8b)
-
- .align 4
- /* The unaligned read of source2 will cross a 4K page boundary,
- and the different byte or NULL maybe be in the remaining page
- bytes. Since it can not use the unaligned load, the algorithm
- reads and compares 8 bytes to keep source1 doubleword aligned. */
-L(check_source2_byte):
- li r9,8
- mtctr r9
-
- .align 4
-L(check_source2_byte_loop):
- lbz r9,0(r7)
- lbz r10,0(r4)
- addi r7,r7,1
- addi r4,r4,1
- cmplw cr7,r9,10
- cmpdi r5,r9,0
- bne cr7,L(pagecross_ne)
- beq cr5,L(pagecross_nullfound)
- bdnz L(check_source2_byte_loop)
-
- /* If source2 is unaligned to doubleword, the code needs to check
- on each interation if the unaligned doubleword access will cross
- a 4k page boundary. */
- .align 5
-L(loop_unaligned):
- ld r8,0(r7)
- ld r10,0(r4)
- cmpb r12,r8,r0
- cmpb r11,r8,r10
- orc. r9,r12,r11
- bne cr0,L(different_nocmpb)
- addi r7,r7,8
- addi r4,r4,8
-
-L(loop_diff_align):
- /* Check if [src2]+8 cross a 4k page boundary:
-
- srcin2 % PAGE_SIZE > (PAGE_SIZE - 8)
-
- with PAGE_SIZE being 4096. */
- rldicl r9,r4,0,52
- cmpldi cr7,r9,4088
- ble cr7,L(loop_unaligned)
- b L(check_source2_byte)
-
- .align 4
-L(pagecross_ne):
- extsw r3,r9
- mr r9,r10
-L(pagecross_retdiff):
- subf r9,r9,r3
- extsw r3,r9
- blr
-
- .align 4
-L(pagecross_nullfound):
- li r3,0
- b L(pagecross_retdiff)
-END (STRCMP)
-libc_hidden_builtin_def (strcmp)
diff --git a/sysdeps/powerpc/powerpc64/power8/strcpy.S b/sysdeps/powerpc/powerpc64/power8/strcpy.S
deleted file mode 100644
index 7f2cee4b1b..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcpy.S
+++ /dev/null
@@ -1,270 +0,0 @@
-/* Optimized strcpy/stpcpy implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#ifdef USE_AS_STPCPY
-# ifndef STPCPY
-# define FUNC_NAME __stpcpy
-# else
-# define FUNC_NAME STPCPY
-# endif
-#else
-# ifndef STRCPY
-# define FUNC_NAME strcpy
-# else
-# define FUNC_NAME STRCPY
-# endif
-#endif /* !USE_AS_STPCPY */
-
-/* Implements the function
-
- char * [r3] strcpy (char *dest [r3], const char *src [r4])
-
- or
-
- char * [r3] stpcpy (char *dest [r3], const char *src [r4])
-
- if USE_AS_STPCPY is defined.
-
- The implementation uses unaligned doubleword access to avoid specialized
- code paths depending of data alignment. Although recent powerpc64 uses
- 64K as default, the page cross handling assumes minimum page size of
- 4k. */
-
- .machine power7
-EALIGN (FUNC_NAME, 4, 0)
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- /* Check if the [src]+15 will cross a 4K page by checking if the bit
- indicating the page size changes. Basically:
-
- uint64_t srcin = (uint64_t)src;
- uint64_t ob = srcin & 4096UL;
- uint64_t nb = (srcin+15UL) & 4096UL;
- if (ob ^ nb)
- goto pagecross; */
-
- addi r9,r4,15
- xor r9,r9,r4
- rlwinm. r9,r9,0,19,19
- bne L(pagecross)
-
- /* For short string (less than 16 bytes), just calculate its size as
- strlen and issues a memcpy if null is found. */
- mr r7,r4
- ld r12,0(r7) /* Load doubleword from memory. */
- cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */
- cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */
- bne cr7,L(done)
-
- ldu r8,8(r7)
- cmpb r10,r8,r0
- cmpdi cr7,r10,0
- bne cr7,L(done)
-
- b L(loop_before)
-
- .align 4
-L(pagecross):
- clrrdi r7,r4,3 /* Align the address to doubleword boundary. */
- rlwinm r6,r4,3,26,28 /* Calculate padding. */
- li r5,-1 /* MASK = 0xffffffffffffffff. */
- ld r12,0(r7) /* Load doubleword from memory. */
-#ifdef __LITTLE_ENDIAN__
- sld r5,r5,r6
-#else
- srd r5,r5,r6 /* MASK = MASK >> padding. */
-#endif
- orc r9,r12,r5 /* Mask bits that are not part of the string. */
- cmpb r10,r9,r0 /* Check for null bytes in DWORD1. */
- cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */
- bne cr7,L(done)
-
- ldu r6,8(r7)
- cmpb r10,r6,r0
- cmpdi cr7,r10,0
- bne cr7,L(done)
-
- ld r12,0(r7)
- cmpb r10,r12,r0
- cmpdi cr7,r10,0
- bne cr7,L(done)
-
- ldu r6,8(r7)
- cmpb r10,r6,r0
- cmpdi cr7,r10,0
- bne cr7,L(done)
-
- /* We checked for 24 - x bytes, with x being the source alignment
- (0 <= x <= 16), and no zero has been found. Start the loop
- copy with doubleword aligned address. */
- mr r7,r4
- ld r12, 0(r7)
- ldu r8, 8(r7)
-
-L(loop_before):
- /* Save the two doublewords readed from source and align the source
- to 16 bytes for the loop. */
- mr r11,r3
- std r12,0(r11)
- std r8,8(r11)
- addi r11,r11,16
- rldicl r9,r4,0,60
- subf r7,r9,r7
- subf r11,r9,r11
- b L(loop_start)
-
- .align 5
-L(loop):
- std r12, 0(r11)
- std r6, 8(r11)
- addi r11,r11,16
-L(loop_start):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
-
- ld r12, 8(r7)
- ldu r6, 16(r7)
- cmpb r10,r12,r0
- cmpb r9,r6,r0
- or r8,r9,r10 /* Merge everything in one doubleword. */
- cmpdi cr7,r8,0
- beq cr7,L(loop)
-
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- addi r4,r7,-8
- cmpdi cr6,r10,0
- addi r7,r7,-8
- bne cr6,L(done2)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- length. */
-
- mr r10,r9
- addi r7,r7,8
- b L(done2)
-
- /* r10 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the length. */
-L(done):
- mr r11,r3
-L(done2):
-#ifdef __LITTLE_ENDIAN__
- addi r9, r10, -1 /* Form a mask from trailing zeros. */
- andc r9, r9, r10
- popcntd r6, r9 /* Count the bits in the mask. */
-#else
- cntlzd r6,r10 /* Count leading zeros before the match. */
-#endif
- subf r5,r4,r7
- srdi r6,r6,3 /* Convert leading/trailing zeros to bytes. */
- add r8,r5,r6 /* Compute final length. */
-#ifdef USE_AS_STPCPY
- /* stpcpy returns the dest address plus the size not counting the
- final '\0'. */
- add r3,r11,r8
-#endif
- addi r8,r8,1 /* Final '/0'. */
-
- cmpldi cr6,r8,8
- mtocrf 0x01,r8
- ble cr6,L(copy_LE_8)
-
- cmpldi cr1,r8,16
- blt cr1,8f
-
- /* Handle copies of 0~31 bytes. */
- .align 4
-L(copy_LT_32):
- /* At least 6 bytes to go. */
- blt cr1,8f
-
- /* Copy 16 bytes. */
- ld r6,0(r4)
- ld r8,8(r4)
- addi r4,r4,16
- std r6,0(r11)
- std r8,8(r11)
- addi r11,r11,16
-8: /* Copy 8 bytes. */
- bf 28,L(tail4)
- ld r6,0(r4)
- addi r4,r4,8
- std r6,0(r11)
- addi r11,r11,8
-
- .align 4
-/* Copies 4~7 bytes. */
-L(tail4):
- bf 29,L(tail2)
- lwz r6,0(r4)
- stw r6,0(r11)
- bf 30,L(tail5)
- lhz r7,4(r4)
- sth r7,4(r11)
- bflr 31
- lbz r8,6(r4)
- stb r8,6(r11)
- blr
-
- .align 4
-/* Copies 2~3 bytes. */
-L(tail2):
- bf 30,1f
- lhz r6,0(r4)
- sth r6,0(r11)
- bflr 31
- lbz r7,2(r4)
- stb r7,2(r11)
- blr
-
- .align 4
-L(tail5):
- bf 31,1f
- lbz r6,4(r4)
- stb r6,4(r11)
- blr
-
- .align 4
-1:
- bflr 31
- lbz r6,0(r4)
- stb r6,0(r11)
- blr
-
-/* Handles copies of 0~8 bytes. */
- .align 4
-L(copy_LE_8):
- bne cr6,L(tail4)
- ld r6,0(r4)
- std r6,0(r11)
- blr
-END (FUNC_NAME)
-
-#ifndef USE_AS_STPCPY
-libc_hidden_builtin_def (strcpy)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/strcspn.S b/sysdeps/powerpc/powerpc64/power8/strcspn.S
deleted file mode 100644
index c9a7a2e3c3..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strcspn.S
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Optimized strcspn implementation for PowerPC64/POWER8.
- Copyright (C) 2016-2017 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 USE_AS_STRCSPN 1
-#include <sysdeps/powerpc/powerpc64/power8/strspn.S>
diff --git a/sysdeps/powerpc/powerpc64/power8/strlen.S b/sysdeps/powerpc/powerpc64/power8/strlen.S
deleted file mode 100644
index 8f4a1fc1dc..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strlen.S
+++ /dev/null
@@ -1,301 +0,0 @@
-/* Optimized strlen implementation for PowerPC64/POWER8 using a vectorized
- loop.
- Copyright (C) 2016-2017 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 <sysdep.h>
-
-/* TODO: change these to the actual instructions when the minimum required
- binutils allows it. */
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b) .long (0x1000054c \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-/* int [r3] strlen (char *s [r3]) */
-
-#ifndef STRLEN
-# define STRLEN strlen
-#endif
-
-/* TODO: change this to .machine power8 when the minimum required binutils
- allows it. */
- .machine power7
-EALIGN (STRLEN, 4, 0)
- CALL_MCOUNT 1
- dcbt 0,r3
- clrrdi r4,r3,3 /* Align the address to doubleword boundary. */
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
- li r5,-1 /* MASK = 0xffffffffffffffff. */
- ld r12,0(r4) /* Load doubleword from memory. */
-#ifdef __LITTLE_ENDIAN__
- sld r5,r5,r6
-#else
- srd r5,r5,r6 /* MASK = MASK >> padding. */
-#endif
- orc r9,r12,r5 /* Mask bits that are not part of the string. */
- cmpb r10,r9,r0 /* Check for null bytes in DWORD1. */
- cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */
- bne cr7,L(done)
-
- /* For shorter strings (< 64 bytes), we will not use vector registers,
- as the overhead isn't worth it. So, let's use GPRs instead. This
- will be done the same way as we do in the POWER7 implementation.
- Let's see if we are aligned to a quadword boundary. If so, we can
- jump to the first (non-vectorized) loop. Otherwise, we have to
- handle the next DWORD first. */
- mtcrf 0x01,r4
- mr r9,r4
- addi r9,r9,8
- bt 28,L(align64)
-
- /* Handle the next 8 bytes so we are aligned to a quadword
- boundary. */
- ldu r5,8(r4)
- cmpb r10,r5,r0
- cmpdi cr7,r10,0
- addi r9,r9,8
- bne cr7,L(done)
-
-L(align64):
- /* Proceed to the old (POWER7) implementation, checking two doublewords
- per iteraction. For the first 56 bytes, we will just check for null
- characters. After that, we will also check if we are 64-byte aligned
- so we can jump to the vectorized implementation. We will unroll
- these loops to avoid excessive branching. */
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- /* Are we 64-byte aligned? If so, jump to the vectorized loop.
- Note: aligning to 64-byte will necessarily slow down performance for
- strings around 64 bytes in length due to the extra comparisons
- required to check alignment for the vectorized loop. This is a
- necessary tradeoff we are willing to take in order to speed up the
- calculation for larger strings. */
- andi. r10,r9,63
- beq cr0,L(preloop)
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- andi. r10,r9,63
- beq cr0,L(preloop)
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- andi. r10,r9,63
- beq cr0,L(preloop)
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
- bne cr7,L(dword_zero)
-
- andi. r10,r9,63
- beq cr0,L(preloop)
- ld r6,8(r4)
- ldu r5,16(r4)
- cmpb r10,r6,r0
- cmpb r11,r5,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- addi r9,r9,16
-
- /* At this point, we are necessarily 64-byte aligned. If no zeroes were
- found, jump to the vectorized loop. */
- beq cr7,L(preloop)
-
-L(dword_zero):
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r10,0
- addi r4,r4,-8
- bne cr6,L(done)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- length. */
-
- mr r10,r11
- addi r4,r4,8
-
- /* If the null byte was found in the non-vectorized code, compute the
- final length. r10 has the output of the cmpb instruction, that is,
- it contains 0xff in the same position as the null byte in the
- original doubleword from the string. Use that to calculate the
- length. */
-L(done):
-#ifdef __LITTLE_ENDIAN__
- addi r9, r10,-1 /* Form a mask from trailing zeros. */
- andc r9, r9,r10
- popcntd r0, r9 /* Count the bits in the mask. */
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- subf r5,r3,r4
- srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */
- add r3,r5,r0 /* Compute final length. */
- blr
-
- /* Vectorized implementation starts here. */
- .p2align 4
-L(preloop):
- /* Set up for the loop. */
- mr r4,r9
- li r7, 16 /* Load required offsets. */
- li r8, 32
- li r9, 48
- li r12, 8
- vxor v0,v0,v0 /* VR with null chars to use with
- vcmpequb. */
-
- /* Main loop to look for the end of the string. We will read in
- 64-byte chunks. Align it to 32 bytes and unroll it 3 times to
- leverage the icache performance. */
- .p2align 5
-L(loop):
- lvx v1,r4,r0 /* Load 4 quadwords. */
- lvx v2,r4,r7
- lvx v3,r4,r8
- lvx v4,r4,r9
- vminub v5,v1,v2 /* Compare and merge into one VR for speed. */
- vminub v6,v3,v4
- vminub v7,v5,v6
- vcmpequb. v7,v7,v0 /* Check for NULLs. */
- addi r4,r4,64 /* Adjust address for the next iteration. */
- bne cr6,L(vmx_zero)
-
- lvx v1,r4,r0 /* Load 4 quadwords. */
- lvx v2,r4,r7
- lvx v3,r4,r8
- lvx v4,r4,r9
- vminub v5,v1,v2 /* Compare and merge into one VR for speed. */
- vminub v6,v3,v4
- vminub v7,v5,v6
- vcmpequb. v7,v7,v0 /* Check for NULLs. */
- addi r4,r4,64 /* Adjust address for the next iteration. */
- bne cr6,L(vmx_zero)
-
- lvx v1,r4,r0 /* Load 4 quadwords. */
- lvx v2,r4,r7
- lvx v3,r4,r8
- lvx v4,r4,r9
- vminub v5,v1,v2 /* Compare and merge into one VR for speed. */
- vminub v6,v3,v4
- vminub v7,v5,v6
- vcmpequb. v7,v7,v0 /* Check for NULLs. */
- addi r4,r4,64 /* Adjust address for the next iteration. */
- beq cr6,L(loop)
-
-L(vmx_zero):
- /* OK, we found a null byte. Let's look for it in the current 64-byte
- block and mark it in its corresponding VR. */
- vcmpequb v1,v1,v0
- vcmpequb v2,v2,v0
- vcmpequb v3,v3,v0
- vcmpequb v4,v4,v0
-
- /* We will now 'compress' the result into a single doubleword, so it
- can be moved to a GPR for the final calculation. First, we
- generate an appropriate mask for vbpermq, so we can permute bits into
- the first halfword. */
- vspltisb v10,3
- lvsl v11,r0,r0
- vslb v10,v11,v10
-
- /* Permute the first bit of each byte into bits 48-63. */
- VBPERMQ(v1,v1,v10)
- VBPERMQ(v2,v2,v10)
- VBPERMQ(v3,v3,v10)
- VBPERMQ(v4,v4,v10)
-
- /* Shift each component into its correct position for merging. */
-#ifdef __LITTLE_ENDIAN__
- vsldoi v2,v2,v2,2
- vsldoi v3,v3,v3,4
- vsldoi v4,v4,v4,6
-#else
- vsldoi v1,v1,v1,6
- vsldoi v2,v2,v2,4
- vsldoi v3,v3,v3,2
-#endif
-
- /* Merge the results and move to a GPR. */
- vor v1,v2,v1
- vor v2,v3,v4
- vor v4,v1,v2
- MFVRD(r10,v4)
-
- /* Adjust address to the begninning of the current 64-byte block. */
- addi r4,r4,-64
-
-#ifdef __LITTLE_ENDIAN__
- addi r9, r10,-1 /* Form a mask from trailing zeros. */
- andc r9, r9,r10
- popcntd r0, r9 /* Count the bits in the mask. */
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- subf r5,r3,r4
- add r3,r5,r0 /* Compute final length. */
- blr
-
-END (STRLEN)
-libc_hidden_builtin_def (strlen)
diff --git a/sysdeps/powerpc/powerpc64/power8/strncase.S b/sysdeps/powerpc/powerpc64/power8/strncase.S
deleted file mode 100644
index 32e09e4d94..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strncase.S
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Optimized strncasecmp implementation for POWER8.
- Copyright (C) 2016-2017 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 USE_AS_STRNCASECMP 1
-#include <sysdeps/powerpc/powerpc64/power8/strcasecmp.S>
diff --git a/sysdeps/powerpc/powerpc64/power8/strncmp.S b/sysdeps/powerpc/powerpc64/power8/strncmp.S
deleted file mode 100644
index 3d8df90538..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strncmp.S
+++ /dev/null
@@ -1,327 +0,0 @@
-/* Optimized strncmp implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#ifndef STRNCMP
-# define STRNCMP strncmp
-#endif
-
-/* Implements the function
-
- int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n)
-
- The implementation uses unaligned doubleword access to avoid specialized
- code paths depending of data alignment. Although recent powerpc64 uses
- 64K as default, the page cross handling assumes minimum page size of
- 4k. */
-
- .machine power7
-EALIGN (STRNCMP, 4, 0)
- /* Check if size is 0. */
- mr. r10,r5
- beq cr0,L(ret0)
-
- /* Check if [s1]+16 or [s2]+16 will cross a 4K page boundary using
- the code:
-
- (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE))
-
- with PAGE_SIZE being 4096 and ITER_SIZE begin 16. */
- rldicl r8,r3,0,52
- cmpldi cr7,r8,4096-16
- bgt cr7,L(pagecross)
- rldicl r9,r4,0,52
- cmpldi cr7,r9,4096-16
- bgt cr7,L(pagecross)
-
- /* For short string up to 16 bytes, load both s1 and s2 using
- unaligned dwords and compare. */
- ld r7,0(r3)
- ld r9,0(r4)
- li r8,0
- cmpb r8,r7,r8
- cmpb r6,r7,r9
- orc. r8,r8,r6
- bne cr0,L(different1)
-
- /* If the string compared are equal, but size is less or equal
- to 8, return 0. */
- cmpldi cr7,r10,8
- li r9,0
- ble cr7,L(ret1)
- addi r5,r10,-8
-
- ld r7,8(r3)
- ld r9,8(r4)
- cmpb r8,r7,r8
- cmpb r6,r7,r9
- orc. r8,r8,r6
- bne cr0,L(different0)
-
- cmpldi cr7,r5,8
- mr r9,r8
- ble cr7,L(ret1)
-
- /* Update pointers and size. */
- addi r10,r10,-16
- addi r3,r3,16
- addi r4,r4,16
-
- /* Now it has checked for first 16 bytes, align source1 to doubleword
- and adjust source2 address. */
-L(align_8b):
- rldicl r5,r3,0,61
- rldicr r3,r3,0,60
- subf r4,r5,r4
- add r10,r10,r5
-
- /* At this point, source1 alignment is 0 and source2 alignment is
- between 0 and 7. Check is source2 alignment is 0, meaning both
- sources have the same alignment. */
- andi. r8,r4,0x7
- beq cr0,L(loop_eq_align_0)
-
- li r5,0
- b L(loop_ne_align_1)
-
- /* If source2 is unaligned to doubleword, the code needs to check
- on each interation if the unaligned doubleword access will cross
- a 4k page boundary. */
- .align 4
-L(loop_ne_align_0):
- ld r7,0(r3)
- ld r9,0(r4)
- cmpb r8,r7,r5
- cmpb r6,r7,r9
- orc. r8,r8,r6
- bne cr0,L(different1)
-
- cmpldi cr7,r10,8
- ble cr7,L(ret0)
- addi r10,r10,-8
- addi r3,r3,8
- addi r4,r4,8
-L(loop_ne_align_1):
- rldicl r9,r4,0,52
- cmpldi r7,r9,4088
- ble cr7,L(loop_ne_align_0)
- cmpdi cr7,r10,0
- beq cr7,L(ret0)
-
- lbz r9,0(r3)
- lbz r8,0(r4)
- cmplw cr7,r9,r8
- bne cr7,L(byte_ne_4)
- cmpdi cr7,r9,0
- beq cr7,L(size_reached_0)
-
- li r9,r7
- addi r8,r3,1
- mtctr r9
- addi r4,r4,1
- addi r10,r10,-1
- addi r3,r3,8
-
- /* The unaligned read of source2 will cross a 4K page boundary,
- and the different byte or NULL maybe be in the remaining page
- bytes. Since it can not use the unaligned load the algorithm
- reads and compares 8 bytes to keep source1 doubleword aligned. */
- .align 4
-L(loop_ne_align_byte):
- cmpdi cr7,r10,0
- addi r10,r10,-1
- beq cr7,L(ret0)
- lbz r9,0(r8)
- lbz r7,0(r4)
- addi r8,r8,1
- addi r4,r4,1
- cmplw cr7,r9,r7
- cmpdi cr5,r9,0
- bne cr7,L(size_reached_2)
- beq cr5,L(size_reached_0)
- bdnz L(loop_ne_align_byte)
-
- cmpdi cr7,r10,0
- bne+ cr7,L(loop_ne_align_0)
-
- .align 4
-L(ret0):
- li r9,0
-L(ret1):
- mr r3,r9
- blr
-
- /* The code now check if r8 and r10 are different by issuing a
- cmpb and shift the result based on its output:
-
- #ifdef __LITTLE_ENDIAN__
- leadzero = (__builtin_ffsl (z1) - 1);
- leadzero = leadzero > (n-1)*8 ? (n-1)*8 : leadzero;
- r1 = (r1 >> leadzero) & 0xFFUL;
- r2 = (r2 >> leadzero) & 0xFFUL;
- #else
- leadzero = __builtin_clzl (z1);
- leadzero = leadzero > (n-1)*8 ? (n-1)*8 : leadzero;
- r1 = (r1 >> (56 - leadzero)) & 0xFFUL;
- r2 = (r2 >> (56 - leadzero)) & 0xFFUL;
- #endif
- return r1 - r2; */
-
- .align 4
-L(different0):
- mr r10,r5
-#ifdef __LITTLE_ENDIAN__
-L(different1):
- neg r11,r8
- sldi r10,r10,3
- and r8,r11,r8
- addi r10,r10,-8
- cntlzd r8,r8
- subfic r8,r8,63
- extsw r8,r8
- cmpld cr7,r8,r10
- ble cr7,L(different2)
- mr r8,r10
-L(different2):
- extsw r8,r8
-#else
-L(different1):
- addi r10,r10,-1
- cntlzd r8,r8
- sldi r10,r10,3
- cmpld cr7,r8,r10
- blt cr7,L(different2)
- mr r8,r10
-L(different2):
- subfic r8,r8,56
-#endif
- srd r7,r7,r8
- srd r9,r9,r8
- rldicl r3,r7,0,56
- rldicl r9,r9,0,56
- subf r9,r9,3
- extsw r9,r9
- mr r3,r9
- blr
-
- /* If unaligned 16 bytes reads across a 4K page boundary, it uses
- a simple byte a byte comparison until the page alignment for s1
- is reached. */
- .align 4
-L(pagecross):
- lbz r7,0(r3)
- lbz r9,0(r4)
- subfic r8,r8,4095
- cmplw cr7,r9,r7
- bne cr7,L(byte_ne_3)
- cmpdi cr7,r9,0
- beq cr7,L(byte_ne_0)
- addi r10,r10,-1
- subf r7,r8,r10
- subf r9,r7,r10
- addi r9,r9,1
- mtctr r9
- b L(pagecross_loop1)
-
- .align 4
-L(pagecross_loop0):
- beq cr7,L(ret0)
- lbz r9,0(r3)
- lbz r8,0(r4)
- addi r10,r10,-1
- cmplw cr7,r9,r8
- cmpdi cr5,r9,0
- bne r7,L(byte_ne_2)
- beq r5,L(byte_ne_0)
-L(pagecross_loop1):
- cmpdi cr7,r10,0
- addi r3,r3,1
- addi r4,r4,1
- bdnz L(pagecross_loop0)
- cmpdi cr7,r7,0
- li r9,0
- bne+ cr7,L(align_8b)
- b L(ret1)
-
- /* If both source1 and source2 are doubleword aligned, there is no
- need for page boundary cross checks. */
- .align 4
-L(loop_eq_align_0):
- ld r7,0(r3)
- ld r9,0(r4)
- cmpb r8,r7,r8
- cmpb r6,r7,r9
- orc. r8,r8,r6
- bne cr0,L(different1)
-
- cmpldi cr7,r10,8
- ble cr7,L(ret0)
- addi r9,r10,-9
-
- li r5,0
- srdi r9,r9,3
- addi r9,r9,1
- mtctr r9
- b L(loop_eq_align_2)
-
- .align 4
-L(loop_eq_align_1):
- bdz L(ret0)
-L(loop_eq_align_2):
- ldu r7,8(r3)
- addi r10,r10,-8
- ldu r9,8(r4)
- cmpb r8,r7,r5
- cmpb r6,r7,r9
- orc. r8,r8,r6
- beq cr0,L(loop_eq_align_1)
- b L(different1)
-
- .align 4
-L(byte_ne_0):
- li r7,0
-L(byte_ne_1):
- subf r9,r9,r7
- extsw r9,r9
- b L(ret1)
-
- .align 4
-L(byte_ne_2):
- extsw r7,r9
- mr r9,r8
- b L(byte_ne_1)
-L(size_reached_0):
- li r10,0
-L(size_reached_1):
- subf r9,r9,r10
- extsw r9,r9
- b L(ret1)
-L(size_reached_2):
- extsw r10,r9
- mr r9,r7
- b L(size_reached_1)
-L(byte_ne_3):
- extsw r7,r7
- b L(byte_ne_1)
-L(byte_ne_4):
- extsw r10,r9
- mr r9,r8
- b L(size_reached_1)
-END(STRNCMP)
-libc_hidden_builtin_def(strncmp)
diff --git a/sysdeps/powerpc/powerpc64/power8/strncpy.S b/sysdeps/powerpc/powerpc64/power8/strncpy.S
deleted file mode 100644
index 6d40f30ff7..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strncpy.S
+++ /dev/null
@@ -1,465 +0,0 @@
-/* Optimized strncpy/stpncpy implementation for PowerPC64/POWER8.
- Copyright (C) 2015-2017 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 <sysdep.h>
-
-#ifdef USE_AS_STPNCPY
-# ifndef STPNCPY
-# define FUNC_NAME __stpncpy
-# else
-# define FUNC_NAME STPNCPY
-# endif
-#else
-# ifndef STRNCPY
-# define FUNC_NAME strncpy
-# else
-# define FUNC_NAME STRNCPY
-# endif
-#endif /* !USE_AS_STPNCPY */
-
-#ifndef MEMSET
-/* For builds without IFUNC support, local calls should be made to internal
- GLIBC symbol (created by libc_hidden_builtin_def). */
-# ifdef SHARED
-# define MEMSET __GI_memset
-# else
-# define MEMSET memset
-# endif
-#endif
-
-#define FRAMESIZE (FRAME_MIN_SIZE+48)
-
-/* Implements the function
-
- char * [r3] strncpy (char *dest [r3], const char *src [r4], size_t n [r5])
-
- or
-
- char * [r3] stpncpy (char *dest [r3], const char *src [r4], size_t n [r5])
-
- if USE_AS_STPCPY is defined.
-
- The implementation uses unaligned doubleword access to avoid specialized
- code paths depending of data alignment. Although recent powerpc64 uses
- 64K as default, the page cross handling assumes minimum page size of
- 4k. */
-
- .machine power7
-EALIGN (FUNC_NAME, 4, 0)
-
- /* Check if the [src]+15 will cross a 4K page by checking if the bit
- indicating the page size changes. Basically:
-
- uint64_t srcin = (uint64_t)src;
- uint64_t ob = srcin & 4096UL;
- uint64_t nb = (srcin+15UL) & 4096UL;
- if (ob ^ nb)
- goto pagecross; */
-
- addi r10,r4,16
- rlwinm r9,r4,0,19,19
-
- /* Save some non-volatile registers on the stack. */
- std r26,-48(r1)
- std r27,-40(r1)
-
- rlwinm r8,r10,0,19,19
-
- std r28,-32(r1)
- std r29,-24(r1)
-
- cmpld cr7,r9,r8
-
- std r30,-16(r1)
- std r31,-8(r1)
-
- /* Update CFI. */
- cfi_offset(r26, -48)
- cfi_offset(r27, -40)
- cfi_offset(r28, -32)
- cfi_offset(r29, -24)
- cfi_offset(r30, -16)
- cfi_offset(r31, -8)
-
- beq cr7,L(unaligned_lt_16)
- rldicl r9,r4,0,61
- subfic r8,r9,8
- cmpld cr7,r5,r8
- bgt cr7,L(pagecross)
-
- /* At this points there is 1 to 15 bytes to check and write. Since it could
- be either from first unaligned 16 bytes access or from bulk copy, the code
- uses an unrolled byte read/write instead of trying to analyze the cmpb
- results. */
-L(short_path):
- mr r9,r3
-L(short_path_1):
- /* Return if there are no more bytes to be written. */
- cmpdi cr7,r5,0
- beq cr7,L(short_path_loop_end_1)
-L(short_path_2):
- /* Copy one char from src (r4) and write it to dest (r9). If it is the
- end-of-string, start the null padding. Continue, otherwise. */
- lbz r10,0(r4)
- cmpdi cr7,r10,0
- stb r10,0(r9)
- beq cr7,L(zero_pad_start_1)
- /* If there are no more bytes to be written, return. */
- cmpdi cr0,r5,1
- addi r8,r9,1
- addi r6,r5,-1
- beq cr0,L(short_path_loop_end_0)
- /* Copy another char from src (r4) to dest (r9). Check again if it is
- the end-of-string. If so, start the null padding. */
- lbz r10,1(r4)
- cmpdi cr7,r10,0
- stb r10,1(r9)
- beq cr7,L(zero_pad_start_prepare_1)
- /* Eagerly decrement r5 by 3, which is the number of bytes already
- written, plus one write that will be performed later on. */
- addi r10,r5,-3
- b L(short_path_loop_1)
-
- .align 4
-L(short_path_loop):
- /* At this point, the induction variable, r5, as well as the pointers
- to dest and src (r9 and r4, respectivelly) have been updated.
-
- Note: The registers r7 and r10 are induction variables derived from
- r5. They are used to determine if the total number of writes has
- been reached at every other write.
-
- Copy one char from src (r4) and write it to dest (r9). If it is the
- end-of-string, start the null padding. Continue, otherwise. */
- lbz r8,0(r4)
- addi r7,r10,-2
- cmpdi cr5,r8,0
- stb r8,0(r9)
- beq cr5,L(zero_pad_start_1)
- beq cr7,L(short_path_loop_end_0)
- /* Copy another char from src (r4) to dest (r9). Check again if it is
- the end-of-string. If so, start the null padding. */
- lbz r8,1(r4)
- cmpdi cr7,r8,0
- stb r8,1(r9)
- beq cr7,L(zero_pad_start)
- mr r10,r7
-L(short_path_loop_1):
- /* This block is reached after two chars have been already written to
- dest. Nevertheless, r5 (the induction variable), r9 (the pointer to
- dest), and r4 (the pointer to src) have not yet been updated.
-
- At this point:
- r5 holds the count of bytes yet to be written plus 2.
- r9 points to the last two chars that were already written to dest.
- r4 points to the last two chars that were already copied from src.
-
- The algorithm continues by decrementing r5, the induction variable,
- so that it reflects the last two writes. The pointers to dest (r9)
- and to src (r4) are increment by two, for the same reason.
-
- Note: Register r10 is another induction variable, derived from r5,
- which determines if the total number of writes has been reached. */
- addic. r5,r5,-2
- addi r9,r9,2
- cmpdi cr7,r10,0 /* Eagerly check if the next write is the last. */
- addi r4,r4,2
- addi r6,r9,1
- bne cr0,L(short_path_loop) /* Check if the total number of writes
- has been reached at every other
- write. */
-#ifdef USE_AS_STPNCPY
- mr r3,r9
- b L(short_path_loop_end)
-#endif
-
-L(short_path_loop_end_0):
-#ifdef USE_AS_STPNCPY
- addi r3,r9,1
- b L(short_path_loop_end)
-#endif
-L(short_path_loop_end_1):
-#ifdef USE_AS_STPNCPY
- mr r3,r9
-#endif
-L(short_path_loop_end):
- /* Restore non-volatile registers. */
- ld r26,-48(r1)
- ld r27,-40(r1)
- ld r28,-32(r1)
- ld r29,-24(r1)
- ld r30,-16(r1)
- ld r31,-8(r1)
- blr
-
- /* This code pads the remainder of dest with NULL bytes. The algorithm
- calculates the remaining size and calls memset. */
- .align 4
-L(zero_pad_start):
- mr r5,r10
- mr r9,r6
-L(zero_pad_start_1):
- /* At this point:
- - r5 holds the number of bytes that still have to be written to
- dest.
- - r9 points to the position, in dest, where the first null byte
- will be written.
- The above statements are true both when control reaches this label
- from a branch or when falling through the previous lines. */
-#ifndef USE_AS_STPNCPY
- mr r30,r3 /* Save the return value of strncpy. */
-#endif
- /* Prepare the call to memset. */
- mr r3,r9 /* Pointer to the area to be zero-filled. */
- li r4,0 /* Byte to be written (zero). */
-
- /* We delayed the creation of the stack frame, as well as the saving of
- the link register, because only at this point, we are sure that
- doing so is actually needed. */
-
- /* Save the link register. */
- mflr r0
- std r0,16(r1)
- cfi_offset(lr, 16)
-
- /* Create the stack frame. */
- stdu r1,-FRAMESIZE(r1)
- cfi_adjust_cfa_offset(FRAMESIZE)
-
- bl MEMSET
- nop
-
- /* Restore the stack frame. */
- addi r1,r1,FRAMESIZE
- cfi_adjust_cfa_offset(-FRAMESIZE)
- /* Restore the link register. */
- ld r0,16(r1)
- mtlr r0
-
-#ifndef USE_AS_STPNCPY
- mr r3,r30 /* Restore the return value of strncpy, i.e.:
- dest. For stpncpy, the return value is the
- same as return value of memset. */
-#endif
-
- /* Restore non-volatile registers and return. */
- ld r26,-48(r1)
- ld r27,-40(r1)
- ld r28,-32(r1)
- ld r29,-24(r1)
- ld r30,-16(r1)
- ld r31,-8(r1)
- blr
-
- /* The common case where [src]+16 will not cross a 4K page boundary.
- In this case the code fast check the first 16 bytes by using doubleword
- read/compares and update destiny if neither total size or null byte
- is found in destiny. */
- .align 4
-L(unaligned_lt_16):
- cmpldi cr7,r5,7
- ble cr7,L(short_path)
- ld r7,0(r4)
- li r8,0
- cmpb r8,r7,r8
- cmpdi cr7,r8,0
- bne cr7,L(short_path_prepare_2)
- addi r6,r5,-8
- std r7,0(r3)
- addi r9,r3,8
- cmpldi cr7,r6,7
- addi r7,r4,8
- ble cr7,L(short_path_prepare_1_1)
- ld r4,8(r4)
- cmpb r8,r4,r8
- cmpdi cr7,r8,0
- bne cr7,L(short_path_prepare_2_1)
- std r4,8(r3)
- addi r29,r3,16
- addi r5,r5,-16
- /* Neither the null byte was found or total length was reached,
- align to 16 bytes and issue a bulk copy/compare. */
- b L(align_to_16b)
-
- /* In the case of 4k page boundary cross, the algorithm first align
- the address to a doubleword, calculate a mask based on alignment
- to ignore the bytes and continue using doubleword. */
- .align 4
-L(pagecross):
- rldicr r11,r4,0,59 /* Align the address to 8 bytes boundary. */
- li r6,-1 /* MASK = 0xffffffffffffffffUL. */
- sldi r9,r9,3 /* Calculate padding. */
- ld r7,0(r11) /* Load doubleword from memory. */
-#ifdef __LITTLE_ENDIAN__
- sld r9,r6,r9 /* MASK = MASK << padding. */
-#else
- srd r9,r6,r9 /* MASK = MASK >> padding. */
-#endif
- orc r9,r7,r9 /* Mask bits that are not part of the
- string. */
- li r7,0
- cmpb r9,r9,r7 /* Check for null bytes in DWORD1. */
- cmpdi cr7,r9,0
- bne cr7,L(short_path_prepare_2)
- subf r8,r8,r5 /* Adjust total length. */
- cmpldi cr7,r8,8 /* Check if length was reached. */
- ble cr7,L(short_path_prepare_2)
-
- /* For next checks we have aligned address, so we check for more
- three doublewords to make sure we can read 16 unaligned bytes
- to start the bulk copy with 16 aligned addresses. */
- ld r7,8(r11)
- cmpb r9,r7,r9
- cmpdi cr7,r9,0
- bne cr7,L(short_path_prepare_2)
- addi r7,r8,-8
- cmpldi cr7,r7,8
- ble cr7,L(short_path_prepare_2)
- ld r7,16(r11)
- cmpb r9,r7,r9
- cmpdi cr7,r9,0
- bne cr7,L(short_path_prepare_2)
- addi r8,r8,-16
- cmpldi cr7,r8,8
- ble cr7,L(short_path_prepare_2)
- ld r8,24(r11)
- cmpb r9,r8,r9
- cmpdi cr7,r9,0
- bne cr7,L(short_path_prepare_2)
-
- /* No null byte found in the 32 bytes readed and length not reached,
- read source again using unaligned loads and store them. */
- ld r9,0(r4)
- addi r29,r3,16
- addi r5,r5,-16
- std r9,0(r3)
- ld r9,8(r4)
- std r9,8(r3)
-
- /* Align source to 16 bytes and adjust destiny and size. */
-L(align_to_16b):
- rldicl r9,r10,0,60
- rldicr r28,r10,0,59
- add r12,r5,r9
- subf r29,r9,r29
-
- /* The bulk read/compare/copy loads two doublewords, compare and merge
- in a single register for speed. This is an attempt to speed up the
- null-checking process for bigger strings. */
-
- cmpldi cr7,r12,15
- ble cr7,L(short_path_prepare_1_2)
-
- /* Main loop for large sizes, unrolled 2 times to get better use of
- pipeline. */
- ld r8,0(28)
- ld r10,8(28)
- li r9,0
- cmpb r7,r8,r9
- cmpb r9,r10,r9
- or. r6,r9,r7
- bne cr0,L(short_path_prepare_2_3)
- addi r5,r12,-16
- addi r4,r28,16
- std r8,0(r29)
- std r10,8(r29)
- cmpldi cr7,r5,15
- addi r9,r29,16
- ble cr7,L(short_path_1)
- mr r11,r28
- mr r6,r29
- li r30,0
- subfic r26,r4,48
- subfic r27,r9,48
-
- b L(loop_16b)
-
- .align 4
-L(loop_start):
- ld r31,0(r11)
- ld r10,8(r11)
- cmpb r0,r31,r7
- cmpb r8,r10,r7
- or. r7,r0,r8
- addi r5,r5,-32
- cmpldi cr7,r5,15
- add r4,r4,r26
- add r9,r9,r27
- bne cr0,L(short_path_prepare_2_2)
- add r4,r28,r4
- std r31,0(r6)
- add r9,r29,r9
- std r10,8(r6)
- ble cr7,L(short_path_1)
-
-L(loop_16b):
- ld r10,16(r11)
- ld r0,24(r11)
- cmpb r8,r10,r30
- cmpb r7,r0,r30
- or. r7,r8,r7
- addi r12,r12,-32
- cmpldi cr7,r12,15
- addi r11,r11,32
- bne cr0,L(short_path_2)
- std r10,16(r6)
- addi r6,r6,32
- std r0,-8(r6)
- bgt cr7,L(loop_start)
-
- mr r5,r12
- mr r4,r11
- mr r9,r6
- b L(short_path_1)
-
- .align 4
-L(short_path_prepare_1_1):
- mr r5,r6
- mr r4,r7
- b L(short_path_1)
-L(short_path_prepare_1_2):
- mr r5,r12
- mr r4,r28
- mr r9,r29
- b L(short_path_1)
-L(short_path_prepare_2):
- mr r9,r3
- b L(short_path_2)
-L(short_path_prepare_2_1):
- mr r5,r6
- mr r4,r7
- b L(short_path_2)
-L(short_path_prepare_2_2):
- mr r5,r12
- mr r4,r11
- mr r9,r6
- b L(short_path_2)
-L(short_path_prepare_2_3):
- mr r5,r12
- mr r4,r28
- mr r9,r29
- b L(short_path_2)
-L(zero_pad_start_prepare_1):
- mr r5,r6
- mr r9,r8
- b L(zero_pad_start_1)
-END (FUNC_NAME)
-
-#ifndef USE_AS_STPNCPY
-libc_hidden_builtin_def (strncpy)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power8/strnlen.S b/sysdeps/powerpc/powerpc64/power8/strnlen.S
deleted file mode 100644
index 3eadbfb09e..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strnlen.S
+++ /dev/null
@@ -1,433 +0,0 @@
-/* Optimized strnlen implementation for POWER8 using a vmx loop.
-
- Copyright (C) 2017 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/>. */
-
-/* It is implemented the following heuristic:
- 1. Case maxlen <= 32: align the pointer to 8 bytes to loop through
- reading doublewords. Uses the POWER7 algorithm.
- 2. Case maxlen > 32: check for null bytes in the first 16 bytes using
- unaligned accesses. Return length if found. Otherwise:
- 2.1 Case maxlen < 64: deduct the bytes previously read, align
- the pointer to 16 bytes and loop through reading quadwords
- until find null bytes or reach maxlen.
- 2.2 Case maxlen > 64: deduct the bytes previously read, align
- the pointer to 64 bytes and set up a counter to loop through
- reading in strides of 64 bytes. In case it finished the loop
- with null bytes not found, process the remainder bytes by
- switching to the loop to heuristic in 2.1. */
-
-#include <sysdep.h>
-
-/* Define default page size to 4KB. */
-#define PAGE_SIZE 4096
-
-/* The following macros implement Power ISA v2.07 opcodes
- that could not be used directly into this code to the keep
- compatibility with older binutils versions. */
-
-/* Move from vector register doubleword. */
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-/* Move to vector register doubleword. */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-/* Vector Bit Permute Quadword. */
-#define VBPERMQ(t,a,b) .long (0x1000054c \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-/* Vector Population Count Halfword. */
-#define VPOPCNTH(t,b) .long (0x10000743 | ((t)<<(32-11)) | ((b)<<(32-21)))
-
-/* Vector Count Leading Zeros Halfword. */
-#define VCLZH(t,b) .long (0x10000742 | ((t)<<(32-11)) | ((b)<<(32-21)))
-
-
-/* int [r3] strnlen (char *s [r3], size_t maxlen [r4]) */
-/* TODO: change to power8 when minimum required binutils allows it. */
- .machine power7
-ENTRY (__strnlen)
- CALL_MCOUNT 2
- dcbt 0,r3
-
- cmpldi r4,32 /* Check if maxlen <= 32. */
- ble L(small_range) /* If maxlen <= 32. */
-
- /* Upcoming 16 bytes unaligned accesses cannot cross the page boundary
- otherwise the processor throws an memory access error.
- Use following code to check there is room for such as accesses:
- (((size_t) s) % PAGE_SIZE > (PAGE_SIZE - 16)
- If it is disallowed then switch to the code that handles
- the string when maxlen <= 32. */
- clrldi r10,r3,52
- cmpldi cr7,r10,PAGE_SIZE-16
- bgt cr7,L(small_range) /* If less than 16B of page end. */
-
- /* Compute our permute constant r8. */
- li r7,0
- /* Compute a bpermd constant to move bit 0 of each word into
- a halfword value, and count trailing zeros. */
-#ifdef __LITTLE_ENDIAN__
- li r8,0x2820
- oris r8,r8,0x3830
- sldi r8,r8,32
- ori r8,r8,0x0800
- oris r8,r8,0x1810
-#else
- li r8,0x1018
- oris r8,r8,0x0008
- sldi r8,r8,32
- ori r8,r8,0x3038
- oris r8,r8,0x2028
-#endif
-
- /* maxlen > 32. Optimistically check for null bytes in the first
- 16 bytes of the string using unaligned accesses. */
- ld r5,0(r3)
- ld r6,8(r3)
- cmpb r10,r7,r5 /* Check for null bytes in DWORD1. */
- cmpb r11,r7,r6 /* Check for null bytes in DWORD2. */
- or. r7,r10,r11
- bne cr0, L(early_find) /* If found null bytes. */
-
- /* At this point maxlen > 32 and null bytes were not found at first
- 16 bytes. Prepare for loop using VMX. */
-
- /* r3 == s, r4 == maxlen. All other volatile regs are unused now. */
-
- addi r5,r3,16 /* Align up, or just add the 16B we
- already checked. */
- li r0,15
- and r7,r5,r0 /* Find offset into 16B alignment. */
- andc r5,r5,r0 /* Quadword align up s to the next quadword. */
- li r0,16
- subf r0,r7,r0
- subf r4,r0,r4 /* Deduct unaligned bytes from maxlen. */
-
-
- /* Compute offsets for vmx loads, and precompute the vbpermq
- constants for both the 64B and 16B loops. */
- li r6,0
- vspltisb v0,0
- vspltisb v10,3
- lvsl v11,r6,r6
- vslb v10,v11,v10
-
- cmpldi r4,64 /* Check maxlen < 64. */
- blt L(smaller) /* If maxlen < 64 */
-
- /* In order to begin the 64B loop, it needs to be 64
- bytes aligned. So read quadwords until it is aligned or found null
- bytes. At worst case it will be aligned after the fourth iteration,
- so unroll the loop to avoid counter checking. */
- andi. r7,r5,63 /* Check if is 64 bytes aligned. */
- beq cr0,L(preloop_64B) /* If it is already 64B aligned. */
- lvx v1,r5,r6
- vcmpequb. v1,v1,v0
- addi r5,r5,16
- addi r4,r4,-16 /* Decrement maxlen in 16 bytes. */
- bne cr6,L(found_aligning64B) /* If found null bytes. */
-
- /* Unroll 3x above code block until aligned or find null bytes. */
- andi. r7,r5,63
- beq cr0,L(preloop_64B)
- lvx v1,r5,r6
- vcmpequb. v1,v1,v0
- addi r5,r5,16
- addi r4,r4,-16
- bne cr6,L(found_aligning64B)
-
- andi. r7,r5,63
- beq cr0,L(preloop_64B)
- lvx v1,r5,r6
- vcmpequb. v1,v1,v0
- addi r5,r5,16
- addi r4,r4,-16
- bne cr6,L(found_aligning64B)
-
- andi. r7,r5,63
- beq cr0,L(preloop_64B)
- lvx v1,r5,r6
- vcmpequb. v1,v1,v0
- addi r5,r5,16
- addi r4,r4,-16
- bne cr6,L(found_aligning64B)
-
- /* At this point it should be 16 bytes aligned.
- Prepare for the 64B loop. */
- .p2align 4
-L(preloop_64B):
- /* Check if maxlen became is less than 64, therefore disallowing the
- 64B loop. If it happened switch to the 16B loop code. */
- cmpldi r4,64 /* Check if maxlen < 64. */
- blt L(smaller) /* If maxlen < 64. */
- /* Set some constant values. */
- li r7,16
- li r10,32
- li r9,48
-
- /* Compute the number of 64 bytes iterations needed. */
- srdi r11,r4,6 /* Compute loop count (maxlen / 64). */
- andi. r4,r4,63 /* Set maxlen the remainder (maxlen % 64). */
- mtctr r11 /* Move loop count to counter register. */
-
- /* Handle maxlen > 64. Loop over the bytes in strides of 64B. */
- .p2align 4
-L(loop_64B):
- lvx v1,r5,r6 /* r5 is the pointer to s. */
- lvx v2,r5,r7
- lvx v3,r5,r10
- lvx v4,r5,r9
- /* Compare the four 16B vectors to obtain the least 16 values.
- Null bytes should emerge into v7, then check for null bytes. */
- vminub v5,v1,v2
- vminub v6,v3,v4
- vminub v7,v5,v6
- vcmpequb. v7,v7,v0 /* Check for null bytes. */
- addi r5,r5,64 /* Add pointer to next iteraction. */
- bne cr6,L(found_64B) /* If found null bytes. */
- bdnz L(loop_64B) /* Continue the loop if count > 0. */
-
-/* Hit loop end without null match. So branch to handle the remainder. */
-
- /* Prepare a 16B loop to handle two cases:
- 1. If 32 > maxlen < 64.
- 2. If maxlen >= 64, and reached end of the 64B loop with null
- bytes not found. Thus handle the remainder bytes here. */
- .p2align 4
-L(smaller):
- cmpldi r4,0 /* Check maxlen is zero. */
- beq L(done) /* If maxlen is zero. */
-
- /* Place rounded up number of qw's to check into a vmx
- register, and use some vector tricks to minimize
- branching. */
- MTVRD(v7,r4) /* Copy maxlen from GPR to vector register. */
- vspltisb v5,1
- vspltisb v6,15
- vspltb v2,v7,7
- vaddubs v3,v5,v6
-
-#ifdef __LITTLE_ENDIAN__
- vspltish v5,1 /* Compute 16 in each byte. */
-#endif
-
- /* Loop in 16B aligned incremements now. */
- .p2align 4
-L(loop_16B):
- lvx v1,r5,r6 /* Load quadword into vector register. */
- addi r5,r5,16 /* Increment address to next 16B block. */
- vor v7,v2,v2 /* Save loop count (v2) into v7. */
- vsububs v2,v2,v3 /* Subtract 16B from count, saturate at 0. */
- vminub v4,v1,v2
- vcmpequb. v4,v4,v0 /* Checking for null bytes. */
- beq cr6,L(loop_16B) /* If null bytes not found. */
-
- vcmpequb v1,v1,v0
- VBPERMQ(v1,v1,v10)
-#ifdef __LITTLE_ENDIAN__
- vsubuhm v2,v1,v5 /* Form a mask of trailing zeros. */
- vandc v2,v2,v1
- VPOPCNTH(v1,v2) /* Count of trailing zeros, 16 if none. */
-#else
- VCLZH(v1,v1) /* Count the leading zeros, 16 if none. */
-#endif
- /* Truncate to maximum allowable offset. */
- vcmpgtub v2,v1,v7 /* Compare and truncate for matches beyond
- maxlen. */
- vsel v1,v1,v7,v2 /* 0-16 is now in byte 7. */
-
- MFVRD(r0,v1)
- addi r5,r5,-16 /* Undo speculative bump. */
- extsb r0,r0 /* Clear whatever gunk is in the high 56b. */
- add r5,r5,r0 /* Add the offset of whatever was found. */
-L(done):
- subf r3,r3,r5 /* Length is equal to the offset of null byte
- matched minus the pointer to s. */
- blr /* Done. */
-
- /* Handle case of maxlen > 64 and found null bytes in last block
- of 64 bytes read. */
- .p2align 4
-L(found_64B):
- /* A zero was found. Reduce the result. */
- vcmpequb v1,v1,v0
- vcmpequb v2,v2,v0
- vcmpequb v3,v3,v0
- vcmpequb v4,v4,v0
-
- /* Permute the first bit of each byte into bits 48-63. */
- VBPERMQ(v1,v1,v10)
- VBPERMQ(v2,v2,v10)
- VBPERMQ(v3,v3,v10)
- VBPERMQ(v4,v4,v10)
-
- /* Shift each component into its correct position for merging. */
-#ifdef __LITTLE_ENDIAN__
- vsldoi v2,v2,v2,2
- vsldoi v3,v3,v3,4
- vsldoi v4,v4,v4,6
-#else
- vsldoi v1,v1,v1,6
- vsldoi v2,v2,v2,4
- vsldoi v3,v3,v3,2
-#endif
-
- /* Merge the results and move to a GPR. */
- vor v1,v2,v1
- vor v2,v3,v4
- vor v4,v1,v2
-
- /* Adjust address to the start of the current 64B block. */
- addi r5,r5,-64
-
- MFVRD(r10,v4)
-#ifdef __LITTLE_ENDIAN__
- addi r9,r10,-1 /* Form a mask from trailing zeros. */
- andc r9,r9,r10
- popcntd r0,r9 /* Count the bits in the mask. */
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- subf r5,r3,r5
- add r3,r5,r0 /* Compute final length. */
- blr /* Done. */
-
- /* Handle case where null bytes were found while aligning
- as a preparation for the 64B loop. */
- .p2align 4
-L(found_aligning64B):
- VBPERMQ(v1,v1,v10)
-#ifdef __LITTLE_ENDIAN__
- MFVRD(r10,v1)
- addi r9,r10,-1 /* Form a mask from trailing zeros. */
- andc r9,r9,r10
- popcntd r0,r9 /* Count the bits in the mask. */
-#else
- vsldoi v1,v1,v1,6
- MFVRD(r10,v1)
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- addi r5,r5,-16 /* Adjust address to offset of last 16 bytes
- read. */
- /* Calculate length as subtracted the pointer to s of last 16 bytes
- offset, added with the bytes before the match. */
- subf r5,r3,r5
- add r3,r5,r0
- blr /* Done. */
-
- /* Handle case of maxlen > 32 and found a null bytes within the first
- 16 bytes of s. */
- .p2align 4
-L(early_find):
- bpermd r5,r8,r10 /* r8 contains the bit permute constants. */
- bpermd r6,r8,r11
- sldi r5,r5,8
- or r5,r5,r6 /* r5 should hold a 16B mask of
- a potential 0. */
- cntlzd r5,r5 /* Count leading zeros. */
- addi r3,r5,-48 /* Deduct the 48 leading zeros always
- present. */
- blr /* Done. */
-
- /* Handle case of maxlen <= 32. Use the POWER7 algorithm. */
- .p2align 4
-L(small_range):
- clrrdi r8,r3,3 /* Align the pointer to 8B. */
- li r0,0
- /* Register's content at this point:
- r3 == pointer to s, r4 == maxlen, r8 == pointer to s aligned to 8B,
- r7 == last acceptable address. */
- cmpldi r4,0 /* Check if maxlen is zero. */
- beq L(end_max) /* If maxlen is zero. */
-
- /* Calculate the last acceptable address and check for possible
- addition overflow by using satured math:
- r7 = r3 + r4
- r7 |= -(r7 < x) */
- add r7,r3,r4
- subfc r6,r3,r7
- subfe r9,r9,r9
- extsw r6,r9
- or r7,r7,r6
- addi r7,r7,-1
-
- clrrdi r7,r7,3 /* Align to 8B address of last
- acceptable address. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
- ld r12,0(r8) /* Load aligned doubleword. */
- cmpb r10,r12,r0 /* Check for null bytes. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- sld r10,r10,r6
-#else
- sld r10,r10,r6
- srd r10,r10,r6
-#endif /* __LITTLE_ENDIAN__ */
- cmpldi cr7,r10,0
- bne cr7,L(done_small) /* If found null byte. */
-
- cmpld r8,r7 /* Check if reached maxlen. */
- beq L(end_max) /* If reached maxlen. */
-
- /* Still handling case of maxlen <= 32. Read doubleword aligned until
- find null bytes or reach maxlen. */
- .p2align 4
-L(loop_small):
- ldu r12,8(r8) /* Load next doubleword and update r8. */
- cmpb r10,r12,r0 /* Check for null bytes. */
- cmpldi cr6,r10,0
- bne cr6,L(done_small) /* If found null bytes. */
- cmpld r8,r7 /* Check if reached maxlen. */
- bne L(loop_small) /* If it has more bytes to read. */
- mr r3,r4 /* Reached maxlen with null bytes not found.
- Length is equal to maxlen. */
- blr /* Done. */
-
- /* Still handling case of maxlen <= 32. Found null bytes.
- Registers: r10 == match bits within doubleword, r8 == address of
- last doubleword read, r3 == pointer to s, r4 == maxlen. */
- .p2align 4
-L(done_small):
-#ifdef __LITTLE_ENDIAN__
- /* Count trailing zeros. */
- addi r0,r10,-1
- andc r0,r0,r10
- popcntd r0,r0
-#else
- cntlzd r0,r10 /* Count leading zeros before the match. */
-#endif
- sub r3,r8,r3 /* Calculate total of bytes before the match. */
- srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */
- add r3,r3,r0 /* Length until the match. */
- cmpld r3,r4 /* Check length is greater than maxlen. */
- blelr
- mr r3,r4 /* If length is greater than maxlen, return
- maxlen. */
- blr
-
- /* Handle case of reached maxlen with null bytes not found. */
- .p2align 4
-L(end_max):
- mr r3,r4 /* Length is equal to maxlen. */
- blr /* Done. */
-
-
-END (__strnlen)
-libc_hidden_def (__strnlen)
-weak_alias (__strnlen, strnlen)
-libc_hidden_def (strnlen)
diff --git a/sysdeps/powerpc/powerpc64/power8/strrchr.S b/sysdeps/powerpc/powerpc64/power8/strrchr.S
deleted file mode 100644
index 8eb74853c3..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strrchr.S
+++ /dev/null
@@ -1,464 +0,0 @@
-/* Optimized strrchr implementation for PowerPC64/POWER7 using cmpb insn.
- Copyright (C) 2017 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 <sysdep.h>
-
-/* char *[r3] strrchr (char *s [r3], int c [r4]) */
-/* TODO: change these to the actual instructions when the minimum required
- binutils allows it. */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b) .long (0x1000054c \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-#define VCLZD(r,v) .long (0x100007c2 | ((r)<<(32-11)) | ((v)<<(32-21)))
-#define VPOPCNTD(r,v) .long (0x100007c3 | ((r)<<(32-11)) | ((v)<<(32-21)))
-#define VADDUQM(t,a,b) .long (0x10000100 \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-#ifdef __LITTLE_ENDIAN__
-/* Find the match position from v6 and place result in r6. */
-# define CALCULATE_MATCH() \
- VBPERMQ(v6, v6, v10); \
- vsldoi v6, v6, v6, 6; \
- MFVRD(r7, v6); \
- cntlzd r6, r7; \
- subfic r6, r6, 15;
-/*
- * Find the first null position to mask bytes after null.
- * (reg): vcmpequb result: v2 for 1st qw v3 for 2nd qw.
- * Result placed at v2.
- */
-# define FIND_NULL_POS(reg) \
- vspltisb v11, -1; \
- VADDUQM(v11, reg, v11); \
- vandc v11, v11, reg; \
- VPOPCNTD(v2, v11); \
- vspltb v11, v2, 15; \
- vcmpequb. v11, v11, v9; \
- blt cr6, 1f; \
- vsldoi v9, v0, v9, 1; \
- vslo v2, v2, v9; \
-1: \
- vsumsws v2, v2, v0;
-#else
-# define CALCULATE_MATCH() \
- VBPERMQ(v6, v6, v10); \
- MFVRD(r7, v6); \
- addi r6, r7, -1; \
- andc r6, r6, r7; \
- popcntd r6, r6; \
- subfic r6, r6, 15;
-# define FIND_NULL_POS(reg) \
- VCLZD(v2, reg); \
- vspltb v11, v2, 7; \
- vcmpequb. v11, v11, v9; \
- blt cr6, 1f; \
- vsldoi v9, v0, v9, 1; \
- vsro v2, v2, v9; \
-1: \
- vsumsws v2, v2, v0;
-#endif /* !__LITTLE_ENDIAN__ */
- .machine power7
-ENTRY (strrchr)
- CALL_MCOUNT 2
- dcbt 0,r3
- clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
- cmpdi cr7,r4,0
- ld r12,0(r8) /* Load doubleword from memory. */
- li r9,0 /* Used to store last occurence. */
- li r0,0 /* Doubleword with null chars to use
- with cmpb. */
-
- rlwinm r6,r3,3,26,28 /* Calculate padding. */
-
- beq cr7,L(null_match)
-
- /* Replicate byte to doubleword. */
- insrdi r4,r4,8,48
- insrdi r4,r4,16,32
- insrdi r4,r4,32,0
-
- /* r4 is changed now. If it's passed more chars, then
- check for null again. */
- cmpdi cr7,r4,0
- beq cr7,L(null_match)
- /* Now r4 has a doubleword of c bytes and r0 has
- a doubleword of null bytes. */
-
- cmpb r10,r12,r4 /* Compare each byte against c byte. */
- cmpb r11,r12,r0 /* Compare each byte against null byte. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r10,r10,r6
- srd r11,r11,r6
- sld r10,r10,r6
- sld r11,r11,r6
-#else
- sld r10,r10,r6
- sld r11,r11,r6
- srd r10,r10,r6
- srd r11,r11,r6
-#endif
- or r5,r10,r11 /* OR the results to speed things up. */
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done)
-
-L(align):
- andi. r12, r8, 15
-
- /* Are we now aligned to a doubleword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bne cr0, L(loop)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- or r5,r10,r11
- cmpdi cr7,r5,0
- bne cr7,L(done)
- b L(loop) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
- .p2align 5
-L(loop):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r7,16(r8)
- cmpb r10,r12,r4
- cmpb r11,r12,r0
- cmpb r6,r7,r4
- cmpb r7,r7,r0
- or r12,r10,r11
- or r5,r6,r7
- or r5,r12,r5
- cmpdi cr7,r5,0
- beq cr7,L(vector)
-
- /* OK, one (or both) of the doublewords contains a c/null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a c/null byte. */
- cmpdi cr6,r12,0
- addi r8,r8,-8
- bne cr6,L(done)
-
- /* The c/null byte must be in the second doubleword. Adjust the
- address again and move the result of cmpb to r10 so we can calculate
- the pointer. */
-
- mr r10,r6
- mr r11,r7
- addi r8,r8,8
-
- /* r10/r11 have the output of the cmpb instructions, that is,
- 0xff in the same position as the c/null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-
-L(done):
- /* If there are more than one 0xff in r11, find the first position of
- 0xff in r11 and fill r10 with 0 from that position. */
- cmpdi cr7,r11,0
- beq cr7,L(no_null)
-#ifdef __LITTLE_ENDIAN__
- addi r3,r11,-1
- andc r3,r3,r11
- popcntd r0,r3
-#else
- cntlzd r0,r11
-#endif
- subfic r0,r0,63
- li r6,-1
-#ifdef __LITTLE_ENDIAN__
- srd r0,r6,r0
-#else
- sld r0,r6,r0
-#endif
- and r10,r0,r10
-L(no_null):
-#ifdef __LITTLE_ENDIAN__
- cntlzd r0,r10 /* Count leading zeros before c matches. */
- addi r3,r10,-1
- andc r3,r3,r10
- addi r10,r11,-1
- andc r10,r10,r11
- cmpld cr7,r3,r10
- bgt cr7,L(no_match)
-#else
- addi r3,r10,-1 /* Count trailing zeros before c matches. */
- andc r3,r3,r10
- popcntd r0,r3
- cmpld cr7,r11,r10
- bgt cr7,L(no_match)
-#endif
- srdi r0,r0,3 /* Convert trailing zeros to bytes. */
- subfic r0,r0,7
- add r9,r8,r0 /* Return address of the matching c byte
- or null in case c was not found. */
- li r0,0
- cmpdi cr7,r11,0 /* If r11 == 0, no null's have been found. */
- beq cr7,L(align)
-
- .align 4
-L(no_match):
- mr r3,r9
- blr
-
-/* Check the first 32B in GPR's and move to vectorized loop. */
- .p2align 5
-L(vector):
- addi r3, r8, 8
- /* Make sure 32B aligned. */
- andi. r10, r3, 31
- bne cr0, L(loop)
- vspltisb v0, 0
- /* Precompute vbpermq constant. */
- vspltisb v10, 3
- lvsl v11, r0, r0
- vslb v10, v11, v10
- MTVRD(v1, r4)
- li r5, 16
- vspltb v1, v1, 7
- /* Compare 32 bytes in each loop. */
-L(continue):
- lvx v4, 0, r3
- lvx v5, r3, r5
- vcmpequb v2, v0, v4
- vcmpequb v3, v0, v5
- vcmpequb v6, v1, v4
- vcmpequb v7, v1, v5
- vor v8, v2, v3
- vor v9, v6, v7
- vor v11, v8, v9
- vcmpequb. v11, v0, v11
- addi r3, r3, 32
- blt cr6, L(continue)
- vcmpequb. v8, v0, v8
- blt cr6, L(match)
-
- /* One (or both) of the quadwords contains c/null. */
- vspltisb v8, 2
- vspltisb v9, 5
- /* Precompute values used for comparison. */
- vsl v9, v8, v9 /* v9 = 0x4040404040404040. */
- vaddubm v8, v9, v9
- vsldoi v8, v0, v8, 1 /* v8 = 0x80. */
-
- /* Check if null is in second qw. */
- vcmpequb. v11, v0, v2
- blt cr6, L(secondqw)
-
- /* Null found in first qw. */
- addi r8, r3, -32
- /* Calculate the null position. */
- FIND_NULL_POS(v2)
- /* Check if null is in the first byte. */
- vcmpequb. v11, v0, v2
- blt cr6, L(no_match)
- vsububm v2, v8, v2
- /* Mask unwanted bytes after null. */
-#ifdef __LITTLE_ENDIAN__
- vslo v6, v6, v2
- vsro v6, v6, v2
-#else
- vsro v6, v6, v2
- vslo v6, v6, v2
-#endif
- vcmpequb. v11, v0, v6
- blt cr6, L(no_match)
- /* Found a match before null. */
- CALCULATE_MATCH()
- add r3, r8, r6
- blr
-
-L(secondqw):
- addi r8, r3, -16
- FIND_NULL_POS(v3)
- vcmpequb. v11, v0, v2
- blt cr6, L(no_match1)
- vsububm v2, v8, v2
- /* Mask unwanted bytes after null. */
-#ifdef __LITTLE_ENDIAN__
- vslo v7, v7, v2
- vsro v7, v7, v2
-#else
- vsro v7, v7, v2
- vslo v7, v7, v2
-#endif
- vcmpequb. v11, v0, v7
- blt cr6, L(no_match1)
- addi r8, r8, 16
- vor v6, v0, v7
-L(no_match1):
- addi r8, r8, -16
- vcmpequb. v11, v0, v6
- blt cr6, L(no_match)
- /* Found a match before null. */
- CALCULATE_MATCH()
- add r3, r8, r6
- blr
-
-L(match):
- /* One (or both) of the quadwords contains a match. */
- mr r8, r3
- vcmpequb. v8, v0, v7
- blt cr6, L(firstqw)
- /* Match found in second qw. */
- addi r8, r8, 16
- vor v6, v0, v7
-L(firstqw):
- addi r8, r8, -32
- CALCULATE_MATCH()
- add r9, r8, r6 /* Compute final length. */
- b L(continue)
-/* We are here because strrchr was called with a null byte. */
- .align 4
-L(null_match):
- /* r0 has a doubleword of null bytes. */
-
- cmpb r5,r12,r0 /* Compare each byte against null bytes. */
-
- /* Move the doublewords left and right to discard the bits that are
- not part of the string and bring them back as zeros. */
-#ifdef __LITTLE_ENDIAN__
- srd r5,r5,r6
- sld r5,r5,r6
-#else
- sld r5,r5,r6
- srd r5,r5,r6
-#endif
- cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes
- have been found. */
- bne cr7,L(done_null)
-
- andi. r12, r8, 15
-
- /* Are we now aligned to a quadword boundary? If so, skip to
- the main loop. Otherwise, go through the alignment code. */
-
- bne cr0, L(loop_null)
-
- /* Handle WORD2 of pair. */
- ldu r12,8(r8)
- cmpb r5,r12,r0
- cmpdi cr7,r5,0
- bne cr7,L(done_null)
- b L(loop_null) /* We branch here (rather than falling through)
- to skip the nops due to heavy alignment
- of the loop below. */
-
- /* Main loop to look for the end of the string. Since it's a
- small loop (< 8 instructions), align it to 32-bytes. */
- .p2align 5
-L(loop_null):
- /* Load two doublewords, compare and merge in a
- single register for speed. This is an attempt
- to speed up the null-checking process for bigger strings. */
- ld r12,8(r8)
- ldu r11,16(r8)
- cmpb r5,r12,r0
- cmpb r10,r11,r0
- or r6,r5,r10
- cmpdi cr7,r6,0
- beq cr7,L(vector1)
-
- /* OK, one (or both) of the doublewords contains a null byte. Check
- the first doubleword and decrement the address in case the first
- doubleword really contains a null byte. */
-
- cmpdi cr6,r5,0
- addi r8,r8,-8
- bne cr6,L(done_null)
-
- /* The null byte must be in the second doubleword. Adjust the address
- again and move the result of cmpb to r10 so we can calculate the
- pointer. */
-
- mr r5,r10
- addi r8,r8,8
-
- /* r5 has the output of the cmpb instruction, that is, it contains
- 0xff in the same position as the null byte in the original
- doubleword from the string. Use that to calculate the pointer. */
-L(done_null):
-#ifdef __LITTLE_ENDIAN__
- addi r0,r5,-1
- andc r0,r0,r5
- popcntd r0,r0
-#else
- cntlzd r0,r5 /* Count leading zeros before the match. */
-#endif
- srdi r0,r0,3 /* Convert trailing zeros to bytes. */
- add r3,r8,r0 /* Return address of the matching null byte. */
- blr
-/* Check the first 32B in GPR's and move to vectorized loop. */
- .p2align 5
-L(vector1):
- addi r3, r8, 8
- /* Make sure 32B aligned. */
- andi. r10, r3, 31
- bne cr0, L(loop_null)
- vspltisb v0, 0
- /* Precompute vbpermq constant. */
- vspltisb v10, 3
- lvsl v11, r0, r0
- vslb v10, v11, v10
- li r5, 16
- /* Compare 32 bytes in each loop. */
-L(continue1):
- lvx v4, 0, r3
- lvx v5, r3, r5
- vcmpequb v2, v0, v4
- vcmpequb v3, v0, v5
- vor v8, v2, v3
- vcmpequb. v11, v0, v8
- addi r3, r3, 32
- blt cr6, L(continue1)
- addi r3, r3, -32
- VBPERMQ(v2, v2, v10)
- VBPERMQ(v3, v3, v10)
- /* Shift each component into its correct position for merging. */
-#ifdef __LITTLE_ENDIAN__
- vsldoi v3, v3, v3, 2
-#else
- vsldoi v2, v2, v2, 6
- vsldoi v3, v3, v3, 4
-#endif
- /* Merge the results and move to a GPR. */
- vor v4, v3, v2
- MFVRD(r5, v4)
-#ifdef __LITTLE_ENDIAN__
- addi r6, r5, -1
- andc r6, r6, r5
- popcntd r6, r6
-#else
- cntlzd r6, r5 /* Count leading zeros before the match. */
-#endif
- add r3, r3, r6 /* Compute final length. */
- blr
-END (strrchr)
-weak_alias (strrchr, rindex)
-libc_hidden_builtin_def (strrchr)
diff --git a/sysdeps/powerpc/powerpc64/power8/strspn.S b/sysdeps/powerpc/powerpc64/power8/strspn.S
deleted file mode 100644
index e9271898f2..0000000000
--- a/sysdeps/powerpc/powerpc64/power8/strspn.S
+++ /dev/null
@@ -1,202 +0,0 @@
-/* Optimized strspn implementation for Power8.
-
- Copyright (C) 2016-2017 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/>. */
-
-/* size_t [r3] strspn (const char *string [r3],
- const char *needleAccept [r4]) */
-
-/* This takes a novel approach by computing a 256 bit mask whereby
- each set bit implies the byte is "accepted". P8 vector hardware
- has extremely efficient hardware for selecting bits from a mask.
-
- One might ask "why not use bpermd for short strings"? It is
- so slow that its performance about matches the generic PPC64
- variant without any fancy masking, with the added expense of
- making the mask. That was the first variant of this. */
-
-
-
-#include "sysdep.h"
-
-#ifndef USE_AS_STRCSPN
-# define USE_AS_STRCSPN 0
-# ifndef STRSPN
-# define STRSPN strspn
-# endif
-# define INITIAL_MASK 0
-# define UPDATE_MASK(RA, RS, RB) or RA, RS, RB
-#else
-# ifndef STRSPN
-# define STRSPN strcspn
-# endif
-# define INITIAL_MASK -1
-# define UPDATE_MASK(RA, RS, RB) andc RA, RS, RB
-#endif
-
-/* Simple macro to use VSX instructions in overlapping VR's. */
-#define XXVR(insn, vrt, vra, vrb) \
- insn 32+vrt, 32+vra, 32+vrb
-
-/* ISA 2.07B instructions are not all defined for older binutils.
- Macros are defined below for these newer instructions in order
- to maintain compatibility. */
-
-/* Note, TX/SX is always set as VMX regs are the high 32 VSX regs. */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-#define VBPERMQ(t,a,b) .long (0x1000054c \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
- /* This can be updated to power8 once the minimum version of
- binutils supports power8 and the above instructions. */
- .machine power7
-EALIGN(STRSPN, 4, 0)
- CALL_MCOUNT 2
-
- /* Generate useful constants for later on. */
- vspltisb v1, 7
- vspltisb v2, -1
- vslb v1, v1, v1 /* 0x80 to swap high bit for vbpermq. */
- vspltisb v10, 0
- vsldoi v4, v10, v2, 2 /* 0xFFFF into vr4. */
- XXVR(xxmrgld, v4, v4, v10) /* Mask for checking matches. */
-
- /* Prepare to compute 256b mask. */
- addi r4, r4, -1
- li r5, INITIAL_MASK
- li r6, INITIAL_MASK
- li r7, INITIAL_MASK
- li r8, INITIAL_MASK
-
-#if USE_AS_STRCSPN
- /* Ensure the null character never matches by clearing ISA bit 0 in
- in r5 which is the bit which will check for it in the later usage
- of vbpermq. */
- srdi r5, r5, 1
-#endif
-
- li r11, 1
- sldi r11, r11, 63
-
- /* Start interleaved Mask computation.
- This will eventually or 1's into ignored bits from vbpermq. */
- lvsr v11, 0, r3
- vspltb v11, v11, 0 /* Splat shift constant. */
-
- /* Build a 256b mask in r5-r8. */
- .align 4
-L(next_needle):
- lbzu r9, 1(r4)
-
- cmpldi cr0, r9, 0
- cmpldi cr1, r9, 128
-
- /* This is a little tricky. srd only uses the first 7 bits,
- and if bit 7 is set, value is always 0. So, we can
- effectively shift 128b in this case. */
- xori r12, r9, 0x40 /* Invert bit 6. */
- srd r10, r11, r9 /* Mask for bits 0-63. */
- srd r12, r11, r12 /* Mask for bits 64-127. */
-
- beq cr0, L(start_cmp)
-
- /* Now, or the value into the correct GPR. */
- bge cr1,L(needle_gt128)
- UPDATE_MASK (r5, r5, r10) /* 0 - 63. */
- UPDATE_MASK (r6, r6, r12) /* 64 - 127. */
- b L(next_needle)
-
- .align 4
-L(needle_gt128):
- UPDATE_MASK (r7, r7, r10) /* 128 - 191. */
- UPDATE_MASK (r8, r8, r12) /* 192 - 255. */
- b L(next_needle)
-
-
- .align 4
-L(start_cmp):
- /* Move and merge bitmap into 2 VRs. bpermd is slower on P8. */
- mr r0, r3 /* Save r3 for final length computation. */
- MTVRD (v5, r5)
- MTVRD (v6, r6)
- MTVRD (v7, r7)
- MTVRD (v8, r8)
-
- /* Continue interleaved mask generation. */
-#ifdef __LITTLE_ENDIAN__
- vsrw v11, v2, v11 /* Note, shift ignores higher order bits. */
- vsplth v11, v11, 0 /* Only care about the high 16 bits of v10. */
-#else
- vslw v11, v2, v11 /* Note, shift ignores higher order bits. */
- vsplth v11, v11, 1 /* Only care about the low 16 bits of v10. */
-#endif
- lvx v0, 0, r3 /* Note, unaligned load ignores lower bits. */
-
- /* Do the merging of the bitmask. */
- XXVR(xxmrghd, v5, v5, v6)
- XXVR(xxmrghd, v6, v7, v8)
-
- /* Finish mask generation. */
- vand v11, v11, v4 /* Throwaway bits not in the mask. */
-
- /* Compare the first 1-16B, while masking unwanted bytes. */
- clrrdi r3, r3, 4 /* Note, counts from qw boundaries. */
- vxor v9, v0, v1 /* Swap high bit. */
- VBPERMQ (v8, v5, v0)
- VBPERMQ (v7, v6, v9)
- vor v7, v7, v8
- vor v7, v7, v11 /* Ignore non-participating bytes. */
- vcmpequh. v8, v7, v4
- bnl cr6, L(done)
-
- addi r3, r3, 16
-
- .align 4
-L(vec):
- lvx v0, 0, r3
- addi r3, r3, 16
- vxor v9, v0, v1 /* Swap high bit. */
- VBPERMQ (v8, v5, v0)
- VBPERMQ (v7, v6, v9)
- vor v7, v7, v8
- vcmpequh. v8, v7, v4
- blt cr6, L(vec)
-
- addi r3, r3, -16
-L(done):
- subf r3, r0, r3
- MFVRD (r10, v7)
-
-#ifdef __LITTLE_ENDIAN__
- addi r0, r10, 1 /* Count the trailing 1's. */
- andc r10, r10, r0
- popcntd r10, r10
-#else
- xori r10, r10, 0xffff /* Count leading 1's by inverting. */
- addi r3, r3, -48 /* Account for the extra leading zeros. */
- cntlzd r10, r10
-#endif
-
- add r3, r3, r10
- blr
-
-END(STRSPN)
-libc_hidden_builtin_def (STRSPN)
diff --git a/sysdeps/powerpc/powerpc64/power9/Implies b/sysdeps/powerpc/powerpc64/power9/Implies
deleted file mode 100644
index fad2505ab9..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc64/power8/fpu
-powerpc/powerpc64/power8
diff --git a/sysdeps/powerpc/powerpc64/power9/fpu/Implies b/sysdeps/powerpc/powerpc64/power9/fpu/Implies
deleted file mode 100644
index ae0dbaf857..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/fpu/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power8/fpu
diff --git a/sysdeps/powerpc/powerpc64/power9/fpu/multiarch/Implies b/sysdeps/powerpc/powerpc64/power9/fpu/multiarch/Implies
deleted file mode 100644
index f11e1bdba2..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/fpu/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power8/fpu/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power9/multiarch/Implies b/sysdeps/powerpc/powerpc64/power9/multiarch/Implies
deleted file mode 100644
index dd6bca4b36..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/multiarch/Implies
+++ /dev/null
@@ -1 +0,0 @@
-powerpc/powerpc64/power8/multiarch
diff --git a/sysdeps/powerpc/powerpc64/power9/strcmp.S b/sysdeps/powerpc/powerpc64/power9/strcmp.S
deleted file mode 100644
index 2dc4f6c722..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/strcmp.S
+++ /dev/null
@@ -1,268 +0,0 @@
-/* Optimized strcmp implementation for PowerPC64/POWER9.
- Copyright (C) 2016-2017 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/>. */
-#ifdef __LITTLE_ENDIAN__
-#include <sysdep.h>
-
-#ifndef STRCMP
-# define STRCMP strcmp
-#endif
-
-/* Implements the function
-
- int [r3] strcmp (const char *s1 [r3], const char *s2 [r4])
-
- The implementation uses unaligned doubleword access for first 32 bytes
- as in POWER8 patch and uses vectorised loops after that. */
-
-/* TODO: Change this to actual instructions when minimum binutils is upgraded
- to 2.27. Macros are defined below for these newer instructions in order
- to maintain compatibility. */
-# define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
-
-# define VEXTUBRX(t,a,b) .long (0x1000070d \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-# define VCMPNEZB(t,a,b) .long (0x10000507 \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-/* Get 16 bytes for unaligned case.
- reg1: Vector to hold next 16 bytes.
- reg2: Address to read from.
- reg3: Permute control vector. */
-# define GET16BYTES(reg1, reg2, reg3) \
- lvx reg1, 0, reg2; \
- vperm v8, v2, reg1, reg3; \
- vcmpequb. v8, v0, v8; \
- beq cr6, 1f; \
- vspltisb v9, 0; \
- b 2f; \
- .align 4; \
-1: \
- addi r6, reg2, 16; \
- lvx v9, 0, r6; \
-2: \
- vperm reg1, v9, reg1, reg3;
-
-/* TODO: change this to .machine power9 when the minimum required binutils
- allows it. */
-
- .machine power7
-EALIGN (STRCMP, 4, 0)
- li r0, 0
-
- /* Check if [s1]+16 or [s2]+16 will cross a 4K page boundary using
- the code:
-
- (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE))
-
- with PAGE_SIZE being 4096 and ITER_SIZE begin 16. */
-
- rldicl r7, r3, 0, 52
- rldicl r9, r4, 0, 52
- cmpldi cr7, r7, 4096-16
- bgt cr7, L(pagecross_check)
- cmpldi cr5, r9, 4096-16
- bgt cr5, L(pagecross_check)
-
- /* For short strings up to 16 bytes, load both s1 and s2 using
- unaligned dwords and compare. */
- ld r8, 0(r3)
- ld r10, 0(r4)
- cmpb r12, r8, r0
- cmpb r11, r8, r10
- orc. r9, r12, r11
- bne cr0, L(different_nocmpb)
-
- ld r8, 8(r3)
- ld r10, 8(r4)
- cmpb r12, r8, r0
- cmpb r11, r8, r10
- orc. r9, r12, r11
- bne cr0, L(different_nocmpb)
-
- addi r7, r3, 16
- addi r4, r4, 16
-
-L(align):
- /* Now it has checked for first 16 bytes. */
- vspltisb v0, 0
- vspltisb v2, -1
- lvsr v6, 0, r4 /* Compute mask. */
- or r5, r4, r7
- andi. r5, r5, 0xF
- beq cr0, L(aligned)
- andi. r5, r7, 0xF
- beq cr0, L(s1_align)
- lvsr v10, 0, r7 /* Compute mask. */
-
- /* Both s1 and s2 are unaligned. */
- GET16BYTES(v4, r7, v10)
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- beq cr6, L(match)
- b L(different)
-
- /* Align s1 to qw and adjust s2 address. */
- .align 4
-L(match):
- clrldi r6, r7, 60
- subfic r5, r6, 16
- add r7, r7, r5
- add r4, r4, r5
- andi. r5, r4, 0xF
- beq cr0, L(aligned)
- lvsr v6, 0, r4
- /* There are 2 loops depending on the input alignment.
- Each loop gets 16 bytes from s1 and s2 and compares.
- Loop until a mismatch or null occurs. */
-L(s1_align):
- lvx v4, r7, r0
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, r7, r0
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, r7, r0
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, r7, r0
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- beq cr6, L(s1_align)
- b L(different)
-
- .align 4
-L(aligned):
- lvx v4, 0, r7
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, 0, r7
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, 0, r7
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- bne cr6, L(different)
-
- lvx v4, 0, r7
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- addi r7, r7, 16
- addi r4, r4, 16
- beq cr6, L(aligned)
-
- /* Calculate and return the difference. */
-L(different):
- VCTZLSBB(r6, v7)
- VEXTUBRX(r5, r6, v4)
- VEXTUBRX(r4, r6, v5)
- subf r3, r4, r5
- extsw r3, r3
- blr
-
- .align 4
-L(different_nocmpb):
- neg r3, r9
- and r9, r9, r3
- cntlzd r9, r9
- subfic r9, r9, 63
- srd r3, r8, r9
- srd r10, r10, r9
- rldicl r10, r10, 0, 56
- rldicl r3, r3, 0, 56
- subf r3, r10, r3
- extsw r3, r3
- blr
-
- .align 4
-L(pagecross_check):
- subfic r9, r9, 4096
- subfic r7, r7, 4096
- cmpld cr7, r7, r9
- bge cr7, L(pagecross)
- mr r7, r9
-
- /* If unaligned 16 bytes reads across a 4K page boundary, it uses
- a simple byte a byte comparison until the page alignment for s1
- is reached. */
-L(pagecross):
- add r7, r3, r7
- subf r9, r3, r7
- mtctr r9
-
- .align 4
-L(pagecross_loop):
- /* Loads a byte from s1 and s2, compare if *s1 is equal to *s2
- and if *s1 is '\0'. */
- lbz r9, 0(r3)
- lbz r10, 0(r4)
- addi r3, r3, 1
- addi r4, r4, 1
- cmplw cr7, r9, r10
- cmpdi cr5, r9, r0
- bne cr7, L(pagecross_ne)
- beq cr5, L(pagecross_nullfound)
- bdnz L(pagecross_loop)
- b L(align)
-
- .align 4
-L(pagecross_ne):
- extsw r3, r9
- mr r9, r10
-L(pagecross_retdiff):
- subf r9, r9, r3
- extsw r3, r9
- blr
-
- .align 4
-L(pagecross_nullfound):
- li r3, 0
- b L(pagecross_retdiff)
-END (STRCMP)
-libc_hidden_builtin_def (strcmp)
-#else
-#include <sysdeps/powerpc/powerpc64/power8/strcmp.S>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/power9/strncmp.S b/sysdeps/powerpc/powerpc64/power9/strncmp.S
deleted file mode 100644
index c946a5c638..0000000000
--- a/sysdeps/powerpc/powerpc64/power9/strncmp.S
+++ /dev/null
@@ -1,379 +0,0 @@
-/* Optimized strncmp implementation for PowerPC64/POWER9.
- Copyright (C) 2016-2017 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/>. */
-#ifdef __LITTLE_ENDIAN__
-#include <sysdep.h>
-
-/* Implements the function
-
- int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n)
-
- The implementation uses unaligned doubleword access to avoid specialized
- code paths depending of data alignment for first 32 bytes and uses
- vectorised loops after that. */
-
-#ifndef STRNCMP
-# define STRNCMP strncmp
-#endif
-
-/* TODO: Change this to actual instructions when minimum binutils is upgraded
- to 2.27. Macros are defined below for these newer instructions in order
- to maintain compatibility. */
-# define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
-
-# define VEXTUBRX(t,a,b) .long (0x1000070d \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-# define VCMPNEZB(t,a,b) .long (0x10000507 \
- | ((t)<<(32-11)) \
- | ((a)<<(32-16)) \
- | ((b)<<(32-21)) )
-
-/* Get 16 bytes for unaligned case.
- reg1: Vector to hold next 16 bytes.
- reg2: Address to read from.
- reg3: Permute control vector. */
-# define GET16BYTES(reg1, reg2, reg3) \
- lvx reg1, 0, reg2; \
- vperm v8, v2, reg1, reg3; \
- vcmpequb. v8, v0, v8; \
- beq cr6, 1f; \
- vspltisb v9, 0; \
- b 2f; \
- .align 4; \
-1: \
- cmplw cr6, r5, r11; \
- ble cr6, 2f; \
- addi r6, reg2, 16; \
- lvx v9, 0, r6; \
-2: \
- vperm reg1, v9, reg1, reg3;
-
-/* TODO: change this to .machine power9 when minimum binutils
- is upgraded to 2.27. */
- .machine power7
-EALIGN (STRNCMP, 4, 0)
- /* Check if size is 0. */
- cmpdi cr0, r5, 0
- beq cr0, L(ret0)
- li r0, 0
-
- /* Check if [s1]+32 or [s2]+32 will cross a 4K page boundary using
- the code:
-
- (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE))
-
- with PAGE_SIZE being 4096 and ITER_SIZE begin 32. */
- rldicl r8, r3, 0, 52
- cmpldi cr7, r8, 4096-32
- bgt cr7, L(pagecross)
- rldicl r9, r4, 0, 52
- cmpldi cr7, r9, 4096-32
- bgt cr7, L(pagecross)
-
- /* For short strings up to 32 bytes, load both s1 and s2 using
- unaligned dwords and compare. */
-
- ld r7, 0(r3)
- ld r9, 0(r4)
- li r8, 0
- cmpb r8, r7, r8
- cmpb r6, r7, r9
- orc. r8, r8, r6
- bne cr0, L(different1)
-
- /* If the strings compared are equal, but size is less or equal
- to 8, return 0. */
- cmpldi cr7, r5, 8
- li r9, 0
- ble cr7, L(ret1)
- addi r5, r5, -8
-
- ld r7, 8(r3)
- ld r9, 8(r4)
- cmpb r8, r7, r8
- cmpb r6, r7, r9
- orc. r8, r8, r6
- bne cr0, L(different1)
- cmpldi cr7, r5, 8
- mr r9, r8
- ble cr7, L(ret1)
- /* Update pointers and size. */
- addi r5, r5, -8
- addi r3, r3, 16
- addi r4, r4, 16
-
- ld r7, 0(r3)
- ld r9, 0(r4)
- li r8, 0
- cmpb r8, r7, r8
- cmpb r6, r7, r9
- orc. r8, r8, r6
- bne cr0, L(different1)
- cmpldi cr7, r5, 8
- li r9, 0
- ble cr7, L(ret1)
- addi r5, r5, -8
-
- ld r7, 8(r3)
- ld r9, 8(r4)
- cmpb r8, r7, r8
- cmpb r6, r7, r9
- orc. r8, r8, r6
- bne cr0, L(different1)
- cmpldi cr7, r5, 8
- mr r9, r8
- ble cr7, L(ret1)
-
- /* Update pointers and size. */
- addi r5, r5, -8
- addi r3, r3, 16
- addi r4, r4, 16
-L(align):
- /* Now it has checked for first 32 bytes, align source1 to doubleword
- and adjust source2 address. */
- vspltisb v0, 0
- vspltisb v2, -1
- or r6, r4, r3
- andi. r6, r6, 0xF
- beq cr0, L(aligned)
- lvsr v6, 0, r4 /* Compute mask. */
- clrldi r6, r4, 60
- subfic r11, r6, 16
- andi. r6, r3, 0xF
- beq cr0, L(s1_align)
- /* Both s1 and s2 are unaligned. */
- GET16BYTES(v5, r4, v6)
- lvsr v10, 0, r3 /* Compute mask. */
- clrldi r6, r3, 60
- subfic r11, r6, 16
- GET16BYTES(v4, r3, v10)
- VCMPNEZB(v7, v5, v4)
- beq cr6, L(match)
- b L(different)
-
- /* Align s1 to qw and adjust s2 address. */
- .align 4
-L(match):
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- subf r5, r11, r5
- add r3, r3, r11
- add r4, r4, r11
- andi. r11, r4, 0xF
- beq cr0, L(aligned)
- lvsr v6, 0, r4
- clrldi r6, r4, 60
- subfic r11, r6, 16
- /* There are 2 loops depending on the input alignment.
- Each loop gets 16 bytes from s1 and s2, checks for null
- and compares them. Loops until a mismatch or null occurs. */
-L(s1_align):
- lvx v4, 0, r3
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- GET16BYTES(v5, r4, v6)
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
- b L(s1_align)
- .align 4
-L(aligned):
- lvx v4, 0, r3
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
-
- lvx v4, 0, r3
- lvx v5, 0, r4
- VCMPNEZB(v7, v5, v4)
- bne cr6, L(different)
- cmpldi cr7, r5, 16
- ble cr7, L(ret0)
- addi r5, r5, -16
- addi r3, r3, 16
- addi r4, r4, 16
- b L(aligned)
- /* Calculate and return the difference. */
-L(different):
- VCTZLSBB(r6, v7)
- cmplw cr7, r5, r6
- ble cr7, L(ret0)
- VEXTUBRX(r5, r6, v4)
- VEXTUBRX(r4, r6, v5)
- subf r3, r4, r5
- extsw r3, r3
- blr
-
- .align 4
-L(ret0):
- li r9, 0
-L(ret1):
- mr r3, r9
- blr
-
- /* The code now checks if r8 and r5 are different by issuing a
- cmpb and shifts the result based on its output:
-
- leadzero = (__builtin_ffsl (z1) - 1);
- leadzero = leadzero > (n-1)*8 ? (n-1)*8 : leadzero;
- r1 = (r1 >> leadzero) & 0xFFUL;
- r2 = (r2 >> leadzero) & 0xFFUL;
- return r1 - r2; */
-
- .align 4
-L(different1):
- neg r11, r8
- sldi r5, r5, 3
- and r8, r11, r8
- addi r5, r5, -8
- cntlzd r8, r8
- subfic r8, r8, 63
- extsw r8, r8
- cmpld cr7, r8, r5
- ble cr7, L(different2)
- mr r8, r5
-L(different2):
- extsw r8, r8
- srd r7, r7, r8
- srd r9, r9, r8
- rldicl r3, r7, 0, 56
- rldicl r9, r9, 0, 56
- subf r9, r9, 3
- extsw r9, r9
- mr r3, r9
- blr
-
- /* If unaligned 16 bytes reads across a 4K page boundary, it uses
- a simple byte a byte comparison until the page alignment for s1
- is reached. */
- .align 4
-L(pagecross):
- lbz r7, 0(r3)
- lbz r9, 0(r4)
- subfic r8, r8,4095
- cmplw cr7, r9, r7
- bne cr7, L(byte_ne_3)
- cmpdi cr7, r9, 0
- beq cr7, L(byte_ne_0)
- addi r5, r5, -1
- subf r7, r8, r5
- subf r9, r7, r5
- addi r9, r9, 1
- mtctr r9
- b L(pagecross_loop1)
-
- .align 4
-L(pagecross_loop0):
- beq cr7, L(ret0)
- lbz r9, 0(r3)
- lbz r8, 0(r4)
- addi r5, r5, -1
- cmplw cr7, r9, r8
- cmpdi cr5, r9, 0
- bne cr7, L(byte_ne_2)
- beq cr5, L(byte_ne_0)
-L(pagecross_loop1):
- cmpdi cr7, r5, 0
- addi r3, r3, 1
- addi r4, r4, 1
- bdnz L(pagecross_loop0)
- cmpdi cr7, r7, 0
- li r9, 0
- bne+ cr7, L(align)
- b L(ret1)
-
- .align 4
-L(byte_ne_0):
- li r7, 0
-L(byte_ne_1):
- subf r9, r9, r7
- extsw r9, r9
- b L(ret1)
-
- .align 4
-L(byte_ne_2):
- extsw r7, r9
- mr r9, r8
- b L(byte_ne_1)
-L(byte_ne_3):
- extsw r7, r7
- b L(byte_ne_1)
-END(STRNCMP)
-libc_hidden_builtin_def(strncmp)
-#else
-#include <sysdeps/powerpc/powerpc64/power8/strncmp.S>
-#endif
diff --git a/sysdeps/powerpc/powerpc64/ppc-mcount.S b/sysdeps/powerpc/powerpc64/ppc-mcount.S
deleted file mode 100644
index 8312f46644..0000000000
--- a/sysdeps/powerpc/powerpc64/ppc-mcount.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/* PowerPC64-specific implementation of profiling support.
- Copyright (C) 1997-2017 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 <sysdep.h>
-/* We don't need to save the parameter-passing registers as gcc takes
- care of that for us. Thus this function looks fairly normal.
- In fact, the generic code would work for us. */
-
-ENTRY(_mcount)
- mflr r4
- ld r11, 0(r1)
- stdu r1,-FRAME_MIN_SIZE(r1)
- cfi_adjust_cfa_offset (FRAME_MIN_SIZE)
- std r4, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
- cfi_offset (lr, FRAME_LR_SAVE)
- ld r3, FRAME_LR_SAVE(r11)
- bl JUMPTARGET(__mcount_internal)
- nop
- ld r0, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
- mtlr r0
- addi r1,r1,FRAME_MIN_SIZE
- blr
-END(_mcount)
-
diff --git a/sysdeps/powerpc/powerpc64/register-dump.h b/sysdeps/powerpc/powerpc64/register-dump.h
deleted file mode 100644
index 215e42b63f..0000000000
--- a/sysdeps/powerpc/powerpc64/register-dump.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Dump registers.
- Copyright (C) 1998-2017 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 <sys/uio.h>
-#include <_itoa.h>
-
-/* This prints out the information in the following form: */
-static const char dumpform[] = "\
-Register dump:\n\
-sr0=000000000000020% sr1=000000000000021% dar=000000000000029% dsi=000002a%\n\
-lr=000000000000024% ctr=000000000000023% gr3*=000000000000022% trap=0000028%\n\
-ccr=0000026% xer=0000025%\n\
-gr0-3: 000000000000000% 000000000000001% 000000000000002% 000000000000003%\n\
-gr4-7: 000000000000004% 000000000000005% 000000000000006% 000000000000007%\n\
-gr8-11: 000000000000008% 000000000000009% 00000000000000a% 00000000000000b%\n\
-gr12-15: 00000000000000c% 00000000000000d% 00000000000000e% 00000000000000f%\n\
-gr16-19: 000000000000010% 000000000000011% 000000000000012% 000000000000013%\n\
-gr20-23: 000000000000014% 000000000000015% 000000000000016% 000000000000017%\n\
-gr24-27: 000000000000018% 000000000000019% 00000000000001a% 00000000000001b%\n\
-gr28-31: 00000000000001c% 00000000000001d% 00000000000001e% 00000000000001f%\n\
-fscr=000000000000050%\n\
-fp0-3: 000000000000030% 000000000000031% 000000000000032% 000000000000033%\n\
-fp4-7: 000000000000034% 000000000000035% 000000000000036% 000000000000037%\n\
-fp8-11: 000000000000038% 000000000000038% 00000000000003a% 00000000000003b%\n\
-fp12-15: 00000000000003c% 00000000000003d% 00000000000003e% 00000000000003f%\n\
-fp16-19: 000000000000040% 000000000000041% 000000000000042% 000000000000043%\n\
-fp20-23: 000000000000044% 000000000000045% 000000000000046% 000000000000047%\n\
-fp24-27: 000000000000048% 000000000000049% 00000000000004a% 00000000000004b%\n\
-fp28-31: 00000000000004c% 00000000000004d% 00000000000004e% 00000000000004f%\n\
-";
-
-/* Most of the fields are self-explanatory. 'sr0' is the next
- instruction to execute, from SRR0, which may have some relationship
- with the instruction that caused the exception. 'r3*' is the value
- that will be returned in register 3 when the current system call
- returns. 'sr1' is SRR1, bits 16-31 of which are copied from the MSR:
-
- 16 - External interrupt enable
- 17 - Privilege level (1=user, 0=supervisor)
- 18 - FP available
- 19 - Machine check enable (if clear, processor locks up on machine check)
- 20 - FP exception mode bit 0 (FP exceptions recoverable)
- 21 - Single-step trace enable
- 22 - Branch trace enable
- 23 - FP exception mode bit 1
- 25 - exception prefix (if set, exceptions are taken from 0xFFFnnnnn,
- otherwise from 0x000nnnnn).
- 26 - Instruction address translation enabled.
- 27 - Data address translation enabled.
- 30 - Exception is recoverable (otherwise, don't try to return).
- 31 - Little-endian mode enable.
-
- 'Trap' is the address of the exception:
-
- 00200 - Machine check exception (memory parity error, for instance)
- 00300 - Data access exception (memory not mapped, see dsisr for why)
- 00400 - Instruction access exception (memory not mapped)
- 00500 - External interrupt
- 00600 - Alignment exception (see dsisr for more information)
- 00700 - Program exception (illegal/trap instruction, FP exception)
- 00800 - FP unavailable (should not be seen by user code)
- 00900 - Decrementer exception (for instance, SIGALRM)
- 00A00 - I/O controller interface exception
- 00C00 - System call exception (for instance, kill(3)).
- 00E00 - FP assist exception (optional FP instructions, etc.)
-
- 'dar' is the memory location, for traps 00300, 00400, 00600, 00A00.
- 'dsisr' has the following bits under trap 00300:
- 0 - direct-store error exception
- 1 - no page table entry for page
- 4 - memory access not permitted
- 5 - trying to access I/O controller space or using lwarx/stwcx on
- non-write-cached memory
- 6 - access was store
- 9 - data access breakpoint hit
- 10 - segment table search failed to find translation (64-bit ppcs only)
- 11 - I/O controller instruction not permitted
- For trap 00400, the same bits are set in SRR1 instead.
- For trap 00600, bits 12-31 of the DSISR set to allow emulation of
- the instruction without actually having to read it from memory.
-*/
-
-#define xtoi(x) (x >= 'a' ? x + 10 - 'a' : x - '0')
-
-static void
-register_dump (int fd, struct sigcontext *ctx)
-{
- char buffer[sizeof(dumpform)];
- char *bufferpos;
- unsigned regno;
- unsigned long *regs = (unsigned long *)(ctx->regs);
-
- memcpy(buffer, dumpform, sizeof(dumpform));
-
- /* Generate the output. */
- while ((bufferpos = memchr (buffer, '%', sizeof(dumpform))))
- {
- regno = xtoi (bufferpos[-1]) | xtoi (bufferpos[-2]) << 4;
- memset (bufferpos-2, '0', 3);
- _itoa_word (regs[regno], bufferpos+1, 16, 0);
- }
-
- /* Write the output. */
- write (fd, buffer, sizeof(buffer) - 1);
-}
-
-
-#define REGISTER_DUMP \
- register_dump (fd, ctx)
diff --git a/sysdeps/powerpc/powerpc64/rtld-memset.c b/sysdeps/powerpc/powerpc64/rtld-memset.c
deleted file mode 100644
index f3ed8ad1e7..0000000000
--- a/sysdeps/powerpc/powerpc64/rtld-memset.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* PPCA2 has a different cache-line size than the usual 128 bytes. To avoid
- using code that assumes cache-line size to be 128 bytes (with dcbz
- instructions) we use the generic code instead. */
-#include <string/memset.c>
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
deleted file mode 100644
index 20f6cf364c..0000000000
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ /dev/null
@@ -1,245 +0,0 @@
-/* setjmp for PowerPC64.
- Copyright (C) 1995-2017 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 <sysdep.h>
-#include <stap-probe.h>
-#define _ASM
-#ifdef __NO_VMX__
-#include <novmxsetjmp.h>
-#else
-#include <jmpbuf-offsets.h>
-#endif
-
-#ifndef __NO_VMX__
- .section ".toc","aw"
-.LC__dl_hwcap:
-# ifdef SHARED
-# if IS_IN (rtld)
- /* Inside ld.so we use the local alias to avoid runtime GOT
- relocations. */
- .tc _rtld_local_ro[TC],_rtld_local_ro
-# else
- .tc _rtld_global_ro[TC],_rtld_global_ro
-# endif
-# else
- .tc _dl_hwcap[TC],_dl_hwcap
-# endif
- .section ".text"
-#endif
-
- .machine "altivec"
-ENTRY (setjmp_symbol)
- CALL_MCOUNT 1
- li r4,1 /* Set second argument to 1. */
- b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
-END (setjmp_symbol)
-
-#if defined SHARED && !IS_IN (rtld) && !defined __NO_VMX__
-/* When called from within libc we need a special version of _setjmp
- that saves r2 since the call won't go via a plt call stub. See
- bugz #269. __GI__setjmp is used in csu/libc-start.c when
- HAVE_CLEANUP_JMP_BUF is defined. */
-ENTRY (__GI__setjmp)
- std r2,FRAME_TOC_SAVE(r1) /* Save the callers TOC in the save area. */
- CALL_MCOUNT 1
- li r4,0 /* Set second argument to 0. */
- b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
-END (__GI__setjmp)
-#endif
-
-ENTRY (_setjmp_symbol)
- CALL_MCOUNT 1
- li r4,0 /* Set second argument to 0. */
- b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
-END (_setjmp_symbol)
-libc_hidden_def (_setjmp_symbol)
-
-ENTRY (__sigsetjmp_symbol)
- CALL_MCOUNT 2
-JUMPTARGET(GLUE(__sigsetjmp_symbol,_ent)):
-#ifdef PTR_MANGLE
- mr r5, r1
- PTR_MANGLE (r5, r6)
- std r5,(JB_GPR1*8)(3)
-#else
- std r1,(JB_GPR1*8)(3)
-#endif
- mflr r0
-#if defined SHARED && !IS_IN (rtld)
- ld r5,FRAME_TOC_SAVE(r1) /* Retrieve the callers TOC. */
- std r5,(JB_GPR2*8)(3)
-#else
- std r2,(JB_GPR2*8)(3)
-#endif
- /* setjmp probe expects longjmp first argument (8@3), second argument
- (-4@4), and target address (8@0), respectively. */
- LIBC_PROBE (setjmp, 3, 8@3, -4@4, 8@0)
- std r14,((JB_GPRS+0)*8)(3)
- stfd fp14,((JB_FPRS+0)*8)(3)
-#ifdef PTR_MANGLE
- PTR_MANGLE2 (r0, r6)
-#endif
- std r0,(JB_LR*8)(3)
- std r15,((JB_GPRS+1)*8)(3)
- stfd fp15,((JB_FPRS+1)*8)(3)
- mfcr r0
- std r16,((JB_GPRS+2)*8)(3)
- stfd fp16,((JB_FPRS+2)*8)(3)
- stw r0,((JB_CR*8)+4)(3) /* 32-bit CR. */
- std r17,((JB_GPRS+3)*8)(3)
- stfd fp17,((JB_FPRS+3)*8)(3)
- std r18,((JB_GPRS+4)*8)(3)
- stfd fp18,((JB_FPRS+4)*8)(3)
- std r19,((JB_GPRS+5)*8)(3)
- stfd fp19,((JB_FPRS+5)*8)(3)
- std r20,((JB_GPRS+6)*8)(3)
- stfd fp20,((JB_FPRS+6)*8)(3)
- std r21,((JB_GPRS+7)*8)(3)
- stfd fp21,((JB_FPRS+7)*8)(3)
- std r22,((JB_GPRS+8)*8)(3)
- stfd fp22,((JB_FPRS+8)*8)(3)
- std r23,((JB_GPRS+9)*8)(3)
- stfd fp23,((JB_FPRS+9)*8)(3)
- std r24,((JB_GPRS+10)*8)(3)
- stfd fp24,((JB_FPRS+10)*8)(3)
- std r25,((JB_GPRS+11)*8)(3)
- stfd fp25,((JB_FPRS+11)*8)(3)
- std r26,((JB_GPRS+12)*8)(3)
- stfd fp26,((JB_FPRS+12)*8)(3)
- std r27,((JB_GPRS+13)*8)(3)
- stfd fp27,((JB_FPRS+13)*8)(3)
- std r28,((JB_GPRS+14)*8)(3)
- stfd fp28,((JB_FPRS+14)*8)(3)
- std r29,((JB_GPRS+15)*8)(3)
- stfd fp29,((JB_FPRS+15)*8)(3)
- std r30,((JB_GPRS+16)*8)(3)
- stfd fp30,((JB_FPRS+16)*8)(3)
- std r31,((JB_GPRS+17)*8)(3)
- stfd fp31,((JB_FPRS+17)*8)(3)
-#ifndef __NO_VMX__
- ld r6,.LC__dl_hwcap@toc(r2)
-# ifdef SHARED
- /* Load _rtld-global._dl_hwcap. */
- ld r6,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r6)
-# else
- ld r6,0(r6) /* Load extern _dl_hwcap. */
-# endif
- andis. r6,r6,(PPC_FEATURE_HAS_ALTIVEC >> 16)
- beq L(no_vmx)
- la r5,((JB_VRS)*8)(3)
- andi. r6,r5,0xf
- mfspr r0,VRSAVE
- stw r0,((JB_VRSAVE)*8)(3) /* 32-bit VRSAVE. */
- addi r6,r5,16
- beq+ L(aligned_save_vmx)
-
- lvsr v0,0,r5
- lvsl v1,0,r5
- addi r6,r5,-16
-
-# define save_misaligned_vmx(savevr,prevvr,shiftvr,tmpvr,savegpr,addgpr) \
- addi addgpr,addgpr,32; \
- vperm tmpvr,prevvr,savevr,shiftvr; \
- stvx tmpvr,0,savegpr
-
- /*
- * We have to be careful not to corrupt the data below v20 and
- * above v31. To keep things simple we just rotate both ends in
- * the opposite direction to our main permute so we can use
- * the common macro.
- */
-
- /* load and rotate data below v20 */
- lvx v2,0,r5
- vperm v2,v2,v2,v1
- save_misaligned_vmx(v20,v2,v0,v3,r5,r6)
- save_misaligned_vmx(v21,v20,v0,v3,r6,r5)
- save_misaligned_vmx(v22,v21,v0,v3,r5,r6)
- save_misaligned_vmx(v23,v22,v0,v3,r6,r5)
- save_misaligned_vmx(v24,v23,v0,v3,r5,r6)
- save_misaligned_vmx(v25,v24,v0,v3,r6,r5)
- save_misaligned_vmx(v26,v25,v0,v3,r5,r6)
- save_misaligned_vmx(v27,v26,v0,v3,r6,r5)
- save_misaligned_vmx(v28,v27,v0,v3,r5,r6)
- save_misaligned_vmx(v29,v28,v0,v3,r6,r5)
- save_misaligned_vmx(v30,v29,v0,v3,r5,r6)
- save_misaligned_vmx(v31,v30,v0,v3,r6,r5)
- /* load and rotate data above v31 */
- lvx v2,0,r6
- vperm v2,v2,v2,v1
- save_misaligned_vmx(v2,v31,v0,v3,r5,r6)
-
- b L(no_vmx)
-
-L(aligned_save_vmx):
- stvx 20,0,r5
- addi r5,r5,32
- stvx 21,0,r6
- addi r6,r6,32
- stvx 22,0,r5
- addi r5,r5,32
- stvx 23,0,r6
- addi r6,r6,32
- stvx 24,0,r5
- addi r5,r5,32
- stvx 25,0,r6
- addi r6,r6,32
- stvx 26,0,r5
- addi r5,r5,32
- stvx 27,0,r6
- addi r6,r6,32
- stvx 28,0,r5
- addi r5,r5,32
- stvx 29,0,r6
- addi r6,r6,32
- stvx 30,0,r5
- stvx 31,0,r6
-L(no_vmx):
-#else
- li r6,0
-#endif
-#if IS_IN (rtld)
- li r3,0
- blr
-#elif defined SHARED
- b JUMPTARGET (__sigjmp_save_symbol)
-#else
- mflr r0
- std r0,FRAME_LR_SAVE(r1)
- stdu r1,-FRAME_MIN_SIZE(r1)
- cfi_adjust_cfa_offset(FRAME_MIN_SIZE)
- cfi_offset(lr,FRAME_LR_SAVE)
- bl JUMPTARGET (__sigjmp_save_symbol)
- nop
- ld r0,FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
- addi r1,r1,FRAME_MIN_SIZE
- mtlr r0
- blr
-#endif
-END (__sigsetjmp_symbol)
-
-#if defined SHARED && !IS_IN (rtld) && !defined __NO_VMX__
-/* When called from within libc we need a special version of __sigsetjmp
- that saves r2 since the call won't go via a plt call stub. See
- bugz #269. */
-ENTRY (__GI___sigsetjmp)
- std r2,FRAME_TOC_SAVE(r1) /* Save the callers TOC in the save area. */
- CALL_MCOUNT 1
- b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
-END (__GI___sigsetjmp)
-#endif
diff --git a/sysdeps/powerpc/powerpc64/setjmp.S b/sysdeps/powerpc/powerpc64/setjmp.S
deleted file mode 100644
index 3f61d28203..0000000000
--- a/sysdeps/powerpc/powerpc64/setjmp.S
+++ /dev/null
@@ -1,61 +0,0 @@
-/* AltiVec (new) version of setjmp for PowerPC.
- Copyright (C) 1995-2017 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 <libc-symbols.h>
-#include <rtld-global-offsets.h>
-#include <shlib-compat.h>
-
-#if !IS_IN (libc)
-/* Build a non-versioned object for rtld-*. */
-# define setjmp_symbol setjmp
-# define _setjmp_symbol _setjmp
-# define __sigsetjmp_symbol __sigsetjmp
-# define __sigjmp_save_symbol __sigjmp_save
-# include "setjmp-common.S"
-
-#else /* IS_IN (libc) */
-/* Build a versioned object for libc. */
-versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4)
-versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4)
-versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
-# define setjmp_symbol __vmxsetjmp
-# define _setjmp_symbol __vmx_setjmp
-# define __sigsetjmp_symbol __vmx__sigsetjmp
-# define __sigjmp_save_symbol __vmx__sigjmp_save
-# include "setjmp-common.S"
-strong_alias (__vmxsetjmp, __vmx__setjmp)
-strong_alias (__vmx__sigsetjmp, __setjmp)
-
-# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
-# undef setjmp_symbol
-# undef _setjmp_symbol
-# undef __sigsetjmp_symbol
-# undef __sigjmp_save_symbol
-# undef JB_SIZE
-# define __NO_VMX__
-compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_3)
-compat_symbol (libc, __novmx_setjmp,_setjmp, GLIBC_2_3);
-compat_symbol (libc, __novmx__sigsetjmp,__sigsetjmp, GLIBC_2_3)
-# define setjmp_symbol __novmxsetjmp
-# define _setjmp_symbol __novmx_setjmp
-# define __sigsetjmp_symbol __novmx__sigsetjmp
-# define __sigjmp_save_symbol __novmx__sigjmp_save
-# include "setjmp-common.S"
-strong_alias (__novmxsetjmp, __novmx__setjmp)
-# endif
-#endif /* IS_IN (libc) */
diff --git a/sysdeps/powerpc/powerpc64/stackguard-macros.h b/sysdeps/powerpc/powerpc64/stackguard-macros.h
deleted file mode 100644
index e80a683e64..0000000000
--- a/sysdeps/powerpc/powerpc64/stackguard-macros.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdint.h>
-
-#define STACK_CHK_GUARD \
- ({ uintptr_t x; asm ("ld %0,-28688(13)" : "=r" (x)); x; })
-
-#define POINTER_CHK_GUARD \
- ({ \
- uintptr_t x; \
- asm ("ld %0,%1(13)" \
- : "=r" (x) \
- : "i" (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) \
- ); \
- x; \
- })
diff --git a/sysdeps/powerpc/powerpc64/start.S b/sysdeps/powerpc/powerpc64/start.S
deleted file mode 100644
index 937c39a740..0000000000
--- a/sysdeps/powerpc/powerpc64/start.S
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Startup code for programs linked with GNU libc. PowerPC64 version.
- Copyright (C) 1998-2017 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/>. */
-
-#include <sysdep.h>
-
-/* We do not want .eh_frame info for crt1.o since crt1.o is linked
- before crtbegin.o, the file defining __EH_FRAME_BEGIN__. */
-#undef cfi_startproc
-#define cfi_startproc
-#undef cfi_endproc
-#define cfi_endproc
-
- /* These are the various addresses we require. */
-#ifdef PIC
- .section ".data.rel.ro.local","aw"
-#else
- .section ".rodata"
-#endif
- .align 3
-L(start_addresses):
- .quad 0 /* was _SDA_BASE_ but not in 64-bit ABI*/
-/* function descriptors so don't need JUMPTARGET */
- .quad main
- .quad __libc_csu_init
- .quad __libc_csu_fini
-
- ASM_SIZE_DIRECTIVE(L(start_addresses))
-
- .section ".toc","aw"
-.L01:
- .tc L(start_addresses)[TC],L(start_addresses)
- .section ".text"
-ENTRY(_start)
- /* Save the stack pointer, in case we're statically linked under Linux. */
- mr r9,r1
- /* Set up an initial stack frame, and clear the LR. */
- clrrdi r1,r1,4
- li r0,0
- stdu r1,-128(r1)
- mtlr r0
- std r0,0(r1)
-
- /* put the address of start_addresses in r8... **
-** PPC64 ABI uses R13 for thread local, so we leave it alone */
- ld r8,.L01@toc(r2)
-
- /* and continue in libc-start, in glibc. */
- b JUMPTARGET(__libc_start_main)
-/* The linker needs this nop to recognize that it's OK to call via a
- TOC adjusting stub. */
- nop
-
-END(_start)
-
-/* Define a symbol for the first piece of initialized data. */
- .section ".data"
- .globl __data_start
-__data_start:
- .long 0
-weak_alias (__data_start, data_start)
diff --git a/sysdeps/powerpc/powerpc64/strchr.S b/sysdeps/powerpc/powerpc64/strchr.S
deleted file mode 100644
index cbfcc14cfe..0000000000
--- a/sysdeps/powerpc/powerpc64/strchr.S
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Optimized strchr implementation for PowerPC64.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
-/* See strlen.s for comments on how this works. */
-
-/* char * [r3] strchr (const char *s [r3] , int c [r4] ) */
-
-#ifndef STRCHR
-# define STRCHR strchr
-#endif
-
-ENTRY (STRCHR)
- CALL_MCOUNT 2
-
-#define rTMP1 r0
-#define rRTN r3 /* outgoing result */
-#define rSTR r8 /* current word pointer */
-#define rCHR r4 /* byte we're looking for, spread over the whole word */
-#define rWORD r5 /* the current word */
-#define rCLZB rCHR /* leading zero byte count */
-#define rFEFE r6 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r7 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rTMP2 r9
-#define rIGN r10 /* number of bits we should ignore in the first word */
-#define rMASK r11 /* mask with the bits to ignore set to 0 */
-#define rTMP3 r12
-#define rTMP4 rIGN
-#define rTMP5 rMASK
-
- dcbt 0,rRTN
- insrdi rCHR, rCHR, 8, 48
- li rMASK, -1
- insrdi rCHR, rCHR, 16, 32
- rlwinm rIGN, rRTN, 3, 26, 28
- insrdi rCHR, rCHR, 32, 0
- lis rFEFE, -0x101
- lis r7F7F, 0x7f7f
- clrrdi rSTR, rRTN, 3
- addi rFEFE, rFEFE, -0x101
- addi r7F7F, r7F7F, 0x7f7f
- sldi rTMP1, rFEFE, 32
- insrdi r7F7F, r7F7F, 32, 0
- add rFEFE, rFEFE, rTMP1
-/* Test the first (partial?) word. */
- ld rWORD, 0(rSTR)
-#ifdef __LITTLE_ENDIAN__
- sld rMASK, rMASK, rIGN
-#else
- srd rMASK, rMASK, rIGN
-#endif
- orc rWORD, rWORD, rMASK
- add rTMP1, rFEFE, rWORD
- nor rTMP2, r7F7F, rWORD
- and. rTMP4, rTMP1, rTMP2
- xor rTMP3, rCHR, rWORD
- orc rTMP3, rTMP3, rMASK
- b L(loopentry)
-
-/* The loop. */
-
-L(loop):
- ldu rWORD, 8(rSTR)
- and. rTMP5, rTMP1, rTMP2
-/* Test for 0. */
- add rTMP1, rFEFE, rWORD /* x - 0x01010101. */
- nor rTMP2, r7F7F, rWORD /* ~(x | 0x7f7f7f7f) == ~x & 0x80808080. */
- bne L(foundit)
- and. rTMP4, rTMP1, rTMP2 /* (x - 0x01010101) & ~x & 0x80808080. */
-/* Start test for the bytes we're looking for. */
- xor rTMP3, rCHR, rWORD
-L(loopentry):
- add rTMP1, rFEFE, rTMP3
- nor rTMP2, r7F7F, rTMP3
- beq L(loop)
-
-/* There is a zero byte in the word, but may also be a matching byte (either
- before or after the zero byte). In fact, we may be looking for a
- zero byte, in which case we return a match. */
- and. rTMP5, rTMP1, rTMP2
- li rRTN, 0
- beqlr
-/* At this point:
- rTMP5 bytes are 0x80 for each match of c, 0 otherwise.
- rTMP4 bytes are 0x80 for each match of 0, 0 otherwise.
- But there may be false matches in the next most significant byte from
- a true match due to carries. This means we need to recalculate the
- matches using a longer method for big-endian. */
-#ifdef __LITTLE_ENDIAN__
- addi rTMP1, rTMP5, -1
- andc rTMP1, rTMP1, rTMP5
- cntlzd rCLZB, rTMP1
- addi rTMP2, rTMP4, -1
- andc rTMP2, rTMP2, rTMP4
- cmpld rTMP1, rTMP2
- bgtlr
- subfic rCLZB, rCLZB, 64-7
-#else
-/* I think we could reduce this by two instructions by keeping the "nor"
- results from the loop for reuse here. See strlen.S tail. Similarly
- one instruction could be pruned from L(foundit). */
- and rFEFE, r7F7F, rWORD
- or rTMP5, r7F7F, rWORD
- and rTMP1, r7F7F, rTMP3
- or rTMP4, r7F7F, rTMP3
- add rFEFE, rFEFE, r7F7F
- add rTMP1, rTMP1, r7F7F
- nor rWORD, rTMP5, rFEFE
- nor rTMP2, rTMP4, rTMP1
- cntlzd rCLZB, rTMP2
- cmpld rWORD, rTMP2
- bgtlr
-#endif
- srdi rCLZB, rCLZB, 3
- add rRTN, rSTR, rCLZB
- blr
-
-L(foundit):
-#ifdef __LITTLE_ENDIAN__
- addi rTMP1, rTMP5, -1
- andc rTMP1, rTMP1, rTMP5
- cntlzd rCLZB, rTMP1
- subfic rCLZB, rCLZB, 64-7-64
- sradi rCLZB, rCLZB, 3
-#else
- and rTMP1, r7F7F, rTMP3
- or rTMP4, r7F7F, rTMP3
- add rTMP1, rTMP1, r7F7F
- nor rTMP2, rTMP4, rTMP1
- cntlzd rCLZB, rTMP2
- subi rSTR, rSTR, 8
- srdi rCLZB, rCLZB, 3
-#endif
- add rRTN, rSTR, rCLZB
- blr
-END (STRCHR)
-
-weak_alias (strchr, index)
-libc_hidden_builtin_def (strchr)
diff --git a/sysdeps/powerpc/powerpc64/strcmp.S b/sysdeps/powerpc/powerpc64/strcmp.S
deleted file mode 100644
index ab5f8c231c..0000000000
--- a/sysdeps/powerpc/powerpc64/strcmp.S
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Optimized strcmp implementation for PowerPC64.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
-/* See strlen.s for comments on how the end-of-string testing works. */
-
-/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
-
-#ifndef STRCMP
-# define STRCMP strcmp
-#endif
-
-EALIGN (STRCMP, 4, 0)
- CALL_MCOUNT 2
-
-#define rTMP2 r0
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rWORD1 r5 /* current word in s1 */
-#define rWORD2 r6 /* current word in s2 */
-#define rFEFE r7 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r8 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
-#define rBITDIF r10 /* bits that differ in s1 & s2 words */
-#define rTMP r11
-
- dcbt 0,rSTR1
- or rTMP, rSTR2, rSTR1
- dcbt 0,rSTR2
- clrldi. rTMP, rTMP, 61
- lis rFEFE, -0x101
- bne L(unaligned)
-
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
- lis r7F7F, 0x7f7f
- addi rFEFE, rFEFE, -0x101
- addi r7F7F, r7F7F, 0x7f7f
- sldi rTMP, rFEFE, 32
- insrdi r7F7F, r7F7F, 32, 0
- add rFEFE, rFEFE, rTMP
- b L(g1)
-
-L(g0): ldu rWORD1, 8(rSTR1)
- bne cr1, L(different)
- ldu rWORD2, 8(rSTR2)
-L(g1): add rTMP, rFEFE, rWORD1
- nor rNEG, r7F7F, rWORD1
- and. rTMP, rTMP, rNEG
- cmpd cr1, rWORD1, rWORD2
- beq+ L(g0)
-
-/* OK. We've hit the end of the string. We need to be careful that
- we don't compare two strings as different because of gunk beyond
- the end of the strings... */
-#ifdef __LITTLE_ENDIAN__
-L(endstring):
- addi rTMP2, rTMP, -1
- beq cr1, L(equal)
- andc rTMP2, rTMP2, rTMP
- rldimi rTMP2, rTMP2, 1, 0
- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */
- and rWORD1, rWORD1, rTMP2
- cmpd cr1, rWORD1, rWORD2
- beq cr1, L(equal)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-
-#else
-L(endstring):
- and rTMP, r7F7F, rWORD1
- beq cr1, L(equal)
- add rTMP, rTMP, r7F7F
- xor. rBITDIF, rWORD1, rWORD2
- andc rNEG, rNEG, rTMP
- blt- L(highbit)
- cntlzd rBITDIF, rBITDIF
- cntlzd rNEG, rNEG
- addi rNEG, rNEG, 7
- cmpd cr1, rNEG, rBITDIF
- sub rRTN, rWORD1, rWORD2
- blt- cr1, L(equal)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-#endif
-
-/* Oh well. In this case, we just do a byte-by-byte comparison. */
- .align 4
-L(unaligned):
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- b L(u1)
-
-L(u0): lbzu rWORD1, 1(rSTR1)
- bne- L(u4)
- lbzu rWORD2, 1(rSTR2)
-L(u1): cmpwi cr1, rWORD1, 0
- beq- cr1, L(u3)
- cmpd rWORD1, rWORD2
- bne- L(u3)
- lbzu rWORD1, 1(rSTR1)
- lbzu rWORD2, 1(rSTR2)
- cmpdi cr1, rWORD1, 0
- cmpd rWORD1, rWORD2
- bne+ cr1, L(u0)
-L(u3): sub rRTN, rWORD1, rWORD2
- blr
-L(u4): lbz rWORD1, -1(rSTR1)
- sub rRTN, rWORD1, rWORD2
- blr
-END (STRCMP)
-libc_hidden_builtin_def (strcmp)
diff --git a/sysdeps/powerpc/powerpc64/strlen.S b/sysdeps/powerpc/powerpc64/strlen.S
deleted file mode 100644
index 1466624c6a..0000000000
--- a/sysdeps/powerpc/powerpc64/strlen.S
+++ /dev/null
@@ -1,203 +0,0 @@
-/* Optimized strlen implementation for PowerPC64.
- Copyright (C) 1997-2017 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 <sysdep.h>
-
-/* The algorithm here uses the following techniques:
-
- 1) Given a word 'x', we can test to see if it contains any 0 bytes
- by subtracting 0x01010101, and seeing if any of the high bits of each
- byte changed from 0 to 1. This works because the least significant
- 0 byte must have had no incoming carry (otherwise it's not the least
- significant), so it is 0x00 - 0x01 == 0xff. For all other
- byte values, either they have the high bit set initially, or when
- 1 is subtracted you get a value in the range 0x00-0x7f, none of which
- have their high bit set. The expression here is
- (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when
- there were no 0x00 bytes in the word. You get 0x80 in bytes that
- match, but possibly false 0x80 matches in the next more significant
- byte to a true match due to carries. For little-endian this is
- of no consequence since the least significant match is the one
- we're interested in, but big-endian needs method 2 to find which
- byte matches.
-
- 2) Given a word 'x', we can test to see _which_ byte was zero by
- calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f).
- This produces 0x80 in each byte that was zero, and 0x00 in all
- the other bytes. The '| 0x7f7f7f7f' clears the low 7 bits in each
- byte, and the '| x' part ensures that bytes with the high bit set
- produce 0x00. The addition will carry into the high bit of each byte
- iff that byte had one of its low 7 bits set. We can then just see
- which was the most significant bit set and divide by 8 to find how
- many to add to the index.
- This is from the book 'The PowerPC Compiler Writer's Guide',
- by Steve Hoxey, Faraydon Karim, Bill Hay and Hank Warren.
-
- We deal with strings not aligned to a word boundary by taking the
- first word and ensuring that bytes not part of the string
- are treated as nonzero. To allow for memory latency, we unroll the
- loop a few times, being careful to ensure that we do not read ahead
- across cache line boundaries.
-
- Questions to answer:
- 1) How long are strings passed to strlen? If they're often really long,
- we should probably use cache management instructions and/or unroll the
- loop more. If they're often quite short, it might be better to use
- fact (2) in the inner loop than have to recalculate it.
- 2) How popular are bytes with the high bit set? If they are very rare,
- on some processors it might be useful to use the simpler expression
- ~((x - 0x01010101) | 0x7f7f7f7f) (that is, on processors with only one
- ALU), but this fails when any character has its high bit set.
-
- Answer:
- 1) Added a Data Cache Block Touch early to prefetch the first 128
- byte cache line. Adding dcbt instructions to the loop would not be
- effective since most strings will be shorter than the cache line. */
-
-/* Some notes on register usage: Under the SVR4 ABI, we can use registers
- 0 and 3 through 12 (so long as we don't call any procedures) without
- saving them. We can also use registers 14 through 31 if we save them.
- We can't use r1 (it's the stack pointer), r2 nor r13 because the user
- program may expect them to hold their usual value if we get sent
- a signal. Integer parameters are passed in r3 through r10.
- We can use condition registers cr0, cr1, cr5, cr6, and cr7 without saving
- them, the others we must save. */
-
-/* int [r3] strlen (char *s [r3]) */
-
-#ifndef STRLEN
-# define STRLEN strlen
-#endif
-
-ENTRY (STRLEN)
- CALL_MCOUNT 1
-
-#define rTMP4 r0
-#define rRTN r3 /* incoming STR arg, outgoing result */
-#define rSTR r4 /* current string position */
-#define rPADN r5 /* number of padding bits we prepend to the
- string to make it start at a word boundary */
-#define rFEFE r6 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r7 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rWORD1 r8 /* current string doubleword */
-#define rWORD2 r9 /* next string doubleword */
-#define rMASK r9 /* mask for first string doubleword */
-#define rTMP1 r10
-#define rTMP2 r11
-#define rTMP3 r12
-
- dcbt 0,rRTN
- clrrdi rSTR, rRTN, 3
- lis r7F7F, 0x7f7f
- rlwinm rPADN, rRTN, 3, 26, 28
- ld rWORD1, 0(rSTR)
- addi r7F7F, r7F7F, 0x7f7f
- li rMASK, -1
- insrdi r7F7F, r7F7F, 32, 0
-/* We use method (2) on the first two doublewords, because rFEFE isn't
- required which reduces setup overhead. Also gives a faster return
- for small strings on big-endian due to needing to recalculate with
- method (2) anyway. */
-#ifdef __LITTLE_ENDIAN__
- sld rMASK, rMASK, rPADN
-#else
- srd rMASK, rMASK, rPADN
-#endif
- and rTMP1, r7F7F, rWORD1
- or rTMP2, r7F7F, rWORD1
- lis rFEFE, -0x101
- add rTMP1, rTMP1, r7F7F
- addi rFEFE, rFEFE, -0x101
- nor rTMP3, rTMP2, rTMP1
- and. rTMP3, rTMP3, rMASK
- mtcrf 0x01, rRTN
- bne L(done0)
- sldi rTMP1, rFEFE, 32
- add rFEFE, rFEFE, rTMP1
-/* Are we now aligned to a doubleword boundary? */
- bt 28, L(loop)
-
-/* Handle second doubleword of pair. */
-/* Perhaps use method (1) here for little-endian, saving one instruction? */
- ldu rWORD1, 8(rSTR)
- and rTMP1, r7F7F, rWORD1
- or rTMP2, r7F7F, rWORD1
- add rTMP1, rTMP1, r7F7F
- nor. rTMP3, rTMP2, rTMP1
- bne L(done0)
-
-/* The loop. */
-
-L(loop):
- ld rWORD1, 8(rSTR)
- ldu rWORD2, 16(rSTR)
- add rTMP1, rFEFE, rWORD1
- nor rTMP2, r7F7F, rWORD1
- and. rTMP1, rTMP1, rTMP2
- add rTMP3, rFEFE, rWORD2
- nor rTMP4, r7F7F, rWORD2
- bne L(done1)
- and. rTMP3, rTMP3, rTMP4
- beq L(loop)
-
-#ifndef __LITTLE_ENDIAN__
- and rTMP1, r7F7F, rWORD2
- add rTMP1, rTMP1, r7F7F
- andc rTMP3, rTMP4, rTMP1
- b L(done0)
-
-L(done1):
- and rTMP1, r7F7F, rWORD1
- subi rSTR, rSTR, 8
- add rTMP1, rTMP1, r7F7F
- andc rTMP3, rTMP2, rTMP1
-
-/* When we get to here, rSTR points to the first doubleword in the string that
- contains a zero byte, and rTMP3 has 0x80 for bytes that are zero, and 0x00
- otherwise. */
-L(done0):
- cntlzd rTMP3, rTMP3
- subf rTMP1, rRTN, rSTR
- srdi rTMP3, rTMP3, 3
- add rRTN, rTMP1, rTMP3
- blr
-#else
-
-L(done0):
- addi rTMP1, rTMP3, -1 /* Form a mask from trailing zeros. */
- andc rTMP1, rTMP1, rTMP3
- cntlzd rTMP1, rTMP1 /* Count bits not in the mask. */
- subf rTMP3, rRTN, rSTR
- subfic rTMP1, rTMP1, 64-7
- srdi rTMP1, rTMP1, 3
- add rRTN, rTMP1, rTMP3
- blr
-
-L(done1):
- addi rTMP3, rTMP1, -1
- andc rTMP3, rTMP3, rTMP1
- cntlzd rTMP3, rTMP3
- subf rTMP1, rRTN, rSTR
- subfic rTMP3, rTMP3, 64-7-64
- sradi rTMP3, rTMP3, 3
- add rRTN, rTMP1, rTMP3
- blr
-#endif
-
-END (STRLEN)
-libc_hidden_builtin_def (strlen)
diff --git a/sysdeps/powerpc/powerpc64/strncmp.S b/sysdeps/powerpc/powerpc64/strncmp.S
deleted file mode 100644
index 076599804a..0000000000
--- a/sysdeps/powerpc/powerpc64/strncmp.S
+++ /dev/null
@@ -1,210 +0,0 @@
-/* Optimized strcmp implementation for PowerPC64.
- Copyright (C) 2003-2017 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 <sysdep.h>
-
-/* See strlen.s for comments on how the end-of-string testing works. */
-
-/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
-
-#ifndef STRNCMP
-# define STRNCMP strncmp
-#endif
-
-EALIGN (STRNCMP, 4, 0)
- CALL_MCOUNT 3
-
-#define rTMP2 r0
-#define rRTN r3
-#define rSTR1 r3 /* first string arg */
-#define rSTR2 r4 /* second string arg */
-#define rN r5 /* max string length */
-#define rWORD1 r6 /* current word in s1 */
-#define rWORD2 r7 /* current word in s2 */
-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */
-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
-#define rBITDIF r11 /* bits that differ in s1 & s2 words */
-#define rTMP r12
-
- dcbt 0,rSTR1
- or rTMP, rSTR2, rSTR1
- lis r7F7F, 0x7f7f
- dcbt 0,rSTR2
- clrldi. rTMP, rTMP, 61
- cmpldi cr1, rN, 0
- lis rFEFE, -0x101
- bne L(unaligned)
-/* We are doubleword aligned so set up for two loops. first a double word
- loop, then fall into the byte loop if any residual. */
- srdi. rTMP, rN, 3
- clrldi rN, rN, 61
- addi rFEFE, rFEFE, -0x101
- addi r7F7F, r7F7F, 0x7f7f
- cmpldi cr1, rN, 0
- beq L(unaligned)
-
- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group. */
- ld rWORD1, 0(rSTR1)
- ld rWORD2, 0(rSTR2)
- sldi rTMP, rFEFE, 32
- insrdi r7F7F, r7F7F, 32, 0
- add rFEFE, rFEFE, rTMP
- b L(g1)
-
-L(g0):
- ldu rWORD1, 8(rSTR1)
- bne- cr1, L(different)
- ldu rWORD2, 8(rSTR2)
-L(g1): add rTMP, rFEFE, rWORD1
- nor rNEG, r7F7F, rWORD1
- bdz L(tail)
- and. rTMP, rTMP, rNEG
- cmpd cr1, rWORD1, rWORD2
- beq+ L(g0)
-
-/* OK. We've hit the end of the string. We need to be careful that
- we don't compare two strings as different because of gunk beyond
- the end of the strings... */
-
-#ifdef __LITTLE_ENDIAN__
-L(endstring):
- addi rTMP2, rTMP, -1
- beq cr1, L(equal)
- andc rTMP2, rTMP2, rTMP
- rldimi rTMP2, rTMP2, 1, 0
- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */
- and rWORD1, rWORD1, rTMP2
- cmpd cr1, rWORD1, rWORD2
- beq cr1, L(equal)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */
- neg rNEG, rBITDIF
- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */
- cntlzd rNEG, rNEG /* bitcount of the bit. */
- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */
- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */
- sld rWORD2, rWORD2, rNEG
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-
-#else
-L(endstring):
- and rTMP, r7F7F, rWORD1
- beq cr1, L(equal)
- add rTMP, rTMP, r7F7F
- xor. rBITDIF, rWORD1, rWORD2
- andc rNEG, rNEG, rTMP
- blt- L(highbit)
- cntlzd rBITDIF, rBITDIF
- cntlzd rNEG, rNEG
- addi rNEG, rNEG, 7
- cmpd cr1, rNEG, rBITDIF
- sub rRTN, rWORD1, rWORD2
- blt- cr1, L(equal)
- sradi rRTN, rRTN, 63 /* must return an int. */
- ori rRTN, rRTN, 1
- blr
-L(equal):
- li rRTN, 0
- blr
-
-L(different):
- ld rWORD1, -8(rSTR1)
- xor. rBITDIF, rWORD1, rWORD2
- sub rRTN, rWORD1, rWORD2
- blt- L(highbit)
- sradi rRTN, rRTN, 63
- ori rRTN, rRTN, 1
- blr
-L(highbit):
- sradi rRTN, rWORD2, 63
- ori rRTN, rRTN, 1
- blr
-#endif
-
-/* Oh well. In this case, we just do a byte-by-byte comparison. */
- .align 4
-L(tail):
- and. rTMP, rTMP, rNEG
- cmpd cr1, rWORD1, rWORD2
- bne- L(endstring)
- addi rSTR1, rSTR1, 8
- bne- cr1, L(different)
- addi rSTR2, rSTR2, 8
- cmpldi cr1, rN, 0
-L(unaligned):
- mtctr rN /* Power4 wants mtctr 1st in dispatch group */
- bgt cr1, L(uz)
-L(ux):
- li rRTN, 0
- blr
- .align 4
-L(uz):
- lbz rWORD1, 0(rSTR1)
- lbz rWORD2, 0(rSTR2)
- nop
- b L(u1)
-L(u0):
- lbzu rWORD2, 1(rSTR2)
-L(u1):
- bdz L(u3)
- cmpdi cr1, rWORD1, 0
- cmpd rWORD1, rWORD2
- beq- cr1, L(u3)
- lbzu rWORD1, 1(rSTR1)
- bne- L(u2)
- lbzu rWORD2, 1(rSTR2)
- bdz L(u3)
- cmpdi cr1, rWORD1, 0
- cmpd rWORD1, rWORD2
- bne- L(u3)
- lbzu rWORD1, 1(rSTR1)
- bne+ cr1, L(u0)
-
-L(u2): lbzu rWORD1, -1(rSTR1)
-L(u3): sub rRTN, rWORD1, rWORD2
- blr
-END (STRNCMP)
-libc_hidden_builtin_def (strncmp)
diff --git a/sysdeps/powerpc/powerpc64/submul_1.S b/sysdeps/powerpc/powerpc64/submul_1.S
deleted file mode 100644
index df93b4c3f4..0000000000
--- a/sysdeps/powerpc/powerpc64/submul_1.S
+++ /dev/null
@@ -1,21 +0,0 @@
-/* PowerPC64 __mpn_addmul_1 -- Multiply a limb vector with a limb and subtract
- the result to a second limb vector.
- Copyright (C) 2013-2017 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 USE_AS_SUBMUL
-#include "addmul_1.S"
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
deleted file mode 100644
index db7c1d78b5..0000000000
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ /dev/null
@@ -1,425 +0,0 @@
-/* Assembly macros for 64-bit PowerPC.
- Copyright (C) 2002-2017 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/powerpc/sysdep.h>
-
-#ifdef __ASSEMBLER__
-
-/* Stack frame offsets. */
-#if _CALL_ELF != 2
-#define FRAME_MIN_SIZE 112
-#define FRAME_MIN_SIZE_PARM 112
-#define FRAME_BACKCHAIN 0
-#define FRAME_CR_SAVE 8
-#define FRAME_LR_SAVE 16
-#define FRAME_TOC_SAVE 40
-#define FRAME_PARM_SAVE 48
-#define FRAME_PARM1_SAVE 48
-#define FRAME_PARM2_SAVE 56
-#define FRAME_PARM3_SAVE 64
-#define FRAME_PARM4_SAVE 72
-#define FRAME_PARM5_SAVE 80
-#define FRAME_PARM6_SAVE 88
-#define FRAME_PARM7_SAVE 96
-#define FRAME_PARM8_SAVE 104
-#define FRAME_PARM9_SAVE 112
-#else
-#define FRAME_MIN_SIZE 32
-#define FRAME_MIN_SIZE_PARM 96
-#define FRAME_BACKCHAIN 0
-#define FRAME_CR_SAVE 8
-#define FRAME_LR_SAVE 16
-#define FRAME_TOC_SAVE 24
-#define FRAME_PARM_SAVE 32
-#define FRAME_PARM1_SAVE 32
-#define FRAME_PARM2_SAVE 40
-#define FRAME_PARM3_SAVE 48
-#define FRAME_PARM4_SAVE 56
-#define FRAME_PARM5_SAVE 64
-#define FRAME_PARM6_SAVE 72
-#define FRAME_PARM7_SAVE 80
-#define FRAME_PARM8_SAVE 88
-#define FRAME_PARM9_SAVE 96
-#endif
-
-/* Support macros for CALL_MCOUNT. */
-#if _CALL_ELF == 2
-#define call_mcount_parm_offset (-64)
-#else
-#define call_mcount_parm_offset FRAME_PARM_SAVE
-#endif
- .macro SAVE_ARG NARG
- .if \NARG
- SAVE_ARG \NARG-1
- std 2+\NARG,call_mcount_parm_offset-8+8*(\NARG)(1)
- .endif
- .endm
-
- .macro REST_ARG NARG
- .if \NARG
- REST_ARG \NARG-1
- ld 2+\NARG,FRAME_MIN_SIZE_PARM+call_mcount_parm_offset-8+8*(\NARG)(1)
- .endif
- .endm
-
- .macro CFI_SAVE_ARG NARG
- .if \NARG
- CFI_SAVE_ARG \NARG-1
- cfi_offset(2+\NARG,call_mcount_parm_offset-8+8*(\NARG))
- .endif
- .endm
-
- .macro CFI_REST_ARG NARG
- .if \NARG
- CFI_REST_ARG \NARG-1
- cfi_restore(2+\NARG)
- .endif
- .endm
-
-/* If compiled for profiling, call `_mcount' at the start of each function.
- see ppc-mcount.S for more details. */
- .macro CALL_MCOUNT NARG
-#ifdef PROF
- mflr r0
- SAVE_ARG \NARG
- std r0,FRAME_LR_SAVE(r1)
- stdu r1,-FRAME_MIN_SIZE_PARM(r1)
- cfi_adjust_cfa_offset(FRAME_MIN_SIZE_PARM)
- cfi_offset(lr,FRAME_LR_SAVE)
- CFI_SAVE_ARG \NARG
- bl JUMPTARGET (_mcount)
-#ifndef SHARED
- nop
-#endif
- ld r0,FRAME_MIN_SIZE_PARM+FRAME_LR_SAVE(r1)
- REST_ARG \NARG
- mtlr r0
- addi r1,r1,FRAME_MIN_SIZE_PARM
- cfi_adjust_cfa_offset(-FRAME_MIN_SIZE_PARM)
- cfi_restore(lr)
- CFI_REST_ARG \NARG
-#endif
- .endm
-
-#if _CALL_ELF != 2
-
-/* Macro to prepare for calling via a function pointer. */
- .macro PPC64_LOAD_FUNCPTR PTR
- ld r12,0(\PTR)
- ld r2,8(\PTR)
- mtctr r12
- ld r11,16(\PTR)
- .endm
-
-#ifdef USE_PPC64_OVERLAPPING_OPD
-# define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase
-#else
-# define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase, 0
-#endif
-
-#define ENTRY_1(name) \
- .type BODY_LABEL(name),@function; \
- .globl name; \
- .section ".opd","aw"; \
- .align 3; \
-name##: OPD_ENT (name); \
- .previous;
-
-#define DOT_LABEL(X) X
-#define BODY_LABEL(X) .LY##X
-#define ENTRY_2(name) \
- .type name,@function; \
- ENTRY_1(name)
-#define END_2(name) \
- .size name,.-BODY_LABEL(name); \
- .size BODY_LABEL(name),.-BODY_LABEL(name);
-#define LOCALENTRY(name)
-
-#else /* _CALL_ELF */
-
-/* Macro to prepare for calling via a function pointer. */
- .macro PPC64_LOAD_FUNCPTR PTR
- mr r12,\PTR
- mtctr r12
- .endm
-
-#define DOT_LABEL(X) X
-#define BODY_LABEL(X) X
-#define ENTRY_2(name) \
- .globl name; \
- .type name,@function;
-#define END_2(name) \
- .size name,.-name;
-#define LOCALENTRY(name) \
-1: addis r2,r12,.TOC.-1b@ha; \
- addi r2,r2,.TOC.-1b@l; \
- .localentry name,.-name;
-
-#endif /* _CALL_ELF */
-
-#define ENTRY(name) \
- .section ".text"; \
- ENTRY_2(name) \
- .align ALIGNARG(2); \
-BODY_LABEL(name): \
- cfi_startproc; \
- LOCALENTRY(name)
-
-#define EALIGN_W_0 /* No words to insert. */
-#define EALIGN_W_1 nop
-#define EALIGN_W_2 nop;nop
-#define EALIGN_W_3 nop;nop;nop
-#define EALIGN_W_4 EALIGN_W_3;nop
-#define EALIGN_W_5 EALIGN_W_4;nop
-#define EALIGN_W_6 EALIGN_W_5;nop
-#define EALIGN_W_7 EALIGN_W_6;nop
-
-/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
- past a 2^alignt boundary. */
-#define EALIGN(name, alignt, words) \
- .section ".text"; \
- ENTRY_2(name) \
- .align ALIGNARG(alignt); \
- EALIGN_W_##words; \
-BODY_LABEL(name): \
- cfi_startproc; \
- LOCALENTRY(name)
-
-/* Local labels stripped out by the linker. */
-#undef L
-#define L(x) .L##x
-
-#define tostring(s) #s
-#define stringify(s) tostring(s)
-#define XGLUE(a,b) a##b
-#define GLUE(a,b) XGLUE(a,b)
-#define LT_LABEL(name) GLUE(.LT,name)
-#define LT_LABELSUFFIX(name,suffix) GLUE(GLUE(.LT,name),suffix)
-
-/* Support Traceback tables */
-#define TB_ASM 0x000c000000000000
-#define TB_GLOBALLINK 0x0000800000000000
-#define TB_IS_EPROL 0x0000400000000000
-#define TB_HAS_TBOFF 0x0000200000000000
-#define TB_INT_PROC 0x0000100000000000
-#define TB_HAS_CTL 0x0000080000000000
-#define TB_TOCLESS 0x0000040000000000
-#define TB_FP_PRESENT 0x0000020000000000
-#define TB_LOG_ABORT 0x0000010000000000
-#define TB_INT_HANDL 0x0000008000000000
-#define TB_NAME_PRESENT 0x0000004000000000
-#define TB_USES_ALLOCA 0x0000002000000000
-#define TB_SAVES_CR 0x0000000200000000
-#define TB_SAVES_LR 0x0000000100000000
-#define TB_STORES_BC 0x0000000080000000
-#define TB_FIXUP 0x0000000040000000
-#define TB_FP_SAVED(fprs) (((fprs) & 0x3f) << 24)
-#define TB_GPR_SAVED(gprs) (((fprs) & 0x3f) << 16)
-#define TB_FIXEDPARMS(parms) (((parms) & 0xff) << 8)
-#define TB_FLOATPARMS(parms) (((parms) & 0x7f) << 1)
-#define TB_PARMSONSTK 0x0000000000000001
-
-#define PPC_HIGHER(v) (((v) >> 32) & 0xffff)
-#define TB_DEFAULT TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT
-
-#define TRACEBACK(name) \
-LT_LABEL(name): ; \
- .long 0 ; \
- .quad TB_DEFAULT ; \
- .long LT_LABEL(name)-BODY_LABEL(name) ; \
- .short LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \
-LT_LABELSUFFIX(name,_name_start): ;\
- .ascii stringify(name) ; \
-LT_LABELSUFFIX(name,_name_end): ; \
- .align 2 ;
-
-#define TRACEBACK_MASK(name,mask) \
-LT_LABEL(name): ; \
- .long 0 ; \
- .quad TB_DEFAULT | mask ; \
- .long LT_LABEL(name)-BODY_LABEL(name) ; \
- .short LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \
-LT_LABELSUFFIX(name,_name_start): ;\
- .ascii stringify(name) ; \
-LT_LABELSUFFIX(name,_name_end): ; \
- .align 2 ;
-
-/* END generates Traceback tables */
-#undef END
-#define END(name) \
- cfi_endproc; \
- TRACEBACK(name) \
- END_2(name)
-
-/* This form supports more informative traceback tables */
-#define END_GEN_TB(name,mask) \
- cfi_endproc; \
- TRACEBACK_MASK(name,mask) \
- END_2(name)
-
-#if !IS_IN(rtld) && defined (ENABLE_LOCK_ELISION)
-# define ABORT_TRANSACTION \
- cmpdi 13,0; \
- beq 1f; \
- lwz 0,TM_CAPABLE(13); \
- cmpwi 0,0; \
- beq 1f; \
- li 11,_ABORT_SYSCALL; \
- tabort. 11; \
- .align 4; \
-1:
-#else
-# define ABORT_TRANSACTION
-#endif
-
-#define DO_CALL(syscall) \
- ABORT_TRANSACTION \
- li 0,syscall; \
- sc
-
-/* ppc64 is always PIC */
-#undef JUMPTARGET
-#define JUMPTARGET(name) DOT_LABEL(name)
-
-#define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- DO_CALL (SYS_ify (syscall_name));
-
-#ifdef SHARED
-#define TAIL_CALL_SYSCALL_ERROR \
- b JUMPTARGET(__syscall_error)
-#else
-/* Static version might be linked into a large app with a toc exceeding
- 64k. We can't put a toc adjusting stub on a plain branch, so can't
- tail call __syscall_error. */
-#define TAIL_CALL_SYSCALL_ERROR \
- .ifdef .Local_syscall_error; \
- b .Local_syscall_error; \
- .else; \
-.Local_syscall_error: \
- mflr 0; \
- std 0,FRAME_LR_SAVE(1); \
- stdu 1,-FRAME_MIN_SIZE(1); \
- cfi_adjust_cfa_offset(FRAME_MIN_SIZE); \
- cfi_offset(lr,FRAME_LR_SAVE); \
- bl JUMPTARGET(__syscall_error); \
- nop; \
- ld 0,FRAME_MIN_SIZE+FRAME_LR_SAVE(1); \
- addi 1,1,FRAME_MIN_SIZE; \
- cfi_adjust_cfa_offset(-FRAME_MIN_SIZE); \
- mtlr 0; \
- cfi_restore(lr); \
- blr; \
- .endif
-#endif
-
-#define PSEUDO_RET \
- bnslr+; \
- TAIL_CALL_SYSCALL_ERROR
-
-#define ret PSEUDO_RET
-
-#undef PSEUDO_END
-#define PSEUDO_END(name) \
- END (name)
-
-#define PSEUDO_NOERRNO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- DO_CALL (SYS_ify (syscall_name));
-
-#define PSEUDO_RET_NOERRNO \
- blr
-
-#define ret_NOERRNO PSEUDO_RET_NOERRNO
-
-#undef PSEUDO_END_NOERRNO
-#define PSEUDO_END_NOERRNO(name) \
- END (name)
-
-#define PSEUDO_ERRVAL(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- DO_CALL (SYS_ify (syscall_name));
-
-#define PSEUDO_RET_ERRVAL \
- blr
-
-#define ret_ERRVAL PSEUDO_RET_ERRVAL
-
-#undef PSEUDO_END_ERRVAL
-#define PSEUDO_END_ERRVAL(name) \
- END (name)
-
-#else /* !__ASSEMBLER__ */
-
-#if _CALL_ELF != 2
-
-#define PPC64_LOAD_FUNCPTR(ptr) \
- "ld 12,0(" #ptr ");\n" \
- "ld 2,8(" #ptr ");\n" \
- "mtctr 12;\n" \
- "ld 11,16(" #ptr ");"
-
-#ifdef USE_PPC64_OVERLAPPING_OPD
-# define OPD_ENT(name) ".quad " BODY_PREFIX #name ", .TOC.@tocbase;"
-#else
-# define OPD_ENT(name) ".quad " BODY_PREFIX #name ", .TOC.@tocbase, 0;"
-#endif
-
-#define ENTRY_1(name) \
- ".type " BODY_PREFIX #name ",@function;\n" \
- ".globl " #name ";\n" \
- ".pushsection \".opd\",\"aw\";\n" \
- ".align 3;\n" \
-#name ":\n" \
- OPD_ENT (name) "\n" \
- ".popsection;"
-
-#define DOT_PREFIX ""
-#define BODY_PREFIX ".LY"
-#define ENTRY_2(name) \
- ".type " #name ",@function;\n" \
- ENTRY_1(name)
-#define END_2(name) \
- ".size " #name ",.-" BODY_PREFIX #name ";\n" \
- ".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";"
-#define LOCALENTRY(name)
-
-#else /* _CALL_ELF */
-
-#define PPC64_LOAD_FUNCPTR(ptr) \
- "mr 12," #ptr ";\n" \
- "mtctr 12;"
-
-#define DOT_PREFIX ""
-#define BODY_PREFIX ""
-#define ENTRY_2(name) \
- ".type " #name ",@function;\n" \
- ".globl " #name ";"
-#define END_2(name) \
- ".size " #name ",.-" #name ";"
-#define LOCALENTRY(name) \
- "1: addis 2,12,.TOC.-1b@ha;\n" \
- "addi 2,2,.TOC.-1b@l;\n" \
- ".localentry " #name ",.-" #name ";"
-
-#endif /* _CALL_ELF */
-
-#endif /* __ASSEMBLER__ */
diff --git a/sysdeps/powerpc/powerpc64/tls-macros.h b/sysdeps/powerpc/powerpc64/tls-macros.h
deleted file mode 100644
index 42a95ec5c1..0000000000
--- a/sysdeps/powerpc/powerpc64/tls-macros.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Include sysdeps/powerpc/tls-macros.h for __TLS_CALL_CLOBBERS */
-#include_next "tls-macros.h"
-
-/* PowerPC64 Local Exec TLS access. */
-#define TLS_LE(x) \
- ({ int * __result; \
- asm ("addis %0,13," #x "@tprel@ha\n\t" \
- "addi %0,%0," #x "@tprel@l" \
- : "=b" (__result) ); \
- __result; \
- })
-/* PowerPC64 Initial Exec TLS access. */
-#define TLS_IE(x) \
- ({ int * __result; \
- asm ("ld %0," #x "@got@tprel(2)\n\t" \
- "add %0,%0," #x "@tls" \
- : "=r" (__result) ); \
- __result; \
- })
-
-#define __TLS_GET_ADDR "__tls_get_addr"
-
-/* PowerPC64 Local Dynamic TLS access. */
-#define TLS_LD(x) \
- ({ int * __result; \
- asm ("addi 3,2," #x "@got@tlsld\n\t" \
- "bl " __TLS_GET_ADDR "\n\t" \
- "nop \n\t" \
- "addis %0,3," #x "@dtprel@ha\n\t" \
- "addi %0,%0," #x "@dtprel@l" \
- : "=b" (__result) : \
- : "3", __TLS_CALL_CLOBBERS); \
- __result; \
- })
-/* PowerPC64 General Dynamic TLS access. */
-#define TLS_GD(x) \
- ({ register int *__result __asm__ ("r3"); \
- asm ("addi 3,2," #x "@got@tlsgd\n\t" \
- "bl " __TLS_GET_ADDR "\n\t" \
- "nop " \
- : "=r" (__result) : \
- : __TLS_CALL_CLOBBERS); \
- __result; \
- })
diff --git a/sysdeps/powerpc/powerpc64/tst-audit.h b/sysdeps/powerpc/powerpc64/tst-audit.h
deleted file mode 100644
index b25040b9f0..0000000000
--- a/sysdeps/powerpc/powerpc64/tst-audit.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Definitions for testing PLT entry/exit auditing. PowerPC64 version.
-
- Copyright (C) 2012-2017 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/>. */
-
-#if _CALL_ELF != 2
-#define pltenter la_ppc64_gnu_pltenter
-#define pltexit la_ppc64_gnu_pltexit
-#define La_regs La_ppc64_regs
-#define La_retval La_ppc64_retval
-#define int_retval lrv_r3
-#else
-#define pltenter la_ppc64v2_gnu_pltenter
-#define pltexit la_ppc64v2_gnu_pltexit
-#define La_regs La_ppc64v2_regs
-#define La_retval La_ppc64v2_retval
-#define int_retval lrv_r3
-#endif