ARM NEON "vmov.i8" immediate assembly parsing and encoding.
authorJim Grosbach <grosbach@apple.com>
Mon, 17 Oct 2011 22:26:03 +0000 (22:26 +0000)
committerJim Grosbach <grosbach@apple.com>
Mon, 17 Oct 2011 22:26:03 +0000 (22:26 +0000)
NEON immediates are "interesting". Start of the work to handle parsing them
in an 'as' compatible manner. Getting the matcher to play nicely with
these and the floating point immediates from VFP is an extra fun wrinkle.

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

lib/Target/ARM/ARMInstrNEON.td
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
test/MC/ARM/neon-mov-encoding.s
test/MC/ARM/neont2-mov-encoding.s
utils/TableGen/EDEmitter.cpp

index 9375290a2e2ebfe45e7fcc5f2590e0c0682e275a..d5f5772cf040a517c1e3241464a9c35ce596abb9 100644 (file)
@@ -19,6 +19,12 @@ def nModImm : Operand<i32> {
   let PrintMethod = "printNEONModImmOperand";
 }
 
+def nImmSplatI8AsmOperand : AsmOperandClass { let Name = "NEONi8splat"; }
+def nImmSplatI8 : Operand<i32> {
+  let PrintMethod = "printNEONModImmOperand";
+  let ParserMatchClass = nImmSplatI8AsmOperand;
+}
+
 def VectorIndex8Operand  : AsmOperandClass { let Name = "VectorIndex8"; }
 def VectorIndex16Operand : AsmOperandClass { let Name = "VectorIndex16"; }
 def VectorIndex32Operand : AsmOperandClass { let Name = "VectorIndex32"; }
@@ -4314,11 +4320,11 @@ def : InstAlias<"vmov${p} $Vd, $Vm",
 
 let isReMaterializable = 1 in {
 def VMOVv8i8  : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$Vd),
-                         (ins nModImm:$SIMM), IIC_VMOVImm,
+                         (ins nImmSplatI8:$SIMM), IIC_VMOVImm,
                          "vmov", "i8", "$Vd, $SIMM", "",
                          [(set DPR:$Vd, (v8i8 (NEONvmovImm timm:$SIMM)))]>;
 def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$Vd),
-                         (ins nModImm:$SIMM), IIC_VMOVImm,
+                         (ins nImmSplatI8:$SIMM), IIC_VMOVImm,
                          "vmov", "i8", "$Vd, $SIMM", "",
                          [(set QPR:$Vd, (v16i8 (NEONvmovImm timm:$SIMM)))]>;
 
index 3e0aceecc123e3c12b3377ea6b004d2b9496fd5d..b496705efcd8890308c1648571199a176d4a6f01 100644 (file)
@@ -898,6 +898,7 @@ public:
   bool isMSRMask() const { return Kind == k_MSRMask; }
   bool isProcIFlags() const { return Kind == k_ProcIFlags; }
 
+  // NEON operands.
   bool isVectorIndex8() const {
     if (Kind != k_VectorIndex) return false;
     return VectorIndex.Val < 8;
@@ -911,7 +912,18 @@ public:
     return VectorIndex.Val < 2;
   }
 
-
+  bool isNEONi8splat() const {
+    if (Kind != k_Immediate)
+      return false;
+    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+    // Must be a constant.
+    if (!CE) return false;
+    int64_t Value = CE->getValue();
+    // i8 value splatted across 8 bytes. The immediate is just the 8 byte
+    // value.
+//    return ((Value << 8) | (Value & 0xff)) == Value;
+    return Value >= 0 && Value < 256;
+  }
 
   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
     // Add as immediates when possible.  Null MCExpr = 0.
@@ -1435,6 +1447,14 @@ public:
     Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
   }
 
