| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Memory operand parsing is a bit haphazzard at the moment, in no small part
due to the even more haphazzard representations of memory operands in the .td
files. Start cleaning that all up, at least a bit.
The addressing modes in the .td files will be being simplified to not be
so monolithic, especially with regards to immediate vs. register offsets
and post-indexed addressing. addrmode3 is on its way with this patch, for
example.
This patch is foundational to enable going back to smaller incremental patches
for the individual memory referencing instructions themselves. It does just
enough to get the basics in place and handle the "make check" regression tests
we already have.
Follow-up work will be fleshing out the details and adding more robust test
cases for the individual instructions, starting with ARM mode and moving from
there into Thumb and Thumb2.
llvm-svn: 136845
|
|
|
|
|
|
| |
Use a more descriptive name so the code is more self-documenting.
llvm-svn: 136704
|
|
|
|
|
|
|
|
|
|
|
|
| |
llvm-mc gives an "invalid operand" error for instructions that take an unsigned
immediate which have the high bit set such as:
pblendw $0xc5, %xmm2, %xmm1
llvm-mc treats all x86 immediates as signed values and range checks them.
A small number of x86 instructions use the imm8 field as a set of bits.
This change only changes those instructions and where the high bit is not
ignored. The others remain unchanged.
llvm-svn: 136287
|
|
|
|
|
|
| |
for allowing the fixed-length disassembler to distinguish between SBFX and STR_PRE.
llvm-svn: 136141
|
|
|
|
| |
llvm-svn: 136090
|
|
|
|
| |
llvm-svn: 136006
|
|
|
|
|
|
|
|
|
| |
The immediate is in the range 1-32, but is encoded as 0-31 in a 5-bit bitfield.
Update the representation such that we store the operand as 0-31, allowing us
to remove the encoder method and the special case handling in the disassembler.
Update the assembly parser and the instruction printer accordingly.
llvm-svn: 135823
|
|
|
|
|
|
| |
necessitates a lot of changes to related bits.
llvm-svn: 135722
|
|
|
|
|
|
| |
allowing us to distinguish the encodings that use shifted registers from those that use shifted immediates. This is necessary to allow the fixed-length decoder to distinguish things like BICS vs LDRH.
llvm-svn: 135693
|
|
|
|
|
|
|
|
|
|
| |
Move the shift operator and special value (32 encoded as 0 for PKHTB) handling
into the instruction printer. This cleans up a bit of the disassembler
special casing for these instructions, more easily handles not printing the
operand at all for "lsl #0" and prepares for correct asm parsing of these
operands.
llvm-svn: 135626
|
|
|
|
|
|
|
|
| |
Add range checking for the immediate operand and handle the "mov" mnemonic
choosing between encodings based on the value of the immediate. Add tests
for fixups, encoding choice and values, and diagnostic for out of range values.
llvm-svn: 135500
|
|
|
|
| |
llvm-svn: 135092
|
|
|
|
|
|
| |
The immediate is of limited range and the operand type should reflect that.
llvm-svn: 135066
|
|
|
|
|
|
|
|
|
|
|
|
| |
The enum names as well as order (i.e. value)
had skewed, which means that consumers of the
tablegen-ed table would see different values than
intended. Make both files have a superset of enums,
and add classification as needed for numMCOperands.
Reviewed by Owen Anderson
llvm-svn: 134905
|
|
|
|
|
|
|
|
|
|
| |
For now this is distinct from isCodeGenOnly, as code-gen-only
instructions can (and often do) still have encoding information
associated with them. Once we've migrated all of them over to true
pseudo-instructions that are lowered to real instructions prior to
the printer/emitter, we can remove isCodeGenOnly and just use isPseudo.
llvm-svn: 134539
|
|
|
|
|
|
|
|
|
|
|
| |
Correctly parse the forms of the Thumb mov-immediate instruction:
1. 8-bit immediate 0-255.
2. 12-bit shifted-immediate.
The 16-bit immediate "movw" form is also legal with just a "mov" mnemonic,
but is not yet supported. More parser logic necessary there due to fixups.
llvm-svn: 133966
|
|
|
|
|
|
|
| |
must be encoded decremented by one. Only add encoding tests for ssat16
because ssat can't be parsed yet.
llvm-svn: 132324
|
|
|
|
|
|
| |
lane) for size 32
llvm-svn: 131085
|
|
|
|
| |
llvm-svn: 130068
|
|
|
|
| |
llvm-svn: 128236
|
|
|
|
| |
llvm-svn: 127888
|
|
|
|
|
|
|
|
| |
expand the testing of the narrowing shift right instructions.
No functionality change.
llvm-svn: 127193
|
|
|
|
|
|
|
|
|
|
| |
shift.
16-bit: imm6<5:3> = '001', 8 - <imm> is encded in imm6<2:0>
32-bit: imm6<5:4> = '01',16 - <imm> is encded in imm6<3:0>
64-bit: imm6<5> = '1', 32 - <imm> is encded in imm6<4:0>
llvm-svn: 126723
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Add custom operand matching for imod and iflags.
- Rename SplitMnemonicAndCC to SplitMnemonic since it splits more than CC
from mnemonic.
- While adding ".w" as an operand, don't change "Head" to avoid passing the
wrong mnemonic to ParseOperand.
- Add asm parser tests.
- Add disassembler tests just to make sure it can catch all cps versions.
llvm-svn: 125489
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(yes, this is different from R_ARM_CALL)
- Adds a new method getARMBranchTargetOpValue() which handles the
necessary distinction between the conditional and unconditional br/bl
needed for ARM/ELF
At least for ARM mode, the needed fixup for conditional versus unconditional
br/bl is identical, but the ARM docs and existing ARM tools expect this
reloc type...
Added a few FIXME's for future naming fixups in ARMInstrInfo.td
llvm-svn: 124895
|
|
|
|
| |
llvm-svn: 124271
|
|
|
|
|
|
| |
instruction
llvm-svn: 123770
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
requires supporting
the symbolic immediate names used for these instructions, fixing their pretty-printers, and
adding proper encoding information for them.
With this, we can properly pretty-print and encode assembly like:
mrc p15, #0, r3, c13, c0, #3
Fixes <rdar://problem/8857858>.
llvm-svn: 123404
|
|
|
|
|
|
|
|
| |
in the right direction. It eliminated some hacks and will unblock codegen
work. But it's far from being done. It doesn't reject illegal expressions,
e.g. (FOO - :lower16:BAR). It also doesn't work in Thumb2 mode at all.
llvm-svn: 123369
|
|
|
|
| |
llvm-svn: 121798
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
instruction based on the t_addrmode_s# mode and what it returned. There is some
obvious badness to this. In particular, it's hard to do MC-encoding when the
instruction may change out from underneath you after the t_addrmode_s# variable
is finally resolved.
The solution is to revert a long-ago change that merged the reg/reg and reg/imm
versions. There is the addition of several new addressing modes. They no longer
have extraneous operands associated with them. I.e., if it's reg/reg we don't
have to have a dummy zero immediate tacked on to the SDNode.
There are some obvious cleanups here, which will happen shortly.
llvm-svn: 121747
|
|
|
|
|
|
|
|
| |
much later, which makes the entire
process cleaner.
llvm-svn: 121735
|
|
|
|
| |
llvm-svn: 121726
|
|
|
|
|
|
|
|
| |
Provide correct fixups for Thumb2 ADR,
which is _of course_ different from ARM ADR fixups, or any other Thumb2 fixup.
llvm-svn: 121721
|
|
|
|
|
|
|
|
|
|
| |
branch with a null predicate, or
as a "long" direct branch. While the mnemonics are the same, they encode the branch offset differently, and
the Darwin assembler appears to prefer the "long" form for direct branches. Thus, in the name of bitwise
equivalence, provide encoding and fixup support for it.
llvm-svn: 121710
|
|
|
|
| |
llvm-svn: 121659
|
|
|
|
| |
llvm-svn: 121496
|
|
|
|
| |
llvm-svn: 121493
|
|
|
|
|
|
| |
t_brtarget to be more specific.
llvm-svn: 121398
|
|
|
|
|
|
|
|
|
|
| |
particular, the immediate has 20-bits of value instead of 21. And bit 0 is '0'
always. Going through the BL fixup encoding was trashing the "bit 0 is '0'"
invariant.
Attempt to get the encoding at slightly more correct with this.
llvm-svn: 121336
|
|
|
|
| |
llvm-svn: 121308
|
|
|
|
| |
llvm-svn: 121226
|
|
|
|
| |
llvm-svn: 121072
|
|
|
|
|
|
|
| |
instruction at MC lowering. Add binary encoding information for the ADR,
including fixup data for the label operand.
llvm-svn: 120594
|
|
|
|
|
|
|
|
|
| |
This allows the
Thumb2 encoding to share code with the ARM encoding, which gets use fixup support for free.
It also allows us to fold away at least one codegen-only pattern.
llvm-svn: 120481
|
|
|
|
| |
llvm-svn: 120449
|
|
|
|
|
|
|
|
| |
The only reasonable way I could find to do this is to provide an alternate
version of the addrmode6 operand with a different encoding function. Use it
for all the VLD-dup instructions for the sake of consistency.
llvm-svn: 120358
|
|
|
|
|
|
|
|
|
| |
.o path now works for ARM.
Note: lo16AllZero remains in ARMInstrInfo.td - It can be factored out when Thumb movt is repaired.
Existing tests cover this update.
llvm-svn: 119760
|
|
|
|
|
|
|
|
|
| |
instructions have to distinguish between lists of single- and double-precision
registers in order for the ASM matcher to do a proper job. In all other
respects, a list of single- or double-precision registers are the same as a list
of GPR registers.
llvm-svn: 119460
|
|
|
|
| |
llvm-svn: 118829
|