Bug 10611 – operations on vector mode not recognized in C++
Description Richard Biener 2003-05-03 16:46:01 UTC
Operations (+ - * /, etc.) on vector modes are not recognized in c++. The following testcase works for C, but not for C++:
typedef float v4sf __attribute__((mode(V4SF)));
void foo()
{
v4sf a, b, c;
a = b + c;
}
bellatrix:~/src/tests$ g++-3.3 -c -msse2 simd2.cpp
simd2.cpp: In function `void foo()':
simd2.cpp:6: error: invalid operands of types `vector float' and `vector
float'
to binary `operator+'
same for gcc 3.4. I suspect this is really rejects-legal, as I see no reason that it shouldnt (but the documentation isnt clear either - vector mode extensions are within the C Extensions part).
Release:
gcc-3.3 (GCC) 3.3 20030427 (Debian prerelease), gcc-3.4 (GCC) 3.4 20030422 (experimental)
Environment:
ia32 gnu-linux
Comment 1 Wolfgang Bangerth 2003-05-05 14:40:45 UTC
State-Changed-From-To: open->analyzed State-Changed-Why: Confirmed. Never worked. Does work in C, however.
Comment 2 Wolfgang Bangerth 2003-05-05 19:40:07 UTC
Responsible-Changed-From-To: unassigned->aldyh Responsible-Changed-Why: As requested
Comment 3 Andrew Pinski 2004-04-29 19:37:56 UTC
*** Bug 15208 has been marked as a duplicate of this bug. ***
Comment 4 dylan 2004-07-23 14:22:45 UTC
I seem to have gotten this working to some extent by doing the following:
This is just a quick hack but is it the right direction? If so, I can tidy it
up and fix the side-effects. (or someone else with more knowledge of the
internals of gcc/cp can)
cp/cp-tree.h, change the ARITHMETIC_TYPE_P define to:
#define ARITHMETIC_TYPE_P(TYPE) \
(CP_INTEGRAL_TYPE_P (TYPE) || TREE_CODE (TYPE) == REAL_TYPE || TREE_CODE
(TYPE) == VECTOR_TYPE )
and
cp/typeck.c, function build_binary_op
** CHANGE **
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
&&
(code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
{
int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
** TO **
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE ||
code0 == VECTOR_TYPE)
&&
(code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE ||
code1 == VECTOR_TYPE))
{
int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE &&
code0 != VECTOR_TYPE && code1 != VECTOR_TYPE );
Comment 5 Richard Biener 2005-01-12 09:44:04 UTC
What is the status on this issue? I.e. +,-,*,/ on vector types for C++? Note
that trying to work around this missing feature with operator overloading like
v4sf operator+(const v4sf& a, const v4sf& b)
{
return __builtin_ia32_addps(a, b);
}
(which would be again machine specific, but anyhow) doesn't work:
t.c:3: error: 'float __vector__ operator+(const float __vector__&, const float
__vector__&)' must have an argument of class or enumerated type.
Comment 6 Jim Wilson 2005-01-13 22:36:30 UTC
Subject: Re: operations on vector mode not recognized in C++
On Wed, 2005-01-12 at 01:44, rguenth at tat dot physik dot uni-tuebingen
dot de wrote:
> ------- Additional Comments From rguenth at tat dot physik dot uni-tuebingen dot de 2005-01-12 09:44 -------
> What is the status on this issue?
It is waiting for someone who works on the C++ FE to look at it.
Comment 7 dylan 2005-01-14 01:41:56 UTC
I am implementing this locally to gcc 3.3.3, if it all seems to work ok I will attach the patches to this bug in a month or so (it's slow careful work). It's interesting because the side effect is the math optimizing pass of g++ begins to work with vector registers.
Comment 10 Aldy Hernandez 2005-06-11 00:20:01 UTC
Fixed on mainline. Backported to 3.4. 4.0 patch will be committed once the branch is opened.
Comment 11 bert.hubert@netherlabs.nl 2005-06-11 14:13:35 UTC
Subject: Re: operations on vector mode not recognized in C++ Updated http://ds9a.nl/gcc-simd/ to this effect, thanks. On Sat, Jun 11, 2005 at 12:20:03AM -0000, aldyh at gcc dot gnu dot org wrote: > > ------- Additional Comments From aldyh at gcc dot gnu dot org 2005-06-11 00:20 ------- > Fixed on mainline. Backported to 3.4. 4.0 patch will be committed once the > branch is opened. > > -- > What |Removed |Added > ---------------------------------------------------------------------------- > Status|ASSIGNED |RESOLVED > Resolution| |FIXED > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10611 > > ------- You are receiving this mail because: ------- > You are on the CC list for the bug, or are watching someone who is. > > > !DSPAM:42aa2e35254161288245759!
Comment 12 Ryan Hill 2005-07-11 06:24:53 UTC
Has this been backported to the 4.0 branch now that it's open again?
Comment 14 Aldy Hernandez 2005-07-11 14:42:20 UTC
I have just backported to the 4.0 branch.