diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-02-25 02:56:58 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-02-25 02:56:58 +0000 |
| commit | f85e33cd792e74e53163c0664172a0015f04b08e (patch) | |
| tree | ddde30d26289a888b4844385d2834240c5e6655f /llvm/lib | |
| parent | 04cff21c2fbe8238492615e67ab386e52c5fabb3 (diff) | |
| download | bcm5719-llvm-f85e33cd792e74e53163c0664172a0015f04b08e.tar.gz bcm5719-llvm-f85e33cd792e74e53163c0664172a0015f04b08e.zip | |
Implement special case for storing an immediate into memory so that we don't need
an intermediate register.
llvm-svn: 11816
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/InstSelectSimple.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/llvm/lib/Target/X86/InstSelectSimple.cpp b/llvm/lib/Target/X86/InstSelectSimple.cpp index 4ebffeb81be..b19ba556446 100644 --- a/llvm/lib/Target/X86/InstSelectSimple.cpp +++ b/llvm/lib/Target/X86/InstSelectSimple.cpp @@ -1907,24 +1907,40 @@ void ISel::visitLoadInst(LoadInst &I) { /// instruction. /// void ISel::visitStoreInst(StoreInst &I) { - unsigned ValReg = getReg(I.getOperand(0)); unsigned AddressReg = getReg(I.getOperand(1)); - const Type *ValTy = I.getOperand(0)->getType(); unsigned Class = getClassB(ValTy); - if (Class == cLong) { - addDirectMem(BuildMI(BB, X86::MOVmr32, 1+4), AddressReg).addReg(ValReg); - addRegOffset(BuildMI(BB, X86::MOVmr32, 1+4), AddressReg,4).addReg(ValReg+1); - return; + if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(0))) { + uint64_t Val = CI->getRawValue(); + if (Class == cLong) { + addDirectMem(BuildMI(BB, X86::MOVmi32, 5), AddressReg).addZImm(Val & ~0U); + addRegOffset(BuildMI(BB, X86::MOVmi32, 5), AddressReg,4).addZImm(Val>>32); + } else { + static const unsigned Opcodes[] = { + X86::MOVmi8, X86::MOVmi16, X86::MOVmi32 + }; + unsigned Opcode = Opcodes[Class]; + addDirectMem(BuildMI(BB, Opcode, 5), AddressReg).addZImm(Val); + } + } else if (ConstantBool *CB = dyn_cast<ConstantBool>(I.getOperand(0))) { + addDirectMem(BuildMI(BB, X86::MOVmi8, 5), + AddressReg).addZImm(CB->getValue()); + } else { + if (Class == cLong) { + unsigned ValReg = getReg(I.getOperand(0)); + addDirectMem(BuildMI(BB, X86::MOVmr32, 5), AddressReg).addReg(ValReg); + addRegOffset(BuildMI(BB, X86::MOVmr32, 5), AddressReg,4).addReg(ValReg+1); + } else { + unsigned ValReg = getReg(I.getOperand(0)); + static const unsigned Opcodes[] = { + X86::MOVmr8, X86::MOVmr16, X86::MOVmr32, X86::FSTr32 + }; + unsigned Opcode = Opcodes[Class]; + if (ValTy == Type::DoubleTy) Opcode = X86::FSTr64; + addDirectMem(BuildMI(BB, Opcode, 1+4), AddressReg).addReg(ValReg); + } } - - static const unsigned Opcodes[] = { - X86::MOVmr8, X86::MOVmr16, X86::MOVmr32, X86::FSTr32 - }; - unsigned Opcode = Opcodes[Class]; - if (ValTy == Type::DoubleTy) Opcode = X86::FSTr64; - addDirectMem(BuildMI(BB, Opcode, 1+4), AddressReg).addReg(ValReg); } |

