diff options
| author | Eric Christopher <echristo@apple.com> | 2010-11-30 07:20:12 +0000 | 
|---|---|---|
| committer | Eric Christopher <echristo@apple.com> | 2010-11-30 07:20:12 +0000 | 
| commit | fa6657cec09e5ca39ddc7b9a6e7a9b9f0af9add5 (patch) | |
| tree | b72ca1868cd2e44f371cc9c4730a03fb7eb9d0c8 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | 3c9deef16a23bd877df79cf13339bc5cdd09a47c (diff) | |
| download | bcm5719-llvm-fa6657cec09e5ca39ddc7b9a6e7a9b9f0af9add5.tar.gz bcm5719-llvm-fa6657cec09e5ca39ddc7b9a6e7a9b9f0af9add5.zip | |
Rewrite mwait and monitor support and custom lower arguments.
Fixes PR8573.
llvm-svn: 120404
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 53 | 
1 files changed, 53 insertions, 0 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 6793b70dd57..f53b0ed3834 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -9444,6 +9444,53 @@ X86TargetLowering::EmitPCMP(MachineInstr *MI, MachineBasicBlock *BB,  }  MachineBasicBlock * +X86TargetLowering::EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) const { +  assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); +   +  DebugLoc dl = MI->getDebugLoc(); +  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); +   +  // Address into RAX/EAX, other two args into ECX, EDX. +  unsigned MemOpc = Subtarget->is64Bit() ? X86::LEA64r : X86::LEA32r; +  unsigned MemReg = Subtarget->is64Bit() ? X86::RAX : X86::EAX; +  MachineInstrBuilder MIB = BuildMI(*BB, MI, dl, TII->get(MemOpc), MemReg); +  for (int i = 0; i < X86::AddrNumOperands; ++i) +    (*MIB).addOperand(MI->getOperand(i)); +   +  unsigned ValOps = X86::AddrNumOperands; +  BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::ECX) +    .addReg(MI->getOperand(ValOps).getReg()); +  BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::EDX) +    .addReg(MI->getOperand(ValOps+1).getReg()); + +  // The instruction doesn't actually take any operands though. +  BuildMI(*BB, MI, dl, TII->get(X86::MONITORrrr)); +   +  MI->eraseFromParent(); // The pseudo is gone now. +  return BB; +} + +MachineBasicBlock * +X86TargetLowering::EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const { +  assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); +   +  DebugLoc dl = MI->getDebugLoc(); +  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); +   +  // First arg in ECX, the second in EAX. +  BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::ECX) +    .addReg(MI->getOperand(0).getReg()); +  BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::EAX) +    .addReg(MI->getOperand(1).getReg()); +     +  // The instruction doesn't actually take any operands though. +  BuildMI(*BB, MI, dl, TII->get(X86::MWAITrr)); +   +  MI->eraseFromParent(); // The pseudo is gone now. +  return BB; +} + +MachineBasicBlock *  X86TargetLowering::EmitVAARG64WithCustomInserter(                     MachineInstr *MI,                     MachineBasicBlock *MBB) const { @@ -10042,6 +10089,12 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,    case X86::VPCMPESTRM128MEM:      return EmitPCMP(MI, BB, 5, true /* in mem */); +    // Thread synchronization. +  case X86::MONITOR: +    return EmitMonitor(MI, BB);   +  case X86::MWAIT: +    return EmitMwait(MI, BB); +      // Atomic Lowering.    case X86::ATOMAND32:      return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr, | 

