Commit Graph

60 Commits

Author SHA1 Message Date
Owen Anderson
8fdd172502 First stab at providing correct Thumb2 encodings, start with adc.
llvm-svn: 118924
2010-11-12 21:12:40 +00:00
Jim Grosbach
20b6fd7d5d Start of support for binary emit of 16-it Thumb instructions.
llvm-svn: 118859
2010-11-11 23:41:09 +00:00
Owen Anderson
ce2250fba4 Fill out support for Thumb2 encodings of NEON instructions.
llvm-svn: 118854
2010-11-11 23:12:55 +00:00
Owen Anderson
99a8cb4875 Add correct Thumb2 encodings for NEON vst[1,2,3,4] and vld[1,2,3,4].
llvm-svn: 118843
2010-11-11 21:36:43 +00:00
Owen Anderson
7ffe3b35ac Add support for Thumb2 encodings of NEON data processing instructions, using the new PostEncoderMethod infrastructure.
More tests to come.

llvm-svn: 118819
2010-11-11 19:07:48 +00:00
Jim Grosbach
9d6d77a9f4 Encoding of destination fixup for ARM branch and conditional branch
instructions.

llvm-svn: 118801
2010-11-11 18:04:49 +00:00
Jim Grosbach
68685e644f Encoding for ARM LDRSH_POST.
llvm-svn: 118794
2010-11-11 16:55:29 +00:00
Jim Grosbach
607efcbc3e ARM STRH encoding information.
llvm-svn: 118757
2010-11-11 01:09:40 +00:00
Jim Grosbach
cc4a491557 ARM LDM encoding for the mode (ia, ib, da, db) operand.
llvm-svn: 118736
2010-11-10 23:38:36 +00:00
Jim Grosbach
59002dc973 For ARM load/store instructions, encode [reg+reg] with no shifter immediate as
a left shift by zero.

llvm-svn: 118587
2010-11-09 17:38:15 +00:00
Jim Grosbach
dbfb5edbdb Add encoder method for ARM load/store shifted register offset operands.
llvm-svn: 118513
2010-11-09 17:20:53 +00:00
Jim Grosbach
9098714f8b Add support for a few simple fixups to the ARM Darwin asm backend. This allows
constant pool references and global variable refernces to resolve properly
for object file generation. For example,

int x;
void foo(unsigned a, unsigned *p) {
  p[a] = x;
}

can now be successfully compiled directly to an (ARM mode) object file.

llvm-svn: 118469
2010-11-09 01:37:15 +00:00
Bill Wendling
1b83ed5f7c Revert r118457 and r118458. These won't hold for GPRs.
llvm-svn: 118462
2010-11-09 00:30:18 +00:00
Bill Wendling
31b850be15 Get the register and count from the register list operands.
llvm-svn: 118458
2010-11-08 23:51:20 +00:00
Jim Grosbach
0fb841fd19 Add ARM fixup info for load/store label references. Probably will need a bit of
tweaking when we start using it for object file emission or JIT, but it's a
start.

llvm-svn: 118221
2010-11-04 01:12:30 +00:00
Jim Grosbach
2eed7a1310 Teach ARM Target to use the tblgen support for generating an MC'ized
CodeEmitter.

