diff options
author | Jim Grosbach <grosbach@apple.com> | 2011-12-09 23:34:09 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2011-12-09 23:34:09 +0000 |
commit | 8be2f6577e147ea695b702ba71a1a349232849b1 (patch) | |
tree | 92760052dcb0f6b3f6ca8134bc7bff59827cfd75 | |
parent | 8a6a6acd1fa91a2abaff86a4724b4e007efda2a2 (diff) | |
download | bcm5719-llvm-8be2f6577e147ea695b702ba71a1a349232849b1.tar.gz bcm5719-llvm-8be2f6577e147ea695b702ba71a1a349232849b1.zip |
ARM add some pre-UAL VFP mnemonics for convenience when porting old code.
llvm-svn: 146296
-rw-r--r-- | llvm/lib/Target/ARM/ARMInstrNEON.td | 5 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMInstrVFP.td | 23 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 9 |
3 files changed, 31 insertions, 6 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrNEON.td b/llvm/lib/Target/ARM/ARMInstrNEON.td index c546ad9bf27..f0fa3d26200 100644 --- a/llvm/lib/Target/ARM/ARMInstrNEON.td +++ b/llvm/lib/Target/ARM/ARMInstrNEON.td @@ -5308,6 +5308,11 @@ def : Pat<(v2f64 (bitconvert (v4f32 QPR:$src))), (v2f64 QPR:$src)>; //===----------------------------------------------------------------------===// // Assembler aliases // +def : VFP2InstAlias<"fmdhr${p} $Dd, $Rn", + (VSETLNi32 DPR:$Dd, GPR:$Rn, 1, pred:$p)>; +def : VFP2InstAlias<"fmdlr${p} $Dd, $Rn", + (VSETLNi32 DPR:$Dd, GPR:$Rn, 0, pred:$p)>; + // VADD two-operand aliases. def : NEONInstAlias<"vadd${p}.i8 $Vdn, $Vm", diff --git a/llvm/lib/Target/ARM/ARMInstrVFP.td b/llvm/lib/Target/ARM/ARMInstrVFP.td index 828b9a2bb34..9839ccd770e 100644 --- a/llvm/lib/Target/ARM/ARMInstrVFP.td +++ b/llvm/lib/Target/ARM/ARMInstrVFP.td @@ -1161,15 +1161,26 @@ def FCONSTS : VFPAI<(outs SPR:$Sd), (ins vfp_f32imm:$imm), // Assembler aliases. // +class VFP2MnemonicAlias<string src, string dst> : MnemonicAlias<src, dst>, + Requires<[HasVFP2]>; // A few mnemnoic aliases for pre-unifixed syntax. We don't guarantee to // support them all, but supporting at least some of the basics is // good to be friendly. -def : MnemonicAlias<"flds", "vldr">; -def : MnemonicAlias<"fldd", "vldr">; -def : MnemonicAlias<"fmrs", "vmov">; -def : MnemonicAlias<"fmsr", "vmov">; -def : MnemonicAlias<"fsqrts", "vsqrt">; -def : MnemonicAlias<"fsqrtd", "vsqrt">; +def : VFP2MnemonicAlias<"flds", "vldr">; +def : VFP2MnemonicAlias<"fldd", "vldr">; +def : VFP2MnemonicAlias<"fmrs", "vmov">; +def : VFP2MnemonicAlias<"fmsr", "vmov">; +def : VFP2MnemonicAlias<"fsqrts", "vsqrt">; +def : VFP2MnemonicAlias<"fsqrtd", "vsqrt">; +def : VFP2MnemonicAlias<"fadds", "vadd.f32">; +def : VFP2MnemonicAlias<"faddd", "vadd.f64">; +def : VFP2MnemonicAlias<"fmrdd", "vmov">; +def : VFP2MnemonicAlias<"fmrds", "vmov">; +def : VFP2MnemonicAlias<"fmrrd", "vmov">; +def : VFP2MnemonicAlias<"fmdrr", "vmov">; +def : VFP2MnemonicAlias<"fmuld", "vmul.f64">; +def : VFP2MnemonicAlias<"fnegs", "vneg.f32">; +def : VFP2MnemonicAlias<"fnegd", "vneg.f64">; def : VFP2InstAlias<"fmstat${p}", (FMSTAT pred:$p)>; diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index f616bea190f..19706e95c8e 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -4523,9 +4523,18 @@ static bool doesIgnoreDataTypeSuffix(StringRef Mnemonic, StringRef DT) { return Mnemonic.startswith("vldm") || Mnemonic.startswith("vstm"); } +static void applyMnemonicAliases(StringRef &Mnemonic, unsigned Features); /// Parse an arm instruction mnemonic followed by its operands. bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc, SmallVectorImpl<MCParsedAsmOperand*> &Operands) { + // Apply mnemonic aliases before doing anything else, as the destination + // mnemnonic may include suffices and we want to handle them normally. + // The generic tblgen'erated code does this later, at the start of + // MatchInstructionImpl(), but that's too late for aliases that include + // any sort of suffix. + unsigned AvailableFeatures = getAvailableFeatures(); + applyMnemonicAliases(Name, AvailableFeatures); + // Create the leading tokens for the mnemonic, split by '.' characters. size_t Start = 0, Next = Name.find('.'); StringRef Mnemonic = Name.slice(Start, Next); |