implement MULHU/MULHS for 64-bit multiplies
authorChris Lattner <sabre@nondot.org>
Sat, 17 Dec 2005 22:30:00 +0000 (22:30 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 17 Dec 2005 22:30:00 +0000 (22:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24797 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp

index 0e9210dcfed93bcd7c59d3bf53889d6f37058c2b..5d60a1bf5e2d70c947b37ebbb5ee41133ecdeff2 100644 (file)
@@ -278,6 +278,17 @@ SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) {
   
   switch (N->getOpcode()) {
   default: break;
+  case ISD::MULHU:
+  case ISD::MULHS: {
+    SDOperand MulLHS = Select(N->getOperand(0));
+    SDOperand MulRHS = Select(N->getOperand(1));
+    unsigned Opcode = N->getOpcode() == ISD::MULHU ? V8::UMULrr : V8::SMULrr;
+    SDOperand Mul = CurDAG->getTargetNode(Opcode, MVT::i32, MVT::Flag,
+                                          MulLHS, MulRHS);
+    // The high part is in the Y register.
+    return CurDAG->SelectNodeTo(N, V8::RDY, MVT::i32, Mul.getValue(1));
+  }
+    
   case ISD::RET: {
     if (N->getNumOperands() == 2) {
       SDOperand Chain = Select(N->getOperand(0));     // Token chain.
index 0e9210dcfed93bcd7c59d3bf53889d6f37058c2b..5d60a1bf5e2d70c947b37ebbb5ee41133ecdeff2 100644 (file)
@@ -278,6 +278,17 @@ SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) {
   
   switch (N->getOpcode()) {
   default: break;
+  case ISD::MULHU:
+  case ISD::MULHS: {
+    SDOperand MulLHS = Select(N->getOperand(0));
+    SDOperand MulRHS = Select(N->getOperand(1));
+    unsigned Opcode = N->getOpcode() == ISD::MULHU ? V8::UMULrr : V8::SMULrr;
+    SDOperand Mul = CurDAG->getTargetNode(Opcode, MVT::i32, MVT::Flag,
+                                          MulLHS, MulRHS);
+    // The high part is in the Y register.
+    return CurDAG->SelectNodeTo(N, V8::RDY, MVT::i32, Mul.getValue(1));
+  }
+    
   case ISD::RET: {
     if (N->getNumOperands() == 2) {
       SDOperand Chain = Select(N->getOperand(0));     // Token chain.