diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp index b33c32608c0..2e9d804894e 100644 --- a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp @@ -214,6 +214,8 @@ public:                                    SmallVectorImpl<MCFixup> &Fixups) const;    unsigned getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op,                                        SmallVectorImpl<MCFixup> &Fixups) const; +  unsigned getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op, +                                        SmallVectorImpl<MCFixup> &Fixups) const;    unsigned getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op,                                       SmallVectorImpl<MCFixup> &Fixups) const; @@ -775,6 +777,8 @@ getRegisterListOpValue(const MCInst &MI, unsigned Op,    return Binary;  } +/// getAddrMode6AddressOpValue - Encode an addrmode6 register number along +/// with the alignment operand.  unsigned ARMMCCodeEmitter::  getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op,                             SmallVectorImpl<MCFixup> &Fixups) const { @@ -796,6 +800,30 @@ getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op,    return RegNo | (Align << 4);  } +/// getAddrMode6DupAddressOpValue - Encode an addrmode6 register number and +/// alignment operand for use in VLD-dup instructions.  This is the same as +/// getAddrMode6AddressOpValue except for the alignment encoding, which is +/// different for VLD4-dup. +unsigned ARMMCCodeEmitter:: +getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op, +                              SmallVectorImpl<MCFixup> &Fixups) const { +  const MCOperand &Reg = MI.getOperand(Op); +  const MCOperand &Imm = MI.getOperand(Op + 1); + +  unsigned RegNo = getARMRegisterNumbering(Reg.getReg()); +  unsigned Align = 0; + +  switch (Imm.getImm()) { +  default: break; +  case 2: +  case 4: +  case 8:  Align = 0x01; break; +  case 16: Align = 0x03; break; +  } + +  return RegNo | (Align << 4); +} +  unsigned ARMMCCodeEmitter::  getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op,                            SmallVectorImpl<MCFixup> &Fixups) const { | 

