Agreed. This looks much better, and is simpler and faster. Though, it looks to 
me that "fst" should be called "status" instead (just not to break consistency 
throughout SoftFloat library and in other places of assigning name "status" to 
the last argument of any function if its type is float_status*). If you agree, 
I am going to replace name "fst" with name "status" in the code that you 
provided, otherwise as-is.
________________________________________
From: Leon Alrae
Sent: Thursday, April 14, 2016 8:31 AM
To: Aleksandar Markovic; qemu-devel@nongnu.org
Cc: pro...@gmail.com; kbast...@mail.uni-paderborn.de; 
mark.cave-ayl...@ilande.co.uk; ag...@suse.de; blauwir...@gmail.com; 
jcmvb...@gmail.com; Aleksandar Markovic; qemu-...@nongnu.org; 
qemu-...@nongnu.org; Petar Jovanovic; pbonz...@redhat.com; Miodrag Dinic; 
edgar.igles...@gmail.com; g...@mprc.pku.edu.cn; afaer...@suse.de; 
aurel...@aurel32.net; r...@twiddle.net; Maciej Rozycki
Subject: Re: [PATCH v4 1/9] softfloat: Implement run-time-configurable meaning 
of signaling NaN bit

On 12/04/2016 13:58, Aleksandar Markovic wrote:
> @@ -3200,11 +3200,17 @@ FLOAT_RINT(rint_d, 64)
>  #define FLOAT_CLASS_POSITIVE_ZERO      0x200
>
>  #define FLOAT_CLASS(name, bits)                                      \
> -uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg)    \
> +uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env,         \
> +                         uint ## bits ## _t arg, uint32_t is_msa)    \
>  {                                                                    \
> -    if (float ## bits ## _is_signaling_nan(arg)) {                   \
> +    float_status* fst;                                               \
> +                                                                     \
> +    fst = (is_msa == 1) ?                                            \
> +        &env->active_tc.msa_fp_status : &env->active_fpu.fp_status;  \
> +                                                                     \
> +    if (float ## bits ## _is_signaling_nan(arg, fst)) {              \
>          return FLOAT_CLASS_SIGNALING_NAN;                            \
> -    } else if (float ## bits ## _is_quiet_nan(arg)) {                \
> +    } else if (float ## bits ## _is_quiet_nan(arg, fst)) {           \
>          return FLOAT_CLASS_QUIET_NAN;                                \
>      } else if (float ## bits ## _is_neg(arg)) {                      \
>          if (float ## bits ## _is_infinity(arg)) {                    \

Let's make it a common function which takes float_status passed from FPU and
MSA helpers and avoid is_msa:


 #define FLOAT_CLASS(name, bits)                                      \
-uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg)    \
+uint ## bits ## _t float_ ## name (uint ## bits ## _t arg,           \
+                                   float_status *fst)                \
 {                                                                    \
-    if (float ## bits ## _is_signaling_nan(arg)) {                   \
+    if (float ## bits ## _is_signaling_nan(arg, fst)) {              \
         return FLOAT_CLASS_SIGNALING_NAN;                            \
-    } else if (float ## bits ## _is_quiet_nan(arg)) {                \
+    } else if (float ## bits ## _is_quiet_nan(arg, fst)) {           \
         return FLOAT_CLASS_QUIET_NAN;                                \
     } else if (float ## bits ## _is_neg(arg)) {                      \
         if (float ## bits ## _is_infinity(arg)) {                    \
@@ -3227,6 +3228,12 @@ uint ## bits ## _t helper_float_ ## name (uint ## bits 
## _t arg)    \
             return FLOAT_CLASS_POSITIVE_NORMAL;                      \
         }                                                            \
     }                                                                \
+}                                                                    \
+                                                                     \
+uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env,         \
+                                          uint ## bits ## _t arg)    \
+{                                                                    \
+    return float_ ## name(arg, &env->active_fpu.fp_status);          \
 }

 FLOAT_CLASS(class_s, 32)


And in MSA:


+    float_status *status = &env->active_tc.msa_fp_status;
     if (df == DF_WORD) {
-        pwd->w[0] = helper_float_class_s(pws->w[0]);
-        pwd->w[1] = helper_float_class_s(pws->w[1]);
-        pwd->w[2] = helper_float_class_s(pws->w[2]);
-        pwd->w[3] = helper_float_class_s(pws->w[3]);
+        pwd->w[0] = float_class_s(pws->w[0], status);
+        pwd->w[1] = float_class_s(pws->w[1], status);
+        pwd->w[2] = float_class_s(pws->w[2], status);
+        pwd->w[3] = float_class_s(pws->w[3], status);
     } else {
-        pwd->d[0] = helper_float_class_d(pws->d[0]);
-        pwd->d[1] = helper_float_class_d(pws->d[1]);
+        pwd->d[0] = float_class_d(pws->d[0], status);
+        pwd->d[1] = float_class_d(pws->d[1], status);
     }


Thanks,
Leon

Reply via email to