]> granicus.if.org Git - llvm/commitdiff
[globalisel][tablegen] Add support for specific immediates in the match pattern
authorDaniel Sanders <daniel_l_sanders@apple.com>
Thu, 30 Nov 2017 18:48:35 +0000 (18:48 +0000)
committerDaniel Sanders <daniel_l_sanders@apple.com>
Thu, 30 Nov 2017 18:48:35 +0000 (18:48 +0000)
This enables a few rules such as ARM's uxtb instruction.

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

test/CodeGen/ARM/GlobalISel/arm-isel.ll
utils/TableGen/GlobalISelEmitter.cpp

index 579101e2d2af26420b936c009bae5e2690e9b151..7162815a7f70a4ecff71fb1eef70047182aef61d 100644 (file)
@@ -35,7 +35,7 @@ entry:
 
 define zeroext i8 @test_ext_i8(i8 %x) {
 ; CHECK-LABEL: test_ext_i8:
-; CHECK: and r0, r0, #255
+; CHECK: uxtb r0, r0
 ; CHECK: bx lr
 
 entry:
index f82b2fd3e9bb8b109aebe41c594048eabf77e5ce..d9048c231c296e693448c55f90826129337665a6 100644 (file)
@@ -2812,6 +2812,14 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
     return failedImport("Dst pattern child isn't a leaf node or an MBB" + llvm::to_string(*DstChild));
   }
 
+  // It could be a specific immediate in which case we should just check for
+  // that immediate.
+  if (const IntInit *ChildIntInit =
+          dyn_cast<IntInit>(DstChild->getLeafValue())) {
+    DstMIBuilder.addRenderer<ImmRenderer>(ChildIntInit->getValue());
+    return InsertPt;
+  }
+
   // Otherwise, we're looking for a bog-standard RegisterClass operand.
   if (auto *ChildDefInit = dyn_cast<DefInit>(DstChild->getLeafValue())) {
     auto *ChildRec = ChildDefInit->getDef();