aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMickaƫl Thomas <mickael9@gmail.com>2024-06-29 22:44:34 +0200
committerRichard Earnshaw <rearnsha@arm.com>2024-07-01 13:47:01 +0100
commit920b72f4f6cccc3ca0bca203c8150cfcbe3a7daa (patch)
tree38b9fcc9c49e8c06a550c27ce7de47dc07b705d4
parentc4fb5da2787693ea3bf20b2ac847f2c7d50da67c (diff)
downloadnewlib-920b72f4f6cccc3ca0bca203c8150cfcbe3a7daa.zip
newlib-920b72f4f6cccc3ca0bca203c8150cfcbe3a7daa.tar.gz
newlib-920b72f4f6cccc3ca0bca203c8150cfcbe3a7daa.tar.bz2
arm: Fix fma & fmaf implementations
The vfma.f32|64 z, x, y instruction performs the operation z += x * y without intermediate rounding. The register used for z is both read and written by the instruction. The inline assembly must therefore use the "+" constraint modifier.
-rw-r--r--newlib/libm/machine/arm/s_fma_arm.c2
-rw-r--r--newlib/libm/machine/arm/sf_fma_arm.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/newlib/libm/machine/arm/s_fma_arm.c b/newlib/libm/machine/arm/s_fma_arm.c
index f945419..6a2b403 100644
--- a/newlib/libm/machine/arm/s_fma_arm.c
+++ b/newlib/libm/machine/arm/s_fma_arm.c
@@ -41,7 +41,7 @@
double
fma (double x, double y, double z)
{
- asm ("vfma.f64 %P0, %P1, %P2" : "=w" (z) : "w" (x), "w" (y));
+ asm ("vfma.f64 %P0, %P1, %P2" : "+w" (z) : "w" (x), "w" (y));
return z;
}
diff --git a/newlib/libm/machine/arm/sf_fma_arm.c b/newlib/libm/machine/arm/sf_fma_arm.c
index 4befd90..8d1b63d 100644
--- a/newlib/libm/machine/arm/sf_fma_arm.c
+++ b/newlib/libm/machine/arm/sf_fma_arm.c
@@ -41,7 +41,7 @@
float
fmaf (float x, float y, float z)
{
- asm ("vfma.f32 %0, %1, %2" : "=t" (z) : "t" (x), "t" (y));
+ asm ("vfma.f32 %0, %1, %2" : "+t" (z) : "t" (x), "t" (y));
return z;
}