[WebAssembly] Implement the is_zero_undef forms of cttz and ctlz
authorDan Gohman <dan433584@gmail.com>
Mon, 24 Aug 2015 16:39:37 +0000 (16:39 +0000)
committerDan Gohman <dan433584@gmail.com>
Mon, 24 Aug 2015 16:39:37 +0000 (16:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/WebAssembly/WebAssemblyInstrInteger.td
test/CodeGen/WebAssembly/integer32.ll
test/CodeGen/WebAssembly/integer64.ll

index cf2c6a38d5135819b732b0003c3a306f08128300..16ed7acbb9d369e4b565c87441357c6ba5f09971 100644 (file)
@@ -40,3 +40,9 @@ defm UGE : ComparisonInt<SETUGE>;
 defm CLZ : UnaryInt<ctlz>;
 defm CTZ : UnaryInt<cttz>;
 defm POPCNT : UnaryInt<ctpop>;
+
+// Expand the "don't care" operations to supported operations.
+def : Pat<(ctlz_zero_undef Int32:$src), (CLZ_I32 Int32:$src)>;
+def : Pat<(ctlz_zero_undef Int64:$src), (CLZ_I64 Int64:$src)>;
+def : Pat<(cttz_zero_undef Int32:$src), (CTZ_I32 Int32:$src)>;
+def : Pat<(cttz_zero_undef Int64:$src), (CTZ_I64 Int64:$src)>;
index e987f6eaa556c64f4a35ecba421dab740e0e0453..ab2d0b9497ca9d528306a72fcbde897f6dd91ba5 100644 (file)
@@ -148,6 +148,15 @@ define i32 @clz32(i32 %x) {
   ret i32 %a
 }
 
+; CHECK-LABEL: clz32_zero_undef:
+; CHECK-NEXT: (setlocal @0 (argument 0))
+; CHECK-NEXT: (setlocal @1 (clz @0))
+; CHECK-NEXT: (return @1)
+define i32 @clz32_zero_undef(i32 %x) {
+  %a = call i32 @llvm.ctlz.i32(i32 %x, i1 true)
+  ret i32 %a
+}
+
 ; CHECK-LABEL: ctz32:
 ; CHECK-NEXT: (setlocal @0 (argument 0))
 ; CHECK-NEXT: (setlocal @1 (ctz @0))
@@ -157,6 +166,15 @@ define i32 @ctz32(i32 %x) {
   ret i32 %a
 }
 
+; CHECK-LABEL: ctz32_zero_undef:
+; CHECK-NEXT: (setlocal @0 (argument 0))
+; CHECK-NEXT: (setlocal @1 (ctz @0))
+; CHECK-NEXT: (return @1)
+define i32 @ctz32_zero_undef(i32 %x) {
+  %a = call i32 @llvm.cttz.i32(i32 %x, i1 true)
+  ret i32 %a
+}
+
 ; CHECK-LABEL: popcnt32:
 ; CHECK-NEXT: (setlocal @0 (argument 0))
 ; CHECK-NEXT: (setlocal @1 (popcnt @0))
index ba483552939903912ce24862bda3b3f3834ee831..f902bced9d9a4d8af98ce0a83a42bee799f18639 100644 (file)
@@ -148,6 +148,15 @@ define i64 @clz64(i64 %x) {
   ret i64 %a
 }
 
+; CHECK-LABEL: clz64_zero_undef:
+; CHECK-NEXT: (setlocal @0 (argument 0))
+; CHECK-NEXT: (setlocal @1 (clz @0))
+; CHECK-NEXT: (return @1)
+define i64 @clz64_zero_undef(i64 %x) {
+  %a = call i64 @llvm.ctlz.i64(i64 %x, i1 true)
+  ret i64 %a
+}
+
 ; CHECK-LABEL: ctz64:
 ; CHECK-NEXT: (setlocal @0 (argument 0))
 ; CHECK-NEXT: (setlocal @1 (ctz @0))
@@ -157,6 +166,15 @@ define i64 @ctz64(i64 %x) {
   ret i64 %a
 }
 
+; CHECK-LABEL: ctz64_zero_undef:
+; CHECK-NEXT: (setlocal @0 (argument 0))
+; CHECK-NEXT: (setlocal @1 (ctz @0))
+; CHECK-NEXT: (return @1)
+define i64 @ctz64_zero_undef(i64 %x) {
+  %a = call i64 @llvm.cttz.i64(i64 %x, i1 true)
+  ret i64 %a
+}
+
 ; CHECK-LABEL: popcnt64:
 ; CHECK-NEXT: (setlocal @0 (argument 0))
 ; CHECK-NEXT: (setlocal @1 (popcnt @0))