diff options
author | Chad Rosier <mcrosier@apple.com> | 2011-11-11 00:36:21 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2011-11-11 00:36:21 +0000 |
commit | 2a3503e061f0eddfb48d79a02dead244566fd5a0 (patch) | |
tree | 1019dac554028d9706eff01fc99444964d644f51 /llvm/lib/Target/ARM/ARMFastISel.cpp | |
parent | 197ac203af7810a066d15aafea18b85331826a48 (diff) | |
download | bcm5719-llvm-2a3503e061f0eddfb48d79a02dead244566fd5a0.tar.gz bcm5719-llvm-2a3503e061f0eddfb48d79a02dead244566fd5a0.zip |
Add support for using MVN to materialize negative constants.
rdar://10412592
llvm-svn: 144348
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFastISel.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFastISel.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index 6b2c1f32d23..030fab16316 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/lib/Target/ARM/ARMFastISel.cpp @@ -552,16 +552,30 @@ unsigned ARMFastISel::ARMMaterializeInt(const Constant *C, EVT VT) { // do so now. const ConstantInt *CI = cast<ConstantInt>(C); if (Subtarget->hasV6T2Ops() && isUInt<16>(CI->getZExtValue())) { - EVT SrcVT = MVT::i32; unsigned Opc = isThumb2 ? ARM::t2MOVi16 : ARM::MOVi16; - unsigned ImmReg = createResultReg(TLI.getRegClassFor(SrcVT)); + unsigned ImmReg = createResultReg(TLI.getRegClassFor(MVT::i32)); AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), ImmReg) .addImm(CI->getZExtValue())); return ImmReg; } - // For now 32-bit only. + // Use MVN to emit negative constants. + if (VT == MVT::i32 && Subtarget->hasV6T2Ops() && CI->isNegative()) { + unsigned Imm = (unsigned)~(CI->getSExtValue()); + bool EncodeImm = isThumb2 ? (ARM_AM::getT2SOImmVal(Imm) != -1) : + (ARM_AM::getSOImmVal(Imm) != -1); + if (EncodeImm) { + unsigned Opc = isThumb2 ? ARM::t2MVNi : ARM::MVNi; + unsigned ImmReg = createResultReg(TLI.getRegClassFor(MVT::i32)); + AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(Opc), ImmReg) + .addImm(Imm)); + return ImmReg; + } + } + + // Load from constant pool. For now 32-bit only. if (VT != MVT::i32) return false; |