+  void addNEONi8splatOperands(MCInst &Inst, unsigned N) const {
+    assert(N == 1 && "Invalid number of operands!");
+    // The immediate encodes the type of constant as well as the value.
+    // Mask in that this is an i8 splat.
+    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+    Inst.addOperand(MCOperand::CreateImm(CE->getValue() | 0xe00));
+  }
+
   virtual void print(raw_ostream &OS) const;
 
   static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) {
@@ -3330,6 +3350,22 @@ parseFPImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
 
   if (Parser.getTok().isNot(AsmToken::Hash))
     return MatchOperand_NoMatch;
+
+  // Disambiguate the VMOV forms that can accept an FP immediate.
+  // vmov.f32 <sreg>, #imm
+  // vmov.f64 <dreg>, #imm
+  // vmov.f32 <dreg>, #imm  @ vector f32x2
+  // vmov.f32 <qreg>, #imm  @ vector f32x4
+  //
+  // There are also the NEON VMOV instructions which expect an
+  // integer constant. Make sure we don't try to parse an FPImm
+  // for these:
+  // vmov.i{8|16|32|64} <dreg|qreg>, #imm
+  ARMOperand *TyOp = static_cast<ARMOperand*>(Operands[2]);
+  if (!TyOp->isToken() || (TyOp->getToken() != ".f32" &&
+                           TyOp->getToken() != ".f64"))
+    return MatchOperand_NoMatch;
+
   Parser.Lex(); // Eat the '#'.
 
   // Handle negation, as that still comes through as a separate token.
index 02eec1215ab7b570a38c4e8adbf360acfdf9928a..320c463492482c132896c02c08eb04cc98855fb9 100644 (file)
@@ -1,69 +1,68 @@
 @ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown -show-encoding < %s | FileCheck %s
-@ XFAIL: *
 
        vmov.i8         d16, #0x8
-       vmov.i16        d16, #0x10
-       vmov.i16        d16, #0x1000
-       vmov.i32        d16, #0x20
-       vmov.i32        d16, #0x2000
-       vmov.i32        d16, #0x200000
-       vmov.i32        d16, #0x20000000
-       vmov.i32        d16, #0x20FF
-       vmov.i32        d16, #0x20FFFF
-       vmov.i64        d16, #0xFF0000FF0000FFFF
+@      vmov.i16        d16, #0x10
+@      vmov.i16        d16, #0x1000
+@      vmov.i32        d16, #0x20
+@      vmov.i32        d16, #0x2000
+@      vmov.i32        d16, #0x200000
+@      vmov.i32        d16, #0x20000000
+@      vmov.i32        d16, #0x20FF
+@      vmov.i32        d16, #0x20FFFF
+@      vmov.i64        d16, #0xFF0000FF0000FFFF
 
 @ CHECK: vmov.i8       d16, #0x8       @ encoding: [0x18,0x0e,0xc0,0xf2]
-@ CHECK: vmov.i16      d16, #0x10      @ encoding: [0x10,0x08,0xc1,0xf2]
-@ CHECK: vmov.i16      d16, #0x1000    @ encoding: [0x10,0x0a,0xc1,0xf2]
-@ CHECK: vmov.i32      d16, #0x20      @ encoding: [0x10,0x00,0xc2,0xf2]
-@ CHECK: vmov.i32      d16, #0x2000    @ encoding: [0x10,0x02,0xc2,0xf2]
-@ CHECK: vmov.i32      d16, #0x200000  @ encoding: [0x10,0x04,0xc2,0xf2]
-@ CHECK: vmov.i32      d16, #0x20000000 @ encoding: [0x10,0x06,0xc2,0xf2]
-@ CHECK: vmov.i32      d16, #0x20FF    @ encoding: [0x10,0x0c,0xc2,0xf2]
-@ CHECK: vmov.i32      d16, #0x20FFFF  @ encoding: [0x10,0x0d,0xc2,0xf2]
-@ CHECK: vmov.i64 d16, #0xFF0000FF0000FFFF @ encoding: [0x33,0x0e,0xc1,0xf3]
+@ FIXME: vmov.i16      d16, #0x10      @ encoding: [0x10,0x08,0xc1,0xf2]
+@ FIXME: vmov.i16      d16, #0x1000    @ encoding: [0x10,0x0a,0xc1,0xf2]
+@ FIXME: vmov.i32      d16, #0x20      @ encoding: [0x10,0x00,0xc2,0xf2]
+@ FIXME: vmov.i32      d16, #0x2000    @ encoding: [0x10,0x02,0xc2,0xf2]
+@ FIXME: vmov.i32      d16, #0x200000  @ encoding: [0x10,0x04,0xc2,0xf2]
+@ FIXME: vmov.i32      d16, #0x20000000 @ encoding: [0x10,0x06,0xc2,0xf2]
+@ FIXME: vmov.i32      d16, #0x20FF    @ encoding: [0x10,0x0c,0xc2,0xf2]
+@ FIXME: vmov.i32      d16, #0x20FFFF  @ encoding: [0x10,0x0d,0xc2,0xf2]
+@ FIXME: vmov.i64 d16, #0xFF0000FF0000FFFF @ encoding: [0x33,0x0e,0xc1,0xf3]
 
 
 
        vmov.i8         q8, #0x8
-       vmov.i16        q8, #0x10
-       vmov.i16        q8, #0x1000
-       vmov.i32        q8, #0x20
-       vmov.i32        q8, #0x2000
-       vmov.i32        q8, #0x200000
-       vmov.i32        q8, #0x20000000
-       vmov.i32        q8, #0x20FF
-       vmov.i32        q8, #0x20FFFF
-       vmov.i64        q8, #0xFF0000FF0000FFFF
+@      vmov.i16        q8, #0x10
+@      vmov.i16        q8, #0x1000
+@      vmov.i32        q8, #0x20
+@      vmov.i32        q8, #0x2000
+@      vmov.i32        q8, #0x200000
+@      vmov.i32        q8, #0x20000000
+@      vmov.i32        q8, #0x20FF
+@      vmov.i32        q8, #0x20FFFF
+@      vmov.i64        q8, #0xFF0000FF0000FFFF
 
 @ CHECK: vmov.i8 q8, #0x8               @ encoding: [0x58,0x0e,0xc0,0xf2]
-@ CHECK: vmov.i16      q8, #0x10       @ encoding: [0x50,0x08,0xc1,0xf2]
-@ CHECK: vmov.i16      q8, #0x1000     @ encoding: [0x50,0x0a,0xc1,0xf2]
-@ CHECK: vmov.i32      q8, #0x20       @ encoding: [0x50,0x00,0xc2,0xf2]
-@ CHECK: vmov.i32      q8, #0x2000     @ encoding: [0x50,0x02,0xc2,0xf2]
-@ CHECK: vmov.i32      q8, #0x200000   @ encoding: [0x50,0x04,0xc2,0xf2]
-@ CHECK: vmov.i32      q8, #0x20000000 @ encoding: [0x50,0x06,0xc2,0xf2]
-@ CHECK: vmov.i32      q8, #0x20FF     @ encoding: [0x50,0x0c,0xc2,0xf2]
-@ CHECK: vmov.i32      q8, #0x20FFFF   @ encoding: [0x50,0x0d,0xc2,0xf2]
-@ CHECK: vmov.i64 q8, #0xFF0000FF0000FFFF @ encoding: [0x73,0x0e,0xc1,0xf3]
+@ FIXME: vmov.i16      q8, #0x10       @ encoding: [0x50,0x08,0xc1,0xf2]
+@ FIXME: vmov.i16      q8, #0x1000     @ encoding: [0x50,0x0a,0xc1,0xf2]
+@ FIXME: vmov.i32      q8, #0x20       @ encoding: [0x50,0x00,0xc2,0xf2]
+@ FIXME: vmov.i32      q8, #0x2000     @ encoding: [0x50,0x02,0xc2,0xf2]
+@ FIXME: vmov.i32      q8, #0x200000   @ encoding: [0x50,0x04,0xc2,0xf2]
+@ FIXME: vmov.i32      q8, #0x20000000 @ encoding: [0x50,0x06,0xc2,0xf2]
+@ FIXME: vmov.i32      q8, #0x20FF     @ encoding: [0x50,0x0c,0xc2,0xf2]
+@ FIXME: vmov.i32      q8, #0x20FFFF   @ encoding: [0x50,0x0d,0xc2,0xf2]
+@ FIXME: vmov.i64 q8, #0xFF0000FF0000FFFF @ encoding: [0x73,0x0e,0xc1,0xf3]
 
-       vmvn.i16        d16, #0x10
-       vmvn.i16        d16, #0x1000
-       vmvn.i32        d16, #0x20
-       vmvn.i32        d16, #0x2000
-       vmvn.i32        d16, #0x200000
-       vmvn.i32        d16, #0x20000000
-       vmvn.i32        d16, #0x20FF
-       vmvn.i32        d16, #0x20FFFF
+@      vmvn.i16        d16, #0x10
+@      vmvn.i16        d16, #0x1000
+@      vmvn.i32        d16, #0x20
+@      vmvn.i32        d16, #0x2000
+@      vmvn.i32        d16, #0x200000
+@      vmvn.i32        d16, #0x20000000
+@      vmvn.i32        d16, #0x20FF
+@      vmvn.i32        d16, #0x20FFFF
 
-@ CHECK: vmvn.i16      d16, #0x10      @ encoding: [0x30,0x08,0xc1,0xf2]
-@ CHECK: vmvn.i16      d16, #0x1000    @ encoding: [0x30,0x0a,0xc1,0xf2]
-@ CHECK: vmvn.i32      d16, #0x20      @ encoding: [0x30,0x00,0xc2,0xf2]
-@ CHECK: vmvn.i32      d16, #0x2000    @ encoding: [0x30,0x02,0xc2,0xf2]
-@ CHECK: vmvn.i32      d16, #0x200000  @ encoding: [0x30,0x04,0xc2,0xf2]
-@ CHECK: vmvn.i32      d16, #0x20000000 @ encoding: [0x30,0x06,0xc2,0xf2]
-@ CHECK: vmvn.i32      d16, #0x20FF    @ encoding: [0x30,0x0c,0xc2,0xf2]
-@ CHECK: vmvn.i32      d16, #0x20FFFF  @ encoding: [0x30,0x0d,0xc2,0xf2]
+@ FIXME: vmvn.i16      d16, #0x10      @ encoding: [0x30,0x08,0xc1,0xf2]
+@ FIXME: vmvn.i16      d16, #0x1000    @ encoding: [0x30,0x0a,0xc1,0xf2]
+@ FIXME: vmvn.i32      d16, #0x20      @ encoding: [0x30,0x00,0xc2,0xf2]
+@ FIXME: vmvn.i32      d16, #0x2000    @ encoding: [0x30,0x02,0xc2,0xf2]
+@ FIXME: vmvn.i32      d16, #0x200000  @ encoding: [0x30,0x04,0xc2,0xf2]
+@ FIXME: vmvn.i32      d16, #0x20000000 @ encoding: [0x30,0x06,0xc2,0xf2]
+@ FIXME: vmvn.i32      d16, #0x20FF    @ encoding: [0x30,0x0c,0xc2,0xf2]
+@ FIXME: vmvn.i32      d16, #0x20FFFF  @ encoding: [0x30,0x0d,0xc2,0xf2]
 
        vmovl.s8        q8, d16
        vmovl.s16       q8, d16
 @ CHECK: vqmovun.s32   d16, q8         @ encoding: [0x60,0x02,0xf6,0xf3]
 @ CHECK: vqmovun.s64   d16, q8         @ encoding: [0x60,0x02,0xfa,0xf3]
 
-       vmov.s8         r0, d16[1]
-       vmov.s16        r0, d16[1]
-       vmov.u8         r0, d16[1]
-       vmov.u16        r0, d16[1]
-       vmov.32         r0, d16[1]
-       vmov.8  d16[1], r1
-       vmov.16 d16[1], r1
-       vmov.32 d16[1], r1
-       vmov.8  d18[1], r1
-       vmov.16 d18[1], r1
-       vmov.32 d18[1], r1
+@      vmov.s8         r0, d16[1]
+@      vmov.s16        r0, d16[1]
+@      vmov.u8         r0, d16[1]
+@      vmov.u16        r0, d16[1]
+@      vmov.32         r0, d16[1]
+@      vmov.8  d16[1], r1
+@      vmov.16 d16[1], r1
+@      vmov.32 d16[1], r1
+@      vmov.8  d18[1], r1
+@      vmov.16 d18[1], r1
+@      vmov.32 d18[1], r1
 
-@ CHECK: vmov.s8       r0, d16[1]      @ encoding: [0xb0,0x0b,0x50,0xee]
-@ CHECK: vmov.s16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x10,0xee]
-@ CHECK: vmov.u8       r0, d16[1]      @ encoding: [0xb0,0x0b,0xd0,0xee]
-@ CHECK: vmov.u16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x90,0xee]
-@ CHECK: vmov.32       r0, d16[1]      @ encoding: [0x90,0x0b,0x30,0xee]
-@ CHECK: vmov.8        d16[1], r1              @ encoding: [0xb0,0x1b,0x40,0xee]
-@ CHECK: vmov.16       d16[1], r1      @ encoding: [0xf0,0x1b,0x00,0xee]
-@ CHECK: vmov.32       d16[1], r1      @ encoding: [0x90,0x1b,0x20,0xee]
-@ CHECK: vmov.8        d18[1], r1              @ encoding: [0xb0,0x1b,0x42,0xee]
-@ CHECK: vmov.16       d18[1], r1      @ encoding: [0xf0,0x1b,0x02,0xee]
-@ CHECK: vmov.32       d18[1], r1      @ encoding: [0x90,0x1b,0x22,0xee]
+@ FIXME: vmov.s8       r0, d16[1]      @ encoding: [0xb0,0x0b,0x50,0xee]
+@ FIXME: vmov.s16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x10,0xee]
+@ FIXME: vmov.u8       r0, d16[1]      @ encoding: [0xb0,0x0b,0xd0,0xee]
+@ FIXME: vmov.u16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x90,0xee]
+@ FIXME: vmov.32       r0, d16[1]      @ encoding: [0x90,0x0b,0x30,0xee]
+@ FIXME: vmov.8        d16[1], r1              @ encoding: [0xb0,0x1b,0x40,0xee]
+@ FIXME: vmov.16       d16[1], r1      @ encoding: [0xf0,0x1b,0x00,0xee]
+@ FIXME: vmov.32       d16[1], r1      @ encoding: [0x90,0x1b,0x20,0xee]
+@ FIXME: vmov.8        d18[1], r1              @ encoding: [0xb0,0x1b,0x42,0xee]
+@ FIXME: vmov.16       d18[1], r1      @ encoding: [0xf0,0x1b,0x02,0xee]
+@ FIXME: vmov.32       d18[1], r1      @ encoding: [0x90,0x1b,0x22,0xee]
index ababbb7957295b79152f8f0fba7f277e03efe01f..89fe82cf7110cfa35c70ee45199ed9937232ab7c 100644 (file)
 @ RUN: llvm-mc -mcpu=cortex-a8 -triple thumb-unknown-unknown -show-encoding < %s | FileCheck %s
