summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-05-06 11:18:53 +0000
committerTim Northover <tnorthover@apple.com>2014-05-06 11:18:53 +0000
commit0f54f309bb41a5e2b438d6bc7a4bcdc9fb0fdf9e (patch)
tree64761b565d94380eb2ae14363598d1d759618f6d /llvm/lib
parente357df8eaee1ed71a226b5bbaeb1d57ca8219a99 (diff)
downloadbcm5719-llvm-0f54f309bb41a5e2b438d6bc7a4bcdc9fb0fdf9e.tar.gz
bcm5719-llvm-0f54f309bb41a5e2b438d6bc7a4bcdc9fb0fdf9e.zip
AArch64/ARM64: produce more informative diagnostic assembling some immediates
No tests here, they'll be added when the entire neon-diagnostics.s test from AArch64 is enabled. llvm-svn: 208079
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/ARM64/ARM64InstrFormats.td32
-rw-r--r--llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp38
2 files changed, 38 insertions, 32 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64InstrFormats.td b/llvm/lib/Target/ARM64/ARM64InstrFormats.td
index b67218cf5ea..26db1b2fac8 100644
--- a/llvm/lib/Target/ARM64/ARM64InstrFormats.td
+++ b/llvm/lib/Target/ARM64/ARM64InstrFormats.td
@@ -225,23 +225,16 @@ def imm0_65535 : Operand<i32>, ImmLeaf<i32, [{
let PrintMethod = "printHexImm";
}
-def Imm1_8Operand : AsmOperandClass {
- let Name = "Imm1_8";
- let DiagnosticType = "InvalidImm1_8";
-}
-def Imm1_16Operand : AsmOperandClass {
- let Name = "Imm1_16";
- let DiagnosticType = "InvalidImm1_16";
-}
-def Imm1_32Operand : AsmOperandClass {
- let Name = "Imm1_32";
- let DiagnosticType = "InvalidImm1_32";
-}
-def Imm1_64Operand : AsmOperandClass {
- let Name = "Imm1_64";
- let DiagnosticType = "InvalidImm1_64";
+class AsmImmRange<int Low, int High> : AsmOperandClass {
+ let Name = "Imm" # Low # "_" # High;
+ let DiagnosticType = "InvalidImm" # Low # "_" # High;
}
+def Imm1_8Operand : AsmImmRange<1, 8>;
+def Imm1_16Operand : AsmImmRange<1, 16>;
+def Imm1_32Operand : AsmImmRange<1, 32>;
+def Imm1_64Operand : AsmImmRange<1, 64>;
+
def MovZSymbolG3AsmOperand : AsmOperandClass {
let Name = "MovZSymbolG3";
let RenderMethod = "addImmOperands";
@@ -386,10 +379,10 @@ def vecshiftR64Narrow : Operand<i32>, ImmLeaf<i32, [{
let ParserMatchClass = Imm1_32Operand;
}
-def Imm0_7Operand : AsmOperandClass { let Name = "Imm0_7"; }
-def Imm0_15Operand : AsmOperandClass { let Name = "Imm0_15"; }
-def Imm0_31Operand : AsmOperandClass { let Name = "Imm0_31"; }
-def Imm0_63Operand : AsmOperandClass { let Name = "Imm0_63"; }
+def Imm0_7Operand : AsmImmRange<0, 7>;
+def Imm0_15Operand : AsmImmRange<0, 15>;
+def Imm0_31Operand : AsmImmRange<0, 31>;
+def Imm0_63Operand : AsmImmRange<0, 63>;
def vecshiftL8 : Operand<i32>, ImmLeaf<i32, [{
return (((uint32_t)Imm) < 8);
@@ -4473,6 +4466,7 @@ multiclass SIMDCmpTwoVector<bit U, bits<5> opc, string asm,
// FP Comparisons support only S and D element sizes.
multiclass SIMDFPCmpTwoVector<bit U, bit S, bits<5> opc,
string asm, SDNode OpNode> {
+
def v2i32rz : BaseSIMDCmpTwoVector<0, U, {S,0}, opc, V64,
asm, ".2s", "0.0",
v2i32, v2f32, OpNode>;
diff --git a/llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp b/llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
index bad7a1ce58a..f2f666bc33f 100644
--- a/llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
+++ b/llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
@@ -3852,31 +3852,39 @@ bool ARM64AsmParser::showMatchError(SMLoc Loc, unsigned ErrCode) {
case Match_InvalidSuffix:
return Error(Loc, "invalid type suffix for instruction");
case Match_InvalidMemoryIndexedSImm9:
- return Error(Loc, "index must be an integer in range [-256,255].");
+ return Error(Loc, "index must be an integer in range [-256, 255].");
case Match_InvalidMemoryIndexed32SImm7:
- return Error(Loc, "index must be a multiple of 4 in range [-256,252].");
+ return Error(Loc, "index must be a multiple of 4 in range [-256, 252].");
case Match_InvalidMemoryIndexed64SImm7:
- return Error(Loc, "index must be a multiple of 8 in range [-512,504].");
+ return Error(Loc, "index must be a multiple of 8 in range [-512, 504].");
case Match_InvalidMemoryIndexed128SImm7:
- return Error(Loc, "index must be a multiple of 16 in range [-1024,1008].");
+ return Error(Loc, "index must be a multiple of 16 in range [-1024, 1008].");
case Match_InvalidMemoryIndexed8:
- return Error(Loc, "index must be an integer in range [0,4095].");
+ return Error(Loc, "index must be an integer in range [0, 4095].");
case Match_InvalidMemoryIndexed16:
- return Error(Loc, "index must be a multiple of 2 in range [0,8190].");
+ return Error(Loc, "index must be a multiple of 2 in range [0, 8190].");
case Match_InvalidMemoryIndexed32:
- return Error(Loc, "index must be a multiple of 4 in range [0,16380].");
+ return Error(Loc, "index must be a multiple of 4 in range [0, 16380].");
case Match_InvalidMemoryIndexed64:
- return Error(Loc, "index must be a multiple of 8 in range [0,32760].");
+ return Error(Loc, "index must be a multiple of 8 in range [0, 32760].");
case Match_InvalidMemoryIndexed128:
- return Error(Loc, "index must be a multiple of 16 in range [0,65520].");
+ return Error(Loc, "index must be a multiple of 16 in range [0, 65520].");
+ case Match_InvalidImm0_7:
+ return Error(Loc, "immediate must be an integer in range [0, 7].");
+ case Match_InvalidImm0_15:
+ return Error(Loc, "immediate must be an integer in range [0, 15].");
+ case Match_InvalidImm0_31:
+ return Error(Loc, "immediate must be an integer in range [0, 31].");
+ case Match_InvalidImm0_63:
+ return Error(Loc, "immediate must be an integer in range [0, 63].");
case Match_InvalidImm1_8:
- return Error(Loc, "immediate must be an integer in range [1,8].");
+ return Error(Loc, "immediate must be an integer in range [1, 8].");
case Match_InvalidImm1_16:
- return Error(Loc, "immediate must be an integer in range [1,16].");
+ return Error(Loc, "immediate must be an integer in range [1, 16].");
case Match_InvalidImm1_32:
- return Error(Loc, "immediate must be an integer in range [1,32].");
+ return Error(Loc, "immediate must be an integer in range [1, 32].");
case Match_InvalidImm1_64:
- return Error(Loc, "immediate must be an integer in range [1,64].");
+ return Error(Loc, "immediate must be an integer in range [1, 64].");
case Match_InvalidLabel:
return Error(Loc, "expected label or encodable integer pc offset");
case Match_MRS:
@@ -4416,6 +4424,10 @@ bool ARM64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
case Match_InvalidMemoryIndexed32SImm7:
case Match_InvalidMemoryIndexed64SImm7:
case Match_InvalidMemoryIndexed128SImm7:
+ case Match_InvalidImm0_7:
+ case Match_InvalidImm0_15:
+ case Match_InvalidImm0_31:
+ case Match_InvalidImm0_63:
case Match_InvalidImm1_8:
case Match_InvalidImm1_16:
case Match_InvalidImm1_32:
OpenPOWER on IntegriCloud