aboutsummaryrefslogtreecommitdiff
path: root/gcc/stor-layout.c
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2016-05-02 23:23:45 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2016-05-02 23:23:45 +0000
commit4304ccfd019194af658e777c9d5d2a3dbebbc825 (patch)
tree7e53a4f7ecf1db3452d71051ae33009438550f2a /gcc/stor-layout.c
parentfd39794afaedab9f102cede19852ec74e8a1ee17 (diff)
downloadgcc-4304ccfd019194af658e777c9d5d2a3dbebbc825.zip
gcc-4304ccfd019194af658e777c9d5d2a3dbebbc825.tar.gz
gcc-4304ccfd019194af658e777c9d5d2a3dbebbc825.tar.bz2
machmode.h (mode_complex): Add support to give the complex mode for a given mode.
[gcc] 2016-05-02 Michael Meissner <meissner@linux.vnet.ibm.com> * machmode.h (mode_complex): Add support to give the complex mode for a given mode. (GET_MODE_COMPLEX_MODE): Likewise. * stor-layout.c (layout_type): For COMPLEX_TYPE, use the mode stored by build_complex_type and gfc_build_complex_type instead of trying to figure out the appropriate mode based on the size. Raise an assertion error, if the type was not set. * genmodes.c (struct mode_data): Add field for the complex type of the given type. (blank_mode): Likewise. (make_complex_modes): Remember the complex mode created in the base type. (emit_mode_complex): Write out the mode_complex array to map a type mode to the complex version. (emit_insn_modes_c): Likewise. * tree.c (build_complex_type): Set the complex type to use before calling layout_type. * config/rs6000/rs6000.c (rs6000_hard_regno_nregs_internal): Add support for __float128 complex datatypes. (rs6000_hard_regno_mode_ok): Likewise. (rs6000_setup_reg_addr_masks): Likewise. (rs6000_complex_function_value): Likewise. * config/rs6000/rs6000.h (FLOAT128_IEEE_P): Likewise. __float128 and __ibm128 complex. (FLOAT128_IBM_P): Likewise. (ALTIVEC_ARG_MAX_RETURN): Likewise. * doc/extend.texi (Additional Floating Types): Document that -mfloat128 must be used to enable __float128. Document complex __float128 and __ibm128 support. [gcc/fortran] 2016-05-02 Michael Meissner <meissner@linux.vnet.ibm.com> * trans-types.c (gfc_build_complex_type): [gcc/testsuite] 2016-05-02 Michael Meissner <meissner@linux.vnet.ibm.com> * gcc.target/powerpc/float128-complex-1.c: New tests for complex __float128. * gcc.target/powerpc/float128-complex-2.c: Likewise. From-SVN: r235794
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r--gcc/stor-layout.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 02b8c64..bf8a978 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -2146,11 +2146,13 @@ layout_type (tree type)
case COMPLEX_TYPE:
TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type));
- SET_TYPE_MODE (type,
- mode_for_size (2 * TYPE_PRECISION (TREE_TYPE (type)),
- (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE
- ? MODE_COMPLEX_FLOAT : MODE_COMPLEX_INT),
- 0));
+
+ /* build_complex_type and fortran's gfc_build_complex_type have set the
+ expected mode to allow having multiple complex types for multiple
+ floating point types that have the same size such as the PowerPC with
+ __ibm128 and __float128. */
+ gcc_assert (TYPE_MODE (type) != VOIDmode);
+
TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
break;