72 lines
1.8 KiB
Diff
72 lines
1.8 KiB
Diff
|
|
commit a3799ae3f5dd6648040d499224cc6dea61b355dd
|
||
|
|
Author: Arnold D. Robbins <arnold@skeeve.com>
|
||
|
|
Date: Mon Sep 19 18:51:28 2022 +0300
|
||
|
|
|
||
|
|
Fix negative NaN issue on RiscV.
|
||
|
|
|
||
|
|
diff --git a/ChangeLog b/ChangeLog
|
||
|
|
index 35941d0a..d751baf1 100644
|
||
|
|
--- a/ChangeLog
|
||
|
|
+++ b/ChangeLog
|
||
|
|
@@ -1,0 +1,6 @@
|
||
|
|
+2022-09-19 Arnold D. Robbins <arnold@skeeve.com>
|
||
|
|
+
|
||
|
|
+ * eval.c (fix_nan_sign): New function. See bug list citation
|
||
|
|
+ in the code.
|
||
|
|
+ * interpret.h (r_interpret): Use it for plus and minus cases.
|
||
|
|
+
|
||
|
|
diff --git a/eval.c b/eval.c
|
||
|
|
index 1069570b..3bfff0ca 100644
|
||
|
|
--- a/eval.c
|
||
|
|
+++ b/eval.c
|
||
|
|
@@ -39,6 +39,8 @@ static int num_exec_hook = 0;
|
||
|
|
static Func_pre_exec pre_execute[MAX_EXEC_HOOKS];
|
||
|
|
static Func_post_exec post_execute = NULL;
|
||
|
|
|
||
|
|
+static double fix_nan_sign(double left, double right, double result);
|
||
|
|
+
|
||
|
|
extern void frame_popped();
|
||
|
|
|
||
|
|
int OFSlen;
|
||
|
|
@@ -1901,3 +1903,20 @@ elem_new_to_scalar(NODE *n)
|
||
|
|
|
||
|
|
return n;
|
||
|
|
}
|
||
|
|
+
|
||
|
|
+/* fix_nan_sign --- fix NaN sign on RiscV */
|
||
|
|
+
|
||
|
|
+// See the thread starting at
|
||
|
|
+// https://lists.gnu.org/archive/html/bug-gawk/2022-09/msg00005.html
|
||
|
|
+// for why we need this function.
|
||
|
|
+
|
||
|
|
+static double
|
||
|
|
+fix_nan_sign(double left, double right, double result)
|
||
|
|
+{
|
||
|
|
+ if (isnan(left) && signbit(left))
|
||
|
|
+ return copysign(result, -1.0);
|
||
|
|
+ else if (isnan(right) && signbit(right))
|
||
|
|
+ return copysign(result, -1.0);
|
||
|
|
+ else
|
||
|
|
+ return result;
|
||
|
|
+}
|
||
|
|
diff --git a/interpret.h b/interpret.h
|
||
|
|
index 26010ada..955d918f 100644
|
||
|
|
--- a/interpret.h
|
||
|
|
+++ b/interpret.h
|
||
|
|
@@ -583,6 +583,7 @@ uninitialized_scalar:
|
||
|
|
plus:
|
||
|
|
t1 = TOP_NUMBER();
|
||
|
|
r = make_number(t1->numbr + x2);
|
||
|
|
+ r->numbr = fix_nan_sign(t1->numbr, x2, r->numbr);
|
||
|
|
DEREF(t1);
|
||
|
|
REPLACE(r);
|
||
|
|
break;
|
||
|
|
@@ -597,6 +598,7 @@ plus:
|
||
|
|
minus:
|
||
|
|
t1 = TOP_NUMBER();
|
||
|
|
r = make_number(t1->numbr - x2);
|
||
|
|
+ r->numbr = fix_nan_sign(t1->numbr, x2, r->numbr);
|
||
|
|
DEREF(t1);
|
||
|
|
REPLACE(r);
|
||
|
|
break;
|