diff options
| author | Craig Topper <craig.topper@gmail.com> | 2012-08-18 06:39:34 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@gmail.com> | 2012-08-18 06:39:34 +0000 | 
| commit | 0128f9bad72cca9dfa9f80932b12a1e65ffb9abe (patch) | |
| tree | 94de8859c6f920dd2098deabcfe7bff81229e947 /llvm/lib/Target | |
| parent | 2bd9c7bd2deb846b2e21c3ef26c9d8eca78af876 (diff) | |
| download | bcm5719-llvm-0128f9bad72cca9dfa9f80932b12a1e65ffb9abe.tar.gz bcm5719-llvm-0128f9bad72cca9dfa9f80932b12a1e65ffb9abe.zip | |
Refactor code a bit to reduce number of calls in the final compiled code. No functional change intended.
llvm-svn: 162166
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 278 | 
1 files changed, 144 insertions, 134 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c77355f9179..077185c4b53 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -12919,167 +12919,177 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,      return EmitMonitor(MI, BB);      // Atomic Lowering. -  case X86::ATOMAND32: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr, -                                               X86::AND32ri, X86::MOV32rm, -                                               X86::LCMPXCHG32, -                                               X86::NOT32r, X86::EAX, -                                               &X86::GR32RegClass); -  case X86::ATOMOR32: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR32rr, -                                               X86::OR32ri, X86::MOV32rm, -                                               X86::LCMPXCHG32, -                                               X86::NOT32r, X86::EAX, -                                               &X86::GR32RegClass); -  case X86::ATOMXOR32: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR32rr, -                                               X86::XOR32ri, X86::MOV32rm, -                                               X86::LCMPXCHG32, -                                               X86::NOT32r, X86::EAX, -                                               &X86::GR32RegClass); -  case X86::ATOMNAND32: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr, -                                               X86::AND32ri, X86::MOV32rm, -                                               X86::LCMPXCHG32, -                                               X86::NOT32r, X86::EAX, -                                               &X86::GR32RegClass, true);    case X86::ATOMMIN32: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL32rr);    case X86::ATOMMAX32: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG32rr);    case X86::ATOMUMIN32: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB32rr);    case X86::ATOMUMAX32: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA32rr); +  case X86::ATOMMIN16: +  case X86::ATOMMAX16: +  case X86::ATOMUMIN16: +  case X86::ATOMUMAX16: +  case X86::ATOMMIN64: +  case X86::ATOMMAX64: +  case X86::ATOMUMIN64: +  case X86::ATOMUMAX64: { +    unsigned Opc; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMMIN32:  Opc = X86::CMOVL32rr; break; +    case X86::ATOMMAX32:  Opc = X86::CMOVG32rr; break; +    case X86::ATOMUMIN32: Opc = X86::CMOVB32rr; break; +    case X86::ATOMUMAX32: Opc = X86::CMOVA32rr; break; +    case X86::ATOMMIN16:  Opc = X86::CMOVL16rr; break; +    case X86::ATOMMAX16:  Opc = X86::CMOVG16rr; break; +    case X86::ATOMUMIN16: Opc = X86::CMOVB16rr; break; +    case X86::ATOMUMAX16: Opc = X86::CMOVA16rr; break; +    case X86::ATOMMIN64:  Opc = X86::CMOVL64rr; break; +    case X86::ATOMMAX64:  Opc = X86::CMOVG64rr; break; +    case X86::ATOMUMIN64: Opc = X86::CMOVB64rr; break; +    case X86::ATOMUMAX64: Opc = X86::CMOVA64rr; break; +    // FIXME: There are no CMOV8 instructions; MIN/MAX need some other way. +    } +    return EmitAtomicMinMaxWithCustomInserter(MI, BB, Opc); +  } + +  case X86::ATOMAND32: +  case X86::ATOMOR32: +  case X86::ATOMXOR32: +  case X86::ATOMNAND32: { +    bool Invert = false; +    unsigned RegOpc, ImmOpc; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMAND32: +      RegOpc = X86::AND32rr; ImmOpc = X86::AND32ri; break; +    case X86::ATOMOR32: +      RegOpc = X86::OR32rr;  ImmOpc = X86::OR32ri; break; +    case X86::ATOMXOR32: +      RegOpc = X86::XOR32rr; ImmOpc = X86::XOR32ri; break; +    case X86::ATOMNAND32: +      RegOpc = X86::AND32rr; ImmOpc = X86::AND32ri; Invert = true; break; +    } +    return EmitAtomicBitwiseWithCustomInserter(MI, BB, RegOpc, ImmOpc, +                                               X86::MOV32rm, X86::LCMPXCHG32, +                                               X86::NOT32r, X86::EAX, +                                               &X86::GR32RegClass, Invert); +  }    case X86::ATOMAND16: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr, -                                               X86::AND16ri, X86::MOV16rm, -                                               X86::LCMPXCHG16, -                                               X86::NOT16r, X86::AX, -                                               &X86::GR16RegClass);    case X86::ATOMOR16: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR16rr, -                                               X86::OR16ri, X86::MOV16rm, -                                               X86::LCMPXCHG16, -                                               X86::NOT16r, X86::AX, -                                               &X86::GR16RegClass);    case X86::ATOMXOR16: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR16rr, -                                               X86::XOR16ri, X86::MOV16rm, -                                               X86::LCMPXCHG16, -                                               X86::NOT16r, X86::AX, -                                               &X86::GR16RegClass); -  case X86::ATOMNAND16: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr, -                                               X86::AND16ri, X86::MOV16rm, -                                               X86::LCMPXCHG16, +  case X86::ATOMNAND16: { +    bool Invert = false; +    unsigned RegOpc, ImmOpc; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMAND16: +      RegOpc = X86::AND16rr; ImmOpc = X86::AND16ri; break; +    case X86::ATOMOR16: +      RegOpc = X86::OR16rr;  ImmOpc = X86::OR16ri; break; +    case X86::ATOMXOR16: +      RegOpc = X86::XOR16rr; ImmOpc = X86::XOR16ri; break; +    case X86::ATOMNAND16: +      RegOpc = X86::AND16rr; ImmOpc = X86::AND16ri; Invert = true; break; +    } +    return EmitAtomicBitwiseWithCustomInserter(MI, BB, RegOpc, ImmOpc, +                                               X86::MOV16rm, X86::LCMPXCHG16,                                                 X86::NOT16r, X86::AX, -                                               &X86::GR16RegClass, true); -  case X86::ATOMMIN16: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL16rr); -  case X86::ATOMMAX16: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG16rr); -  case X86::ATOMUMIN16: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB16rr); -  case X86::ATOMUMAX16: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA16rr); +                                               &X86::GR16RegClass, Invert); +  }    case X86::ATOMAND8: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr, -                                               X86::AND8ri, X86::MOV8rm, -                                               X86::LCMPXCHG8, -                                               X86::NOT8r, X86::AL, -                                               &X86::GR8RegClass);    case X86::ATOMOR8: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR8rr, -                                               X86::OR8ri, X86::MOV8rm, -                                               X86::LCMPXCHG8, -                                               X86::NOT8r, X86::AL, -                                               &X86::GR8RegClass);    case X86::ATOMXOR8: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR8rr, -                                               X86::XOR8ri, X86::MOV8rm, -                                               X86::LCMPXCHG8, -                                               X86::NOT8r, X86::AL, -                                               &X86::GR8RegClass); -  case X86::ATOMNAND8: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr, -                                               X86::AND8ri, X86::MOV8rm, -                                               X86::LCMPXCHG8, +  case X86::ATOMNAND8: { +    bool Invert = false; +    unsigned RegOpc, ImmOpc; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMAND8: +      RegOpc = X86::AND8rr; ImmOpc = X86::AND8ri; break; +    case X86::ATOMOR8: +      RegOpc = X86::OR8rr;  ImmOpc = X86::OR8ri; break; +    case X86::ATOMXOR8: +      RegOpc = X86::XOR8rr; ImmOpc = X86::XOR8ri; break; +    case X86::ATOMNAND8: +      RegOpc = X86::AND8rr; ImmOpc = X86::AND8ri; Invert = true; break; +    } +    return EmitAtomicBitwiseWithCustomInserter(MI, BB, RegOpc, ImmOpc, +                                               X86::MOV8rm, X86::LCMPXCHG8,                                                 X86::NOT8r, X86::AL, -                                               &X86::GR8RegClass, true); -  // FIXME: There are no CMOV8 instructions; MIN/MAX need some other way. +                                               &X86::GR8RegClass, Invert); +  } +    // This group is for 64-bit host.    case X86::ATOMAND64: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr, -                                               X86::AND64ri32, X86::MOV64rm, -                                               X86::LCMPXCHG64, -                                               X86::NOT64r, X86::RAX, -                                               &X86::GR64RegClass);    case X86::ATOMOR64: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR64rr, -                                               X86::OR64ri32, X86::MOV64rm, -                                               X86::LCMPXCHG64, -                                               X86::NOT64r, X86::RAX, -                                               &X86::GR64RegClass);    case X86::ATOMXOR64: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR64rr, -                                               X86::XOR64ri32, X86::MOV64rm, -                                               X86::LCMPXCHG64, -                                               X86::NOT64r, X86::RAX, -                                               &X86::GR64RegClass); -  case X86::ATOMNAND64: -    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr, -                                               X86::AND64ri32, X86::MOV64rm, -                                               X86::LCMPXCHG64, +  case X86::ATOMNAND64: { +    bool Invert = false; +    unsigned RegOpc, ImmOpc; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMAND64: +      RegOpc = X86::AND64rr; ImmOpc = X86::AND64ri32; break; +    case X86::ATOMOR64: +      RegOpc = X86::OR64rr;  ImmOpc = X86::OR64ri32; break; +    case X86::ATOMXOR64: +      RegOpc = X86::XOR64rr; ImmOpc = X86::XOR64ri32; break; +    case X86::ATOMNAND64: +      RegOpc = X86::AND64rr; ImmOpc = X86::AND64ri32; Invert = true; break; +    } +    return EmitAtomicBitwiseWithCustomInserter(MI, BB, RegOpc, ImmOpc, +                                               X86::MOV64rm, X86::LCMPXCHG64,                                                 X86::NOT64r, X86::RAX, -                                               &X86::GR64RegClass, true); -  case X86::ATOMMIN64: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL64rr); -  case X86::ATOMMAX64: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG64rr); -  case X86::ATOMUMIN64: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB64rr); -  case X86::ATOMUMAX64: -    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA64rr); +                                               &X86::GR64RegClass, Invert); +  }    // This group does 64-bit operations on a 32-bit host.    case X86::ATOMAND6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::AND32rr, X86::AND32rr, -                                               X86::AND32ri, X86::AND32ri, -                                               false);    case X86::ATOMOR6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::OR32rr, X86::OR32rr, -                                               X86::OR32ri, X86::OR32ri, -                                               false);    case X86::ATOMXOR6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::XOR32rr, X86::XOR32rr, -                                               X86::XOR32ri, X86::XOR32ri, -                                               false);    case X86::ATOMNAND6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::AND32rr, X86::AND32rr, -                                               X86::AND32ri, X86::AND32ri, -                                               true);    case X86::ATOMADD6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::ADD32rr, X86::ADC32rr, -                                               X86::ADD32ri, X86::ADC32ri, -                                               false);    case X86::ATOMSUB6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::SUB32rr, X86::SBB32rr, -                                               X86::SUB32ri, X86::SBB32ri, -                                               false); -  case X86::ATOMSWAP6432: -    return EmitAtomicBit6432WithCustomInserter(MI, BB, -                                               X86::MOV32rr, X86::MOV32rr, -                                               X86::MOV32ri, X86::MOV32ri, -                                               false); +  case X86::ATOMSWAP6432: { +    bool Invert = false; +    unsigned RegOpcL, RegOpcH, ImmOpcL, ImmOpcH; +    switch (MI->getOpcode()) { +    default: llvm_unreachable("illegal opcode!"); +    case X86::ATOMAND6432: +      RegOpcL = RegOpcH = X86::AND32rr; +      ImmOpcL = ImmOpcH = X86::AND32ri; +      break; +    case X86::ATOMOR6432: +      RegOpcL = RegOpcH = X86::OR32rr; +      ImmOpcL = ImmOpcH = X86::OR32ri; +      break; +    case X86::ATOMXOR6432: +      RegOpcL = RegOpcH = X86::XOR32rr; +      ImmOpcL = ImmOpcH = X86::XOR32ri; +      break; +    case X86::ATOMNAND6432: +      RegOpcL = RegOpcH = X86::AND32rr; +      ImmOpcL = ImmOpcH = X86::AND32ri; +      Invert = true; +      break; +    case X86::ATOMADD6432: +      RegOpcL = X86::ADD32rr; RegOpcH = X86::ADC32rr; +      ImmOpcL = X86::ADD32ri; ImmOpcH = X86::ADC32ri; +      break; +    case X86::ATOMSUB6432: +      RegOpcL = X86::SUB32rr; RegOpcH = X86::SBB32rr; +      ImmOpcL = X86::SUB32ri; ImmOpcH = X86::SBB32ri; +      break; +    case X86::ATOMSWAP6432: +      RegOpcL = RegOpcH = X86::MOV32rr; +      ImmOpcL = ImmOpcH = X86::MOV32ri; +      break; +    } +    return EmitAtomicBit6432WithCustomInserter(MI, BB, RegOpcL, RegOpcH, +                                               ImmOpcL, ImmOpcH, Invert); +  } +    case X86::VASTART_SAVE_XMM_REGS:      return EmitVAStartSaveXMMRegsWithCustomInserter(MI, BB); | 

