aboutsummaryrefslogtreecommitdiffstats
path: root/libm
diff options
context:
space:
mode:
authorAmaury Le Leyzour <amaury.leleyzour@arm.com>2015-02-17 15:05:51 -0800
committerChristopher Ferris <cferris@google.com>2015-03-04 12:18:52 -0800
commit32936c895d4407f7444c09ef4b0fd0ea532feb00 (patch)
treebb60552c26bb13950b28ad513129fdf6fc6d6ed5 /libm
parentd5c2745ca8664b987d737e4a32922b6c9fe7c628 (diff)
downloadandroid_bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.tar.gz
android_bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.tar.bz2
android_bionic-32936c895d4407f7444c09ef4b0fd0ea532feb00.zip
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.mk109
-rw-r--r--libm/arm64/ceil.S27
-rw-r--r--libm/arm64/floor.S27
-rw-r--r--libm/arm64/fma.S27
-rw-r--r--libm/arm64/lrint.S36
-rw-r--r--libm/arm64/rint.S27
-rw-r--r--libm/arm64/sqrt.S27
-rw-r--r--libm/arm64/trunc.S27
8 files changed, 285 insertions, 22 deletions
diff --git a/libm/Android.mk b/libm/Android.mk
index ebc3c9fe9..3139bc252 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 000000000..006c9887a
--- /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 000000000..2d792e555
--- /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 000000000..e64e8077e
--- /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 000000000..69cc10c3e
--- /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 000000000..0820c2211
--- /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 000000000..fe0020bd6
--- /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 000000000..329c08d12
--- /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)