[mips] Add support for branch-likely pseudo-instructions
authorZoran Jovanovic <zoran.jovanovic@imgtec.com>
Tue, 15 Sep 2015 15:06:26 +0000 (15:06 +0000)
committerZoran Jovanovic <zoran.jovanovic@imgtec.com>
Tue, 15 Sep 2015 15:06:26 +0000 (15:06 +0000)
Differential Revision: http://reviews.llvm.org/D10537

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247697 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
lib/Target/Mips/MicroMips32r6InstrInfo.td
lib/Target/Mips/MipsInstrFormats.td
lib/Target/Mips/MipsInstrInfo.td
test/MC/Mips/branch-pseudos-bad.s
test/MC/Mips/branch-pseudos.s
test/MC/Mips/mips32r6/invalid.s
test/MC/Mips/mips64r6/invalid.s

index 9f0b9f7f09a6fe6e54d19bd4572f466afb086cd9..5a3cf65a3c884e8e1616f7a81d01abeeac4fdd15 100644 (file)
@@ -1817,6 +1817,14 @@ bool MipsAsmParser::needsExpansion(MCInst &Inst) {
   case Mips::BLEU:
   case Mips::BGEU:
   case Mips::BGTU:
+  case Mips::BLTL:
+  case Mips::BLEL:
+  case Mips::BGEL:
+  case Mips::BGTL:
+  case Mips::BLTUL:
+  case Mips::BLEUL:
+  case Mips::BGEUL:
+  case Mips::BGTUL:
   case Mips::SDivMacro:
   case Mips::UDivMacro:
   case Mips::DSDivMacro:
@@ -1876,6 +1884,14 @@ bool MipsAsmParser::expandInstruction(MCInst &Inst, SMLoc IDLoc,
   case Mips::BLEU:
   case Mips::BGEU:
   case Mips::BGTU:
+  case Mips::BLTL:
+  case Mips::BLEL:
+  case Mips::BGEL:
+  case Mips::BGTL:
+  case Mips::BLTUL:
+  case Mips::BLEUL:
+  case Mips::BGEUL:
+  case Mips::BGTUL:
     return expandCondBranches(Inst, IDLoc, Instructions);
   case Mips::SDivMacro:
     return expandDiv(Inst, IDLoc, Instructions, false, true);
@@ -2568,38 +2584,50 @@ bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *OffsetExpr = Inst.getOperand(2).getExpr();
 
   unsigned ZeroSrcOpcode, ZeroTrgOpcode;
-  bool ReverseOrderSLT, IsUnsigned, AcceptsEquality;
+  bool ReverseOrderSLT, IsUnsigned, IsLikely, AcceptsEquality;
 
   switch (PseudoOpcode) {
   case Mips::BLT:
   case Mips::BLTU:
+  case Mips::BLTL:
+  case Mips::BLTUL:
     AcceptsEquality = false;
     ReverseOrderSLT = false;
-    IsUnsigned = (PseudoOpcode == Mips::BLTU);
+    IsUnsigned = ((PseudoOpcode == Mips::BLTU) || (PseudoOpcode == Mips::BLTUL));
+    IsLikely = ((PseudoOpcode == Mips::BLTL) || (PseudoOpcode == Mips::BLTUL));
     ZeroSrcOpcode = Mips::BGTZ;
     ZeroTrgOpcode = Mips::BLTZ;
     break;
   case Mips::BLE:
   case Mips::BLEU:
+  case Mips::BLEL:
+  case Mips::BLEUL:
     AcceptsEquality = true;
     ReverseOrderSLT = true;
-    IsUnsigned = (PseudoOpcode == Mips::BLEU);
+    IsUnsigned = ((PseudoOpcode == Mips::BLEU) || (PseudoOpcode == Mips::BLEUL));
+    IsLikely = ((PseudoOpcode == Mips::BLEL) || (PseudoOpcode == Mips::BLEUL));
     ZeroSrcOpcode = Mips::BGEZ;
     ZeroTrgOpcode = Mips::BLEZ;
     break;
   case Mips::BGE:
   case Mips::BGEU:
+  case Mips::BGEL:
+  case Mips::BGEUL:
     AcceptsEquality = true;
     ReverseOrderSLT = false;
-    IsUnsigned = (PseudoOpcode == Mips::BGEU);
+    IsUnsigned = ((PseudoOpcode == Mips::BGEU) || (PseudoOpcode == Mips::BGEUL));
+    IsLikely = ((PseudoOpcode == Mips::BGEL) || (PseudoOpcode == Mips::BGEUL));
     ZeroSrcOpcode = Mips::BLEZ;
     ZeroTrgOpcode = Mips::BGEZ;
     break;
   case Mips::BGT:
   case Mips::BGTU:
+  case Mips::BGTL:
+  case Mips::BGTUL:
     AcceptsEquality = false;
     ReverseOrderSLT = true;
-    IsUnsigned = (PseudoOpcode == Mips::BGTU);
+    IsUnsigned = ((PseudoOpcode == Mips::BGTU) || (PseudoOpcode == Mips::BGTUL));
+    IsLikely = ((PseudoOpcode == Mips::BGTL) || (PseudoOpcode == Mips::BGTUL));
     ZeroSrcOpcode = Mips::BLTZ;
     ZeroTrgOpcode = Mips::BGTZ;
     break;
@@ -2752,7 +2780,10 @@ bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc,
   SetInst.addOperand(MCOperand::createReg(ReverseOrderSLT ? SrcReg : TrgReg));
   Instructions.push_back(SetInst);
 
-  BranchInst.setOpcode(AcceptsEquality ? Mips::BEQ : Mips::BNE);
+  if (!IsLikely)
+    BranchInst.setOpcode(AcceptsEquality ? Mips::BEQ : Mips::BNE);
+  else
+    BranchInst.setOpcode(AcceptsEquality ? Mips::BEQL : Mips::BNEL);
   BranchInst.addOperand(MCOperand::createReg(ATRegNum));
   BranchInst.addOperand(MCOperand::createReg(Mips::ZERO));
   BranchInst.addOperand(MCOperand::createExpr(OffsetExpr));
index c1037b8ed0ea35a548dd0c1bd429cf43cf7c1024..a725727802743c0fc3f6627f57f64620a7bf7684 100644 (file)
@@ -899,5 +899,6 @@ def SRL16_MMR6 : StdMMR6Rel, SRL16_MMR6_DESC, SRL16_MMR6_ENC,
 def : MipsInstAlias<"ei", (EI_MMR6 ZERO), 1>, ISA_MICROMIPS32R6;
 def : MipsInstAlias<"nop", (SLL_MMR6 ZERO, ZERO, 0), 1>, ISA_MICROMIPS32R6;
 def B_MMR6_Pseudo : MipsAsmPseudoInst<(outs), (ins brtarget_mm:$offset),
-                                      !strconcat("b", "\t$offset")>,
-                    MicroMipsR6Inst16;
+                                      !strconcat("b", "\t$offset")> {
+  string DecoderNamespace = "MicroMipsR6";
+}
index 73886689b3e88540b0bc780d722fd735fdb14a8a..45baf27be518fb78109f643cda95d770add53f46 100644 (file)
@@ -132,7 +132,7 @@ class PseudoSE<dag outs, dag ins, list<dag> pattern,
 // These are aliases that require C++ handling to convert to the target
 // instruction, while InstAliases can be handled directly by tblgen.
 class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
-  MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
+  MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo>, PredicateControl {
   let isPseudo = 1;
   let Pattern = [];
 }
index ab86f3aa0ec3a3bedbc9e0c419a1a41dc8aed771..dfee87f82759cfd9cd81b6329143ec95c1955cf8 100644 (file)
@@ -1757,24 +1757,38 @@ def BLTU : CondBranchPseudo<"bltu">;
 def BLEU : CondBranchPseudo<"bleu">;
 def BGEU : CondBranchPseudo<"bgeu">;
 def BGTU : CondBranchPseudo<"bgtu">;
+def BLTL : CondBranchPseudo<"bltl">, ISA_MIPS2_NOT_32R6_64R6;
+def BLEL : CondBranchPseudo<"blel">, ISA_MIPS2_NOT_32R6_64R6;
+def BGEL : CondBranchPseudo<"bgel">, ISA_MIPS2_NOT_32R6_64R6;
+def BGTL : CondBranchPseudo<"bgtl">, ISA_MIPS2_NOT_32R6_64R6;
+def BLTUL: CondBranchPseudo<"bltul">, ISA_MIPS2_NOT_32R6_64R6;
+def BLEUL: CondBranchPseudo<"bleul">, ISA_MIPS2_NOT_32R6_64R6;
+def BGEUL: CondBranchPseudo<"bgeul">, ISA_MIPS2_NOT_32R6_64R6;
+def BGTUL: CondBranchPseudo<"bgtul">, ISA_MIPS2_NOT_32R6_64R6;
+
+// FIXME: Predicates are removed because instructions are matched regardless of
+// predicates, because PredicateControl was not in the hierarchy. This was
+// done to emit more precise error message from expansion function.
+// Once the tablegen-erated errors are made better, this needs to be fixed and
+// predicates needs to be restored.
 
 def SDivMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt),
-                                  "div\t$rs, $rt">, ISA_MIPS1_NOT_32R6_64R6;
+                                  "div\t$rs, $rt">; //, ISA_MIPS1_NOT_32R6_64R6;
 
 def UDivMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt),
-                                  "divu\t$rs, $rt">, ISA_MIPS1_NOT_32R6_64R6;
+                                  "divu\t$rs, $rt">; //, ISA_MIPS1_NOT_32R6_64R6;
 
 def DSDivMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt),
