define the IntBinOp class and use it to implement the multiply instructions
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 16 Oct 2006 17:57:20 +0000 (17:57 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 16 Oct 2006 17:57:20 +0000 (17:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30978 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td

index e5db101865b033b77116eea4b1a60d59a944481c..956f16bf78f6baf726a4a30a765a1a91a001ac8c 100644 (file)
@@ -36,9 +36,8 @@ def iaddr  : ComplexPattern<iPTR, 2, "SelectAddrRegImm", [frameindex], []>;
 //def raddr  : ComplexPattern<iPTR, 2, "SelectAddrRegReg", [], []>;
 
 //===----------------------------------------------------------------------===//
-// Instructions
+// Instruction Class Templates
 //===----------------------------------------------------------------------===//
-
 class InstARM<dag ops, string asmstr, list<dag> pattern> : Instruction {
   let Namespace = "ARM";
 
@@ -47,6 +46,15 @@ class InstARM<dag ops, string asmstr, list<dag> pattern> : Instruction {
   let Pattern = pattern;
 }
 
+class IntBinOp<string OpcStr, SDNode OpNode> :
+        InstARM<(ops IntRegs:$dst, IntRegs:$a, IntRegs:$b),
+                 !strconcat(OpcStr, " $dst, $a, $b"),
+                 [(set IntRegs:$dst, (OpNode IntRegs:$a, IntRegs:$b))]>;
+
+//===----------------------------------------------------------------------===//
+// Instructions
+//===----------------------------------------------------------------------===//
+
 def brtarget : Operand<OtherVT>;
 
 // Operand for printing out a condition code.
@@ -186,18 +194,11 @@ let isTwoAddress = 1 in {
                           IntRegs:$false, imm:$cc))]>;
 }
 
-def MUL     : InstARM<(ops IntRegs:$dst, IntRegs:$a, IntRegs:$b),
-                       "mul $dst, $a, $b",
-                      [(set IntRegs:$dst, (mul IntRegs:$a, IntRegs:$b))]>;
+def MUL     : IntBinOp<"mul", mul>;
 
 let Defs = [R0] in {
-  def SMULL   : InstARM<(ops IntRegs:$dst, IntRegs:$a, IntRegs:$b),
-                         "smull r12, $dst, $a, $b",
-                         [(set IntRegs:$dst, (mulhs IntRegs:$a, IntRegs:$b))]>;
-
-  def UMULL   : InstARM<(ops IntRegs:$dst, IntRegs:$a, IntRegs:$b),
-                         "umull r12, $dst, $a, $b",
-                         [(set IntRegs:$dst, (mulhu IntRegs:$a, IntRegs:$b))]>;
+  def SMULL   : IntBinOp<"smull r12,", mulhs>;
+  def UMULL   : IntBinOp<"umull r12,", mulhu>;
 }
 
 def bcond      : InstARM<(ops brtarget:$dst, CCOp:$cc),