-@ XFAIL: *
 
 .code 16
 
-@ CHECK: vmov.i8       d16, #0x8               @ encoding: [0x18,0x0e,0xc0,0xef]
        vmov.i8 d16, #0x8
-@ CHECK: vmov.i16      d16, #0x10      @ encoding: [0x10,0x08,0xc1,0xef]
-       vmov.i16        d16, #0x10
-@ CHECK: vmov.i16      d16, #0x1000    @ encoding: [0x10,0x0a,0xc1,0xef]
-       vmov.i16        d16, #0x1000
-@ CHECK: vmov.i32      d16, #0x20      @ encoding: [0x10,0x00,0xc2,0xef]
-       vmov.i32        d16, #0x20
-@ CHECK: vmov.i32      d16, #0x2000    @ encoding: [0x10,0x02,0xc2,0xef]
-       vmov.i32        d16, #0x2000
-@ CHECK: vmov.i32      d16, #0x200000  @ encoding: [0x10,0x04,0xc2,0xef]
-       vmov.i32        d16, #0x200000
-@ CHECK: vmov.i32      d16, #0x20000000 @ encoding: [0x10,0x06,0xc2,0xef]
-       vmov.i32        d16, #0x20000000
-@ CHECK: vmov.i32      d16, #0x20FF    @ encoding: [0x10,0x0c,0xc2,0xef]
-       vmov.i32        d16, #0x20FF
-@ CHECK: vmov.i32      d16, #0x20FFFF  @ encoding: [0x10,0x0d,0xc2,0xef]
-       vmov.i32        d16, #0x20FFFF
-@ CHECK: vmov.i64      d16, #0xFF0000FF0000FFFF @ encoding: [0x33,0x0e,0xc1,0xff]
-       vmov.i64        d16, #0xFF0000FF0000FFFF
-@ CHECK: vmov.i8       q8, #0x8                @ encoding: [0x58,0x0e,0xc0,0xef]
+@      vmov.i16        d16, #0x10
+@      vmov.i16        d16, #0x1000
+@      vmov.i32        d16, #0x20
+@      vmov.i32        d16, #0x2000
+@      vmov.i32        d16, #0x200000
+@      vmov.i32        d16, #0x20000000
+@      vmov.i32        d16, #0x20FF
+@      vmov.i32        d16, #0x20FFFF
+@      vmov.i64        d16, #0xFF0000FF0000FFFF
+
+@ CHECK: vmov.i8       d16, #0x8       @ encoding: [0xc0,0xef,0x18,0x0e]
+@ FIXME: vmov.i16      d16, #0x10      @ encoding: [0xc1,0xef,0x10,0x08]
+@ FIXME: vmov.i16      d16, #0x1000    @ encoding: [0xc1,0xef,0x10,0x0a]
+@ FIXME: vmov.i32      d16, #0x20      @ encoding: [0xc2,0xef,0x10,0x00]
+@ FIXME: vmov.i32      d16, #0x2000    @ encoding: [0xc2,0xef,0x10,0x02]
+@ FIXME: vmov.i32      d16, #0x200000  @ encoding: [0xc2,0xef,0x10,0x04]
+@ FIXME: vmov.i32      d16, #0x20000000 @ encoding: [0xc2,0xef,0x10,0x06]
+@ FIXME: vmov.i32      d16, #0x20FF    @ encoding: [0xc2,0xef,0x10,0x0c]
+@ FIXME: vmov.i32      d16, #0x20FFFF  @ encoding: [0xc2,0xef,0x10,0x0d]
+@ FIXME: vmov.i64 d16, #0xFF0000FF0000FFFF @ encoding: [0xc1,0xff,0x33,0x0e]
+
+
        vmov.i8 q8, #0x8