-                                   "ddiv\t$rs, $rt">, ISA_MIPS64_NOT_64R6;
+                                   "ddiv\t$rs, $rt">; //, ISA_MIPS64_NOT_64R6;
 
 def DUDivMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt),
-                                   "ddivu\t$rs, $rt">, ISA_MIPS64_NOT_64R6;
+                                   "ddivu\t$rs, $rt">; //, ISA_MIPS64_NOT_64R6;
 
 def Ulhu : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr),
-                             "ulhu\t$rt, $addr">, ISA_MIPS1_NOT_32R6_64R6;
+                             "ulhu\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6;
 
 def Ulw : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr),
-                            "ulw\t$rt, $addr">, ISA_MIPS1_NOT_32R6_64R6;
+                            "ulw\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6;
 
 //===----------------------------------------------------------------------===//
 //  Arbitrary patterns that map to one or more instructions
index fcbf84af84d047c7ee4c5875f6aad4a3c41030ff..3a0193b2e94bfcd20c2b602d6fc3eda801c37791 100644 (file)
@@ -19,3 +19,20 @@ local_label:
 # CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
   bgtu $7, $8, local_label
 # CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+
+  bltl $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bltul $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  blel $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bleul $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bgel $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bgeul $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bgtl $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
+  bgtul $7, $8, local_label
+# CHECK: :[[@LINE-1]]:3: error: pseudo-instruction requires $at, which is not available
index d5b06f78d8006fb40f6016cdc0a83d0e63f0bb74..56841e29f4259a0dabb650a4532c1985aa592582 100644 (file)
@@ -187,3 +187,183 @@ local_label:
 # CHECK: bnez $zero, local_label # encoding: [0x14,0x00,A,A]
 # CHECK:                         #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
 # CHECK: nop
