Skip to content

Commit

Permalink
[mips] Range check simm10
Browse files Browse the repository at this point in the history
Summary:

Reviewers: vkalintiris

Subscribers: llvm-commits, dsanders

Differential Revision: http://reviews.llvm.org/D18148

llvm-svn: 264279
  • Loading branch information
dsandersllvm committed Mar 24, 2016
1 parent 547d879 commit 837f151
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 4 deletions.
3 changes: 3 additions & 0 deletions llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
Expand Up @@ -3781,6 +3781,9 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
case Match_UImm10_0:
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
"expected 10-bit unsigned immediate");
case Match_SImm10_0:
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
"expected 10-bit signed immediate");
case Match_UImm16:
case Match_UImm16_Relaxed:
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/Mips/Mips64InstrInfo.td
Expand Up @@ -15,9 +15,6 @@
// Mips Operand, Complex Patterns and Transformations Definitions.
//===----------------------------------------------------------------------===//

// Signed Operand
def simm10_64 : Operand<i64>;

// Transformation Function - get Imm - 32.
def Subtract32 : SDNodeXForm<imm, [{
return getImm(N, (unsigned)N->getZExtValue() - 32);
Expand Down
11 changes: 10 additions & 1 deletion llvm/lib/Target/Mips/MipsInstrInfo.td
Expand Up @@ -465,11 +465,13 @@ def UImm16AsmOperandClass
: UImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]>;
def ConstantUImm10AsmOperandClass
: ConstantUImmAsmOperandClass<10, [UImm16AsmOperandClass]>;
def ConstantSImm10AsmOperandClass
: ConstantSImmAsmOperandClass<10, [ConstantUImm10AsmOperandClass]>;
def ConstantSImm7Lsl2AsmOperandClass : AsmOperandClass {
let Name = "SImm7Lsl2";
let RenderMethod = "addImmOperands";
let PredicateMethod = "isScaledSImm<7, 2>";
let SuperClasses = [ConstantUImm10AsmOperandClass];
let SuperClasses = [ConstantSImm10AsmOperandClass];
let DiagnosticType = "SImm7_Lsl2";
}
def ConstantUImm8AsmOperandClass
Expand Down Expand Up @@ -746,6 +748,13 @@ foreach I = {4, 5, 6} in
!cast<AsmOperandClass>("ConstantSImm" # I # "AsmOperandClass");
}

foreach I = {10} in
def simm # I # _64 : Operand<i64> {
let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ">";
let ParserMatchClass =
!cast<AsmOperandClass>("ConstantSImm" # I # "AsmOperandClass");
}

def simm7_lsl2 : Operand<OtherVT> {
let EncoderMethod = "getSImm7Lsl2Encoding";
let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ", 0, 4>";
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/MC/Mips/cnmips/invalid.s
Expand Up @@ -17,3 +17,7 @@ foo:
ins $2, $3, 32, 1 # CHECK: :[[@LINE]]:17: error: expected 5-bit unsigned immediate
ins $2, $3, 0, -1 # CHECK: :[[@LINE]]:20: error: expected immediate in range 1 .. 32
ins $2, $3, 0, 33 # CHECK: :[[@LINE]]:20: error: expected immediate in range 1 .. 32
seqi $2, $3, -1025 # CHECK: :[[@LINE]]:18: error: expected 10-bit signed immediate
seqi $2, $3, 1024 # CHECK: :[[@LINE]]:18: error: expected 10-bit signed immediate
snei $2, $3, -1025 # CHECK: :[[@LINE]]:18: error: expected 10-bit signed immediate
snei $2, $3, 1024 # CHECK: :[[@LINE]]:18: error: expected 10-bit signed immediate

0 comments on commit 837f151

Please sign in to comment.