From 37a1d58a10eb8b176c8fac2a25bd8ca8cba0a91e Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Wed, 5 Oct 2016 14:57:14 +0000 Subject: [PATCH] [fold-const] Fix native_encode_real for HFmode constants * fold-const.c (native_encode_real): Fix logic for selecting offset to write to when BYTES_BIG_ENDIAN. From-SVN: r240791 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 81e4235d2e4..6b4dc9cd145 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-10-05 Kyrylo Tkachov + + * fold-const.c (native_encode_real): Fix logic for selecting offset + to write to when BYTES_BIG_ENDIAN. + 2016-10-05 Wilco Dijkstra * builtins.c (fold_builtin_strchr): Remove function. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index a6b7ec7dfec..65c75f63931 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7142,7 +7142,16 @@ native_encode_real (const_tree expr, unsigned char *ptr, int len, int off) offset += byte % UNITS_PER_WORD; } else - offset = BYTES_BIG_ENDIAN ? 3 - byte : byte; + { + offset = byte; + if (BYTES_BIG_ENDIAN) + { + /* Reverse bytes within each long, or within the entire float + if it's smaller than a long (for HFmode). */ + offset = MIN (3, total_bytes - 1) - offset; + gcc_assert (offset >= 0); + } + } offset = offset + ((bitpos / BITS_PER_UNIT) & ~3); if (offset >= off && offset - off < len) -- 2.30.2