diff options
author | Mickaƫl Thomas <mickael9@gmail.com> | 2024-06-29 22:44:34 +0200 |
---|---|---|
committer | Richard Earnshaw <rearnsha@arm.com> | 2024-07-01 13:47:01 +0100 |
commit | 920b72f4f6cccc3ca0bca203c8150cfcbe3a7daa (patch) | |
tree | 38b9fcc9c49e8c06a550c27ce7de47dc07b705d4 | |
parent | c4fb5da2787693ea3bf20b2ac847f2c7d50da67c (diff) | |
download | newlib-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.c | 2 | ||||
-rw-r--r-- | newlib/libm/machine/arm/sf_fma_arm.c | 2 |
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; } |