[llvm-commits] [llvm] r120597 - /llvm/trunk/utils/TableGen/NeonEmitter.cpp
Bob Wilson
bob.wilson at apple.com
Wed Dec 1 11:49:58 PST 2010
Author: bwilson
Date: Wed Dec 1 13:49:58 2010
New Revision: 120597
URL: http://llvm.org/viewvc/llvm-project?rev=120597&view=rev
Log:
Add explicit casts for vector arguments to Neon builtins.
This avoids warnings with -Wvector-conversions. Radar 8228022.
Modified:
llvm/trunk/utils/TableGen/NeonEmitter.cpp
Modified: llvm/trunk/utils/TableGen/NeonEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/NeonEmitter.cpp?rev=120597&r1=120596&r2=120597&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/NeonEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/NeonEmitter.cpp Wed Dec 1 13:49:58 2010
@@ -160,6 +160,10 @@
case 'n':
type = Widen(type);
break;
+ case 'i':
+ type = 'i';
+ scal = true;
+ break;
case 'l':
type = 'l';
scal = true;
@@ -699,8 +703,6 @@
// Generate the definition for this intrinsic, e.g. __builtin_neon_cls(a)
static std::string GenBuiltin(const std::string &name, const std::string &proto,
StringRef typestr, ClassKind ck) {
- bool quad;
- unsigned nElts = GetNumElements(typestr, quad);
char arg = 'a';
std::string s;
@@ -757,10 +759,23 @@
// Wrap macro arguments in parenthesis.
if (define)
args = "(" + args + ")";
-
+
+ bool argQuad = false;
+ bool argPoly = false;
+ bool argUsgn = false;
+ bool argScalar = false;
+ bool dummy = false;
+ char argType = ClassifyType(typestr, argQuad, argPoly, argUsgn);
+ argType = ModType(proto[i], argType, argQuad, argPoly, argUsgn, argScalar,
+ dummy, dummy);
+
// Handle multiple-vector values specially, emitting each subvector as an
// argument to the __builtin.
if (proto[i] >= '2' && proto[i] <= '4') {
+ // Check if an explicit cast is needed.
+ if (argType != 'c' || argPoly || argUsgn)
+ args = (argQuad ? "(int8x16_t)" : "(int8x8_t)") + args;
+
for (unsigned vi = 0, ve = proto[i] - '0'; vi != ve; ++vi) {
s += args + ".val[" + utostr(vi) + "]";
if ((vi + 1) < ve)
@@ -772,8 +787,19 @@
continue;
}
- if (splat && (i + 1) == e)
- s += Duplicate(nElts, typestr, args);
+ // Check if an explicit cast is needed.
+ if (!argScalar &&
+ ((ck == ClassB && argType != 'c') || argPoly || argUsgn)) {
+ std::string argTypeStr = "c";
+ if (ck != ClassB)
+ argTypeStr = argType;
+ if (argQuad)
+ argTypeStr = "Q" + argTypeStr;
+ args = "(" + TypeString('d', argTypeStr) + ")" + args;
+ }
+
+ if (splat && (i + 1) == e)
+ s += Duplicate(GetNumElements(typestr, argQuad), typestr, args);
else
s += args;
if ((i + 1) < e)
More information about the llvm-commits
mailing list