There are 3 patches left in the basic IEEE 128-bit floating point support for the compiler. I will submit these at the same time. They are split to make the review process similar. Patch #5 and #6 are indpendent of each other and can be applied in either order. Patch #7 assumes that patches 1-6 have been applied.
Patch #5 adds the following: * Support for the reload handlers that will be enabled in patch #7. * Adds IFmode/KFmode to other iterators as appropriate. * Adds the basic negate, absolute value, and negative absolute value support. * Adds the insns for the 128-bit pack/unpack routines. Patch #6 adds the following: * Adds support for comparisons. * Updates the cannot change mode support. Patch #7 finishes up the initial basic support. * It defines macros for IEEE 128-bit floating point users. * It defines the basic move support. * It sets up the calling sequence. * It registers the __float128 and __ibm128 keywords. * It sets up the various handler functions. * It adds 'q' and 'Q' as the suffix for IEEE 128-bit floating point. * It adds target attribute/pragma support for the IEEE 128-bit options. * It treats IEEE 128-bit in VSX register modes as vector. * It uses a unique mangling for IEEE 128-bit in VSX registers. * It moves vector modes tieable above scalar floating point. * It adds a simple minded test to make sure IEEE args are passed as vectors. Things to be done: * Work with GDB to add debug support. * Work with GLIBC to add basic software emulation support. * Work with GLIBC on other IEEE 128-bit support. * Look into Complex support. * Look into libquadmath support. * Enable -mfloat128-software if -mvsx. * Add more tests. * Fix bugs that show up if -mabi=ieeelongdouble is used. Each patch bootstraps without error and has no regressions. Are they ok to install in the trunk? This is patch #6: 2015-08-13 Michael Meissner <meiss...@linux.vnet.ibm.com> * config/rs6000/rs6000-protos.h (rs6000_expand_float128_convert): Add declaration. * config/rs6000/rs6000.c (rs6000_emit_le_vsx_store): Fix a comment. (rs6000_cannot_change_mode_class): Add support for IEEE 128-bit floating point in VSX registers. (rs6000_output_move_128bit): Always print out the set insn if we can't generate an appropriate 128-bit move. (rs6000_generate_compare): Add support for IEEE 128-bit floating point in VSX registers comparisons. (rs6000_expand_float128_convert): Likewise. * config/rs6000/rs6000.md (extenddftf2): Add support for IEEE 128-bit floating point in VSX registers. (extenddftf2_internal): Likewise. (trunctfdf2): Likewise. (trunctfdf2_internal2): Likewise. (fix_trunc_helper): Likewise. (fix_trunctfdi2"): Likewise. (floatditf2): Likewise. (floatuns<mode>tf2): Likewise. (extend<FLOAT128_SFDFTF:mode><IFKF:mode>2): Likewise. (trunc<IFKF:mode><FLOAT128_SFDFTF:mode>2): Likewise. (fix_trunc<IFKF:mode><SDI:mode>2): Likewise. (fixuns_trunc<IFKF:mode><SDI:mode>2): Likewise. (float<SDI:mode><IFKF:mode>2): Likewise. (floatuns<SDI:mode><IFKF:mode>2): Likewise. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
2015-08-13 Michael Meissner <meiss...@linux.vnet.ibm.com> * config/rs6000/rs6000-protos.h (rs6000_expand_float128_convert): Add declaration. * config/rs6000/rs6000.c (rs6000_emit_le_vsx_store): Fix a comment. (rs6000_cannot_change_mode_class): Add support for IEEE 128-bit floating point in VSX registers. (rs6000_output_move_128bit): Always print out the set insn if we can't generate an appropriate 128-bit move. (rs6000_generate_compare): Add support for IEEE 128-bit floating point in VSX registers comparisons. (rs6000_expand_float128_convert): Likewise. * config/rs6000/rs6000.md (extenddftf2): Add support for IEEE 128-bit floating point in VSX registers. (extenddftf2_internal): Likewise. (trunctfdf2): Likewise. (trunctfdf2_internal2): Likewise. (fix_trunc_helper): Likewise. (fix_trunctfdi2"): Likewise. (floatditf2): Likewise. (floatuns<mode>tf2): Likewise. (extend<FLOAT128_SFDFTF:mode><IFKF:mode>2): Likewise. (trunc<IFKF:mode><FLOAT128_SFDFTF:mode>2): Likewise. (fix_trunc<IFKF:mode><SDI:mode>2): Likewise. (fixuns_trunc<IFKF:mode><SDI:mode>2): Likewise. (float<SDI:mode><IFKF:mode>2): Likewise. (floatuns<SDI:mode><IFKF:mode>2): Likewise.