Add XCore intrinsic for crc8.
authorRichard Osborne <richard@xmos.com>
Tue, 31 May 2011 16:24:49 +0000 (16:24 +0000)
committerRichard Osborne <richard@xmos.com>
Tue, 31 May 2011 16:24:49 +0000 (16:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132340 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IntrinsicsXCore.td
lib/Target/XCore/XCoreISelDAGToDAG.cpp
lib/Target/XCore/XCoreInstrInfo.td
test/CodeGen/XCore/misc-intrinsics.ll

index 951f7dd700c358ba0cf507933a86b13af819fa46..bab79b2bf880beaa591ff70bc565d6d529e41350 100644 (file)
@@ -11,6 +11,9 @@
 let TargetPrefix = "xcore" in {  // All intrinsics start with "llvm.xcore.".
   // Miscellaneous instructions.
   def int_xcore_bitrev : Intrinsic<[llvm_i32_ty],[llvm_i32_ty],[IntrNoMem]>;
+  def int_xcore_crc8 : Intrinsic<[llvm_i32_ty, llvm_i32_ty],
+                                 [llvm_i32_ty,llvm_i32_ty,llvm_i32_ty],
+                                 [IntrNoMem]>;
   def int_xcore_crc32 : Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_i32_ty,llvm_i32_ty],[IntrNoMem]>;
   def int_xcore_getid : Intrinsic<[llvm_i32_ty],[],[IntrNoMem]>;
   def int_xcore_getps : Intrinsic<[llvm_i32_ty],[llvm_i32_ty]>;
index 6bec9f91944a817e9e8334cf8ddf1d8d2aac8c66..a8dd8479d45f175e51ce92dbb322a24d5a5b112b 100644 (file)
@@ -205,6 +205,16 @@ SDNode *XCoreDAGToDAGISel::Select(SDNode *N) {
     return CurDAG->getMachineNode(XCore::LMUL_l6r, dl, MVT::i32, MVT::i32,
                                   Ops, 4);
   }
+  case ISD::INTRINSIC_WO_CHAIN: {
+    unsigned IntNo = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
+    switch (IntNo) {
+    case Intrinsic::xcore_crc8:
+      SDValue Ops[] = { N->getOperand(1), N->getOperand(2), N->getOperand(3) };
+      return CurDAG->getMachineNode(XCore::CRC8_l4r, dl, MVT::i32, MVT::i32,
+                                    Ops, 3);
+    }
+    break;
+  }
   case ISD::BRIND:
     if (SDNode *ResNode = SelectBRIND(N))
       return ResNode;
index 1647db5d787fb346fcb7c7a2b6fd6002a6439a18..492596d1f37c024b24f763fa49d96deea7cefcbb 100644 (file)
@@ -504,6 +504,12 @@ def MACCS_l4r : _L4R<(outs GRRegs:$dst1, GRRegs:$dst2),
                     []>;
 }
 
+let Constraints = "$src1 = $dst1" in
+def CRC8_l4r : _L4R<(outs GRRegs:$dst1, GRRegs:$dst2),
+                    (ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
+                    "crc8 $dst1, $dst2, $src2, $src3",
+                    []>;
+
 // Five operand long
 
 def LADD_l5r : _L5R<(outs GRRegs:$dst1, GRRegs:$dst2),
index 0c684886eed75023ef0ac813a027e019013b4e0a..f504a2ed72461210ff24a41cc92d8417a1a43f4b 100644 (file)
@@ -1,6 +1,9 @@
 ; RUN: llc < %s -march=xcore | FileCheck %s
+%0 = type { i32, i32 }
+
 declare i32 @llvm.xcore.bitrev(i32)
 declare i32 @llvm.xcore.crc32(i32, i32, i32)
+declare %0 @llvm.xcore.crc8(i32, i32, i32)
 
 define i32 @bitrev(i32 %val) {
 ; CHECK: bitrev:
@@ -15,3 +18,10 @@ define i32 @crc32(i32 %crc, i32 %data, i32 %poly) {
        %result = call i32 @llvm.xcore.crc32(i32 %crc, i32 %data, i32 %poly)
        ret i32 %result
 }
+
+define %0 @crc8(i32 %crc, i32 %data, i32 %poly) {
+; CHECK: crc8:
+; CHECK: crc8 r0, r1, r1, r2
+       %result = call %0 @llvm.xcore.crc8(i32 %crc, i32 %data, i32 %poly)
+       ret %0 %result
+}