+
+  bltl $7,$8,local_label
+# CHECK: slt $1, $7, $8                 # encoding: [0x00,0xe8,0x08,0x2a]
+# CHECK: bnel $1, $zero, local_label    # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltl $7,$8,global_label
+# CHECK: slt $1, $7, $8                 # encoding: [0x00,0xe8,0x08,0x2a]
+# CHECK: bnel $1, $zero, global_label   # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltl $7,$0,local_label
+# CHECK: bltz $7, local_label           # encoding: [0x04,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltl $0,$8,local_label
+# CHECK: bgtz $8, local_label           # encoding: [0x1d,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltl $0,$0,local_label
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  blel $7,$8,local_label
+# CHECK: slt $1, $8, $7                 # encoding: [0x01,0x07,0x08,0x2a]
+# CHECK: beql $1, $zero, local_label    # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  blel $7,$8,global_label
+# CHECK: slt $1, $8, $7                 # encoding: [0x01,0x07,0x08,0x2a]
+# CHECK: beql $1, $zero, global_label   # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  blel $7,$0,local_label
+# CHECK: blez $7, local_label           # encoding: [0x18,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  blel $0,$8,local_label
+# CHECK: bgez $8, local_label           # encoding: [0x05,0x01,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  blel $0,$0,local_label
+# WARNING: :[[@LINE-1]]:3: warning: branch is always taken
+# CHECK: b local_label                  # encoding: [0x10,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bgel $7,$8,local_label
+# CHECK: slt $1, $7, $8                 # encoding: [0x00,0xe8,0x08,0x2a]
+# CHECK: beql $1, $zero, local_label    # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgel $7,$8,global_label
+# CHECK: slt $1, $7, $8                 # encoding: [0x00,0xe8,0x08,0x2a]
+# CHECK: beql $1, $zero, global_label   # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgel $7,$0,local_label
+# CHECK: bgez $7, local_label           # encoding: [0x04,0xe1,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgel $0,$8,local_label
+# CHECK: blez $8, local_label           # encoding: [0x19,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgel $0,$0,local_label
+# WARNING: :[[@LINE-1]]:3: warning: branch is always taken
+# CHECK: b local_label                  # encoding: [0x10,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bgtl $7,$8,local_label
+# CHECK: slt $1, $8, $7                 # encoding: [0x01,0x07,0x08,0x2a]
+# CHECK: bnel $1, $zero, local_label    # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtl $7,$8,global_label
+# CHECK: slt $1, $8, $7                 # encoding: [0x01,0x07,0x08,0x2a]
+# CHECK: bnel $1, $zero, global_label   # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtl $7,$0,local_label
+# CHECK: bgtz $7, local_label           # encoding: [0x1c,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtl $0,$8,local_label
+# CHECK: bltz $8, local_label           # encoding: [0x05,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtl $0,$0,local_label
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bltul $7,$8,local_label
+# CHECK: sltu $1, $7, $8                # encoding: [0x00,0xe8,0x08,0x2b]
+# CHECK: bnel $1, $zero, local_label    # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltul $7,$8,global_label
+# CHECK: sltu $1, $7, $8                # encoding: [0x00,0xe8,0x08,0x2b]
+# CHECK: bnel $1, $zero, global_label   # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltul $7,$0,local_label
+# CHECK: bnez $7, local_label           # encoding: [0x14,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltul $0,$8,local_label
+# CHECK: bnez $8, local_label           # encoding: [0x15,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bltul $0,$0,local_label
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bleul $7,$8,local_label
+# CHECK: sltu $1, $8, $7                # encoding: [0x01,0x07,0x08,0x2b]
+# CHECK: beql $1, $zero, local_label    # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bleul $7,$8,global_label
+# CHECK: sltu $1, $8, $7                # encoding: [0x01,0x07,0x08,0x2b]
+# CHECK: beql $1, $zero, global_label   # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bleul $7,$0,local_label
+# CHECK: beqz $7, local_label           # encoding: [0x10,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bleul $0,$8,local_label
+# CHECK: beqz $8, local_label           # encoding: [0x11,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bleul $0,$0,local_label
+# WARNING: :[[@LINE-1]]:3: warning: branch is always taken
+# CHECK: b local_label                  # encoding: [0x10,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bgeul $7,$8,local_label
+# CHECK: sltu $1, $7, $8                # encoding: [0x00,0xe8,0x08,0x2b]
+# CHECK: beql $1, $zero, local_label    # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgeul $7,$8,global_label
+# CHECK: sltu $1, $7, $8                # encoding: [0x00,0xe8,0x08,0x2b]
+# CHECK: beql $1, $zero, global_label   # encoding: [0x50,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgeul $7,$0,local_label
+# CHECK: beqz $7, local_label           # encoding: [0x10,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgeul $0,$8,local_label
+# CHECK: beqz $8, local_label           # encoding: [0x11,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgeul $0,$0,local_label
+# WARNING: :[[@LINE-1]]:3: warning: branch is always taken
+# CHECK: b local_label                  # encoding: [0x10,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+
+  bgtul $7,$8,local_label
+# CHECK: sltu $1, $8, $7                # encoding: [0x01,0x07,0x08,0x2b]
+# CHECK: bnel $1, $zero, local_label    # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtul $7,$8,global_label
+# CHECK: sltu $1, $8, $7                # encoding: [0x01,0x07,0x08,0x2b]
+# CHECK: bnel $1, $zero, global_label   # encoding: [0x54,0x20,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: global_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtul $7,$0,local_label
+# CHECK: bnez $7, local_label           # encoding: [0x14,0xe0,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtul $0,$8,local_label
+# CHECK: bnez $8, local_label           # encoding: [0x15,0x00,A,A]
+# CHECK:                                #   fixup A - offset: 0, value: local_label-4, kind: fixup_Mips_PC16
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
+  bgtul $0,$0,local_label
+# CHECK: nop                            # encoding: [0x00,0x00,0x00,0x00]
index 0ce75e6143c2acf6b3cec207d5ec9918afb2a3e5..d10a945e3ba1b3e8a641f68eeeaf5a9baddc1304 100644 (file)
@@ -2,17 +2,27 @@
 # the assembler (e.g. invalid set of operands or operand's restrictions not met).
 
 # RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r6 2>%t1
