Add ARM fconsts/fconstd aliases for vmov.f32/vmov.f64
authorDavid Peixotto <dpeixott@codeaurora.org>
Tue, 7 Jan 2014 18:19:23 +0000 (18:19 +0000)
committerDavid Peixotto <dpeixott@codeaurora.org>
Tue, 7 Jan 2014 18:19:23 +0000 (18:19 +0000)
commita872e0e0a6e8e60273ae5f3234ce9ba6153b28bd
treed16c73b67bbe2eda5daa3ec3e311b1fc308e449a
parent2da1021355394805fccfef5a0a83718be1e6b925
Add ARM fconsts/fconstd aliases for vmov.f32/vmov.f64

This commit adds the pre-UAL aliases of fconsts and fconstd for
vmov.f32 and vmov.f64. They use an InstAlias rather than a
MnemonicAlias to properly support the predicate operand.

We need to support encoded 8-bit constants in order to implement the
pre-UAL fconsts/fconstd aliases for vmov.f32/vmov.f64, so this
commit also fixes parsing of encoded floating point constants used
in vmov.f32/vmov.f64 instructions. Now we can support assembly code
like this:

  fconsts s0, #0x70

which is equivalent to vmov.f32 s0, #1.0.

Most of the code was already in place to support this feature.
Previously the code was trying to accept encoded 8-bit float
constants for the vmov.f32/vmov.f64 instructions.  It looks like the
support for parsing encoded floats was lost in a refactoring in
commit r148556 and we did not have any tests in place to catch it.

The change in this commit is to keep the parsed value as a 32-bit
float instead of a 64-bit double because that is what the isFPImm()
function expects to find. There is no loss of precision by using a
32-bit float here because we are still limited to an 8-bit encoded
value in the end.

Additionally, we explicitly reject encoded 8-bit floats for
vmovf.32/64. This is the same as the current behavior, but we now do
it explicitly rather than accidently.

llvm-svn: 198697
llvm/lib/Target/ARM/ARMInstrVFP.td
llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
llvm/test/MC/ARM/fconst.s [new file with mode: 0644]
llvm/test/MC/ARM/fp-const-errors.s [new file with mode: 0644]
llvm/test/MC/ARM/simple-fp-encoding.s