This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add support for powerpc ISA 2.07 128-bit add/subtract builtins


This patch adds support for the PowerPC ISA 2.07 (power8) 128-bit add/subtract
instructions that use the Altivec (VMX) register set (vaddumq, etc.).

Unfortunately at the moment, TImode (__int128_t) is not allowed to use the
VSX/VMX register set, unless you use the undocumented switch -mvsx-timode.
This was disabled because there were several bugs that showed up during the
original ISA 2.07 patches.  I spent some time trying to work out all of the
problems with -mvsx-timode, but I was not able to do so at present.

These patches add support for the builtins when the code is running in 64-bit
mode.  If TImode is not allowed to go into the VMX registers, the code uses
V2DImode to do the operation.  Simple minded tests show that the compiler can
do loads directly into the VMX registers, but after the operation, it does a
permute, 2 direct move instructions, and a store quad from the GPR register
set.  Ideally, a future patch will fix -mvsx-timode so it can be default.

In these patches, I updated test timode_off.c.  This test would fail if
-mvsx-timode is enabled because in that mode, TImode addresses can only be a
single register, so that the address can be used either to load GPRs or VSX
registers without reloading.  This causes the test code to be slightly bigger,
and the test then fails when the code size gets to be larger than 616 bytes.

I have tested these patches on power7 and power8 machines with no regressions.
I have tested the executable test on both big endian and little endian power8
systems, and it produces the correct values in both cases.  Are the patches ok
to install?

[gcc]
2014-03-05  Michael Meissner  <meissner@linux.vnet.ibm.com>

	* 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.

	* config/rs6000/rs6000-protos.h (rs6000_move_128bit_ok_p): Add new
	declaration.
	(rs6000_split_128bit_ok_p): Likewise.
	(rs6000_int128_builtin_fixup): Likewise.

	* gcc/config/rs6000/rs6000-builtin.def (BU_P8V_AV_3): Add new
	macros to support adding ISA 2.07 3 argument builtins.
	(BU_P8V_OVERLOAD_3): Likewise.
	(VADDCUQ): Add ISA 2.07 builtins to support 128-bit integer
	add/subtract instructions, both as a normal builtin, and as an
	overloaded builtin.
	(VADDUQM): Likewise.
	(VSUBCUQ): Likewise.
	(VSUBUQM): Likewise.
	(VADDECUQ): Likewise.
	(VADDECUQ): Likewise.
	(VSUBECUQ): Likewise.
	(VSUBEUQM): Likewise.

	* gcc/config/rs6000-c.c (altivec_overloaded_builtins): Add support
	for ISA 2.07 overloaded builtins to do 128-bit add and subtract.

	* gcc/config/rs6000.c (rs6000_init_builtins): Initialize state
	variables for using __int128_t and __uint128_t as arguments to
	builtins.
	(rs6000_move_128bit_ok_p): New function to validate TImode/PTImode
	moves.
	(rs6000_split_128bit_ok_p): New function to say when it is ok to
	split TImode/PTImove moves.
	(rs6000_int128_builtin_fixup): New function to convert int 128-bit
	add/subtract from using TImode to using V2DImode to allow use of
	the ISA 2.07 builtins when TImode is not allowed in VSX
	registers.

	* gcc/config/rs6000/rs6000.h (enum rs6000_builtin_type_index): Add
	support to allow __int128_t and __uint128_t types as builtin
	arguments.
	(intTI_type_internal_node): Likewise.
	(uintTI_type_internal_node): Likewise.

	* gcc/config/rs6000/altivec.md (UNSPEC_VADDUQM): New unspec
	literals to allow addition of the ISA 2.07 128-bit add/subtract
	builtin functions.
	(UNSPEC_VADDCUQ): Likewise.
	(UNSPEC_VADDEUQM): Likewise.
	(UNSPEC_VADDECUQ): Likewise.
	(UNSPEC_VSUBUQM): Likewise.
	(UNSPEC_VSUBCUQ): Likewise.
	(UNSPEC_VSUBEUQM): Likewise.
	(UNSPEC_VSUBECUQ): Likewise.
	(VINT128): New iterator for 128-bit add/subtract builtins.
	(altivec_vadduqm): New ISA 2.07 128-bit add/subtract builtins.
	(altivec_vadduqm_<mode>): Likewise.
	(altivec_vaddcuq): Likewise.
	(altivec_vaddcuq_<mode>): Likewise.
	(altivec_vaddeuqm): Likewise.
	(altivec_vaddeuqm_<mode>): Likewise.
	(altivec_vaddecuq): Likewise.
	(altivec_vaddecuq_<mode>): Likewise.
	(altivec_vsubuqm): Likewise.
	(altivec_vsubuqm_<mode>): Likewise.
	(altivec_vsubcuq): Likewise.
	(altivec_vsubcuq_<mode>): Likewise.
	(altivec_vsubeuqm): Likewise.
	(altivec_vsubeuqm_<mode>): Likewise.
	(altivec_vsubecuq): Likewise.
	(altivec_vsubecuq_<mode>): Likewise.

	* gcc/config/rs6000/altivec.h (vec_vadduqm): If ISA 2.07, add
	support for 128-bit add/subtract builtins.
	(vec_vaddcuq): Likewise.
	(vec_vaddeuqm): Likewise.
	(vec_vaddecuq): Likewise.
	(vec_vsubuqm): Likewise.
	(vec_vsubcuq): Likewise.
	(vec_vsubeuqm): Likewise.
	(vec_vsubecuq): Likewise.

[gcc/testsuite]
2014-03-05  Michael Meissner  <meissner@linux.vnet.ibm.com>

	* gcc.target/powerpc/p8vector-int128-1.c: New file to test ISA
	2.07 128-bit add/subtract builtins.
	* 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.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797

Attachment: gcc-power8.patch094b
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]