-# RUN: FileCheck %s < %t1 -check-prefix=ASM
+# RUN: FileCheck %s < %t1
 
         .text
+local_label:
         .set noreorder
         .set noat
-        jalr.hb $31 # ASM: :[[@LINE]]:9: error: source and destination must be different
-        jalr.hb $31, $31 # ASM: :[[@LINE]]:9: error: source and destination must be different
-        ldc2    $8,-21181($at)   # ASM: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
-        sdc2    $20,23157($s2)   # ASM: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
-        swc2    $25,24880($s0)   # ASM: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        jalr.hb $31 # CHECK: :[[@LINE]]:9: error: source and destination must be different
+        jalr.hb $31, $31 # CHECK: :[[@LINE]]:9: error: source and destination must be different
+        ldc2    $8,-21181($at)   # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        sdc2    $20,23157($s2)   # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        swc2    $25,24880($s0)   # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
         break 1024        # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 1024, 5     # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 7, 1024     # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 1024, 1024  # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
+        // FIXME: Following tests are temporarely disabled, until "PredicateControl not in hierarchy" problem is resolved
+        bltl  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bltul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        blel  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bleul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgel  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgeul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgtl  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgtul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
index ae980347f3062138e31f7338dc419d22d9a1f75a..24a766727a1006a7416b01a945bdb65d83cfb9e1 100644 (file)
@@ -2,15 +2,25 @@
 # the assembler (e.g. invalid set of operands or operand's restrictions not met).
 
 # RUN: not llvm-mc %s -triple=mips64-unknown-linux -mcpu=mips64r6 2>%t1
-# RUN: FileCheck %s < %t1 -check-prefix=ASM
+# RUN: FileCheck %s < %t1
 
         .text
+local_label:
         .set noreorder
        .set noat
-        jalr.hb $31 # ASM: :[[@LINE]]:9: error: source and destination must be different
-        jalr.hb $31, $31 # ASM: :[[@LINE]]:9: error: source and destination must be different
-        ldc2    $8,-21181($at)   # ASM: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        jalr.hb $31 # CHECK: :[[@LINE]]:9: error: source and destination must be different
+        jalr.hb $31, $31 # CHECK: :[[@LINE]]:9: error: source and destination must be different
+        ldc2    $8,-21181($at)   # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
         break 1024        # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 1024, 5     # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 7, 1024     # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
         break 1024, 1024  # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
+        // FIXME: Following tests are temporarely disabled, until "PredicateControl not in hierarchy" problem is resolved
+        bltl  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bltul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        blel  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bleul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgel  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgeul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgtl  $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
+        bgtul $7, $8, local_label  # -CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled