2017-10-13 9 views
2

J'essaie de déterminer quand activer certains chemins de code Altivec. Lorsque j'examine les macros du préprocesseur lorsque -qaltivec est en vigueur, je ne vois pas de macro de préprocesseur correspondante (voir ci-dessous).Le signal IBM XL/C Altivec prend-il en charge le préprocesseur?

Notre souci ou peur est le besoin de -qaltivec et -DALTIVEC=1 ou similaire. Les utilisateurs ne lisent presque jamais le manuel, ce qui génère des questions et des rapports de bugs sans fin pour la plate-forme. Si la RTFM fonctionnait, cela se serait produit au cours des 50 dernières années.

Est-ce que XL/C signale Altivec lorsque -qaltivec est activé? Sinon, y a-t-il un autre moyen de le déduire?

Merci d'avance.


est ci-dessous de GCC111, qui est une machine Power7. Je ne sais pas pourquoi le compilateur prétend qu'Altivec n'est pas supporté.

$ xlC -qshowmacros -qaltivec -E adhoc.cpp.proto | sort | egrep -iv 'sync' 
1506-1162 (W) The altivec option is not supported for the target architecture and is ignored. 
"adhoc.cpp.proto", line 2.10: 1506-296 (S) #include file <iosfwd> not found. 
"adhoc.cpp.proto", line 3.10: 1506-296 (S) #include file <string> not found. 
#define _AIX 1 
#define _AIX32 1 
#define _AIX41 1 
#define _AIX43 1 
#define _AIX50 1 
#define _AIX51 1 
#define _AIX52 1 
#define _AIX53 1 
#define _AIX61 1 
#define _AIX71 1 
#define _ARCH_COM 1 
#define _ARCH_PPC 1 
#define _BIG_ENDIAN 1 
#define _CHAR_UNSIGNED 1 
#define _IBMR2 1 
#define _ILP32 1 
#define _LONG_LONG 1 
#define _POWER 1 
#define __ALIGN 1 
#define __BASE_FILE__ "adhoc.cpp.proto" 
#define __BIG_ENDIAN__ 1 
#define __BOOL__ 1 
#define __C99_BOOL 1 
#define __C99_COMPLEX 1 
#define __C99_COMPOUND_LITERAL 1 
#define __C99_CPLUSCMT 1 
#define __C99_DESIGNATED_INITIALIZER 1 
#define __C99_DUP_TYPE_QUALIFIER 1 
#define __C99_EMPTY_MACRO_ARGUMENTS 1 
#define __C99_FLEXIBLE_ARRAY_MEMBER 1 
#define __C99_HEX_FLOAT_CONST 1 
#define __C99_INLINE 1 
#define __C99_LLONG 1 
#define __C99_MACRO_WITH_VA_ARGS 1 
#define __C99_MAX_LINE_NUMBER 1 
#define __C99_MIXED_DECL_AND_CODE 1 
#define __C99_MIXED_STRING_CONCAT 1 
#define __C99_NON_CONST_AGGR_INITIALIZER 1 
#define __C99_NON_LVALUE_ARRAY_SUB 1 
#define __C99_PRAGMA_OPERATOR 1 
#define __C99_RESTRICT 1 
#define __C99_STATIC_ARRAY_SIZE 1 
#define __C99_STD_PRAGMAS 1 
#define __C99_TGMATH 1 
#define __C99_UCN 1 
#define __C99_VAR_LEN_ARRAY 1 
#define __C99__FUNC__ 1 
#define __CHAR_UNSIGNED__ 1 
#define __DIGRAPHS__ 1 
#define __FENCE 1 
#define __FUNCTION__ __FUNCTION__ 
#define __GCC_PROTO_OVERRIDES_KNR_DEF 1 
#define __HHW_BIG_ENDIAN__ 1 
#define __HHW_RS6000__ 1 
#define __HOS_AIX__ 1 
#define __IBMC_NORETURN 1 
#define __IBMC_STATIC_ASSERT 1 
#define __IBMC__ 1210 
#define __IBM_ALIGNOF__ 1 
#define __IBM_ATTRIBUTES 1 
#define __IBM_COMPUTED_GOTO 1 
#define __IBM_DOLLAR_IN_ID 1 
#define __IBM_EXTENSION_KEYWORD 1 
#define __IBM_GCC_ASM 1 
#define __IBM_GCC__INLINE__ 1 
#define __IBM_GENERALIZED_LVALUE 1 
#define __IBM_INCLUDE_NEXT 1 
#define __IBM_LABEL_VALUE 1 
#define __IBM_LOCAL_LABEL 1 
#define __IBM_MACRO_WITH_VA_ARGS 1 
#define __IBM_NESTED_FUNCTION 1 
#define __IBM_PP_PREDICATE 1 
#define __IBM_PP_WARNING 1 
#define __IBM_REGISTER_VARS 1 
#define __IBM__IMAG__ 1 
#define __IBM__REAL__ 1 
#define __IBM__TYPEOF__ 1 
#define __ILP32__ 1 
#define __LONGDOUBLE64 1 
#define __MATH__ 1 
#define __PPC 1 
#define __PPC__ 1 
#define __SIZE_TYPE__ unsigned int 
#define __STDC_HOSTED__ 1 
#define __STDC_VERSION__ 199901L 
#define __STDC__ 1 
#define __STR__ 1 
#define __THW_BIG_ENDIAN__ 1 
#define __THW_PPC__ 1 
#define __THW_RS6000__ 1 
#define __TOS_AIX__ 1 
#define __XLC121__ 1 
#define __XLC13__ 1 
#define __XLC_BUILTIN_VAARG__ 1 
#define __alignof __alignof__ 
#define __const const 
#define __const__ const 
#define __powerpc 1 
#define __powerpc__ 1 
#define __signed signed 
#define __signed__ signed 
#define __typeof __typeof__ 
#define __unix 1 
#define __unix__ 1 
#define __volatile volatile 
#define __volatile__ volatile 
#define __xlC__ 0x0c01 
#define __xlC_ver__ 0x00000000 
#define __xlc__ "12.1.0.0" 

Répondre

2

La macro d'habitude que la plupart des compilateurs (gcc et al) définissent automatiquement __VEC__ (ou du moins c'est le symbole que je l'habitude d'utiliser pour tester AltiVec dans le code multi-plateforme). IBM claims that __ALTIVEC__ is also defined (voir "Macros prédéfinies") pour xlc lors de l'utilisation -maltivec ou -qaltivec.

+1

Merci @Paul. J'ai vu '__VEC__' dans le [manuel d'IBM] (https://www-01.ibm.com/support/docview.wss?uid=swg27024811), mais il n'est pas présent comme indiqué ci-dessus. Je ne comprends vraiment pas XL C/C++ affirmant que '-qaltivec' est une option non supportée. Cela n'a aucun sens pour moi. Mais en toute justice pour le compilateur, quand j'inclus ' 'et que j'essaie d'utiliser' __vector', les erreurs de compilation sur les types inconnus. Donc le compilateur est vraiment confus. – jww

+2

Altivec n'est pris en charge que sur les processeurs dotés d'unités vectorielles. L'architecture de l'UC par défaut dans XLC sous AIX est pwr4, qui est le minimum requis pour le système d'exploitation. Puisque pwr4 n'a pas d'unité vectorielle, XLC a émis l'erreur que vous avez vue. Pour résoudre ce problème, ajoutez -qarch = pwr7 ou -qarch = auto. –