Use the same inline assembly constraints as for libc fp*(), when operating
authormiod <miod@openbsd.org>
Fri, 27 Jan 2023 16:43:33 +0000 (16:43 +0000)
committermiod <miod@openbsd.org>
Fri, 27 Jan 2023 16:43:33 +0000 (16:43 +0000)
on the floating-point control register.

lib/libm/arch/hppa/fenv.c
lib/libm/arch/hppa/s_ceil.c
lib/libm/arch/hppa/s_ceilf.c
lib/libm/arch/hppa/s_floor.c
lib/libm/arch/hppa/s_floorf.c
lib/libm/arch/hppa/s_trunc.c
lib/libm/arch/hppa/s_truncf.c

index 398129a..9c60d85 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: fenv.c,v 1.6 2022/12/27 17:10:07 jmc Exp $    */
+/*     $OpenBSD: fenv.c,v 1.7 2023/01/27 16:43:33 miod Exp $   */
 
 /*
  * Copyright (c) 2011 Martynas Venckus <martynas@openbsd.org>
@@ -53,7 +53,7 @@ feclearexcept(int excepts)
        u.bits[0] &= ~(excepts << _MASK_SHIFT);
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m" (u.fpsr));
 
        return (0);
 }
@@ -146,7 +146,7 @@ fesetexceptflag(const fexcept_t *flagp, int excepts)
        u.bits[0] |= (*flagp & excepts) << _MASK_SHIFT;
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m" (u.fpsr));
 
        return (0);
 }
@@ -211,7 +211,7 @@ fesetround(int round)
        u.bits[0] |= round;
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m"(u.fpsr));
 
        return (0);
 }
@@ -258,7 +258,7 @@ feholdexcept(fenv_t *envp)
 
        /* Mask all exceptions */
        u.bits[0] &= ~FE_ALL_EXCEPT;
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m"(u.fpsr));
 
        return (0);
 }
@@ -288,7 +288,7 @@ fesetenv(const fenv_t *envp)
            (FE_ALL_EXCEPT << _MASK_SHIFT));
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m"(u.fpsr));
 
        return (0);
 }
@@ -340,7 +340,7 @@ feenableexcept(int mask)
        u.bits[0] |= mask;
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m"(u.fpsr));
 
        return (omask);
 
@@ -362,7 +362,7 @@ fedisableexcept(int mask)
        u.bits[0] &= ~mask;
 
        /* Load the floating-point status register */
-       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr));
+       __asm__ volatile ("fldd 0(%0), %%fr0" : : "r" (&u.fpsr), "m"(u.fpsr));
 
        return (omask);
 }
index 7844ccf..4e0aec6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_ceil.c,v 1.10 2016/09/12 19:47:01 guenther Exp $    */
+/*     $OpenBSD: s_ceil.c,v 1.11 2023/01/27 16:43:33 miod Exp $        */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,14 +12,14 @@ ceil(double x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = (ofpsr & ~((u_int64_t)FP_RM << (9 + 32))) |
            ((u_int64_t)FP_RP << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,dbl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (ofpsr));
        return (x);
 }
 DEF_STD(ceil);
index 516b8af..c9c1ef5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_ceilf.c,v 1.8 2016/09/12 19:47:01 guenther Exp $    */
+/*     $OpenBSD: s_ceilf.c,v 1.9 2023/01/27 16:43:33 miod Exp $        */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,14 +12,14 @@ ceilf(float x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = (ofpsr & ~((u_int64_t)FP_RM << (9 + 32))) |
            ((u_int64_t)FP_RP << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,sgl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (ofpsr));
        return (x);
 }
 DEF_STD(ceilf);
index f925b89..e93d0bb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_floor.c,v 1.12 2016/09/12 19:47:01 guenther Exp $   */
+/*     $OpenBSD: s_floor.c,v 1.13 2023/01/27 16:43:33 miod Exp $       */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,13 +12,13 @@ floor(double x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = ofpsr | ((u_int64_t)FP_RM << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,dbl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (fpsr));
        return (x);
 }
 DEF_STD(floor);
index 533f736..b508ef7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_floorf.c,v 1.10 2016/09/12 19:47:01 guenther Exp $  */
+/*     $OpenBSD: s_floorf.c,v 1.11 2023/01/27 16:43:33 miod Exp $      */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,13 +12,13 @@ floorf(float x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = ofpsr | ((u_int64_t)FP_RM << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,sgl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (ofpsr));
        return (x);
 }
 DEF_STD(floorf);
index 7c4dcd4..8e914c1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_trunc.c,v 1.8 2016/09/12 19:47:02 guenther Exp $    */
+/*     $OpenBSD: s_trunc.c,v 1.9 2023/01/27 16:43:33 miod Exp $        */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,14 +12,14 @@ trunc(double x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = (ofpsr & ~((u_int64_t)FP_RM << (9 + 32))) |
            ((u_int64_t)FP_RZ << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,dbl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (ofpsr));
        return (x);
 }
 DEF_STD(trunc);
index 3901d22..a543dcb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: s_truncf.c,v 1.5 2015/01/20 04:41:01 krw Exp $        */
+/*     $OpenBSD: s_truncf.c,v 1.6 2023/01/27 16:43:33 miod Exp $       */
 /*
  * Written by Michael Shalayeff. Public Domain
  */
@@ -12,13 +12,13 @@ truncf(float x)
 {
        u_int64_t ofpsr, fpsr;
 
-       __asm__ volatile("fstds %%fr0,0(%0)" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fstds %%fr0,0(%1)" : "=m" (ofpsr) : "r" (&ofpsr));
        fpsr = (ofpsr & ~((u_int64_t)FP_RM << (9 + 32))) |
            ((u_int64_t)FP_RZ << (9 + 32));
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&fpsr), "m" (fpsr));
 
        __asm__ volatile("frnd,sgl %0,%0" : "+f" (x));
 
-       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr) : "memory");
+       __asm__ volatile("fldds 0(%0), %%fr0" :: "r" (&ofpsr), "m" (ofpsr));
        return (x);
 }