-@ CHECK: vmov.i16      q8, #0x10       @ encoding: [0x50,0x08,0xc1,0xef]
-       vmov.i16        q8, #0x10
-@ CHECK: vmov.i16      q8, #0x1000     @ encoding: [0x50,0x0a,0xc1,0xef]
-       vmov.i16        q8, #0x1000
-@ CHECK: vmov.i32      q8, #0x20       @ encoding: [0x50,0x00,0xc2,0xef]
-       vmov.i32        q8, #0x20
-@ CHECK: vmov.i32      q8, #0x2000     @ encoding: [0x50,0x02,0xc2,0xef]
-       vmov.i32        q8, #0x2000
-@ CHECK: vmov.i32      q8, #0x200000   @ encoding: [0x50,0x04,0xc2,0xef]
-       vmov.i32        q8, #0x200000
-@ CHECK: vmov.i32      q8, #0x20000000 @ encoding: [0x50,0x06,0xc2,0xef]
-       vmov.i32        q8, #0x20000000
-@ CHECK: vmov.i32      q8, #0x20FF     @ encoding: [0x50,0x0c,0xc2,0xef]
-       vmov.i32        q8, #0x20FF
-@ CHECK: vmov.i32      q8, #0x20FFFF   @ encoding: [0x50,0x0d,0xc2,0xef]
-       vmov.i32        q8, #0x20FFFF
-@ CHECK: vmov.i64      q8, #0xFF0000FF0000FFFF @ encoding: [0x73,0x0e,0xc1,0xff]
-       vmov.i64        q8, #0xFF0000FF0000FFFF
-@ CHECK: vmvn.i16      d16, #0x10      @ encoding: [0x30,0x08,0xc1,0xef]
-       vmvn.i16        d16, #0x10
-@ CHECK: vmvn.i16      d16, #0x1000    @ encoding: [0x30,0x0a,0xc1,0xef]
-       vmvn.i16        d16, #0x1000
-@ CHECK: vmvn.i32      d16, #0x20      @ encoding: [0x30,0x00,0xc2,0xef]
-       vmvn.i32        d16, #0x20
-@ CHECK: vmvn.i32      d16, #0x2000    @ encoding: [0x30,0x02,0xc2,0xef]
-       vmvn.i32        d16, #0x2000
-@ CHECK: vmvn.i32      d16, #0x200000  @ encoding: [0x30,0x04,0xc2,0xef]
-       vmvn.i32        d16, #0x200000
-@ CHECK: vmvn.i32      d16, #0x20000000 @ encoding: [0x30,0x06,0xc2,0xef]
-       vmvn.i32        d16, #0x20000000
-@ CHECK: vmvn.i32      d16, #0x20FF    @ encoding: [0x30,0x0c,0xc2,0xef]
-       vmvn.i32        d16, #0x20FF
-@ CHECK: vmvn.i32      d16, #0x20FFFF  @ encoding: [0x30,0x0d,0xc2,0xef]
-       vmvn.i32        d16, #0x20FFFF
-@ CHECK: vmovl.s8      q8, d16         @ encoding: [0x30,0x0a,0xc8,0xef]
+@      vmov.i16        q8, #0x10
+@      vmov.i16        q8, #0x1000
+@      vmov.i32        q8, #0x20
+@      vmov.i32        q8, #0x2000
+@      vmov.i32        q8, #0x200000
+@      vmov.i32        q8, #0x20000000
+@      vmov.i32        q8, #0x20FF
+@      vmov.i32        q8, #0x20FFFF
+@      vmov.i64        q8, #0xFF0000FF0000FFFF
+
+@ CHECK: vmov.i8       q8, #0x8        @ encoding: [0xc0,0xef,0x58,0x0e]
+@ FIXME: vmov.i16      q8, #0x10       @ encoding: [0xc1,0xef,0x50,0x08]
+@ FIXME: vmov.i16      q8, #0x1000     @ encoding: [0xc1,0xef,0x50,0x0a]
+@ FIXME: vmov.i32      q8, #0x20       @ encoding: [0xc2,0xef,0x50,0x00]
+@ FIXME: vmov.i32      q8, #0x2000     @ encoding: [0xc2,0xef,0x50,0x02]
+@ FIXME: vmov.i32      q8, #0x200000   @ encoding: [0xc2,0xef,0x50,0x04]
+@ FIXME: vmov.i32      q8, #0x20000000 @ encoding: [0xc2,0xef,0x50,0x06]
+@ FIXME: vmov.i32      q8, #0x20FF     @ encoding: [0xc2,0xef,0x50,0x0c]
+@ FIXME: vmov.i32      q8, #0x20FFFF   @ encoding: [0xc2,0xef,0x50,0x0d]
+@ FIXME: vmov.i64 q8, #0xFF0000FF0000FFFF @ encoding: [0xc1,0xff,0x73,0x0e]
+
+
+@      vmvn.i16        d16, #0x10
+@      vmvn.i16        d16, #0x1000
+@      vmvn.i32        d16, #0x20
+@      vmvn.i32        d16, #0x2000
+@      vmvn.i32        d16, #0x200000
+@      vmvn.i32        d16, #0x20000000
+@      vmvn.i32        d16, #0x20FF
+@      vmvn.i32        d16, #0x20FFFF
+
+@ FIXME: vmvn.i16      d16, #0x10      @ encoding: [0xc1,0xef,0x30,0x08]
+@ FIXME: vmvn.i16      d16, #0x1000    @ encoding: [0xc1,0xef,0x30,0x0a]
+@ FIXME: vmvn.i32      d16, #0x20      @ encoding: [0xc2,0xef,0x30,0x00]
+@ FIXME: vmvn.i32      d16, #0x2000    @ encoding: [0xc2,0xef,0x30,0x02]
+@ FIXME: vmvn.i32      d16, #0x200000  @ encoding: [0xc2,0xef,0x30,0x04]
+@ FIXME: vmvn.i32      d16, #0x20000000 @ encoding: [0xc2,0xef,0x30,0x06]
+@ FIXME: vmvn.i32      d16, #0x20FF    @ encoding: [0xc2,0xef,0x30,0x0c]
+@ FIXME: vmvn.i32      d16, #0x20FFFF  @ encoding: [0xc2,0xef,0x30,0x0d]
+
+
        vmovl.s8        q8, d16
