[PATCH] D44678: [ARM] Do not convert some vmov instructions

Mikhail Maltsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 4 01:58:45 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL329158: [ARM] Do not convert some vmov instructions (authored by miyuki, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D44678?vs=139101&id=140916#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D44678

Files:
  llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
  llvm/trunk/test/MC/ARM/vmov-vmvn-replicate.s


Index: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
===================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -1868,8 +1868,7 @@
            ((Value & 0xffffffffff00ffff) == 0xffff);
   }
 
-  bool isNEONReplicate(unsigned Width, unsigned NumElems, bool Inv,
-                       bool AllowMinusOne) const {
+  bool isNEONReplicate(unsigned Width, unsigned NumElems, bool Inv) const {
     assert((Width == 8 || Width == 16 || Width == 32) &&
            "Invalid element width");
     assert(NumElems * Width <= 64 && "Invalid result width");
@@ -1888,8 +1887,6 @@
 
     uint64_t Mask = (1ull << Width) - 1;
     uint64_t Elem = Value & Mask;
-    if (!AllowMinusOne && Elem == Mask)
-      return false;
     if (Width == 16 && (Elem & 0x00ff) != 0 && (Elem & 0xff00) != 0)
       return false;
     if (Width == 32 && !isValidNEONi32vmovImm(Elem))
@@ -1904,7 +1901,7 @@
   }
 
   bool isNEONByteReplicate(unsigned NumBytes) const {
-    return isNEONReplicate(8, NumBytes, false, true);
+    return isNEONReplicate(8, NumBytes, false);
   }
 
   static void checkNeonReplicateArgs(unsigned FromW, unsigned ToW) {
@@ -1918,14 +1915,15 @@
   template<unsigned FromW, unsigned ToW>
   bool isNEONmovReplicate() const {
     checkNeonReplicateArgs(FromW, ToW);
-    bool AllowMinusOne = ToW != 64;
-    return isNEONReplicate(FromW, ToW / FromW, false, AllowMinusOne);
+    if (ToW == 64 && isNEONi64splat())
+      return false;
+    return isNEONReplicate(FromW, ToW / FromW, false);
   }
 
   template<unsigned FromW, unsigned ToW>
   bool isNEONinvReplicate() const {
     checkNeonReplicateArgs(FromW, ToW);
-    return isNEONReplicate(FromW, ToW / FromW, true, true);
+    return isNEONReplicate(FromW, ToW / FromW, true);
   }
 
   bool isNEONi32vmov() const {
Index: llvm/trunk/test/MC/ARM/vmov-vmvn-replicate.s
===================================================================
--- llvm/trunk/test/MC/ARM/vmov-vmvn-replicate.s
+++ llvm/trunk/test/MC/ARM/vmov-vmvn-replicate.s
@@ -23,6 +23,8 @@
 @ CHECK: vmov.i8 q2, #0xab @ encoding: [0x5b,0x4e,0x82,0xf3]
 @ CHECK: vmov.i8 q2, #0xab @ encoding: [0x5b,0x4e,0x82,0xf3]
 
+        vmov.i64        d2, #0xff00ff00ff00ff00
+        vmov.i64        q2, #0xff00ff00ff00ff00
         vmov.i64        d2, #0x00a500a500a500a5
         vmov.i64        q2, #0x00a500a500a500a5
         vmov.i32        d2, #0x00a500a5
@@ -32,6 +34,8 @@
         vmov.i32        d2, #0xa500a500
         vmov.i32        q2, #0xa500a500
 
+@ CHECK: vmov.i64 d2, #0xff00ff00ff00ff00 @ encoding: [0x3a,0x2e,0x82,0xf3]
+@ CHECK: vmov.i64 q2, #0xff00ff00ff00ff00 @ encoding: [0x7a,0x4e,0x82,0xf3]
 @ CHECK: vmov.i16 d2, #0xa5 @ encoding: [0x15,0x28,0x82,0xf3]
 @ CHECK: vmov.i16 q2, #0xa5 @ encoding: [0x55,0x48,0x82,0xf3]
 @ CHECK: vmov.i16 d2, #0xa5 @ encoding: [0x15,0x28,0x82,0xf3]


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44678.140916.patch
Type: text/x-patch
Size: 2950 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180404/84138112/attachment.bin>


More information about the llvm-commits mailing list