diff options
author | Bob Wilson <bob.wilson@apple.com> | 2010-06-29 20:13:29 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2010-06-29 20:13:29 +0000 |
commit | 21773e716f72babacfcf98cb5a90fc1a62a8254d (patch) | |
tree | e7ccf43973c20be072a2897269cccf03f73bfd65 /lib/Target/ARM/ARMCodeEmitter.cpp | |
parent | 871dc240d06b40ea2194677d5a85957cbdbbbe60 (diff) | |
download | external_llvm-21773e716f72babacfcf98cb5a90fc1a62a8254d.tar.gz external_llvm-21773e716f72babacfcf98cb5a90fc1a62a8254d.tar.bz2 external_llvm-21773e716f72babacfcf98cb5a90fc1a62a8254d.zip |
Add support for encoding VDUP (ARM core register) instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107201 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMCodeEmitter.cpp')
-rw-r--r-- | lib/Target/ARM/ARMCodeEmitter.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp index 2c8939fdf0..7895cb0719 100644 --- a/lib/Target/ARM/ARMCodeEmitter.cpp +++ b/lib/Target/ARM/ARMCodeEmitter.cpp @@ -141,6 +141,7 @@ namespace { void emitMiscInstruction(const MachineInstr &MI); void emitNEONLaneInstruction(const MachineInstr &MI); + void emitNEONDupInstruction(const MachineInstr &MI); void emitNEON1RegModImmInstruction(const MachineInstr &MI); void emitNEON2RegInstruction(const MachineInstr &MI); void emitNEON3RegInstruction(const MachineInstr &MI); @@ -420,6 +421,9 @@ void ARMCodeEmitter::emitInstruction(const MachineInstr &MI) { case ARMII::NSetLnFrm: emitNEONLaneInstruction(MI); break; + case ARMII::NDupFrm: + emitNEONDupInstruction(MI); + break; case ARMII::N1RegModImmFrm: emitNEON1RegModImmInstruction(MI); break; @@ -1638,6 +1642,19 @@ void ARMCodeEmitter::emitNEONLaneInstruction(const MachineInstr &MI) { emitWordLE(Binary); } +void ARMCodeEmitter::emitNEONDupInstruction(const MachineInstr &MI) { + unsigned Binary = getBinaryCodeForInstr(MI); + + // Set the conditional execution predicate + Binary |= (IsThumb ? ARMCC::AL : II->getPredicate(&MI)) << ARMII::CondShift; + + unsigned RegT = MI.getOperand(1).getReg(); + RegT = ARMRegisterInfo::getRegisterNumbering(RegT); + Binary |= (RegT << ARMII::RegRdShift); + Binary |= encodeNEONRn(MI, 0); + emitWordLE(Binary); +} + void ARMCodeEmitter::emitNEON1RegModImmInstruction(const MachineInstr &MI) { unsigned Binary = getBinaryCodeForInstr(MI); // Destination register is encoded in Dd. |