An attempt to fix the problem Anton reported with
authorDale Johannesen <dalej@apple.com>
Fri, 18 Jun 2010 20:44:28 +0000 (20:44 +0000)
committerDale Johannesen <dalej@apple.com>
Fri, 18 Jun 2010 20:44:28 +0000 (20:44 +0000)
ARM tail calls.  Don't know if it works, but it
doesn't break Darwin.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106309 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMBaseRegisterInfo.cpp
lib/Target/ARM/ARMInstrInfo.td
utils/TableGen/ARMDecoderEmitter.cpp

index 1b3e212f66ba1d92207cc5cab7dc9e846a76dc9c..c5848d4df8776ed812458c05f1df6a0f694baee1 100644 (file)
@@ -1658,7 +1658,8 @@ emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const {
         addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
                          JumpTarget.getTargetFlags());
     } else if (RetOpcode == ARM::TCRETURNdiND) {
-      BuildMI(MBB, MBBI, dl, TII.get(ARM::TAILJMPdND)).
+      BuildMI(MBB, MBBI, dl,
+            TII.get(STI.isThumb() ? ARM::TAILJMPdNDt : ARM::TAILJMPdND)).
         addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
                          JumpTarget.getTargetFlags());
     } else if (RetOpcode == ARM::TCRETURNri) {
index d95137ae900503e4ab180a7e2644eaf883419ded..1b4330406f06147d7f1f3c1efbf1941cdb5907d8 100644 (file)
@@ -1085,7 +1085,11 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
 
   def TAILJMPdND : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
                  IIC_Br, "b.w\t$dst  @ TAILCALL",
-                 []>, Requires<[IsNotDarwin]>;
+                 []>, Requires<[IsARM, IsNotDarwin]>;
+
+  def TAILJMPdNDt : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
+                 IIC_Br, "b\t$dst  @ TAILCALL",
+                 []>, Requires<[IsThumb, IsNotDarwin]>;
 
   def TAILJMPrND : AXI<(outs), (ins tGPR:$dst, variable_ops),
                    BrMiscFrm, IIC_Br, "bx\t$dst  @ TAILCALL",
index 0b104ff32c10fdfe9f6024db6c352fbc8e7a34bb..d03e0b96cc6f9d34932e75ec615e6d9cac7705e9 100644 (file)
@@ -1579,6 +1579,7 @@ bool ARMDecoderEmitter::ARMDEBackend::populateInstruction(
     if (Name == "TCRETURNdi" || Name == "TCRETURNdiND" ||
         Name == "TCRETURNri" || Name == "TCRETURNriND" ||
         Name == "TAILJMPd"  || Name == "TAILJMPdND" ||
+        Name == "TAILJMPdNDt" ||
         Name == "TAILJMPr"  || Name == "TAILJMPrND" ||
         Name == "MOVr_TC")
       return false;