diff options
author | Amaury Le Leyzour <amaury.leleyzour@arm.com> | 2015-02-17 15:05:51 -0800 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2015-03-04 12:18:52 -0800 |
commit | 32936c895d4407f7444c09ef4b0fd0ea532feb00 (patch) | |
tree | bb60552c26bb13950b28ad513129fdf6fc6d6ed5 /libm | |
parent | d5c2745ca8664b987d737e4a32922b6c9fe7c628 (diff) | |
download | bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.zip bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.tar.gz bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.tar.bz2 |
Add aarch64 instructions wherever possible
fma, sqrt and various rounding functions have aarch64 instruction equivalent
Change-Id: I1284f31b9f78f914281e5563b8d44db8362b627d
Diffstat (limited to 'libm')
-rw-r--r-- | libm/Android.mk | 109 | ||||
-rw-r--r-- | libm/arm64/ceil.S | 27 | ||||
-rw-r--r-- | libm/arm64/floor.S | 27 | ||||
-rw-r--r-- | libm/arm64/fma.S | 27 | ||||
-rw-r--r-- | libm/arm64/lrint.S | 36 | ||||
-rw-r--r-- | libm/arm64/rint.S | 27 | ||||
-rw-r--r-- | libm/arm64/sqrt.S | 27 | ||||
-rw-r--r-- | libm/arm64/trunc.S | 27 |
8 files changed, 285 insertions, 22 deletions
diff --git a/libm/Android.mk b/libm/Android.mk index ebc3c9f..3139bc2 100644 --- a/libm/Android.mk +++ b/libm/Android.mk @@ -69,8 +69,6 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/e_scalbf.c \ upstream-freebsd/lib/msun/src/e_sinh.c \ upstream-freebsd/lib/msun/src/e_sinhf.c \ - upstream-freebsd/lib/msun/src/e_sqrt.c \ - upstream-freebsd/lib/msun/src/e_sqrtf.c \ upstream-freebsd/lib/msun/src/imprecise.c \ upstream-freebsd/lib/msun/src/k_cos.c \ upstream-freebsd/lib/msun/src/k_cosf.c \ @@ -92,8 +90,6 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/s_cbrtf.c \ upstream-freebsd/lib/msun/src/s_ccosh.c \ upstream-freebsd/lib/msun/src/s_ccoshf.c \ - upstream-freebsd/lib/msun/src/s_ceil.c \ - upstream-freebsd/lib/msun/src/s_ceilf.c \ upstream-freebsd/lib/msun/src/s_cexp.c \ upstream-freebsd/lib/msun/src/s_cexpf.c \ upstream-freebsd/lib/msun/src/s_cimag.c \ @@ -130,9 +126,6 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/s_fdim.c \ upstream-freebsd/lib/msun/src/s_finite.c \ upstream-freebsd/lib/msun/src/s_finitef.c \ - upstream-freebsd/lib/msun/src/s_floorf.c \ - upstream-freebsd/lib/msun/src/s_fma.c \ - upstream-freebsd/lib/msun/src/s_fmaf.c \ upstream-freebsd/lib/msun/src/s_fmax.c \ upstream-freebsd/lib/msun/src/s_fmaxf.c \ upstream-freebsd/lib/msun/src/s_fmin.c \ @@ -141,16 +134,12 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/s_frexpf.c \ upstream-freebsd/lib/msun/src/s_ilogb.c \ upstream-freebsd/lib/msun/src/s_ilogbf.c \ - upstream-freebsd/lib/msun/src/s_llrint.c \ - upstream-freebsd/lib/msun/src/s_llrintf.c \ upstream-freebsd/lib/msun/src/s_llround.c \ upstream-freebsd/lib/msun/src/s_llroundf.c \ upstream-freebsd/lib/msun/src/s_log1p.c \ upstream-freebsd/lib/msun/src/s_log1pf.c \ upstream-freebsd/lib/msun/src/s_logb.c \ upstream-freebsd/lib/msun/src/s_logbf.c \ - upstream-freebsd/lib/msun/src/s_lrint.c \ - upstream-freebsd/lib/msun/src/s_lrintf.c \ upstream-freebsd/lib/msun/src/s_lround.c \ upstream-freebsd/lib/msun/src/s_lroundf.c \ upstream-freebsd/lib/msun/src/s_modf.c \ @@ -161,8 +150,6 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/s_nextafterf.c \ upstream-freebsd/lib/msun/src/s_remquo.c \ upstream-freebsd/lib/msun/src/s_remquof.c \ - upstream-freebsd/lib/msun/src/s_rint.c \ - upstream-freebsd/lib/msun/src/s_rintf.c \ upstream-freebsd/lib/msun/src/s_round.c \ upstream-freebsd/lib/msun/src/s_roundf.c \ upstream-freebsd/lib/msun/src/s_scalbln.c \ @@ -178,8 +165,6 @@ LOCAL_SRC_FILES := \ upstream-freebsd/lib/msun/src/s_tanh.c \ upstream-freebsd/lib/msun/src/s_tanhf.c \ upstream-freebsd/lib/msun/src/s_tgammaf.c \ - upstream-freebsd/lib/msun/src/s_trunc.c \ - upstream-freebsd/lib/msun/src/s_truncf.c \ upstream-freebsd/lib/msun/src/w_cabs.c \ upstream-freebsd/lib/msun/src/w_cabsf.c \ upstream-freebsd/lib/msun/src/w_cabsl.c \ @@ -260,8 +245,28 @@ LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \ signbit.c \ +# Arch specific optimizations. + +# ----------------------------------------------------------------------------- +# arm +# ----------------------------------------------------------------------------- LOCAL_SRC_FILES_arm += \ arm/fenv.c \ + upstream-freebsd/lib/msun/src/e_sqrt.c \ + upstream-freebsd/lib/msun/src/e_sqrtf.c \ + upstream-freebsd/lib/msun/src/s_ceil.c \ + upstream-freebsd/lib/msun/src/s_ceilf.c \ + upstream-freebsd/lib/msun/src/s_fma.c \ + upstream-freebsd/lib/msun/src/s_fmaf.c \ + upstream-freebsd/lib/msun/src/s_floorf.c \ + upstream-freebsd/lib/msun/src/s_llrint.c \ + upstream-freebsd/lib/msun/src/s_llrintf.c \ + upstream-freebsd/lib/msun/src/s_lrint.c \ + upstream-freebsd/lib/msun/src/s_lrintf.c \ + upstream-freebsd/lib/msun/src/s_rint.c \ + upstream-freebsd/lib/msun/src/s_rintf.c \ + upstream-freebsd/lib/msun/src/s_trunc.c \ + upstream-freebsd/lib/msun/src/s_truncf.c \ # s_floor.S requires neon instructions. ifdef TARGET_2ND_ARCH @@ -277,25 +282,87 @@ else LOCAL_SRC_FILES_arm += arm/s_floor.S endif +# ----------------------------------------------------------------------------- +# arm64 +# ----------------------------------------------------------------------------- LOCAL_SRC_FILES_arm64 += \ + arm64/ceil.S \ arm64/fenv.c \ - upstream-freebsd/lib/msun/src/s_floor.c \ + arm64/fma.S \ + arm64/floor.S \ + arm64/lrint.S \ + arm64/rint.S \ + arm64/sqrt.S \ + arm64/trunc.S \ -LOCAL_SRC_FILES_mips += \ +# ----------------------------------------------------------------------------- +# mips +# ----------------------------------------------------------------------------- +libm_mips_arch_files := \ mips/fenv.c \ + upstream-freebsd/lib/msun/src/e_sqrt.c \ + upstream-freebsd/lib/msun/src/e_sqrtf.c \ + upstream-freebsd/lib/msun/src/s_ceil.c \ + upstream-freebsd/lib/msun/src/s_ceilf.c \ + upstream-freebsd/lib/msun/src/s_fma.c \ + upstream-freebsd/lib/msun/src/s_fmaf.c \ upstream-freebsd/lib/msun/src/s_floor.c \ + upstream-freebsd/lib/msun/src/s_floorf.c \ + upstream-freebsd/lib/msun/src/s_llrint.c \ + upstream-freebsd/lib/msun/src/s_llrintf.c \ + upstream-freebsd/lib/msun/src/s_lrint.c \ + upstream-freebsd/lib/msun/src/s_lrintf.c \ + upstream-freebsd/lib/msun/src/s_rint.c \ + upstream-freebsd/lib/msun/src/s_rintf.c \ + upstream-freebsd/lib/msun/src/s_trunc.c \ + upstream-freebsd/lib/msun/src/s_truncf.c \ -LOCAL_SRC_FILES_mips64 += \ - mips/fenv.c \ - upstream-freebsd/lib/msun/src/s_floor.c \ +LOCAL_SRC_FILES_mips += $(libm_mips_arch_files) +LOCAL_SRC_FILES_mips64 += $(libm_mips_arch_files) +# ----------------------------------------------------------------------------- +# x86 +# ----------------------------------------------------------------------------- LOCAL_SRC_FILES_x86 += \ i387/fenv.c \ + upstream-freebsd/lib/msun/src/e_sqrt.c \ + upstream-freebsd/lib/msun/src/e_sqrtf.c \ + upstream-freebsd/lib/msun/src/s_ceil.c \ + upstream-freebsd/lib/msun/src/s_ceilf.c \ + upstream-freebsd/lib/msun/src/s_fma.c \ + upstream-freebsd/lib/msun/src/s_fmaf.c \ upstream-freebsd/lib/msun/src/s_floor.c \ + upstream-freebsd/lib/msun/src/s_floorf.c \ + upstream-freebsd/lib/msun/src/s_llrint.c \ + upstream-freebsd/lib/msun/src/s_llrintf.c \ + upstream-freebsd/lib/msun/src/s_lrint.c \ + upstream-freebsd/lib/msun/src/s_lrintf.c \ + upstream-freebsd/lib/msun/src/s_rint.c \ + upstream-freebsd/lib/msun/src/s_rintf.c \ + upstream-freebsd/lib/msun/src/s_trunc.c \ + upstream-freebsd/lib/msun/src/s_truncf.c \ +# ----------------------------------------------------------------------------- +# x86_64 +# ----------------------------------------------------------------------------- LOCAL_SRC_FILES_x86_64 += \ amd64/fenv.c \ + upstream-freebsd/lib/msun/src/e_sqrt.c \ + upstream-freebsd/lib/msun/src/e_sqrtf.c \ + upstream-freebsd/lib/msun/src/s_ceil.c \ + upstream-freebsd/lib/msun/src/s_ceilf.c \ + upstream-freebsd/lib/msun/src/s_fma.c \ + upstream-freebsd/lib/msun/src/s_fmaf.c \ upstream-freebsd/lib/msun/src/s_floor.c \ + upstream-freebsd/lib/msun/src/s_floorf.c \ + upstream-freebsd/lib/msun/src/s_llrint.c \ + upstream-freebsd/lib/msun/src/s_llrintf.c \ + upstream-freebsd/lib/msun/src/s_lrint.c \ + upstream-freebsd/lib/msun/src/s_lrintf.c \ + upstream-freebsd/lib/msun/src/s_rint.c \ + upstream-freebsd/lib/msun/src/s_rintf.c \ + upstream-freebsd/lib/msun/src/s_trunc.c \ + upstream-freebsd/lib/msun/src/s_truncf.c \ LOCAL_C_INCLUDES_x86 += $(LOCAL_PATH)/i387 @@ -303,7 +370,6 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/upstream-freebsd/lib/msun/src/ LOCAL_C_INCLUDES_64 += $(LOCAL_PATH)/upstream-freebsd/lib/msun/ld128/ LOCAL_CLANG := $(libm_clang) -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_ARM_MODE := arm LOCAL_CFLAGS := \ -DFLT_EVAL_METHOD=0 \ @@ -340,7 +406,6 @@ include $(CLEAR_VARS) LOCAL_MODULE := libm LOCAL_CLANG := $(libm_clang) -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_SYSTEM_SHARED_LIBRARIES := libc LOCAL_WHOLE_STATIC_LIBRARIES := libm diff --git a/libm/arm64/ceil.S b/libm/arm64/ceil.S new file mode 100644 index 0000000..006c988 --- /dev/null +++ b/libm/arm64/ceil.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(ceil) + frintP d0, d0 + ret +END(ceil) + +ENTRY(ceilf) + frintP s0, s0 + ret +END(ceilf) diff --git a/libm/arm64/floor.S b/libm/arm64/floor.S new file mode 100644 index 0000000..2d792e5 --- /dev/null +++ b/libm/arm64/floor.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(floor) + frintM d0, d0 + ret +END(floor) + +ENTRY(floorf) + frintM s0, s0 + ret +END(floorf) diff --git a/libm/arm64/fma.S b/libm/arm64/fma.S new file mode 100644 index 0000000..e64e807 --- /dev/null +++ b/libm/arm64/fma.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(fma) + fmadd d0, d0, d1, d2 + ret +END(fma) + +ENTRY(fmaf) + fmadd s0, s0, s1, s2 + ret +END(fmaf) diff --git a/libm/arm64/lrint.S b/libm/arm64/lrint.S new file mode 100644 index 0000000..69cc10c --- /dev/null +++ b/libm/arm64/lrint.S @@ -0,0 +1,36 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(lrint) + frintX d0, d0 + fcvtzs x0, d0 + ret +END(lrint) + +ENTRY(lrintf) + frintX s0, s0 + fcvtzs x0, s0 + ret +END(lrintf) + +// sizeof(long) and sizeof(long long) are the same for aarch64 +.weak llrint +.equ llrint,lrint + +.weak llrintf +.equ llrintf,lrintf diff --git a/libm/arm64/rint.S b/libm/arm64/rint.S new file mode 100644 index 0000000..0820c22 --- /dev/null +++ b/libm/arm64/rint.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(rint) + frintX d0, d0 + ret +END(rint) + +ENTRY(rintf) + frintX s0, s0 + ret +END(rintf) diff --git a/libm/arm64/sqrt.S b/libm/arm64/sqrt.S new file mode 100644 index 0000000..fe0020b --- /dev/null +++ b/libm/arm64/sqrt.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(sqrt) + fsqrt d0, d0 + ret +END(sqrt) + +ENTRY(sqrtf) + fsqrt s0, s0 + ret +END(sqrtf) diff --git a/libm/arm64/trunc.S b/libm/arm64/trunc.S new file mode 100644 index 0000000..329c08d --- /dev/null +++ b/libm/arm64/trunc.S @@ -0,0 +1,27 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/bionic_asm.h> + +ENTRY(trunc) + frintZ d0, d0 + ret +END(trunc) + +ENTRY(truncf) + frintZ s0, s0 + ret +END(truncf) |