diff options
Diffstat (limited to 'gcc/convert.c')
| -rw-r--r-- | gcc/convert.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/convert.c b/gcc/convert.c index 49d4a3ac5d6..e8030bf9f01 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -263,6 +263,28 @@ convert_to_real (tree type, tree expr) && FLOAT_TYPE_P (TREE_TYPE (arg1))) { tree newtype = type; + + if (TYPE_MODE (TREE_TYPE (arg0)) == SDmode + || TYPE_MODE (TREE_TYPE (arg1)) == SDmode) + newtype = dfloat32_type_node; + if (TYPE_MODE (TREE_TYPE (arg0)) == DDmode + || TYPE_MODE (TREE_TYPE (arg1)) == DDmode) + newtype = dfloat64_type_node; + if (TYPE_MODE (TREE_TYPE (arg0)) == TDmode + || TYPE_MODE (TREE_TYPE (arg1)) == TDmode) + newtype = dfloat128_type_node; + if (newtype == dfloat32_type_node + || newtype == dfloat64_type_node + || newtype == dfloat128_type_node) + { + expr = build2 (TREE_CODE (expr), newtype, + fold (convert_to_real (newtype, arg0)), + fold (convert_to_real (newtype, arg1))); + if (newtype == type) + return expr; + break; + } + if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype)) newtype = TREE_TYPE (arg0); if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype)) |