-@ CHECK: vmovl.s16     q8, d16         @ encoding: [0x30,0x0a,0xd0,0xef]
        vmovl.s16       q8, d16
-@ CHECK: vmovl.s32     q8, d16         @ encoding: [0x30,0x0a,0xe0,0xef]
        vmovl.s32       q8, d16
-@ CHECK: vmovl.u8      q8, d16         @ encoding: [0x30,0x0a,0xc8,0xff]
        vmovl.u8        q8, d16
-@ CHECK: vmovl.u16     q8, d16         @ encoding: [0x30,0x0a,0xd0,0xff]
        vmovl.u16       q8, d16
-@ CHECK: vmovl.u32     q8, d16         @ encoding: [0x30,0x0a,0xe0,0xff]
        vmovl.u32       q8, d16
-@ CHECK: vmovn.i16     d16, q8         @ encoding: [0x20,0x02,0xf2,0xff]
        vmovn.i16       d16, q8
-@ CHECK: vmovn.i32     d16, q8         @ encoding: [0x20,0x02,0xf6,0xff]
        vmovn.i32       d16, q8
-@ CHECK: vmovn.i64     d16, q8         @ encoding: [0x20,0x02,0xfa,0xff]
        vmovn.i64       d16, q8
-@ CHECK: vqmovn.s16    d16, q8         @ encoding: [0xa0,0x02,0xf2,0xff]
        vqmovn.s16      d16, q8