llvm-svn: 118209
2010-11-03 23:52:49 +00:00
Jim Grosbach
49b0c45ecf trailing whitespace
llvm-svn: 118199
2010-11-03 22:03:20 +00:00
Bill Wendling
6552a109bb Put the PC encoding in the correct bit position.
llvm-svn: 118151
2010-11-03 04:57:44 +00:00
Bill Wendling
e84eb99cbb The MC code couldn't handle ARM LDR instructions with negative offsets:
vldr.64 d1, [r0, #-32]

The problem was with how the addressing mode 5 encodes the offsets. This change
makes sure that the way offsets are handled in addressing mode 5 is consistent
throughout the MC code. It involves re-refactoring the "getAddrModeImmOpValue"
method into an "Imm12" and "addressing mode 5" version. But not to worry! The
majority of the duplicated code has been unified.

llvm-svn: 118144
2010-11-03 01:49:29 +00:00
Bill Wendling
f9eebb58b9 Obsessive formatting changes. No functionality impact.
llvm-svn: 118103
2010-11-02 22:53:11 +00:00
Bill Wendling
23436b6530 Omit unused parameter name.
llvm-svn: 118099
2010-11-02 22:46:04 +00:00
Bill Wendling
91da9abbee Simplify the EncodeInstruction method now that a lot of the special case stuff
is handled with the MC encoder.

llvm-svn: 118098
2010-11-02 22:44:12 +00:00
Bill Wendling
603bd8f54c Rename getAddrModeImm12OpValue to getAddrModeImmOpValue and expand it to work
with immediates up to 16-bits in size. The same logic is applied to other LDR
encodings, e.g. VLDR, but which use a different immediate bit width (8-bits in
VLDR's case). Removing the "12" allows it to be more generic.

llvm-svn: 118094
2010-11-02 22:31:46 +00:00
Owen Anderson
a4b63e19d2 Rename encoder methods to match naming convention.
llvm-svn: 118093
2010-11-02 22:28:01 +00:00
Owen Anderson
a83859539f Add correct encodings for the rest of the vld instructions that we generate.
llvm-svn: 118053
2010-11-02 20:40:59 +00:00
Owen Anderson
526ffd57d2 Add correct NEON encodings for vld2, vld3, and vld4 basic variants.
llvm-svn: 117997
2010-11-02 01:24:55 +00:00
Owen Anderson
f1610f7910 Add aesthetic break.
llvm-svn: 117986
2010-11-02 00:14:00 +00:00
Owen Anderson
ad40234eff Add correct NEON encodings for the "multiple single elements" form of vld.
llvm-svn: 117984
2010-11-02 00:05:05 +00:00
Jim Grosbach
2ba03aa618 Explicitly check for non-consant reference in an LDRi12 instruction. Add FIXME
for handling the fixup necessary.

llvm-svn: 117978
2010-11-01 23:45:50 +00:00
Jim Grosbach
a3efae35f5 Remove unused function.
llvm-svn: 117977
2010-11-01 23:40:56 +00:00
Jim Grosbach
7b275105d6 Avoid re-evaluating MI.getNumOperands() every iteration of the loop.
llvm-svn: 117766
2010-10-30 01:40:16 +00:00
Jim Grosbach
74ef9e184e Encode the register list operands for ARM mode LDM/STM instructions.
llvm-svn: 117753
2010-10-30 00:37:59 +00:00
Jim Grosbach
96d828448f trailing whitespace
llvm-svn: 117740
2010-10-29 23:21:03 +00:00
Jim Grosbach
58018e62a8 s/getNEONVcvtImm32/getNEONVcvtImm32OpValue/ to be consistent with other operand
encoder functions.

llvm-svn: 117738
2010-10-29 23:19:55 +00:00
Jim Grosbach
505607e4c6 PLD, PLDW, PLI encodings, plus refactor their use of addrmode2.
llvm-svn: 117571
2010-10-28 18:34:10 +00:00
Owen Anderson
fadb951e5b Provide correct encodings for NEON vcvt, which has its own special immediate encoding
for specifying fractional bits for fixed point conversions.

llvm-svn: 117501
2010-10-27 22:49:00 +00:00
Jim Grosbach
1e4d9a17c2 First part of refactoring ARM addrmode2 (load/store) instructions to be more
explicit about the operands. Split out the different variants into separate
instructions. This gives us the ability to, among other things, assign
different scheduling itineraries to the variants. rdar://8477752.

llvm-svn: 117409
2010-10-26 22:37:02 +00:00
Jim Grosbach
5edb03ee57 ARM Binary encoding information for BFC/BFI instructions.
llvm-svn: 117072
2010-10-21 22:03:21 +00:00
Owen Anderson
2bfa8ed045 Move the encoding logic for Q registers into getMachineOpValue().
llvm-svn: 117060
2010-10-21 20:49:13 +00:00
Jim Grosbach
68a335e185 ARM mode encoding information for UBFX and SBFX instructions.
llvm-svn: 116588
2010-10-15 17:15:16 +00:00
Bill Wendling
6f52f8a87d Add support for vmov.f64/.f32 encoding. There's a bit of a hack going on
here. The f32 in FCONSTS is handled as a double instead of a float in the
code. So the encoding of the immediate into the instruction isn't exactly in
line with the documentation in that regard. But given that we know it's handled
as a double, it doesn't cause any harm.

llvm-svn: 116471
2010-10-14 02:33:26 +00:00
Jim Grosbach
1e7db68774 Add ARM mode encoding for [SU]XT[BH] and [SU]XTA[BH] instructions.
llvm-svn: 116421
2010-10-13 19:56:10 +00:00
Jim Grosbach
efd5369749 Add the rest of the ARM so_reg encoding options (register shifted register)
and move to a custom operand encoder. Remove the last of the special handling
stuff from ARMMCCodeEmitter::EncodeInstruction.

llvm-svn: 116377
2010-10-12 23:53:58 +00:00
Jim Grosbach
12e493ace4 Move the ARM so_imm encoding into a custom operand encoder and remove the
explicit handling of the instructions referencing it from the MC code
emitter.

llvm-svn: 116367
2010-10-12 23:18:08 +00:00
Jim Grosbach
d9d31dafda Add custom encoder for the 's' bit denoting whether an ARM arithmetic
instruction should set the processor status flags or not. Remove the now
unnecessary special handling for the bit from the MCCodeEmitter.

llvm-svn: 116360
2010-10-12 23:00:24 +00:00
Jim Grosbach
0e57a9f7a9 Add MOVi ARM encoding.
llvm-svn: 116321
2010-10-12 18:09:12 +00:00
Jim Grosbach
feeae27ad9 Nuke unused wrapper function.
llvm-svn: 116318
2010-10-12 17:53:25 +00:00
Jim Grosbach
6fead930af Add encoding information for the remainder of the generic arithmetic
ARM instructions.

llvm-svn: 116313
2010-10-12 17:11:26 +00:00
Jim Grosbach
b7c2962d20 MC machine encoding for simple aritmetic instructions that use a shifted
register operand.

llvm-svn: 116259
2010-10-11 23:16:21 +00:00
Jim Grosbach
c43c930690 Implement a few more binary encoding bits. Still very early stage proof-of-
concept level stuff at this point, but it is generally working for those
instructions that know how to map the operands.

This patch fills in the register operands for add/sub/or/etc instructions
and adds the conditional execution predicate encoding.

llvm-svn: 116112
2010-10-08 21:45:55 +00:00