On MacOS 10.3, when I compile Altivec programs that use certain
builtins, in particular the vec_ste() function, specifying -faltivec
and/or -mcpu=7400, gcc-4.1-20050227 gives me the following error:
/var/tmp//ccpZcozX.s:16:lvx vector instruction is optional for the PowerPC (not
allowed without -force_cpusubtype_ALL option)
/var/tmp//ccpZcozX.s:19:stvewx vector instruction is optional for the PowerPC
(not allowed without -force_cpusubtype_ALL option)
This doesn't seem correct to me - I have already specified -faltivec
to specifically enable AltiVec instructions, and moreover have
specified -mcpu=7400 (my G4 processor). According to the
documentation, -force_cpusubtype_ALL overrides -mcpu to cause the
output to have the ALL subtype, which is precisely the opposite of
what you want here (you only want to emit instructions for G4 or
higher).
Note that the error only appears when I use certain Altivec
instructions and not others, reinforcing my notion that there is a
bug. Apple's gcc 3.3 works fine.
Environment:
System: Darwin 172.16.0.242 7.8.0 Darwin Kernel Version 7.8.0: Wed Dec 22
14:26:17 PST 2004; root:xnu/xnu-517.11.1.obj~1/RELEASE_PPC Power Macintosh
powerpc
host: powerpc-apple-darwin7.8.0
build: powerpc-apple-darwin7.8.0
target: powerpc-apple-darwin7.8.0
configured with: ../configure --enable-languages=c
--prefix=/Users/stevenj/t/gcc-4.1-20050227/obj/../i
How-To-Repeat:
Compile the following code with gcc -faltivec -mcpu=7400 -c:
#include <altivec.h>
void bug(const float *x)
{
vector float T;
vec_ste(T, 4, x);
}
The preprocessed source (with --save-temps) is:
void bug(const float *x)
{
__attribute__((altivec(vector__))) float T;
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) unsigned char, __typeof__ ((T))) &&
__builtin_types_compatible_p (unsigned char, __typeof__ (*(x)))),
__builtin_altivec_stvebx ((__attribute__((altivec(vector__))) signed char) (T),
(4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) signed char, __typeof__ ((T))) &&
__builtin_types_compatible_p (signed char, __typeof__ (*(x)))),
__builtin_altivec_stvebx ((__attribute__((altivec(vector__))) signed char) (T),
(4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
char, __typeof__ ((T))) && __builtin_types_compatible_p (unsigned char,
__typeof__ (*(x)))), __builtin_altivec_stvebx
((__attribute__((altivec(vector__))) signed char) (T), (4), (void *) (x)),
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
char, __typeof__ ((T))) && __builtin_types_compatible_p (signed char,
__typeof__ (*(x)))), __builtin_altivec_stvebx
((__attribute__((altivec(vector__))) signed char) (T), (4), (void *) (x)),
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) unsigned short, __typeof__ ((T))) &&
__builtin_types_compatible_p (unsigned short, __typeof__ (*(x)))),
__builtin_altivec_stvehx ((__attribute__((altivec(vector__))) signed short)
(T), (4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) signed short, __typeof__ ((T))) &&
__builtin_types_compatible_p (short, __typeof__ (*(x)))),
__builtin_altivec_stvehx ((__attribute__((altivec(vector__))) signed short)
(T), (4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
short, __typeof__ ((T))) && __builtin_types_compatible_p (unsigned short,
__typeof__ (*(x)))), __builtin_altivec_stvehx
((__attribute__((altivec(vector__))) signed short) (T), (4), (void *) (x)),
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
short, __typeof__ ((T))) && __builtin_types_compatible_p (short, __typeof__
(*(x)))), __builtin_altivec_stvehx ((__attribute__((altivec(vector__))) signed
short) (T), (4), (void *) (x)), __builtin_choose_expr
((__builtin_types_compatible_p (__attribute__((altivec(vector__)))
__attribute__((altivec(pixel__))) unsigned short, __typeof__ ((T))) &&
__builtin_types_compatible_p (unsigned short, __typeof__ (*(x)))),
__builtin_altivec_stvehx ((__attribute__((altivec(vector__))) signed short)
(T), (4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(pixel__))) unsigned
short, __typeof__ ((T))) && __builtin_types_compatible_p (short, __typeof__
(*(x)))), __builtin_altivec_stvehx ((__attribute__((altivec(vector__))) signed
short) (T), (4), (void *) (x)), __builtin_choose_expr
((__builtin_types_compatible_p (__attribute__((altivec(vector__))) unsigned
int, __typeof__ ((T))) && __builtin_types_compatible_p (unsigned int,
__typeof__ (*(x)))), __builtin_altivec_stvewx
((__attribute__((altivec(vector__))) signed int) (T), (4), (void *) (x)),
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) signed int, __typeof__ ((T))) &&
__builtin_types_compatible_p (int, __typeof__ (*(x)))),
__builtin_altivec_stvewx ((__attribute__((altivec(vector__))) signed int) (T),
(4), (void *) (x)), __builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
int, __typeof__ ((T))) && __builtin_types_compatible_p (unsigned int,
__typeof__ (*(x)))), __builtin_altivec_stvewx
((__attribute__((altivec(vector__))) signed int) (T), (4), (void *) (x)),
__builtin_choose_expr ((__builtin_types_compatible_p
(__attribute__((altivec(vector__))) __attribute__((altivec(bool__))) unsigned
int, __typeof__ ((T))) && __builtin_types_compatible_p (int, __typeof__
(*(x)))), __builtin_altivec_stvewx ((__attribute__((altivec(vector__))) signed
int) (T), (4), (void *) (x)), __builtin_choose_expr
((__builtin_types_compatible_p (__attribute__((altivec(vector__))) float,
__typeof__ ((T))) && __builtin_types_compatible_p (float, __typeof__ (*(x)))),
__builtin_altivec_stvewx ((__attribute__((altivec(vector__))) signed int) (T),
(4), (void *) (x)), __builtin_altivec_compiletime_error
("vec_ste"))))))))))))))));
}
--
Summary: AltiVec vector instructions fail unless compiled with -
force_cpusubtype_ALL
Product: gcc
Version: 1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: stevenj at fftw dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: powerpc-apple-darwin7.8.0
GCC host triplet: powerpc-apple-darwin7.8.0
GCC target triplet: powerpc-apple-darwin7.8.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20272