-@ CHECK: vqmovn.s32    d16, q8         @ encoding: [0xa0,0x02,0xf6,0xff]
        vqmovn.s32      d16, q8
-@ CHECK: vqmovn.s64    d16, q8         @ encoding: [0xa0,0x02,0xfa,0xff]
        vqmovn.s64      d16, q8
-@ CHECK: vqmovn.u16    d16, q8         @ encoding: [0xe0,0x02,0xf2,0xff]
        vqmovn.u16      d16, q8
-@ CHECK: vqmovn.u32    d16, q8         @ encoding: [0xe0,0x02,0xf6,0xff]
        vqmovn.u32      d16, q8
-@ CHECK: vqmovn.u64    d16, q8         @ encoding: [0xe0,0x02,0xfa,0xff]
        vqmovn.u64      d16, q8
-@ CHECK: vqmovun.s16   d16, q8         @ encoding: [0x60,0x02,0xf2,0xff]
        vqmovun.s16     d16, q8
-@ CHECK: vqmovun.s32   d16, q8         @ encoding: [0x60,0x02,0xf6,0xff]
        vqmovun.s32     d16, q8
-@ CHECK: vqmovun.s64   d16, q8         @ encoding: [0x60,0x02,0xfa,0xff]
        vqmovun.s64     d16, q8
