This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [4.8, PATCH 25/26] Backport Power8 and LE support: V1TI support
- From: David Edelsohn <dje dot gcc at gmail dot com>
- To: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 3 Apr 2014 10:45:05 -0400
- Subject: Re: [4.8, PATCH 25/26] Backport Power8 and LE support: V1TI support
- Authentication-results: sourceware.org; auth=none
- References: <1395257691 dot 17148 dot 27 dot camel at gnopaine>
On Wed, Mar 19, 2014 at 3:34 PM, Bill Schmidt
<wschmidt@linux.vnet.ibm.com> wrote:
> Hi,
>
> This patch (diff-v1ti) backports the V1TI support.
>
> Thanks,
> Bill
>
>
> [gcc]
>
> 2014-03-19 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
>
> Back port from trunk
> 2014-03-12 Michael Meissner <meissner@linux.vnet.ibm.com>
>
> * config/rs6000/vector.md (VEC_L): Add V1TI mode to vector types.
> (VEC_M): Likewise.
> (VEC_N): Likewise.
> (VEC_R): Likewise.
> (VEC_base): Likewise.
> (mov<MODE>, VEC_M modes): If we are loading TImode into VSX
> registers, we need to swap double words in little endian mode.
>
> * config/rs6000/rs6000-modes.def (V1TImode): Add new vector mode
> to be a container mode for 128-bit integer operations added in ISA
> 2.07. Unlike TImode and PTImode, the preferred register set is
> the Altivec/VMX registers for the 128-bit operations.
>
> * config/rs6000/rs6000-protos.h (rs6000_move_128bit_ok_p): Add
> declarations.
> (rs6000_split_128bit_ok_p): Likewise.
>
> * config/rs6000/rs6000-builtin.def (BU_P8V_AV_3): Add new support
> macros for creating ISA 2.07 normal and overloaded builtin
> functions with 3 arguments.
> (BU_P8V_OVERLOAD_3): Likewise.
> (VPERM_1T): Add support for V1TImode in 128-bit vector operations
> for use as overloaded functions.
> (VPERM_1TI_UNS): Likewise.
> (VSEL_1TI): Likewise.
> (VSEL_1TI_UNS): Likewise.
> (ST_INTERNAL_1ti): Likewise.
> (LD_INTERNAL_1ti): Likewise.
> (XXSEL_1TI): Likewise.
> (XXSEL_1TI_UNS): Likewise.
> (VPERM_1TI): Likewise.
> (VPERM_1TI_UNS): Likewise.
> (XXPERMDI_1TI): Likewise.
> (SET_1TI): Likewise.
> (LXVD2X_V1TI): Likewise.
> (STXVD2X_V1TI): Likewise.
> (VEC_INIT_V1TI): Likewise.
> (VEC_SET_V1TI): Likewise.
> (VEC_EXT_V1TI): Likewise.
> (EQV_V1TI): Likewise.
> (NAND_V1TI): Likewise.
> (ORC_V1TI): Likewise.
> (VADDCUQ): Add support for 128-bit integer arithmetic instructions
> added in ISA 2.07. Add both normal 'altivec' builtins, and the
> overloaded builtin.
> (VADDUQM): Likewise.
> (VSUBCUQ): Likewise.
> (VADDEUQM): Likewise.
> (VADDECUQ): Likewise.
> (VSUBEUQM): Likewise.
> (VSUBECUQ): Likewise.
>
> * config/rs6000/rs6000-c.c (__int128_type): New static to hold
> __int128_t and __uint128_t types.
> (__uint128_type): Likewise.
> (altivec_categorize_keyword): Add support for vector __int128_t,
> vector __uint128_t, vector __int128, and vector unsigned __int128
> as a container type for TImode operations that need to be done in
> VSX/Altivec registers.
> (rs6000_macro_to_expand): Likewise.
> (altivec_overloaded_builtins): Add ISA 2.07 overloaded functions
> to support 128-bit integer instructions vaddcuq, vadduqm,
> vaddecuq, vaddeuqm, vsubcuq, vsubuqm, vsubecuq, vsubeuqm.
> (altivec_resolve_overloaded_builtin): Add support for V1TImode.
>
> * config/rs6000/rs6000.c (rs6000_hard_regno_mode_ok): Add support
> for V1TImode, and set up preferences to use VSX/Altivec
> registers. Setup VSX reload handlers.
> (rs6000_debug_reg_global): Likewise.
> (rs6000_init_hard_regno_mode_ok): Likewise.
> (rs6000_preferred_simd_mode): Likewise.
> (vspltis_constant): Do not allow V1TImode as easy altivec
> constants.
> (easy_altivec_constant): Likewise.
> (output_vec_const_move): Likewise.
> (rs6000_expand_vector_set): Convert V1TImode set and extract to
> simple move.
> (rs6000_expand_vector_extract): Likewise.
> (reg_offset_addressing_ok_p): Setup V1TImode to use VSX reg+reg
> addressing.
> (rs6000_const_vec): Add support for V1TImode.
> (rs6000_emit_le_vsx_load): Swap double words when loading or
> storing TImode/V1TImode.
> (rs6000_emit_le_vsx_store): Likewise.
> (rs6000_emit_le_vsx_move): Likewise.
> (rs6000_emit_move): Add support for V1TImode.
> (altivec_expand_ld_builtin): Likewise.
> (altivec_expand_st_builtin): Likewise.
> (altivec_expand_vec_init_builtin): Likewise.
> (altivec_expand_builtin): Likewise.
> (rs6000_init_builtins): Add support for V1TImode type. Add
> support for ISA 2.07 128-bit integer builtins. Define type names
> for the VSX/Altivec vector types.
> (altivec_init_builtins): Add support for overloaded vector
> functions with V1TImode type.
> (rs6000_preferred_reload_class): Prefer Altivec registers for
> V1TImode.
> (rs6000_move_128bit_ok_p): Move 128-bit move/split validation to
> external function.
> (rs6000_split_128bit_ok_p): Likewise.
> (rs6000_handle_altivec_attribute): Create V1TImode from vector
> __int128_t and vector __uint128_t.
>
> * config/rs6000/vsx.md (VSX_L): Add V1TImode to vector iterators
> and mode attributes.
> (VSX_M): Likewise.
> (VSX_M2): Likewise.
> (VSm): Likewise.
> (VSs): Likewise.
> (VSr): Likewise.
> (VSv): Likewise.
> (VS_scalar): Likewise.
> (VS_double): Likewise.
> (vsx_set_v1ti): New builtin function to create V1TImode from
> TImode.
>
> * config/rs6000/rs6000.h (TARGET_VADDUQM): New macro to say
> whether we support the ISA 2.07 128-bit integer arithmetic
> instructions.
> (ALTIVEC_OR_VSX_VECTOR_MODE): Add V1TImode.
> (enum rs6000_builtin_type_index): Add fields to hold V1TImode
> and TImode types for use with the builtin functions.
> (V1TI_type_node): Likewise.
> (unsigned_V1TI_type_node): Likewise.
> (intTI_type_internal_node): Likewise.
> (uintTI_type_internal_node): Likewise.
>
> * config/rs6000/altivec.md (UNSPEC_VADDCUQ): New unspecs for ISA
> 2.07 128-bit builtin functions.
> (UNSPEC_VADDEUQM): Likewise.
> (UNSPEC_VADDECUQ): Likewise.
> (UNSPEC_VSUBCUQ): Likewise.
> (UNSPEC_VSUBEUQM): Likewise.
> (UNSPEC_VSUBECUQ): Likewise.
> (VM): Add V1TImode to vector mode iterators.
> (VM2): Likewise.
> (VI_unit): Likewise.
> (altivec_vadduqm): Add ISA 2.07 128-bit binary builtins.
> (altivec_vaddcuq): Likewise.
> (altivec_vsubuqm): Likewise.
> (altivec_vsubcuq): Likewise.
> (altivec_vaddeuqm): Likewise.
> (altivec_vaddecuq): Likewise.
> (altivec_vsubeuqm): Likewise.
> (altivec_vsubecuq): Likewise.
>
> * config/rs6000/rs6000.md (FMOVE128_GPR): Add V1TImode to vector
> mode iterators.
> (BOOL_128): Likewise.
> (BOOL_REGS_OUTPUT): Likewise.
> (BOOL_REGS_OP1): Likewise.
> (BOOL_REGS_OP2): Likewise.
> (BOOL_REGS_UNARY): Likewise.
> (BOOL_REGS_AND_CR0): Likewise.
>
> * config/rs6000/altivec.h (vec_vaddcuq): Add support for ISA 2.07
> 128-bit integer builtin support.
> (vec_vadduqm): Likewise.
> (vec_vaddecuq): Likewise.
> (vec_vaddeuqm): Likewise.
> (vec_vsubecuq): Likewise.
> (vec_vsubeuqm): Likewise.
> (vec_vsubcuq): Likewise.
> (vec_vsubuqm): Likewise.
>
> * doc/extend.texi (PowerPC AltiVec/VSX Built-in Functions):
> Document vec_vaddcuq, vec_vadduqm, vec_vaddecuq, vec_vaddeuqm,
> vec_subecuq, vec_subeuqm, vec_vsubcuq, vec_vsubeqm builtins adding
> 128-bit integer add/subtract to ISA 2.07.
>
> [gcc/testsuite]
>
> 2014-03-19 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
>
> Back port from trunk
> 2014-03-12 Michael Meissner <meissner@linux.vnet.ibm.com>
>
> * gcc.target/powerpc/p8vector-int128-1.c: New test to test ISA
> 2.07 128-bit arithmetic.
> * gcc.target/powerpc/p8vector-int128-2.c: Likewise.
>
> * gcc.target/powerpc/timode_off.c: Restrict cpu type to power5,
> due to when TImode is allowed in VSX registers, the allowable
> address modes for TImode is just a single indirect address in
> order for the value to be loaded and store in either GPR or VSX
> registers. This affects the generated code, and it would cause
> this test to fail, when such an option is used.
Okay.
Thanks, David