Index: lib/AST/ItaniumMangle.cpp =================================================================== --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -2188,8 +2188,8 @@ const char *EltName = 0; if (T->getVectorKind() == VectorType::NeonPolyVector) { switch (cast(EltType)->getKind()) { - case BuiltinType::SChar: EltName = "poly8_t"; break; - case BuiltinType::Short: EltName = "poly16_t"; break; + case BuiltinType::UChar: EltName = "poly8_t"; break; + case BuiltinType::UShort: EltName = "poly16_t"; break; default: llvm_unreachable("unexpected Neon polynomial vector element type"); } } else { Index: lib/Sema/SemaType.cpp =================================================================== --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -4754,15 +4754,8 @@ return false; if (VecKind == VectorType::NeonPolyVector) { - if (IsAArch64) { - // AArch64 polynomial vectors are unsigned - return BTy->getKind() == BuiltinType::UChar || - BTy->getKind() == BuiltinType::UShort; - } else { - // AArch32 polynomial vector are signed. - return BTy->getKind() == BuiltinType::SChar || - BTy->getKind() == BuiltinType::Short; - } + return BTy->getKind() == BuiltinType::UChar || + BTy->getKind() == BuiltinType::UShort; } // Non-polynomial vector types: the usual suspects are allowed, as well as Index: test/CodeGenCXX/mangle-neon-vectors.cpp =================================================================== --- test/CodeGenCXX/mangle-neon-vectors.cpp +++ test/CodeGenCXX/mangle-neon-vectors.cpp @@ -2,38 +2,80 @@ typedef float float32_t; typedef __fp16 float16_t; -typedef signed char poly8_t; -typedef short poly16_t; +typedef unsigned char poly8_t; +typedef unsigned short poly16_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed long long int64_t; typedef unsigned long long uint64_t; +typedef __attribute__((neon_vector_type(8))) int8_t int8x8_t; +typedef __attribute__((neon_vector_type(16))) int8_t int8x16_t; +typedef __attribute__((neon_vector_type(4))) int16_t int16x4_t; +typedef __attribute__((neon_vector_type(8))) int16_t int16x8_t; typedef __attribute__((neon_vector_type(2))) int int32x2_t; typedef __attribute__((neon_vector_type(4))) int int32x4_t; typedef __attribute__((neon_vector_type(1))) uint64_t uint64x1_t; +typedef __attribute__((neon_vector_type(2))) int64_t int64x2_t; +typedef __attribute__((neon_vector_type(8))) uint8_t uint8x8_t; +typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t; +typedef __attribute__((neon_vector_type(4))) uint16_t uint16x4_t; +typedef __attribute__((neon_vector_type(8))) uint16_t uint16x8_t; +typedef __attribute__((neon_vector_type(2))) unsigned int uint32x2_t; +typedef __attribute__((neon_vector_type(4))) unsigned int uint32x4_t; typedef __attribute__((neon_vector_type(2))) uint64_t uint64x2_t; typedef __attribute__((neon_vector_type(2))) float32_t float32x2_t; typedef __attribute__((neon_vector_type(4))) float32_t float32x4_t; typedef __attribute__((neon_vector_type(4))) float16_t float16x4_t; typedef __attribute__((neon_vector_type(8))) float16_t float16x8_t; +typedef __attribute__((neon_polyvector_type(8))) poly8_t poly8x8_t; typedef __attribute__((neon_polyvector_type(16))) poly8_t poly8x16_t; +typedef __attribute__((neon_polyvector_type(4))) poly16_t poly16x4_t; typedef __attribute__((neon_polyvector_type(8))) poly16_t poly16x8_t; +// CHECK: 15__simd64_int8_t +void f1(int8x8_t) {} +// CHECK: 16__simd64_int16_t +void f2(int16x4_t) {} // CHECK: 16__simd64_int32_t -void f1(int32x2_t v) { } -// CHECK: 17__simd128_int32_t -void f2(int32x4_t v) { } -// CHECK: 17__simd64_uint64_t -void f3(uint64x1_t v) { } -// CHECK: 18__simd128_uint64_t -void f4(uint64x2_t v) { } -// CHECK: 18__simd64_float32_t -void f5(float32x2_t v) { } -// CHECK: 19__simd128_float32_t -void f6(float32x4_t v) { } +void f3(int32x2_t) {} +// CHECK: 16__simd64_uint8_t +void f4(uint8x8_t) {} +// CHECK: 17__simd64_uint16_t +void f5(uint16x4_t) {} // CHECK: 18__simd64_float16_t -void f7(float16x4_t v) {} +void f6(float16x4_t) {} // CHECK: 19__simd128_float16_t -void f8(float16x8_t v) {} +void f7(float16x8_t) {} +// CHECK: 17__simd64_uint32_t +void f8(uint32x2_t) {} +// CHECK: 18__simd64_float32_t +void f9(float32x2_t) {} +// CHECK: 19__simd128_float32_t +void f10(float32x4_t) {} +// CHECK: 16__simd64_poly8_t +void f11(poly8x8_t) {} +// CHECK: 17__simd64_poly16_t +void f12(poly16x4_t) {} // CHECK: 17__simd128_poly8_t -void f9(poly8x16_t v) {} +void f13(poly8x16_t) {} // CHECK: 18__simd128_poly16_t -void f10(poly16x8_t v) {} +void f14(poly16x8_t) {} +// CHECK: 16__simd128_int8_t +void f15(int8x16_t) {} +// CHECK: 17__simd128_int16_t +void f16(int16x8_t) {} +// CHECK: 17__simd128_int32_t +void f17(int32x4_t) {} +// CHECK: 17__simd128_uint8_t +void f18(uint8x16_t) {} +// CHECK: 18__simd128_uint16_t +void f19(uint16x8_t) {} +// CHECK: 18__simd128_uint32_t +void f20(uint32x4_t) {} +// CHECK: 17__simd128_int64_t +void f21(int64x2_t) {} +// CHECK: 18__simd128_uint64_t +void f22(uint64x2_t) {} Index: test/Sema/neon-vector-types.c =================================================================== --- test/Sema/neon-vector-types.c +++ test/Sema/neon-vector-types.c @@ -2,8 +2,8 @@ // RUN: %clang_cc1 %s -triple armv8 -target-feature +neon -fsyntax-only -verify typedef float float32_t; -typedef signed char poly8_t; -typedef short poly16_t; +typedef unsigned char poly8_t; +typedef unsigned short poly16_t; typedef unsigned long long uint64_t; // Define some valid Neon types. Index: utils/TableGen/NeonEmitter.cpp =================================================================== --- utils/TableGen/NeonEmitter.cpp +++ utils/TableGen/NeonEmitter.cpp @@ -2061,14 +2061,8 @@ OS << "typedef double float64_t;\n"; OS << "#endif\n\n"; - // For now, signedness of polynomial types depends on target - OS << "#ifdef __aarch64__\n"; OS << "typedef uint8_t poly8_t;\n"; OS << "typedef uint16_t poly16_t;\n"; - OS << "#else\n"; - OS << "typedef int8_t poly8_t;\n"; - OS << "typedef int16_t poly16_t;\n"; - OS << "#endif\n"; // Emit Neon vector typedefs. std::string TypedefTypes(