-@ CHECK: vmov.s8       r0, d16[1]              @ encoding: [0xb0,0x0b,0x50,0xee]
-       vmov.s8 r0, d16[1]
-@ CHECK: vmov.s16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x10,0xee]
-       vmov.s16        r0, d16[1]
-@ CHECK: vmov.u8       r0, d16[1]              @ encoding: [0xb0,0x0b,0xd0,0xee]
-       vmov.u8 r0, d16[1]
-@ CHECK: vmov.u16      r0, d16[1]      @ encoding: [0xf0,0x0b,0x90,0xee]
-       vmov.u16        r0, d16[1]
-@ CHECK: vmov.32       r0, d16[1]              @ encoding: [0x90,0x0b,0x30,0xee]
-       vmov.32 r0, d16[1]
-@ CHECK: vmov.8        d16[1], r1              @ encoding: [0xb0,0x1b,0x40,0xee]
-       vmov.8  d16[1], r1
-@ CHECK: vmov.16       d16[1], r1              @ encoding: [0xf0,0x1b,0x00,0xee]
-       vmov.16 d16[1], r1
-@ CHECK: vmov.32       d16[1], r1              @ encoding: [0x90,0x1b,0x20,0xee]
-       vmov.32 d16[1], r1
-@ CHECK: vmov.8        d18[1], r1              @ encoding: [0xb0,0x1b,0x42,0xee]
-       vmov.8  d18[1], r1
-@ CHECK: vmov.16       d18[1], r1              @ encoding: [0xf0,0x1b,0x02,0xee]
-       vmov.16 d18[1], r1
-@ CHECK: vmov.32       d18[1], r1              @ encoding: [0x90,0x1b,0x22,0xee]
-       vmov.32 d18[1], r1
+
+@ CHECK: vmovl.s8      q8, d16         @ encoding: [0xc8,0xef,0x30,0x0a]
+@ CHECK: vmovl.s16     q8, d16         @ encoding: [0xd0,0xef,0x30,0x0a]
+@ CHECK: vmovl.s32     q8, d16         @ encoding: [0xe0,0xef,0x30,0x0a]
+@ CHECK: vmovl.u8      q8, d16         @ encoding: [0xc8,0xff,0x30,0x0a]
+@ CHECK: vmovl.u16     q8, d16         @ encoding: [0xd0,0xff,0x30,0x0a]
+@ CHECK: vmovl.u32     q8, d16         @ encoding: [0xe0,0xff,0x30,0x0a]
+@ CHECK: vmovn.i16     d16, q8         @ encoding: [0xf2,0xff,0x20,0x02]
+@ CHECK: vmovn.i32     d16, q8         @ encoding: [0xf6,0xff,0x20,0x02]
+@ CHECK: vmovn.i64     d16, q8         @ encoding: [0xfa,0xff,0x20,0x02]
+@ CHECK: vqmovn.s16    d16, q8         @ encoding: [0xf2,0xff,0xa0,0x02]
+@ CHECK: vqmovn.s32    d16, q8         @ encoding: [0xf6,0xff,0xa0,0x02]
+@ CHECK: vqmovn.s64    d16, q8         @ encoding: [0xfa,0xff,0xa0,0x02]
+@ CHECK: vqmovn.u16    d16, q8         @ encoding: [0xf2,0xff,0xe0,0x02]
+@ CHECK: vqmovn.u32    d16, q8         @ encoding: [0xf6,0xff,0xe0,0x02]
+@ CHECK: vqmovn.u64    d16, q8         @ encoding: [0xfa,0xff,0xe0,0x02]
+@ CHECK: vqmovun.s16   d16, q8         @ encoding: [0xf2,0xff,0x60,0x02]
+@ CHECK: vqmovun.s32   d16, q8         @ encoding: [0xf6,0xff,0x60,0x02]
+@ CHECK: vqmovun.s64   d16, q8         @ encoding: [0xfa,0xff,0x60,0x02]
+
+
+@      vmov.s8 r0, d16[1]
+@      vmov.s16        r0, d16[1]
+@      vmov.u8 r0, d16[1]
+@      vmov.u16        r0, d16[1]
+@      vmov.32 r0, d16[1]
+@      vmov.8  d16[1], r1
+@      vmov.16 d16[1], r1
+@      vmov.32 d16[1], r1
+@      vmov.8  d18[1], r1
+@      vmov.16 d18[1], r1
+@      vmov.32 d18[1], r1
+
+@ FIXME: vmov.s8       r0, d16[1]      @ encoding: [0x50,0xee,0xb0,0x0b]
+@ FIXME: vmov.s16      r0, d16[1]      @ encoding: [0x10,0xee,0xf0,0x0b]
+@ FIXME: vmov.u8       r0, d16[1]      @ encoding: [0xd0,0xee,0xb0,0x0b]
+@ FIXME: vmov.u16      r0, d16[1]      @ encoding: [0x90,0xee,0xf0,0x0b]
+@ FIXME: vmov.32       r0, d16[1]      @ encoding: [0x30,0xee,0x90,0x0b]
+@ FIXME: vmov.8        d16[1], r1              @ encoding: [0x40,0xee,0xb0,0x1b]
+@ FIXME: vmov.16       d16[1], r1      @ encoding: [0x00,0xee,0xf0,0x1b]
+@ FIXME: vmov.32       d16[1], r1      @ encoding: [0x20,0xee,0x90,0x1b]
+@ FIXME: vmov.8        d18[1], r1              @ encoding: [0x42,0xee,0xb0,0x1b]
+@ FIXME: vmov.16       d18[1], r1      @ encoding: [0x02,0xee,0xf0,0x1b]
+@ FIXME: vmov.32       d18[1], r1      @ encoding: [0x22,0xee,0x90,0x1b]
index abef70e31897b2aba2d9e9e5fe84b6a2b3387bc3..9e9384f6c625adc039e05e2154789a703153bdc3 100644 (file)
@@ -597,6 +597,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
   IMM("imm1_16");
   IMM("imm1_32");
   IMM("nModImm");
+  IMM("nImmSplatI8");
   IMM("imm0_7");
   IMM("imm0_15");
   IMM("imm0_255");