From 06b04aaf5c01ce218dcb1450448a7ec3a28c7fdb Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Wed, 15 Dec 2010 16:58:42 +0000 Subject: [PATCH] Fix Neon intrinsic immediate range checking for some double-register operands. Some quad-register intrinsics with lane operands only take a double-register operand for the vector containing the lane. The valid range of lane numbers is then half as big as you would expect from the quad-register type. Note: This currently has no effect because those intrinsics are now handled entirely in the header file using __builtin_shufflevector, which does its own range checking, but I want to use this for generating tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121867 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/NeonEmitter.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index 1d311041325..0f80d7bcdfd 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -1213,10 +1213,11 @@ void NeonEmitter::emitIntrinsic(raw_ostream &OS, Record *R) { OS << "\n"; } -static unsigned RangeFromType(StringRef typestr) { +static unsigned RangeFromType(const char mod, StringRef typestr) { // base type to get the type string for. bool quad = false, dummy = false; char type = ClassifyType(typestr, quad, dummy, dummy); + type = ModType(mod, type, quad, dummy, dummy, dummy, dummy, dummy); switch (type) { case 'c': @@ -1359,7 +1360,8 @@ void NeonEmitter::runHeader(raw_ostream &OS) { // Functions which do not have an immediate do not need to have range // checking code emitted. - if (Proto.find('i') == std::string::npos) + size_t immPos = Proto.find('i'); + if (immPos == std::string::npos) continue; SmallVector TypeVec; @@ -1386,7 +1388,9 @@ void NeonEmitter::runHeader(raw_ostream &OS) { } rangestr += "u = RFT(TV" + shiftstr + ")"; } else { - rangestr = "u = " + utostr(RangeFromType(TypeVec[ti])); + // The immediate generally refers to a lane in the preceding argument. + assert(immPos > 0 && "unexpected immediate operand"); + rangestr = "u = " + utostr(RangeFromType(Proto[immPos-1], TypeVec[ti])); } // Make sure cases appear only once by uniquing them in a string map. namestr = MangleName(name, TypeVec[ti], ck); -- 2.34.1