The following exports the native_encode_real worker, and makes it
take a scalar float mode and REAL_VALUE_TYPE data instead of a tree
for use in the COBOL frontend, avoiding creating of a temporary tree.

Bootstrap / regtest in progress.  Is this OK for the use in COBOL?

Thanks,
Richard.

        * fold-const.h (native_encode_real): Export.
        * fold-const.cc (native_encode_real): Change API to take
        mode and REAL_VALUE_TYPE.
        (native_encode_expr): Adjust.
---
 gcc/fold-const.cc | 13 +++++++------
 gcc/fold-const.h  |  2 ++
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index fef7a6cc48e..a4fb0147a0b 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -7572,11 +7572,11 @@ native_encode_fixed (const_tree expr, unsigned char 
*ptr, int len, int off)
    Return the number of bytes placed in the buffer, or zero
    upon failure.  */
 
-static int
-native_encode_real (const_tree expr, unsigned char *ptr, int len, int off)
+int
+native_encode_real (scalar_float_mode mode, const REAL_VALUE_TYPE *val,
+                   unsigned char *ptr, int len, int off)
 {
-  tree type = TREE_TYPE (expr);
-  int total_bytes = GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (type));
+  int total_bytes = GET_MODE_SIZE (mode);
   int byte, offset, word, words, bitpos;
   unsigned char value;
 
@@ -7596,7 +7596,7 @@ native_encode_real (const_tree expr, unsigned char *ptr, 
int len, int off)
 
   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
 
-  real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
+  real_to_target (tmp, val, mode);
 
   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
        bitpos += BITS_PER_UNIT)
@@ -7836,7 +7836,8 @@ native_encode_expr (const_tree expr, unsigned char *ptr, 
int len, int off)
       return native_encode_int (expr, ptr, len, off);
 
     case REAL_CST:
-      return native_encode_real (expr, ptr, len, off);
+      return native_encode_real (SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (expr)),
+                                TREE_REAL_CST_PTR (expr), ptr, len, off);
 
     case FIXED_CST:
       return native_encode_fixed (expr, ptr, len, off);
diff --git a/gcc/fold-const.h b/gcc/fold-const.h
index f20fb58271d..43deea4d69c 100644
--- a/gcc/fold-const.h
+++ b/gcc/fold-const.h
@@ -35,6 +35,8 @@ extern bool folding_cxx_constexpr;
 extern int native_encode_expr (const_tree, unsigned char *, int, int off = -1);
 extern int native_encode_initializer (tree, unsigned char *, int,
                                      int off = -1, unsigned char * = nullptr);
+extern int native_encode_real (scalar_float_mode, const REAL_VALUE_TYPE *,
+                              unsigned char *, int, int off = -1);
 extern tree native_interpret_expr (tree, const unsigned char *, int);
 extern tree native_interpret_real (tree, const unsigned char *, int);
 extern bool can_native_interpret_type_p (tree);
-- 
2.43.0

Reply via email to