Make tblgen a little smarter about constants smaller than i32. Currently,
tblgen will complain if a sign-extended constant does not fit into a
data type smaller than i32, e.g., i16. This causes a problem when certain
hex constants are used, such as 0xff for byte masks or immediate xor
values.

tblgen will try the sign-extended value first and, if the sign extended
value would overflow, it tries to see if the unsigned value will fit.
Consequently, a software developer can now safely incant:

	(XORHIr16 R16C:$rA, 0xffff)

which is somewhat clearer and more informative than incanting:

	(XORHIr16 R16C:$rA, (i16 -1))

even if the two are bitwise equivalent.

Tblgen also outputs the 64-bit unsigned constant in the generated ISel code
when getTargetConstant() is invoked.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47188 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp
index 146488e..ddfaaac 100644
--- a/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -702,10 +702,17 @@
           // Make sure that the value is representable for this type.
           if (Size < 32) {
             int Val = (II->getValue() << (32-Size)) >> (32-Size);
-            if (Val != II->getValue())
-              TP.error("Sign-extended integer value '" + itostr(II->getValue())+
-                       "' is out of range for type '" + 
-                       getEnumName(getTypeNum(0)) + "'!");
+            if (Val != II->getValue()) {
+	      // If sign-extended doesn't fit, does it fit as unsigned?
+	      unsigned ValueMask = unsigned(MVT::getIntVTBitMask(VT));
+	      unsigned UnsignedVal = unsigned(II->getValue());
+
+	      if ((ValueMask & UnsignedVal) != UnsignedVal) {
+		TP.error("Integer value '" + itostr(II->getValue())+
+			 "' is out of range for type '" + 
+			 getEnumName(getTypeNum(0)) + "'!");
+	      }
+	    }
           }
         }
       }