fix divide and remainder
authorAndrew Lenharth <andrewl@lenharth.org>
Tue, 6 Dec 2005 23:27:39 +0000 (23:27 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Tue, 6 Dec 2005 23:27:39 +0000 (23:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24628 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Alpha/AlphaISelDAGToDAG.cpp
lib/Target/Alpha/AlphaInstrInfo.td

index 112671f668c7fd326241c0d92e5d5e4d8d7053b6..910c85eb561346272bce3b8941b31d7434b1acfc 100644 (file)
@@ -339,19 +339,17 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
       }
       SDOperand Tmp1 = Select(N->getOperand(0)),
         Tmp2 = Select(N->getOperand(1)),
-        Addr = CurDAG->getExternalSymbol(opstr, AlphaLowering.getPointerTy());
-      SDOperand Tmp3 = Select(Addr);
-      SDOperand Chain = CurDAG->getCopyToReg(CurDAG->getRoot(), Alpha::R24, 
-                                             Tmp1, SDOperand());
-      Chain = CurDAG->getCopyToReg(CurDAG->getRoot(), Alpha::R25, 
-                                   Tmp2, Chain.getValue(1));
-      Chain = CurDAG->getCopyToReg(CurDAG->getRoot(), Alpha::R27, 
-                                   Tmp3, Chain.getValue(1));
-      Chain = CurDAG->getTargetNode(Alpha::JSRs, MVT::i64, MVT::Flag,
-                                    CurDAG->getRegister(Alpha::R27, MVT::i64),
-                                    getI64Imm(0));
-      return CurDAG->getCopyFromReg(Chain.getValue(1), Alpha::R27, MVT::i64, 
-                                    Chain.getValue(1));
+        Addr = Select(CurDAG->getExternalSymbol(opstr, 
+                                               AlphaLowering.getPointerTy()));
+      SDOperand Chain;
+      Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), Alpha::R24, Tmp1,
+                                  SDOperand(0,0));
+      Chain = CurDAG->getCopyToReg(Chain, Alpha::R25, Tmp2, Chain.getValue(1));
+      Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Addr, Chain.getValue(1));
+      Chain = CurDAG->getTargetNode(Alpha::JSRsDAG, MVT::Other, MVT::Flag, 
+                                   Chain, Chain.getValue(1));
+      return CurDAG->getCopyFromReg(Chain, Alpha::R27, MVT::i64, 
+                                   Chain.getValue(1));
     }
     break;
 
index 03ce44fed57c1879e3cd39ad75755d62425c181a..10dc6ea5d3cd6957e10079f473d173497329303c 100644 (file)
@@ -429,6 +429,9 @@ let isCall = 1,
 let isCall = 1, Defs = [R24, R25, R27, R28], Uses = [R24, R25] in
   def JSRs : MbrForm< 0x1A, 0x01, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr $RD,($RS),$DISP">; //Jump to div or rem
 
+let isCall = 1, Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
+  def JSRsDAG : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
+
 def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP">; //Jump to subroutine return
 def BR : BForm<0x30, "br $RA,$DISP">; //Branch