void ARMDecoder::DecodeSIMDDataProcessing()

in runtime/vm/compiler/assembler/disassembler_arm.cc [1312:1439]


void ARMDecoder::DecodeSIMDDataProcessing(Instr* instr) {
  ASSERT(instr->ConditionField() == kSpecialCondition);
  if (instr->Bit(6) == 1) {
    if ((instr->Bits(8, 4) == 8) && (instr->Bit(4) == 0) &&
        (instr->Bits(23, 2) == 0)) {
      Format(instr, "vaddq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 13) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 2) == 0) && (instr->Bit(21) == 0)) {
      Format(instr, "vaddqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 8) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 2) == 2)) {
      Format(instr, "vsubq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 13) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 2) == 0) && (instr->Bit(21) == 1)) {
      Format(instr, "vsubqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 9) && (instr->Bit(4) == 1) &&
               (instr->Bits(23, 2) == 0)) {
      Format(instr, "vmulq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 13) && (instr->Bit(4) == 1) &&
               (instr->Bits(23, 2) == 2) && (instr->Bit(21) == 0)) {
      Format(instr, "vmulqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 4) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 5) == 4)) {
      Format(instr, "vshlqi'sz 'qd, 'qm, 'qn");
    } else if ((instr->Bits(8, 4) == 4) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 5) == 6)) {
      Format(instr, "vshlqu'sz 'qd, 'qm, 'qn");
    } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 2)) {
      Format(instr, "veorq 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vornq 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) {
      if (instr->QmField() == instr->QnField()) {
        Format(instr, "vmovq 'qd, 'qm");
      } else {
        Format(instr, "vorrq 'qd, 'qm");
      }
    } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vandq 'qd, 'qn, 'qm");
    } else if ((instr->Bits(7, 5) == 11) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 5) == 7) &&
               (instr->Bits(16, 4) == 0)) {
      Format(instr, "vmvnq 'qd, 'qm");
    } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vminqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vmaxqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bit(7) == 0) && (instr->Bits(16, 4) == 9)) {
      Format(instr, "vabsqs 'qd, 'qm");
    } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bit(7) == 1) && (instr->Bits(16, 4) == 9)) {
      Format(instr, "vnegqs 'qd, 'qm");
    } else if ((instr->Bits(7, 5) == 10) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bits(16, 4) == 11)) {
      Format(instr, "vrecpeqs 'qd, 'qm");
    } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vrecpsqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 5) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bit(7) == 1) && (instr->Bits(16, 4) == 11)) {
      Format(instr, "vrsqrteqs 'qd, 'qm");
    } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 1) &&
               (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vrsqrtsqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 12) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bit(7) == 0)) {
      int32_t imm4 = instr->Bits(16, 4);
      if (imm4 & 1) {
        Format(instr, "vdupb 'qd, 'dm['imm4_vdup]");
      } else if (imm4 & 2) {
        Format(instr, "vduph 'qd, 'dm['imm4_vdup]");
      } else if (imm4 & 4) {
        Format(instr, "vdupw 'qd, 'dm['imm4_vdup]");
      } else {
        Unknown(instr);
      }
    } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
               (instr->Bit(7) == 1) && (instr->Bits(16, 4) == 10)) {
      Format(instr, "vzipqw 'qd, 'qm");
    } else if ((instr->Bits(8, 4) == 8) && (instr->Bit(4) == 1) &&
               (instr->Bits(23, 2) == 2)) {
      Format(instr, "vceqq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 14) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
      Format(instr, "vceqqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 3) && (instr->Bit(4) == 1) &&
               (instr->Bits(23, 2) == 0)) {
      Format(instr, "vcgeq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 3) && (instr->Bit(4) == 1) &&
               (instr->Bits(23, 2) == 2)) {
      Format(instr, "vcugeq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 14) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 2)) {
      Format(instr, "vcgeqs 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 3) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 2) == 0)) {
      Format(instr, "vcgtq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 3) && (instr->Bit(4) == 0) &&
               (instr->Bits(23, 2) == 2)) {
      Format(instr, "vcugtq'sz 'qd, 'qn, 'qm");
    } else if ((instr->Bits(8, 4) == 14) && (instr->Bit(4) == 0) &&
               (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 2)) {
      Format(instr, "vcgtqs 'qd, 'qn, 'qm");
    } else {
      Unknown(instr);
    }
  } else {
    if ((instr->Bits(23, 2) == 3) && (instr->Bits(20, 2) == 3) &&
        (instr->Bits(10, 2) == 2) && (instr->Bit(4) == 0)) {
      Format(instr, "vtbl 'dd, 'dtbllist, 'dm");
    } else {
      Unknown(instr);
    }
  }
}