diff options
author | Vladimir Medic <Vladimir.Medic@imgtec.com> | 2013-11-13 09:48:53 +0000 |
---|---|---|
committer | Vladimir Medic <Vladimir.Medic@imgtec.com> | 2013-11-13 09:48:53 +0000 |
commit | c7ebe502765fecc2af047ced115845936e8ed58e (patch) | |
tree | 4c28c3bd41cf13e71ca298a25d9b622af7383a5f | |
parent | d3df4603d90cd86ef9d3136fc3d111a575d211a3 (diff) | |
download | external_llvm-c7ebe502765fecc2af047ced115845936e8ed58e.zip external_llvm-c7ebe502765fecc2af047ced115845936e8ed58e.tar.gz external_llvm-c7ebe502765fecc2af047ced115845936e8ed58e.tar.bz2 |
This patch fixes a bug in floating point operands parsing, when instruction alias uses default register operand.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194562 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 21 | ||||
-rw-r--r-- | test/MC/Mips/mips-fpu-instructions.s | 4 |
2 files changed, 22 insertions, 3 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index cd88f9f..7b93d75 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1159,9 +1159,7 @@ MipsAsmParser::ParseOperand(SmallVectorImpl<MCParsedAsmOperand *> &Operands, return true; SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); - MCSymbol *Sym = getContext().GetOrCreateSymbol("$" + Identifier); - // Otherwise create a symbol reference. const MCExpr *Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext()); @@ -1170,6 +1168,25 @@ MipsAsmParser::ParseOperand(SmallVectorImpl<MCParsedAsmOperand *> &Operands, return false; } case AsmToken::Identifier: + // For instruction aliases like "bc1f $Label" dedicated parser will + // eat the '$' sign before failing. So in order to look for appropriate + // label we must check first if we have already consumed '$'. + if (hasConsumedDollar) { + hasConsumedDollar = false; + SMLoc S = Parser.getTok().getLoc(); + StringRef Identifier; + if (Parser.parseIdentifier(Identifier)) + return true; + SMLoc E = + SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); + MCSymbol *Sym = getContext().GetOrCreateSymbol("$" + Identifier); + // Create a symbol reference. + const MCExpr *Res = + MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext()); + + Operands.push_back(MipsOperand::CreateImm(Res, S, E)); + return false; + } // Look for the existing symbol, we should check if // we need to assigne the propper RegisterKind. if (searchSymbolAlias(Operands, MipsOperand::Kind_None)) diff --git a/test/MC/Mips/mips-fpu-instructions.s b/test/MC/Mips/mips-fpu-instructions.s index be0a900..bfaef9e 100644 --- a/test/MC/Mips/mips-fpu-instructions.s +++ b/test/MC/Mips/mips-fpu-instructions.s @@ -138,6 +138,8 @@ #------------------------------------------------------------------------------ # FP move instructions #------------------------------------------------------------------------------ +# CHECK: bc1f $BB_1 # encoding: [A,A,0x00,0x45] +# CHECK: # fixup A - offset: 0, value: ($BB_1), kind: fixup_Mips_PC16 # CHECK: cfc1 $6, $0 # encoding: [0x00,0x00,0x46,0x44] # CHECK: ctc1 $10, $31 # encoding: [0x00,0xf8,0xca,0x44] @@ -173,7 +175,7 @@ # CHECK: sdc2 $4, 16($sp) # encoding: [0x10,0x00,0xa4,0xfb] # CHECK: lwc2 $11, 12($ra) # encoding: [0x0c,0x00,0xeb,0xcb] # CHECK: ldc2 $11, 12($ra) # encoding: [0x0c,0x00,0xeb,0xdb] - + bc1f $fcc0, $BB_1 cfc1 $a2,$0 ctc1 $10,$31 mfc1 $a2,$f7 |