On Wed, Mar 12, 2014 at 5:20 PM, Michael Meissner
<meiss...@linux.vnet.ibm.com> wrote:
> Internally within IBM, the people wanting to use the new 128-bit integer
> instructions (and the integer decimal support instructions that I will be 
> doing
> soon), asked for a new type to do the calculations in, rather than depend on
> the register allocator chosing the correct register, and not bouncing things
> between the GPR and VSX register sets.
>
> So I reworked the patches to add these instructions to use a new type (vector
> __int128_t or V1TImode) to hold the 128-bit integer types.  I simplified
> things, by removing the __int128_t support.  To convert from TImode to
> V1TImode, you would use vector initialization:
>
>         vector __int128_t v128;
>         __int128_t i128;
>
>         v128 = (vector __int128_t) { i128 };
>
> And to convert from vector __int128_t to __int128_t, you use extract:
>
>         #include <altivec.h>
>
>         vector __int128_t v128;
>         __int128_t i128;
>
>         i128 = vec_extract (v128, 0);
>
> I have bootstrapped these changes on a big endian power7, big endian power8,
> and little endian power8 system, and verified that both the test cases work in
> big and little endian modes.  There were no regressions in running make check.
> Are these patches ok to install in the tree (instead of the previous version)?
>
> [gcc]
> 2014-03-11  Michael Meissner  <meiss...@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-11  Michael Meissner  <meiss...@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

Reply via email to