[llvm-commits] [llvm] r50677 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Mon P Wang wangmp at apple.com
Mon May 5 15:56:24 PDT 2008


Author: wangmp
Date: Mon May  5 17:56:23 2008
New Revision: 50677

URL: http://llvm.org/viewvc/llvm-project?rev=50677&view=rev
Log:
Improved generated code for atomic operators

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=50677&r1=50676&r2=50677&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon May  5 17:56:23 2008
@@ -5753,9 +5753,9 @@
   // For the atomic bitwise operator, we generate
   //   thisMBB:
   //   newMBB:
-  //     ld  EAX = [bitinstr.addr]
-  //     mov t1 = EAX
-  //     op  t2 = t1, [bitinstr.val] 
+  //     ld  t1 = [bitinstr.addr]
+  //     op  t2 = t1, [bitinstr.val]
+  //     mov EAX = t1
   //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
   //     bz  newMBB
   //     fallthrough -->nextMBB
@@ -5794,14 +5794,11 @@
   int lastAddrIndx = 3; // [0,3]
   int valArgIndx = 4;
   
-  MachineInstrBuilder MIB = BuildMI(newMBB, TII->get(X86::MOV32rm), X86::EAX);
+  unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
+  MachineInstrBuilder MIB = BuildMI(newMBB, TII->get(X86::MOV32rm), t1);
   for (int i=0; i <= lastAddrIndx; ++i)
     (*MIB).addOperand(*argOpers[i]);
   
-  unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
-  MIB = BuildMI(newMBB, TII->get(X86::MOV32rr), t1);
-  MIB.addReg(X86::EAX);
-  
   unsigned t2 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
   assert(   (argOpers[valArgIndx]->isReg() || argOpers[valArgIndx]->isImm())
          && "invalid operand");
@@ -5812,6 +5809,9 @@
   MIB.addReg(t1);
   (*MIB).addOperand(*argOpers[valArgIndx]);
   
+  MIB = BuildMI(newMBB, TII->get(X86::MOV32rr), X86::EAX);
+  MIB.addReg(t1);
+  
   MIB = BuildMI(newMBB, TII->get(X86::LCMPXCHG32));
   for (int i=0; i <= lastAddrIndx; ++i)
     (*MIB).addOperand(*argOpers[i]);
@@ -5835,11 +5835,11 @@
   // For the atomic min/max operator, we generate
   //   thisMBB:
   //   newMBB:
-  //     ld EAX = [min/max.addr]
-  //     mov t1 = EAX
+  //     ld t1 = [min/max.addr]
   //     mov t2 = [min/max.val] 
   //     cmp  t1, t2
   //     cmov[cond] t2 = t1
+  //     mov EAX = t1
   //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
   //     bz   newMBB
   //     fallthrough -->nextMBB
@@ -5879,14 +5879,11 @@
   int lastAddrIndx = 3; // [0,3]
   int valArgIndx = 4;
   
-  MachineInstrBuilder MIB = BuildMI(newMBB, TII->get(X86::MOV32rm), X86::EAX);
+  unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
+  MachineInstrBuilder MIB = BuildMI(newMBB, TII->get(X86::MOV32rm), t1);
   for (int i=0; i <= lastAddrIndx; ++i)
     (*MIB).addOperand(*argOpers[i]);
-  
-  unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
-  MIB = BuildMI(newMBB, TII->get(X86::MOV32rr), t1);
-  MIB.addReg(X86::EAX);
-  
+
   // We only support register and immediate values
   assert(   (argOpers[valArgIndx]->isReg() || argOpers[valArgIndx]->isImm())
          && "invalid operand");
@@ -5898,6 +5895,9 @@
     MIB = BuildMI(newMBB, TII->get(X86::MOV32rr), t2);
   (*MIB).addOperand(*argOpers[valArgIndx]);
 
+  MIB = BuildMI(newMBB, TII->get(X86::MOV32rr), X86::EAX);
+  MIB.addReg(t1);
+
   MIB = BuildMI(newMBB, TII->get(X86::CMP32rr));
   MIB.addReg(t1);
   MIB.addReg(t2);





More information about the llvm-commits mailing list