Add vector VEOR instruction to the integrated ARM assembler.

BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4334
R=eholk@chromium.org, stichnot@chromium.org

Review URL: https://codereview.chromium.org/1655363002 .
diff --git a/src/DartARM32/assembler_arm.cc b/src/DartARM32/assembler_arm.cc
index fd01f2a..bc5c974 100644
--- a/src/DartARM32/assembler_arm.cc
+++ b/src/DartARM32/assembler_arm.cc
@@ -1301,12 +1301,12 @@
   EmitSIMDqqq(B25 | B24 | B10, sz, qd, qn, qm);
 }
 
-
+#if 0
+// Moved to ARM32::AssemblerARM32::veorq()
 void Assembler::veorq(QRegister qd, QRegister qn, QRegister qm) {
   EmitSIMDqqq(B24 | B8 | B4, kByte, qd, qn, qm);
 }
 
-#if 0
 // Moved to ARM32::AssemblerARM32::vorrq()
 void Assembler::vorrq(QRegister qd, QRegister qn, QRegister qm) {
   EmitSIMDqqq(B21 | B8 | B4, kByte, qd, qn, qm);
diff --git a/src/DartARM32/assembler_arm.h b/src/DartARM32/assembler_arm.h
index 2112209..ab536a4 100644
--- a/src/DartARM32/assembler_arm.h
+++ b/src/DartARM32/assembler_arm.h
@@ -716,9 +716,10 @@
   void vrsqrteqs(QRegister qd, QRegister qm);
   void vrsqrtsqs(QRegister qd, QRegister qn, QRegister qm);
 
-  void veorq(QRegister qd, QRegister qn, QRegister qm);
 #if 0
   // Moved to ARM32::AssemblerARM32::vorrq()
+  void veorq(QRegister qd, QRegister qn, QRegister qm);
+  // Moved to ARM32::AssemblerARM32::vorrq()
   void vorrq(QRegister qd, QRegister qn, QRegister qm);
 #endif
   void vornq(QRegister qd, QRegister qn, QRegister qm);
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
index 2044050..1395b74 100644
--- a/src/IceAssemblerARM32.cpp
+++ b/src/IceAssemblerARM32.cpp
@@ -2471,6 +2471,13 @@
   emitInst(Encoding);
 }
 
+void AssemblerARM32::veorq(const Operand *OpQd, const Operand *OpQn,
+                           const Operand *OpQm) {
+  constexpr const char *Veorq = "veorq";
+  constexpr IValueT VeorqOpcode = B24 | B8 | B4;
+  emitSIMDqqq(VeorqOpcode, IceType_i8, OpQd, OpQn, OpQm, Veorq);
+}
+
 void AssemblerARM32::vldrd(const Operand *OpDd, const Operand *OpAddress,
                            CondARM32::Cond Cond, const TargetInfo &TInfo) {
   // VLDR - ARM section A8.8.333, encoding A1.
diff --git a/src/IceAssemblerARM32.h b/src/IceAssemblerARM32.h
index 2e141c1..93d885b 100644
--- a/src/IceAssemblerARM32.h
+++ b/src/IceAssemblerARM32.h
@@ -377,6 +377,8 @@
 
   void veord(const Operand *OpDd, const Operand *OpDn, const Operand *OpDm);
 
+  void veorq(const Operand *OpQd, const Operand *OpQn, const Operand *OpQm);
+
   void vldrd(const Operand *OpDd, const Operand *OpAddress,
              CondARM32::Cond Cond, const TargetInfo &TInfo);
 
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
index 312a3d1..fbf9fac 100644
--- a/src/IceInstARM32.cpp
+++ b/src/IceInstARM32.cpp
@@ -680,8 +680,8 @@
   auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
   const Variable *Dest = getDest();
   if (isVectorType(Dest->getType())) {
-    // TODO(kschimpf): Add support for this case
-    emitUsingTextFixup(Func);
+    Asm->veorq(Dest, getSrc(0), getSrc(1));
+    assert(!Asm->needsTextFixup());
     return;
   }
   assert(Dest->getType() == IceType_f64);
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index 34069eb..815c41f 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -2989,6 +2989,7 @@
   }
   case InstArithmetic::Xor: {
     Variable *Src0R = Srcs.src0R(this);
+    assert(isIntegerType(DestTy));
     if (isVectorType(DestTy)) {
       Variable *Src1R = legalizeToReg(Src1);
       _veor(T, Src0R, Src1R);
diff --git a/tests_lit/assembler/arm32/xor-vec.ll b/tests_lit/assembler/arm32/xor-vec.ll
index 668d5de..eef201e 100644
--- a/tests_lit/assembler/arm32/xor-vec.ll
+++ b/tests_lit/assembler/arm32/xor-vec.ll
@@ -30,7 +30,7 @@
 
 ; ASM:     veor.i32        q0, q0, q1
 ; DIS:   0:       f3000152
-; IASM:     veor.i32
+; IASM-NOT:     veor.i32
 
   ret <4 x i32> %res
 }
@@ -45,7 +45,7 @@
 
 ; ASM:     veor.i16        q0, q0, q1
 ; DIS:   10:       f3000152
-; IASM:     veor.i16
+; IASM-NOT:     veor.i16
 
   ret <8 x i16> %res
 }
@@ -60,7 +60,7 @@
 
 ; ASM:     veor.i8        q0, q0, q1
 ; DIS:   20:       f3000152
-; IASM:     veor.i8
+; IASM-NOT:     veor.i8
 
   ret <16 x i8> %res
 }
@@ -79,7 +79,7 @@
 
 ; ASM:     veor.i32        q0, q0, q1
 ; DIS:   30:       f3000152
-; IASM:     veor.i32
+; IASM-NOT:     veor.i32
 
   ret <4 x i1> %res
 }
@@ -94,7 +94,7 @@
 
 ; ASM:     veor.i16        q0, q0, q1
 ; DIS:   40:       f3000152
-; IASM:     veor.i16
+; IASM-NOT:     veor.i16
 
   ret <8 x i1> %res
 }
@@ -109,7 +109,7 @@
 
 ; ASM:     veor.i8        q0, q0, q1
 ; DIS:   50:       f3000152
-; IASM:     veor.i8
+; IASM-NOT:     veor.i8
 
   ret <16 x i1> %res
 }