diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2014-02-10 15:43:11 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2014-02-10 15:43:11 +0000 |
commit | 5fcb5c92d3c8e659abd7a4c2b9a84be9955c525a (patch) | |
tree | fe2a9080de8ddd6fa1511d53ddb86fa6c4f34d92 | |
parent | dbd5c285b8a878ef068b6fb05f1981cf4878f0db (diff) | |
download | llvm-5fcb5c92d3c8e659abd7a4c2b9a84be9955c525a.tar.gz llvm-5fcb5c92d3c8e659abd7a4c2b9a84be9955c525a.tar.bz2 llvm-5fcb5c92d3c8e659abd7a4c2b9a84be9955c525a.tar.xz |
[AArch64] Handle aliases of conditional branches without b.pred form.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201091 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp | 29 | ||||
-rw-r--r-- | test/MC/AArch64/basic-a64-instructions.s | 52 |
2 files changed, 77 insertions, 4 deletions
diff --git a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 5a70400023..1b47e2a325 100644 --- a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -2240,15 +2240,36 @@ validateInstruction(MCInst &Inst, bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, SmallVectorImpl<MCParsedAsmOperand*> &Operands) { - size_t CondCodePos = Name.find('.'); - - StringRef Mnemonic = Name.substr(0, CondCodePos); + StringRef PatchedName = StringSwitch<StringRef>(Name.lower()) + .Case("beq", "b.eq") + .Case("bne", "b.ne") + .Case("bhs", "b.hs") + .Case("bcs", "b.cs") + .Case("blo", "b.lo") + .Case("bcc", "b.cc") + .Case("bmi", "b.mi") + .Case("bpl", "b.pl") + .Case("bvs", "b.vs") + .Case("bvc", "b.vc") + .Case("bhi", "b.hi") + .Case("bls", "b.ls") + .Case("bge", "b.ge") + .Case("blt", "b.lt") + .Case("bgt", "b.gt") + .Case("ble", "b.le") + .Case("bal", "b.al") + .Case("bnv", "b.nv") + .Default(Name); + + size_t CondCodePos = PatchedName.find('.'); + + StringRef Mnemonic = PatchedName.substr(0, CondCodePos); Operands.push_back(AArch64Operand::CreateToken(Mnemonic, NameLoc)); if (CondCodePos != StringRef::npos) { // We have a condition code SMLoc S = SMLoc::getFromPointer(NameLoc.getPointer() + CondCodePos + 1); - StringRef CondStr = Name.substr(CondCodePos + 1, StringRef::npos); + StringRef CondStr = PatchedName.substr(CondCodePos + 1, StringRef::npos); A64CC::CondCodes Code; Code = A64StringToCondCode(CondStr); diff --git a/test/MC/AArch64/basic-a64-instructions.s b/test/MC/AArch64/basic-a64-instructions.s index a50efb3310..be00e14b9a 100644 --- a/test/MC/AArch64/basic-a64-instructions.s +++ b/test/MC/AArch64/basic-a64-instructions.s @@ -1194,6 +1194,58 @@ _func: // CHECK: b.al lbl // encoding: [0x0e'A',A,A,0x54'A'] // CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr + beq lbl + bne lbl + bcs lbl + bhs lbl + blo lbl + bcc lbl + bmi lbl + bpl lbl + bvs lbl + bvc lbl + bhi lbl + bls lbl + bge lbl + blt lbl + bgt lbl + ble lbl + bal lbl +// CHECK: b.eq lbl // encoding: [A,A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ne lbl // encoding: [0x01'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hs lbl // encoding: [0x02'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hs lbl // encoding: [0x02'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lo lbl // encoding: [0x03'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lo lbl // encoding: [0x03'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.mi lbl // encoding: [0x04'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.pl lbl // encoding: [0x05'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.vs lbl // encoding: [0x06'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.vc lbl // encoding: [0x07'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hi lbl // encoding: [0x08'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ls lbl // encoding: [0x09'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ge lbl // encoding: [0x0a'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lt lbl // encoding: [0x0b'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.gt lbl // encoding: [0x0c'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.le lbl // encoding: [0x0d'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.al lbl // encoding: [0x0e'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr + b.eq #0 b.lt #-4 b.cc #1048572 |