* add the shladd instruction
authorDuraid Madina <duraid@octopus.com.au>
Wed, 13 Apr 2005 06:12:04 +0000 (06:12 +0000)
committerDuraid Madina <duraid@octopus.com.au>
Wed, 13 Apr 2005 06:12:04 +0000 (06:12 +0000)
* fold left shifts of 1, 2, 3 or 4 bits into adds

  This doesn't save much now, but should get a serious workout once
  multiplies by constants get converted to shift/add/sub sequences.
  Hold on! :)

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

lib/Target/IA64/IA64ISelPattern.cpp
lib/Target/IA64/IA64InstrInfo.td

index c501fa1c331a7938f8f166dd57de143ba4efbcda..7ca220bda1eaa49ce7ae981fb5221e681ff41f29 100644 (file)
@@ -873,6 +873,26 @@ assert(0 && "hmm, ISD::SIGN_EXTEND: shouldn't ever be reached. bad luck!\n");
       BuildMI(BB, IA64::FMA, 3, Result).addReg(Tmp1).addReg(Tmp2).addReg(Tmp3);
       return Result; // early exit
     }
+
+    if(DestType != MVT::f64 && N.getOperand(0).getOpcode() == ISD::SHL &&
+       N.getOperand(0).Val->hasOneUse()) { // if we might be able to fold
+                                            // this add into a shladd, try:
+      ConstantSDNode *CSD = NULL;
+      if((CSD = dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(1))) &&
+         (CSD->getValue() >= 1) && (CSD->getValue() <= 4) ) { // we can:
+
+       // ++FusedSHLADD; // Statistic
+       Tmp1 = SelectExpr(N.getOperand(0).getOperand(0));
+       int shl_amt = CSD->getValue();
+       Tmp3 = SelectExpr(N.getOperand(1));
+       
+       BuildMI(BB, IA64::SHLADD, 3, Result)
+         .addReg(Tmp1).addImm(shl_amt).addReg(Tmp3);
+       return Result; // early exit
+      }
+    }
+
+    //else, fallthrough:
     Tmp1 = SelectExpr(N.getOperand(0));
     if(DestType != MVT::f64) { // integer addition:
         switch (ponderIntegerAdditionWith(N.getOperand(1), Tmp3)) {
index 0dc4cb29bff2499b125c0bd5748a5406027616fe..5cc3312083839680f96ac2f3ed2d63b38caae9e5 100644 (file)
@@ -111,6 +111,9 @@ def SHRS : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
 def SHRSI : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm),
   "shr $dst = $src1, $imm;;">;
 
+def SHLADD : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm, GR:$src2), 
+  "shladd $dst = $src1, $imm, $src2;;">;
+
 def EXTRU : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2),
   "extr.u $dst = $src1, $imm1, $imm2;;">;