diff options
author | Juergen Ributzka <juergen@apple.com> | 2014-08-19 19:44:10 +0000 |
---|---|---|
committer | Juergen Ributzka <juergen@apple.com> | 2014-08-19 19:44:10 +0000 |
commit | 89d187b387e3c0dd3692373167e27db639f83098 (patch) | |
tree | 876cb6a5bc40c6da88ebc9b9ff07f73fe73a9ea0 /llvm/lib/Target/X86/X86FastISel.cpp | |
parent | 4952c35afd2c4b01e7245d651c3ebdc81e4f07a4 (diff) | |
download | bcm5719-llvm-89d187b387e3c0dd3692373167e27db639f83098.tar.gz bcm5719-llvm-89d187b387e3c0dd3692373167e27db639f83098.zip |
Reapply [FastISel][X86] Use XOR to materialize the "0" value (r215594).
Note: This was originally reverted to track down a buildbot error. Reapply
without any modifications.
llvm-svn: 216011
Diffstat (limited to 'llvm/lib/Target/X86/X86FastISel.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 6426d27ae1a..f42465d14ce 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -3107,6 +3107,29 @@ unsigned X86FastISel::X86MaterializeInt(const ConstantInt *CI, MVT VT) { return 0; uint64_t Imm = CI->getZExtValue(); + if (Imm == 0) { + unsigned SrcReg = FastEmitInst_(X86::MOV32r0, &X86::GR32RegClass); + switch (VT.SimpleTy) { + default: llvm_unreachable("Unexpected value type"); + case MVT::i1: + case MVT::i8: + return FastEmitInst_extractsubreg(MVT::i8, SrcReg, /*Kill=*/true, + X86::sub_8bit); + case MVT::i16: + return FastEmitInst_extractsubreg(MVT::i16, SrcReg, /*Kill=*/true, + X86::sub_16bit); + case MVT::i32: + return SrcReg; + case MVT::i64: { + unsigned ResultReg = createResultReg(&X86::GR64RegClass); + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, + TII.get(TargetOpcode::SUBREG_TO_REG), ResultReg) + .addImm(0).addReg(SrcReg).addImm(X86::sub_32bit); + return ResultReg; + } + } + } + unsigned Opc = 0; switch (VT.SimpleTy) { default: llvm_unreachable("Unexpected value type"); |