// Copyright 2015, VIXL authors
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of ARM Limited nor the names of its contributors may be
//     used to endorse or promote products derived from this software without
//     specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

extern "C" {
#include <stdint.h>
}

#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>

#include "utils-vixl.h"
#include "aarch32/constants-aarch32.h"
#include "aarch32/disasm-aarch32.h"
#include "aarch32/instructions-aarch32.h"
#include "aarch32/operands-aarch32.h"

namespace vixl {
namespace aarch32 {

using internal::Int64;
using internal::Uint32;

class T32CodeAddressIncrementer {
  uint32_t* code_address_;
  uint32_t increment_;

 public:
  T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
      : code_address_(code_address),
        increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
  ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
};

class A32CodeAddressIncrementer {
  uint32_t* code_address_;

 public:
  explicit A32CodeAddressIncrementer(uint32_t* code_address)
      : code_address_(code_address) {}
  ~A32CodeAddressIncrementer() { *code_address_ += 4; }
};

class DecodeNeon {
  int lane_;
  SpacingType spacing_;
  bool valid_;

 public:
  DecodeNeon(int lane, SpacingType spacing)
      : lane_(lane), spacing_(spacing), valid_(true) {}
  DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
  int GetLane() const { return lane_; }
  SpacingType GetSpacing() const { return spacing_; }
  bool IsValid() const { return valid_; }
};

class DecodeNeonAndAlign : public DecodeNeon {
 public:
  Alignment align_;
  DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
      : DecodeNeon(lanes, spacing), align_(align) {}
  DecodeNeonAndAlign() : align_(kBadAlignment) {}
  Alignment GetAlign() const { return align_; }
};

// Start of generated code.
DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
  if ((value & 0xf) == 0x1) {
    switch (type_value) {
      case 0x0:
        return S8;
      case 0x1:
        return U8;
    }
  } else if ((value & 0xe) == 0x2) {
    switch (type_value) {
      case 0x0:
        return S16;
      case 0x1:
        return U16;
    }
  } else if ((value & 0xc) == 0x4) {
    switch (type_value) {
      case 0x0:
        return S32;
      case 0x1:
        return U32;
    }
  } else if ((value & 0x8) == 0x8) {
    switch (type_value) {
      case 0x0:
        return S64;
      case 0x1:
        return U64;
    }
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
  if ((value & 0xf) == 0x1) {
    if (type_value == 0x1) return S8;
  } else if ((value & 0xe) == 0x2) {
    if (type_value == 0x1) return S16;
  } else if ((value & 0xc) == 0x4) {
    if (type_value == 0x1) return S32;
  } else if ((value & 0x8) == 0x8) {
    if (type_value == 0x1) return S64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
  if ((value & 0xf) == 0x1) {
    return I8;
  } else if ((value & 0xe) == 0x2) {
    return I16;
  } else if ((value & 0xc) == 0x4) {
    return I32;
  } else if ((value & 0x8) == 0x8) {
    return I64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
  if ((value & 0xf) == 0x1) {
    return Untyped8;
  } else if ((value & 0xe) == 0x2) {
    return Untyped16;
  } else if ((value & 0xc) == 0x4) {
    return Untyped32;
  } else if ((value & 0x8) == 0x8) {
    return Untyped64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
  if ((value & 0x7) == 0x1) {
    switch (type_value) {
      case 0x0:
        return S16;
      case 0x1:
        return U16;
    }
  } else if ((value & 0x6) == 0x2) {
    switch (type_value) {
      case 0x0:
        return S32;
      case 0x1:
        return U32;
    }
  } else if ((value & 0x4) == 0x4) {
    switch (type_value) {
      case 0x0:
        return S64;
      case 0x1:
        return U64;
    }
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
  if ((value & 0x7) == 0x1) {
    if (type_value == 0x1) return S16;
  } else if ((value & 0x6) == 0x2) {
    if (type_value == 0x1) return S32;
  } else if ((value & 0x4) == 0x4) {
    if (type_value == 0x1) return S64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
  if ((value & 0x7) == 0x1) {
    return I16;
  } else if ((value & 0x6) == 0x2) {
    return I32;
  } else if ((value & 0x4) == 0x4) {
    return I64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
  if ((value & 0x7) == 0x1) {
    switch (type_value) {
      case 0x0:
        return S8;
      case 0x1:
        return U8;
    }
  } else if ((value & 0x6) == 0x2) {
    switch (type_value) {
      case 0x0:
        return S16;
      case 0x1:
        return U16;
    }
  } else if ((value & 0x4) == 0x4) {
    switch (type_value) {
      case 0x0:
        return S32;
      case 0x1:
        return U32;
    }
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x4:
      return U8;
    case 0x5:
      return U16;
    case 0x6:
      return U32;
    case 0x8:
      return P8;
    case 0xa:
      return P64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
    case 0x4:
      return P8;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x4:
      return U8;
    case 0x5:
      return U16;
    case 0x6:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S16;
    case 0x1:
      return S32;
    case 0x2:
      return S64;
    case 0x4:
      return U16;
    case 0x5:
      return U32;
    case 0x6:
      return U64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
  switch (value) {
    case 0x1:
      return S8;
    case 0x2:
      return S16;
    case 0x4:
      return S32;
    case 0x9:
      return U8;
    case 0xa:
      return U16;
    case 0xc:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
  if ((value & 0x18) == 0x8) {
    *lane = value & 7;
    return S8;
  }
  if ((value & 0x19) == 0x1) {
    *lane = (value >> 1) & 3;
    return S16;
  }
  if ((value & 0x18) == 0x18) {
    *lane = value & 7;
    return U8;
  }
  if ((value & 0x19) == 0x11) {
    *lane = (value >> 1) & 3;
    return U16;
  }
  if ((value & 0x1b) == 0x0) {
    *lane = (value >> 2) & 1;
    return Untyped32;
  }
  *lane = ~0U;
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
  if ((value & 0x8) == 0x8) {
    *lane = value & 7;
    return Untyped8;
  }
  if ((value & 0x9) == 0x1) {
    *lane = (value >> 1) & 3;
    return Untyped16;
  }
  if ((value & 0xb) == 0x0) {
    *lane = (value >> 2) & 1;
    return Untyped32;
  }
  *lane = ~0U;
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
  if ((value & 0x1) == 0x1) {
    *lane = (value >> 1) & 7;
    return Untyped8;
  }
  if ((value & 0x3) == 0x2) {
    *lane = (value >> 2) & 3;
    return Untyped16;
  }
  if ((value & 0x7) == 0x4) {
    *lane = (value >> 3) & 1;
    return Untyped32;
  }
  *lane = ~0U;
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
  switch (value) {
    case 0x2:
      return Untyped8;
    case 0x1:
      return Untyped16;
    case 0x0:
      return Untyped32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_1_Decode1(uint32_t value) {
  switch (value) {
    case 0x0:
      return F32;
    case 0x1:
      return F32;
    case 0x2:
      return S32;
    case 0x3:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_1_Decode2(uint32_t value) {
  switch (value) {
    case 0x0:
      return S32;
    case 0x1:
      return U32;
    case 0x2:
      return F32;
    case 0x3:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_2_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return U32;
    case 0x1:
      return S32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_3_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S32;
    case 0x1:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S16;
    case 0x1:
      return S32;
    case 0x2:
      return U16;
    case 0x3:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
  switch (value) {
    case 0x0:
      return F32;
    case 0x1:
      return F32;
    case 0x2:
      return S32;
    case 0x3:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
  switch (value) {
    case 0x0:
      return S32;
    case 0x1:
      return U32;
    case 0x2:
      return F32;
    case 0x3:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_sz_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x6:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
    case 0x6:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
  switch (value) {
    case 0x1:
      return I16;
    case 0x2:
      return I32;
    case 0x6:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
  switch (value) {
    case 0x2:
      return U32;
    case 0x6:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x4:
      return U8;
    case 0x5:
      return U16;
    case 0x6:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
  switch (value) {
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x5:
      return U16;
    case 0x6:
      return U32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
    case 0x3:
      return S64;
    case 0x4:
      return U8;
    case 0x5:
      return U16;
    case 0x6:
      return U32;
    case 0x7:
      return U64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_1_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return Untyped8;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_2_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
    case 0x3:
      return I64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_3_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I16;
    case 0x1:
      return I32;
    case 0x2:
      return I64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_4_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_5_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S8;
    case 0x1:
      return S16;
    case 0x2:
      return S32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_6_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return Untyped8;
    case 0x1:
      return Untyped16;
    case 0x2:
      return Untyped32;
    case 0x3:
      return Untyped64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_7_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return Untyped8;
    case 0x1:
      return Untyped16;
    case 0x2:
      return Untyped32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_8_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return Untyped8;
    case 0x1:
      return Untyped16;
    case 0x2:
      return Untyped32;
    case 0x3:
      return Untyped32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
  switch (value) {
    case 0x1:
      switch (type_value) {
        case 0x0:
          return I16;
      }
      break;
    case 0x2:
      switch (type_value) {
        case 0x0:
          return I32;
        case 0x1:
          return F32;
      }
      break;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_10_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
  switch (value) {
    case 0x1:
      switch (type_value) {
        case 0x0:
          return S16;
        case 0x1:
          return U16;
      }
      break;
    case 0x2:
      switch (type_value) {
        case 0x0:
          return S32;
        case 0x1:
          return U32;
      }
      break;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
  switch (value) {
    case 0x0:
      switch (type_value) {
        case 0x0:
          return S8;
        case 0x1:
          return U8;
      }
      break;
    case 0x1:
      switch (type_value) {
        case 0x0:
          return S16;
        case 0x1:
          return U16;
      }
      break;
    case 0x2:
      switch (type_value) {
        case 0x0:
          return S32;
        case 0x1:
          return U32;
      }
      break;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_13_Decode(uint32_t value) {
  switch (value) {
    case 0x1:
      return S16;
    case 0x2:
      return S32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_14_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return S16;
    case 0x1:
      return S32;
    case 0x2:
      return S64;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_15_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return Untyped8;
    case 0x1:
      return Untyped16;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_16_Decode(uint32_t value) {
  switch (value) {
    case 0x2:
      return F32;
  }
  return kDataTypeValueInvalid;
}

DataTypeValue Dt_size_17_Decode(uint32_t value) {
  switch (value) {
    case 0x0:
      return I8;
    case 0x1:
      return I16;
    case 0x2:
      return I32;
  }
  return kDataTypeValueInvalid;
}

DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
  switch (dt.GetValue()) {
    case Untyped8: {
      int lane = (value >> 1) & 0x7;
      if ((value & 1) != 0) break;
      SpacingType spacing = kSingle;
      return DecodeNeon(lane, spacing);
    }
    case Untyped16: {
      int lane = (value >> 2) & 0x3;
      if ((value & 1) != 0) break;
      SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
      return DecodeNeon(lane, spacing);
    }
    case Untyped32: {
      int lane = (value >> 3) & 0x1;
      if ((value & 3) != 0) break;
      SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
      return DecodeNeon(lane, spacing);
    }
    default:
      break;
  }
  return DecodeNeon();
}

DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
  switch (dt.GetValue()) {
    case Untyped8: {
      AlignmentType align;
      if ((value & 1) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 1) & 0x7;
      SpacingType spacing = kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped16: {
      AlignmentType align;
      if ((value & 3) == 1) {
        align = k16BitAlign;
      } else if ((value & 3) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 2) & 0x3;
      SpacingType spacing = kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped32: {
      AlignmentType align;
      if ((value & 7) == 3) {
        align = k32BitAlign;
      } else if ((value & 7) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 3) & 0x1;
      SpacingType spacing = kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    default:
      break;
  }
  return DecodeNeonAndAlign();
}

DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
  switch (dt.GetValue()) {
    case Untyped8: {
      AlignmentType align;
      if ((value & 1) == 1) {
        align = k16BitAlign;
      } else if ((value & 1) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 1) & 0x7;
      SpacingType spacing = kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped16: {
      AlignmentType align;
      if ((value & 1) == 1) {
        align = k32BitAlign;
      } else if ((value & 1) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 2) & 0x3;
      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped32: {
      AlignmentType align;
      if ((value & 3) == 1) {
        align = k64BitAlign;
      } else if ((value & 3) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 3) & 0x1;
      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    default:
      break;
  }
  return DecodeNeonAndAlign();
}

DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
  switch (dt.GetValue()) {
    case Untyped8: {
      AlignmentType align;
      if ((value & 1) == 1) {
        align = k32BitAlign;
      } else if ((value & 1) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 1) & 0x7;
      SpacingType spacing = kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped16: {
      AlignmentType align;
      if ((value & 1) == 1) {
        align = k64BitAlign;
      } else if ((value & 1) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 2) & 0x3;
      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    case Untyped32: {
      AlignmentType align;
      if ((value & 3) == 1) {
        align = k64BitAlign;
      } else if ((value & 3) == 2) {
        align = k128BitAlign;
      } else if ((value & 3) == 0) {
        align = kNoAlignment;
      } else {
        break;
      }
      int lane = (value >> 3) & 0x1;
      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
      return DecodeNeonAndAlign(lane, spacing, align);
    }
    default:
      break;
  }
  return DecodeNeonAndAlign();
}

Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      if (dt.Is(Untyped16)) return k16BitAlign;
      if (dt.Is(Untyped32)) return k32BitAlign;
      break;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      if (dt.Is(Untyped8)) return k16BitAlign;
      if (dt.Is(Untyped16)) return k32BitAlign;
      if (dt.Is(Untyped32)) return k64BitAlign;
      break;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
  switch (value) {
    case 0:
      if (size != 3) return kNoAlignment;
      break;
    case 1:
      if (dt.Is(Untyped8)) return k32BitAlign;
      if (dt.Is(Untyped16)) return k64BitAlign;
      if (size == 2) return k64BitAlign;
      if (size == 3) return k128BitAlign;
      break;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_align_1_Decode(uint32_t value) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      return k64BitAlign;
    case 2:
      return k128BitAlign;
    case 3:
      return k256BitAlign;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_align_2_Decode(uint32_t value) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      return k64BitAlign;
    case 2:
      return k128BitAlign;
    case 3:
      return k256BitAlign;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_align_3_Decode(uint32_t value) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      return k64BitAlign;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_align_4_Decode(uint32_t value) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      return k64BitAlign;
    case 2:
      return k128BitAlign;
    case 3:
      return k256BitAlign;
    default:
      break;
  }
  return kBadAlignment;
}

Alignment Align_align_5_Decode(uint32_t value) {
  switch (value) {
    case 0:
      return kNoAlignment;
    case 1:
      return k64BitAlign;
    case 2:
      return k128BitAlign;
    case 3:
      return k256BitAlign;
    default:
      break;
  }
  return kBadAlignment;
}


void Disassembler::adc(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kAdc, kArithmetic);
  os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::adcs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAdcs, kArithmetic);
  os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::add(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kAdd, kArithmetic);
  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kAdd, kArithmetic);
  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << operand;
}

void Disassembler::adds(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAdds, kArithmetic);
  os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::adds(Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kAdds, kArithmetic);
  os() << ToCString(kAdds) << " " << rd << ", " << operand;
}

void Disassembler::addw(Condition cond,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAddw, kArithmetic);
  os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::adr(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Location* location) {
  os().SetCurrentInstruction(kAdr, kAddress);
  os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", "
       << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::and_(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAnd, kBitwise);
  os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::ands(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAnds, kBitwise);
  os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::asr(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rm,
                       const Operand& operand) {
  os().SetCurrentInstruction(kAsr, kShift);
  os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::asrs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kAsrs, kShift);
  os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
  os().SetCurrentInstruction(kB, kAddress | kBranch);
  os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
       << PrintLabel(kCodeLocation, location, GetCodeAddress());
}

void Disassembler::bfc(Condition cond,
                       Register rd,
                       uint32_t lsb,
                       uint32_t width) {
  os().SetCurrentInstruction(kBfc, kShift);
  os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
}

void Disassembler::bfi(
    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
  os().SetCurrentInstruction(kBfi, kShift);
  os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
       << ImmediatePrinter(width);
}

void Disassembler::bic(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kBic, kBitwise);
  os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::bics(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kBics, kBitwise);
  os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::bkpt(Condition cond, uint32_t imm) {
  os().SetCurrentInstruction(kBkpt, kSystem);
  os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
       << RawImmediatePrinter(imm);
}

void Disassembler::bl(Condition cond, Location* location) {
  os().SetCurrentInstruction(kBl, kAddress | kBranch);
  os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
       << PrintLabel(kCodeLocation, location, GetCodeAddress());
}

void Disassembler::blx(Condition cond, Location* location) {
  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::blx(Condition cond, Register rm) {
  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
}

void Disassembler::bx(Condition cond, Register rm) {
  os().SetCurrentInstruction(kBx, kAddress | kBranch);
  os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
}

void Disassembler::bxj(Condition cond, Register rm) {
  os().SetCurrentInstruction(kBxj, kAddress | kBranch);
  os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
}

void Disassembler::cbnz(Register rn, Location* location) {
  os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
  os() << ToCString(kCbnz) << " " << rn << ", "
       << PrintLabel(kCodeLocation, location, GetCodeAddress());
}

void Disassembler::cbz(Register rn, Location* location) {
  os().SetCurrentInstruction(kCbz, kAddress | kBranch);
  os() << ToCString(kCbz) << " " << rn << ", "
       << PrintLabel(kCodeLocation, location, GetCodeAddress());
}

void Disassembler::clrex(Condition cond) {
  os().SetCurrentInstruction(kClrex, kNoAttribute);
  os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
}

void Disassembler::clz(Condition cond, Register rd, Register rm) {
  os().SetCurrentInstruction(kClz, kNoAttribute);
  os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rm;
}

void Disassembler::cmn(Condition cond,
                       EncodingSize size,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kCmn, kArithmetic);
  os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << ", " << operand;
}

void Disassembler::cmp(Condition cond,
                       EncodingSize size,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kCmp, kArithmetic);
  os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << ", " << operand;
}

void Disassembler::crc32b(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kCrc32b, kNoAttribute);
  os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::crc32cb(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
  os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::crc32ch(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
  os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::crc32cw(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
  os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::crc32h(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kCrc32h, kNoAttribute);
  os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::crc32w(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kCrc32w, kNoAttribute);
  os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::dmb(Condition cond, MemoryBarrier option) {
  os().SetCurrentInstruction(kDmb, kNoAttribute);
  os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
}

void Disassembler::dsb(Condition cond, MemoryBarrier option) {
  os().SetCurrentInstruction(kDsb, kNoAttribute);
  os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
}

void Disassembler::eor(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kEor, kBitwise);
  os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::eors(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kEors, kBitwise);
  os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::fldmdbx(Condition cond,
                           Register rn,
                           WriteBack write_back,
                           DRegisterList dreglist) {
  os().SetCurrentInstruction(kFldmdbx,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << dreglist;
}

void Disassembler::fldmiax(Condition cond,
                           Register rn,
                           WriteBack write_back,
                           DRegisterList dreglist) {
  os().SetCurrentInstruction(kFldmiax,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << dreglist;
}

void Disassembler::fstmdbx(Condition cond,
                           Register rn,
                           WriteBack write_back,
                           DRegisterList dreglist) {
  os().SetCurrentInstruction(kFstmdbx,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << dreglist;
}

void Disassembler::fstmiax(Condition cond,
                           Register rn,
                           WriteBack write_back,
                           DRegisterList dreglist) {
  os().SetCurrentInstruction(kFstmiax,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << dreglist;
}

void Disassembler::hlt(Condition cond, uint32_t imm) {
  os().SetCurrentInstruction(kHlt, kSystem);
  os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
       << RawImmediatePrinter(imm);
}

void Disassembler::hvc(Condition cond, uint32_t imm) {
  os().SetCurrentInstruction(kHvc, kSystem);
  os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
       << RawImmediatePrinter(imm);
}

void Disassembler::isb(Condition cond, MemoryBarrier option) {
  os().SetCurrentInstruction(kIsb, kNoAttribute);
  os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
}

void Disassembler::it(Condition cond, uint16_t mask) {
  os().SetCurrentInstruction(kIt, kNoAttribute);
  os() << ToCString(kIt);
  int count;
  if ((mask & 0x1) != 0) {
    count = 3;
  } else if ((mask & 0x2) != 0) {
    count = 2;
  } else if ((mask & 0x4) != 0) {
    count = 1;
  } else {
    count = 0;
  }
  uint16_t tmp = 0x8;
  uint16_t ref = (cond.GetCondition() & 0x1) << 3;
  while (count-- > 0) {
    os() << (((mask & tmp) == ref) ? "t" : "e");
    tmp >>= 1;
    ref >>= 1;
  }
  if (cond.Is(al)) {
    os() << " al";
  } else {
    os() << " " << cond;
  }
}

void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
  os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
  os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadWordLocation, operand);
}

void Disassembler::ldab(Condition cond,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
  os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadByteLocation, operand);
}

void Disassembler::ldaex(Condition cond,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
  os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadWordLocation, operand);
}

void Disassembler::ldaexb(Condition cond,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
  os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadByteLocation, operand);
}

void Disassembler::ldaexd(Condition cond,
                          Register rt,
                          Register rt2,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
  os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", "
       << PrintMemOperand(kLoadDoubleWordLocation, operand);
}

void Disassembler::ldaexh(Condition cond,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
  os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
}

void Disassembler::ldah(Condition cond,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
  os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
}

void Disassembler::ldm(Condition cond,
                       EncodingSize size,
                       Register rn,
                       WriteBack write_back,
                       RegisterList registers) {
  os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << write_back << ", " << registers;
}

void Disassembler::ldmda(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldmdb(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldmea(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldmed(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldmfa(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldmfd(Condition cond,
                         EncodingSize size,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << write_back << ", " << registers;
}

void Disassembler::ldmib(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::ldr(Condition cond,
                       EncodingSize size,
                       Register rt,
                       const MemOperand& operand) {
  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
}

void Disassembler::ldr(Condition cond,
                       EncodingSize size,
                       Register rt,
                       Location* location) {
  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", "
       << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::ldrb(Condition cond,
                        EncodingSize size,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
}

void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", "
       << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::ldrd(Condition cond,
                        Register rt,
                        Register rt2,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", "
       << PrintMemOperand(kLoadDoubleWordLocation, operand);
}

void Disassembler::ldrd(Condition cond,
                        Register rt,
                        Register rt2,
                        Location* location) {
  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", "
       << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::ldrex(Condition cond,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
  os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadWordLocation, operand);
}

void Disassembler::ldrexb(Condition cond,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
  os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadByteLocation, operand);
}

void Disassembler::ldrexd(Condition cond,
                          Register rt,
                          Register rt2,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
  os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", "
       << PrintMemOperand(kLoadDoubleWordLocation, operand);
}

void Disassembler::ldrexh(Condition cond,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
  os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
}

void Disassembler::ldrh(Condition cond,
                        EncodingSize size,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
}

void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", "
       << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::ldrsb(Condition cond,
                         EncodingSize size,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
}

void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", "
       << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::ldrsh(Condition cond,
                         EncodingSize size,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
}

void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintLabel(kLoadSignedHalfWordLocation,
                             location,
                             GetCodeAddress() & ~3);
}

void Disassembler::lsl(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rm,
                       const Operand& operand) {
  os().SetCurrentInstruction(kLsl, kShift);
  os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::lsls(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kLsls, kShift);
  os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::lsr(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rm,
                       const Operand& operand) {
  os().SetCurrentInstruction(kLsr, kShift);
  os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::lsrs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kLsrs, kShift);
  os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::mla(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kMla, kArithmetic);
  os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::mlas(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kMlas, kArithmetic);
  os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::mls(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kMls, kArithmetic);
  os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::mov(Condition cond,
                       EncodingSize size,
                       Register rd,
                       const Operand& operand) {
  os().SetCurrentInstruction(kMov, kNoAttribute);
  os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << operand;
}

void Disassembler::movs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kMovs, kNoAttribute);
  os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << operand;
}

void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kMovt, kNoAttribute);
  os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << operand;
}

void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kMovw, kNoAttribute);
  os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << operand;
}

void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
  os().SetCurrentInstruction(kMrs, kNoAttribute);
  os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << spec_reg;
}

void Disassembler::msr(Condition cond,
                       MaskedSpecialRegister spec_reg,
                       const Operand& operand) {
  os().SetCurrentInstruction(kMsr, kNoAttribute);
  os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
       << spec_reg << ", " << operand;
}

void Disassembler::mul(
    Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kMul, kArithmetic);
  os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kMuls, kArithmetic);
  os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm;
}

void Disassembler::mvn(Condition cond,
                       EncodingSize size,
                       Register rd,
                       const Operand& operand) {
  os().SetCurrentInstruction(kMvn, kNoAttribute);
  os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << operand;
}

void Disassembler::mvns(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kMvns, kNoAttribute);
  os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << operand;
}

void Disassembler::nop(Condition cond, EncodingSize size) {
  os().SetCurrentInstruction(kNop, kNoAttribute);
  os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
}

void Disassembler::orn(Condition cond,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kOrn, kBitwise);
  os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::orns(Condition cond,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kOrns, kBitwise);
  os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::orr(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kOrr, kBitwise);
  os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::orrs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kOrrs, kBitwise);
  os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::pkhbt(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kPkhbt, kNoAttribute);
  os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::pkhtb(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kPkhtb, kNoAttribute);
  os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::pld(Condition cond, Location* location) {
  os().SetCurrentInstruction(kPld, kAddress);
  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
       << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::pld(Condition cond, const MemOperand& operand) {
  os().SetCurrentInstruction(kPld, kAddress);
  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
       << PrintMemOperand(kDataLocation, operand);
}

void Disassembler::pldw(Condition cond, const MemOperand& operand) {
  os().SetCurrentInstruction(kPldw, kAddress);
  os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
       << PrintMemOperand(kDataLocation, operand);
}

void Disassembler::pli(Condition cond, const MemOperand& operand) {
  os().SetCurrentInstruction(kPli, kAddress);
  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
       << PrintMemOperand(kCodeLocation, operand);
}

void Disassembler::pli(Condition cond, Location* location) {
  os().SetCurrentInstruction(kPli, kAddress);
  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
}

void Disassembler::pop(Condition cond,
                       EncodingSize size,
                       RegisterList registers) {
  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
       << registers;
}

void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
       << "{" << rt << "}";
}

void Disassembler::push(Condition cond,
                        EncodingSize size,
                        RegisterList registers) {
  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
       << registers;
}

void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
       << "{" << rt << "}";
}

void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
  os().SetCurrentInstruction(kQadd, kArithmetic);
  os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::qadd16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kQadd16, kArithmetic);
  os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::qadd8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kQadd8, kArithmetic);
  os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kQasx, kArithmetic);
  os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::qdadd(Condition cond,
                         Register rd,
                         Register rm,
                         Register rn) {
  os().SetCurrentInstruction(kQdadd, kArithmetic);
  os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::qdsub(Condition cond,
                         Register rd,
                         Register rm,
                         Register rn) {
  os().SetCurrentInstruction(kQdsub, kArithmetic);
  os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kQsax, kArithmetic);
  os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
  os().SetCurrentInstruction(kQsub, kArithmetic);
  os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::qsub16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kQsub16, kArithmetic);
  os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::qsub8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kQsub8, kArithmetic);
  os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::rbit(Condition cond, Register rd, Register rm) {
  os().SetCurrentInstruction(kRbit, kNoAttribute);
  os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rm;
}

void Disassembler::rev(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rm) {
  os().SetCurrentInstruction(kRev, kNoAttribute);
  os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << rm;
}

void Disassembler::rev16(Condition cond,
                         EncodingSize size,
                         Register rd,
                         Register rm) {
  os().SetCurrentInstruction(kRev16, kNoAttribute);
  os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << rm;
}

void Disassembler::revsh(Condition cond,
                         EncodingSize size,
                         Register rd,
                         Register rm) {
  os().SetCurrentInstruction(kRevsh, kNoAttribute);
  os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
       << rd << ", " << rm;
}

void Disassembler::ror(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rm,
                       const Operand& operand) {
  os().SetCurrentInstruction(kRor, kShift);
  os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::rors(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kRors, kShift);
  os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::rrx(Condition cond, Register rd, Register rm) {
  os().SetCurrentInstruction(kRrx, kShift);
  os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm;
}

void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
  os().SetCurrentInstruction(kRrxs, kShift);
  os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm;
}

void Disassembler::rsb(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kRsb, kArithmetic);
  os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::rsbs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kRsbs, kArithmetic);
  os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::rsc(Condition cond,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kRsc, kArithmetic);
  os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::rscs(Condition cond,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kRscs, kArithmetic);
  os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sadd16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSadd16, kArithmetic);
  os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::sadd8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kSadd8, kArithmetic);
  os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kSasx, kArithmetic);
  os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::sbc(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kSbc, kArithmetic);
  os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sbcs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSbcs, kArithmetic);
  os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sbfx(
    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
  os().SetCurrentInstruction(kSbfx, kShift);
  os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
       << ImmediatePrinter(width);
}

void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kSdiv, kArithmetic);
  os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kSel, kNoAttribute);
  os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shadd16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kShadd16, kArithmetic);
  os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shadd8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kShadd8, kArithmetic);
  os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shasx(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kShasx, kArithmetic);
  os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shsax(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kShsax, kArithmetic);
  os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shsub16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kShsub16, kArithmetic);
  os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::shsub8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kShsub8, kArithmetic);
  os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smlabb(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlabb, kArithmetic);
  os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlabt(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlabt, kArithmetic);
  os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlad(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlad, kArithmetic);
  os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smladx(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmladx, kArithmetic);
  os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlal(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlal, kArithmetic);
  os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlalbb(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlalbb, kArithmetic);
  os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlalbt(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlalbt, kArithmetic);
  os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlald(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlald, kArithmetic);
  os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlaldx(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlaldx, kArithmetic);
  os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlals(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlals, kArithmetic);
  os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlaltb(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlaltb, kArithmetic);
  os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlaltt(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlaltt, kArithmetic);
  os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlatb(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlatb, kArithmetic);
  os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlatt(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlatt, kArithmetic);
  os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlawb(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlawb, kArithmetic);
  os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlawt(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlawt, kArithmetic);
  os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlsd(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlsd, kArithmetic);
  os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlsdx(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmlsdx, kArithmetic);
  os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smlsld(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlsld, kArithmetic);
  os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smlsldx(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmlsldx, kArithmetic);
  os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smmla(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmmla, kArithmetic);
  os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smmlar(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmmlar, kArithmetic);
  os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smmls(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmmls, kArithmetic);
  os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smmlsr(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kSmmlsr, kArithmetic);
  os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::smmul(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kSmmul, kArithmetic);
  os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smmulr(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmmulr, kArithmetic);
  os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smuad(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kSmuad, kArithmetic);
  os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smuadx(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmuadx, kArithmetic);
  os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smulbb(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmulbb, kArithmetic);
  os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smulbt(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmulbt, kArithmetic);
  os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smull(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmull, kArithmetic);
  os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smulls(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kSmulls, kArithmetic);
  os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::smultb(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmultb, kArithmetic);
  os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smultt(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmultt, kArithmetic);
  os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smulwb(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmulwb, kArithmetic);
  os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smulwt(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmulwt, kArithmetic);
  os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smusd(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kSmusd, kArithmetic);
  os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::smusdx(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSmusdx, kArithmetic);
  os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::ssat(Condition cond,
                        Register rd,
                        uint32_t imm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSsat, kArithmetic);
  os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << ImmediatePrinter(imm) << ", " << operand;
}

void Disassembler::ssat16(Condition cond,
                          Register rd,
                          uint32_t imm,
                          Register rn) {
  os().SetCurrentInstruction(kSsat16, kArithmetic);
  os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << ImmediatePrinter(imm) << ", " << rn;
}

void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kSsax, kArithmetic);
  os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::ssub16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kSsub16, kArithmetic);
  os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::ssub8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kSsub8, kArithmetic);
  os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
  os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
  os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kStoreWordLocation, operand);
}

void Disassembler::stlb(Condition cond,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
  os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kStoreByteLocation, operand);
}

void Disassembler::stlex(Condition cond,
                         Register rd,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
  os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
}

void Disassembler::stlexb(Condition cond,
                          Register rd,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
  os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
}

void Disassembler::stlexd(Condition cond,
                          Register rd,
                          Register rt,
                          Register rt2,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
  os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << rt2 << ", "
       << PrintMemOperand(kStoreDoubleWordLocation, operand);
}

void Disassembler::stlexh(Condition cond,
                          Register rd,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
  os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", "
       << PrintMemOperand(kStoreHalfWordLocation, operand);
}

void Disassembler::stlh(Condition cond,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
  os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
}

void Disassembler::stm(Condition cond,
                       EncodingSize size,
                       Register rn,
                       WriteBack write_back,
                       RegisterList registers) {
  os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << write_back << ", " << registers;
}

void Disassembler::stmda(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::stmdb(Condition cond,
                         EncodingSize size,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << write_back << ", " << registers;
}

void Disassembler::stmea(Condition cond,
                         EncodingSize size,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << write_back << ", " << registers;
}

void Disassembler::stmed(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::stmfa(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::stmfd(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::stmib(Condition cond,
                         Register rn,
                         WriteBack write_back,
                         RegisterList registers) {
  os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
  os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
       << write_back << ", " << registers;
}

void Disassembler::str(Condition cond,
                       EncodingSize size,
                       Register rt,
                       const MemOperand& operand) {
  os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
  os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
}

void Disassembler::strb(Condition cond,
                        EncodingSize size,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
  os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
}

void Disassembler::strd(Condition cond,
                        Register rt,
                        Register rt2,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
  os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", "
       << PrintMemOperand(kStoreDoubleWordLocation, operand);
}

void Disassembler::strex(Condition cond,
                         Register rd,
                         Register rt,
                         const MemOperand& operand) {
  os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
  os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
}

void Disassembler::strexb(Condition cond,
                          Register rd,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
  os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
}

void Disassembler::strexd(Condition cond,
                          Register rd,
                          Register rt,
                          Register rt2,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
  os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", " << rt2 << ", "
       << PrintMemOperand(kStoreDoubleWordLocation, operand);
}

void Disassembler::strexh(Condition cond,
                          Register rd,
                          Register rt,
                          const MemOperand& operand) {
  os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
  os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rt << ", "
       << PrintMemOperand(kStoreHalfWordLocation, operand);
}

void Disassembler::strh(Condition cond,
                        EncodingSize size,
                        Register rt,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
  os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
       << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
}

void Disassembler::sub(Condition cond,
                       EncodingSize size,
                       Register rd,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kSub, kArithmetic);
  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kSub, kArithmetic);
  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << operand;
}

void Disassembler::subs(Condition cond,
                        EncodingSize size,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSubs, kArithmetic);
  os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::subs(Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kSubs, kArithmetic);
  os() << ToCString(kSubs) << " " << rd << ", " << operand;
}

void Disassembler::subw(Condition cond,
                        Register rd,
                        Register rn,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSubw, kArithmetic);
  os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::svc(Condition cond, uint32_t imm) {
  os().SetCurrentInstruction(kSvc, kSystem);
  os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
       << RawImmediatePrinter(imm);
}

void Disassembler::sxtab(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kSxtab, kArithmetic);
  os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sxtab16(Condition cond,
                           Register rd,
                           Register rn,
                           const Operand& operand) {
  os().SetCurrentInstruction(kSxtab16, kArithmetic);
  os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sxtah(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kSxtah, kArithmetic);
  os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::sxtb(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSxtb, kArithmetic);
  os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kSxtb16, kArithmetic);
  os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::sxth(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kSxth, kArithmetic);
  os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::tbb(Condition cond, Register rn, Register rm) {
  os().SetCurrentInstruction(kTbb, kBranch);
  os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
       << MemOperand(rn, rm);
}

void Disassembler::tbh(Condition cond, Register rn, Register rm) {
  os().SetCurrentInstruction(kTbh, kBranch);
  os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
       << MemOperand(rn, plus, rm, LSL, 1);
}

void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
  os().SetCurrentInstruction(kTeq, kBitwise);
  os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
       << ", " << operand;
}

void Disassembler::tst(Condition cond,
                       EncodingSize size,
                       Register rn,
                       const Operand& operand) {
  os().SetCurrentInstruction(kTst, kBitwise);
  os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
       << rn << ", " << operand;
}

void Disassembler::uadd16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUadd16, kArithmetic);
  os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uadd8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUadd8, kArithmetic);
  os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kUasx, kArithmetic);
  os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::ubfx(
    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
  os().SetCurrentInstruction(kUbfx, kShift);
  os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
       << ImmediatePrinter(width);
}

void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
  os().SetCurrentInstruction(kUdf, kNoAttribute);
  os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
       << RawImmediatePrinter(imm);
}

void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kUdiv, kArithmetic);
  os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhadd16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kUhadd16, kArithmetic);
  os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhadd8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUhadd8, kArithmetic);
  os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhasx(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUhasx, kArithmetic);
  os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhsax(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUhsax, kArithmetic);
  os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhsub16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kUhsub16, kArithmetic);
  os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uhsub8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUhsub8, kArithmetic);
  os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::umaal(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kUmaal, kArithmetic);
  os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::umlal(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kUmlal, kArithmetic);
  os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::umlals(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kUmlals, kArithmetic);
  os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::umull(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kUmull, kArithmetic);
  os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::umulls(
    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
  os().SetCurrentInstruction(kUmulls, kArithmetic);
  os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
       << ", " << rdhi << ", " << rn << ", " << rm;
}

void Disassembler::uqadd16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kUqadd16, kArithmetic);
  os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uqadd8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUqadd8, kArithmetic);
  os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uqasx(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUqasx, kArithmetic);
  os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uqsax(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUqsax, kArithmetic);
  os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uqsub16(Condition cond,
                           Register rd,
                           Register rn,
                           Register rm) {
  os().SetCurrentInstruction(kUqsub16, kArithmetic);
  os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uqsub8(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUqsub8, kArithmetic);
  os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::usad8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUsad8, kArithmetic);
  os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::usada8(
    Condition cond, Register rd, Register rn, Register rm, Register ra) {
  os().SetCurrentInstruction(kUsada8, kArithmetic);
  os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << rn << ", " << rm << ", " << ra;
}

void Disassembler::usat(Condition cond,
                        Register rd,
                        uint32_t imm,
                        const Operand& operand) {
  os().SetCurrentInstruction(kUsat, kArithmetic);
  os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << ImmediatePrinter(imm) << ", " << operand;
}

void Disassembler::usat16(Condition cond,
                          Register rd,
                          uint32_t imm,
                          Register rn) {
  os().SetCurrentInstruction(kUsat16, kArithmetic);
  os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
       << ", " << ImmediatePrinter(imm) << ", " << rn;
}

void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
  os().SetCurrentInstruction(kUsax, kArithmetic);
  os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::usub16(Condition cond,
                          Register rd,
                          Register rn,
                          Register rm) {
  os().SetCurrentInstruction(kUsub16, kArithmetic);
  os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::usub8(Condition cond,
                         Register rd,
                         Register rn,
                         Register rm) {
  os().SetCurrentInstruction(kUsub8, kArithmetic);
  os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::uxtab(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kUxtab, kArithmetic);
  os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::uxtab16(Condition cond,
                           Register rd,
                           Register rn,
                           const Operand& operand) {
  os().SetCurrentInstruction(kUxtab16, kArithmetic);
  os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::uxtah(Condition cond,
                         Register rd,
                         Register rn,
                         const Operand& operand) {
  os().SetCurrentInstruction(kUxtah, kArithmetic);
  os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::uxtb(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kUxtb, kArithmetic);
  os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
  os().SetCurrentInstruction(kUxtb16, kArithmetic);
  os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::uxth(Condition cond,
                        EncodingSize size,
                        Register rd,
                        const Operand& operand) {
  os().SetCurrentInstruction(kUxth, kArithmetic);
  os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
  os() << " ";
  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << operand;
}

void Disassembler::vaba(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVaba, kFpNeon);
  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vaba(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVaba, kFpNeon);
  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vabal(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVabal, kFpNeon);
  os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vabd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVabd, kFpNeon);
  os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vabd(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVabd, kFpNeon);
  os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vabdl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVabdl, kFpNeon);
  os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vabs(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVabs, kFpNeon);
  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vabs(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVabs, kFpNeon);
  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vabs(Condition cond,
                        DataType dt,
                        SRegister rd,
                        SRegister rm) {
  os().SetCurrentInstruction(kVabs, kFpNeon);
  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vacge(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVacge, kFpNeon);
  os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vacge(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVacge, kFpNeon);
  os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vacgt(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVacgt, kFpNeon);
  os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vacgt(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVacgt, kFpNeon);
  os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vacle(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVacle, kFpNeon);
  os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vacle(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVacle, kFpNeon);
  os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vaclt(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVaclt, kFpNeon);
  os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vaclt(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVaclt, kFpNeon);
  os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vadd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVadd, kFpNeon);
  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vadd(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVadd, kFpNeon);
  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vadd(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVadd, kFpNeon);
  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vaddhn(
    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVaddhn, kFpNeon);
  os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vaddl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVaddl, kFpNeon);
  os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vaddw(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVaddw, kFpNeon);
  os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vand(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVand, kFpNeon);
  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vand(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVand, kFpNeon);
  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vbic(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVbic, kFpNeon);
  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vbic(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVbic, kFpNeon);
  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vbif(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVbif, kFpNeon);
  os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vbif(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVbif, kFpNeon);
  os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vbit(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVbit, kFpNeon);
  os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vbit(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVbit, kFpNeon);
  os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vbsl(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVbsl, kFpNeon);
  os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vbsl(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVbsl, kFpNeon);
  os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vceq(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVceq, kFpNeon);
  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vceq(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVceq, kFpNeon);
  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vceq(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVceq, kFpNeon);
  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vceq(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVceq, kFpNeon);
  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcge(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVcge, kFpNeon);
  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcge(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVcge, kFpNeon);
  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcge(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVcge, kFpNeon);
  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcge(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVcge, kFpNeon);
  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcgt(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVcgt, kFpNeon);
  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcgt(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVcgt, kFpNeon);
  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcgt(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVcgt, kFpNeon);
  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcgt(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVcgt, kFpNeon);
  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcle(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVcle, kFpNeon);
  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcle(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVcle, kFpNeon);
  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vcle(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVcle, kFpNeon);
  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcle(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVcle, kFpNeon);
  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vcls(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVcls, kFpNeon);
  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vcls(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVcls, kFpNeon);
  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vclt(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVclt, kFpNeon);
  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vclt(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVclt, kFpNeon);
  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vclt(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVclt, kFpNeon);
  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vclt(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVclt, kFpNeon);
  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vclz(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVclz, kFpNeon);
  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vclz(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVclz, kFpNeon);
  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vcmp(Condition cond,
                        DataType dt,
                        SRegister rd,
                        const SOperand& operand) {
  os().SetCurrentInstruction(kVcmp, kFpNeon);
  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vcmp(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVcmp, kFpNeon);
  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vcmpe(Condition cond,
                         DataType dt,
                         SRegister rd,
                         const SOperand& operand) {
  os().SetCurrentInstruction(kVcmpe, kFpNeon);
  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vcmpe(Condition cond,
                         DataType dt,
                         DRegister rd,
                         const DOperand& operand) {
  os().SetCurrentInstruction(kVcmpe, kFpNeon);
  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vcnt(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVcnt, kFpNeon);
  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vcnt(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVcnt, kFpNeon);
  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(Condition cond,
                        DataType dt1,
                        DataType dt2,
                        DRegister rd,
                        DRegister rm,
                        int32_t fbits) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
}

void Disassembler::vcvt(Condition cond,
                        DataType dt1,
                        DataType dt2,
                        QRegister rd,
                        QRegister rm,
                        int32_t fbits) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
}

void Disassembler::vcvt(Condition cond,
                        DataType dt1,
                        DataType dt2,
                        SRegister rd,
                        SRegister rm,
                        int32_t fbits) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvt(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvt, kFpNeon);
  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvta(DataType dt1,
                         DataType dt2,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvta, kFpNeon);
  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvta(DataType dt1,
                         DataType dt2,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVcvta, kFpNeon);
  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvta(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         SRegister rm) {
  os().SetCurrentInstruction(kVcvta, kFpNeon);
  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvta(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvta, kFpNeon);
  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtb(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvtb, kFpNeon);
  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtb(
    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvtb, kFpNeon);
  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtb(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvtb, kFpNeon);
  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtm(DataType dt1,
                         DataType dt2,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtm, kFpNeon);
  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtm(DataType dt1,
                         DataType dt2,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVcvtm, kFpNeon);
  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtm(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         SRegister rm) {
  os().SetCurrentInstruction(kVcvtm, kFpNeon);
  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtm(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtm, kFpNeon);
  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtn(DataType dt1,
                         DataType dt2,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtn, kFpNeon);
  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtn(DataType dt1,
                         DataType dt2,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVcvtn, kFpNeon);
  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtn(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         SRegister rm) {
  os().SetCurrentInstruction(kVcvtn, kFpNeon);
  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtn(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtn, kFpNeon);
  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtp(DataType dt1,
                         DataType dt2,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtp, kFpNeon);
  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtp(DataType dt1,
                         DataType dt2,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVcvtp, kFpNeon);
  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtp(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         SRegister rm) {
  os().SetCurrentInstruction(kVcvtp, kFpNeon);
  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtp(DataType dt1,
                         DataType dt2,
                         SRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVcvtp, kFpNeon);
  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
}

void Disassembler::vcvtr(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvtr, kFpNeon);
  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtr(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvtr, kFpNeon);
  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtt(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvtt, kFpNeon);
  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtt(
    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVcvtt, kFpNeon);
  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vcvtt(
    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVcvtt, kFpNeon);
  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
       << " " << rd << ", " << rm;
}

void Disassembler::vdiv(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVdiv, kFpNeon);
  os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vdiv(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVdiv, kFpNeon);
  os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vdup(Condition cond,
                        DataType dt,
                        QRegister rd,
                        Register rt) {
  os().SetCurrentInstruction(kVdup, kFpNeon);
  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rt;
}

void Disassembler::vdup(Condition cond,
                        DataType dt,
                        DRegister rd,
                        Register rt) {
  os().SetCurrentInstruction(kVdup, kFpNeon);
  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rt;
}

void Disassembler::vdup(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegisterLane rm) {
  os().SetCurrentInstruction(kVdup, kFpNeon);
  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vdup(Condition cond,
                        DataType dt,
                        QRegister rd,
                        DRegisterLane rm) {
  os().SetCurrentInstruction(kVdup, kFpNeon);
  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::veor(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVeor, kFpNeon);
  os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::veor(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVeor, kFpNeon);
  os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vext(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVext, kFpNeon);
  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm << ", " << operand;
}

void Disassembler::vext(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVext, kFpNeon);
  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm << ", " << operand;
}

void Disassembler::vfma(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVfma, kFpNeon);
  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfma(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVfma, kFpNeon);
  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfma(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVfma, kFpNeon);
  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfms(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVfms, kFpNeon);
  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfms(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVfms, kFpNeon);
  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfms(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVfms, kFpNeon);
  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfnma(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVfnma, kFpNeon);
  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfnma(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVfnma, kFpNeon);
  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfnms(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVfnms, kFpNeon);
  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vfnms(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVfnms, kFpNeon);
  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vhadd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVhadd, kFpNeon);
  os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vhadd(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVhadd, kFpNeon);
  os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vhsub(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVhsub, kFpNeon);
  os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vhsub(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVhsub, kFpNeon);
  os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vld1(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVld1, kFpNeon);
  os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
}

void Disassembler::vld2(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVld2, kFpNeon);
  os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
}

void Disassembler::vld3(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVld3, kFpNeon);
  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
}

void Disassembler::vld3(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVld3, kFpNeon);
  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
}

void Disassembler::vld4(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVld4, kFpNeon);
  os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
}

void Disassembler::vldm(Condition cond,
                        DataType dt,
                        Register rn,
                        WriteBack write_back,
                        DRegisterList dreglist) {
  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vldm(Condition cond,
                        DataType dt,
                        Register rn,
                        WriteBack write_back,
                        SRegisterList sreglist) {
  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vldmdb(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          DRegisterList dreglist) {
  os().SetCurrentInstruction(kVldmdb,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vldmdb(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          SRegisterList sreglist) {
  os().SetCurrentInstruction(kVldmdb,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vldmia(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          DRegisterList dreglist) {
  os().SetCurrentInstruction(kVldmia,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vldmia(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          SRegisterList sreglist) {
  os().SetCurrentInstruction(kVldmia,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vldr(Condition cond,
                        DataType dt,
                        DRegister rd,
                        Location* location) {
  os().SetCurrentInstruction(kVldr, kFpNeon);
  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped64) << " " << rd << ", "
       << PrintLabel(kLoadDoublePrecisionLocation,
                     location,
                     GetCodeAddress() & ~3);
}

void Disassembler::vldr(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVldr, kFpNeon);
  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped64) << " " << rd << ", "
       << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
}

void Disassembler::vldr(Condition cond,
                        DataType dt,
                        SRegister rd,
                        Location* location) {
  os().SetCurrentInstruction(kVldr, kFpNeon);
  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped32) << " " << rd << ", "
       << PrintLabel(kLoadSinglePrecisionLocation,
                     location,
                     GetCodeAddress() & ~3);
}

void Disassembler::vldr(Condition cond,
                        DataType dt,
                        SRegister rd,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVldr, kFpNeon);
  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped32) << " " << rd << ", "
       << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
}

void Disassembler::vmax(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmax, kFpNeon);
  os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmax(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVmax, kFpNeon);
  os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmaxnm(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmaxnm(DataType dt,
                          QRegister rd,
                          QRegister rn,
                          QRegister rm) {
  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmaxnm(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmin(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmin, kFpNeon);
  os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmin(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVmin, kFpNeon);
  os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vminnm(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVminnm, kFpNeon);
  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vminnm(DataType dt,
                          QRegister rd,
                          QRegister rn,
                          QRegister rm) {
  os().SetCurrentInstruction(kVminnm, kFpNeon);
  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vminnm(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVminnm, kFpNeon);
  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmla(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmla, kFpNeon);
  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmla(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmla, kFpNeon);
  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmla(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmla, kFpNeon);
  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmla(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVmla, kFpNeon);
  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmla(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVmla, kFpNeon);
  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmlal(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmlal, kFpNeon);
  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmlal(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmlal, kFpNeon);
  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmls(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmls, kFpNeon);
  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmls(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmls, kFpNeon);
  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmls(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmls, kFpNeon);
  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmls(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVmls, kFpNeon);
  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmls(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVmls, kFpNeon);
  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmlsl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVmlsl, kFpNeon);
  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmlsl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmlsl, kFpNeon);
  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rn;
}

void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
       << ", " << rt;
}

void Disassembler::vmov(Condition cond,
                        Register rt,
                        Register rt2,
                        DRegister rm) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", " << rm;
}

void Disassembler::vmov(Condition cond,
                        DRegister rm,
                        Register rt,
                        Register rt2) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
       << ", " << rt << ", " << rt2;
}

void Disassembler::vmov(
    Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << rt2 << ", " << rm << ", " << rm1;
}

void Disassembler::vmov(
    Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
       << ", " << rm1 << ", " << rt << ", " << rt2;
}

void Disassembler::vmov(Condition cond,
                        DataType dt,
                        DRegisterLane rd,
                        Register rt) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rt;
}

void Disassembler::vmov(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vmov(Condition cond,
                        DataType dt,
                        QRegister rd,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vmov(Condition cond,
                        DataType dt,
                        SRegister rd,
                        const SOperand& operand) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vmov(Condition cond,
                        DataType dt,
                        Register rt,
                        DRegisterLane rn) {
  os().SetCurrentInstruction(kVmov, kFpNeon);
  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
       << rt << ", " << rn;
}

void Disassembler::vmovl(Condition cond,
                         DataType dt,
                         QRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVmovl, kFpNeon);
  os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vmovn(Condition cond,
                         DataType dt,
                         DRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVmovn, kFpNeon);
  os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vmrs(Condition cond,
                        RegisterOrAPSR_nzcv rt,
                        SpecialFPRegister spec_reg) {
  os().SetCurrentInstruction(kVmrs, kFpNeon);
  os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
       << ", " << spec_reg;
}

void Disassembler::vmsr(Condition cond,
                        SpecialFPRegister spec_reg,
                        Register rt) {
  os().SetCurrentInstruction(kVmsr, kFpNeon);
  os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
       << spec_reg << ", " << rt;
}

void Disassembler::vmul(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        DRegister dm,
                        unsigned index) {
  os().SetCurrentInstruction(kVmul, kFpNeon);
  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
}

void Disassembler::vmul(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        DRegister dm,
                        unsigned index) {
  os().SetCurrentInstruction(kVmul, kFpNeon);
  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
}

void Disassembler::vmul(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmul, kFpNeon);
  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmul(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVmul, kFpNeon);
  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmul(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVmul, kFpNeon);
  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vmull(Condition cond,
                         DataType dt,
                         QRegister rd,
                         DRegister rn,
                         DRegister dm,
                         unsigned index) {
  os().SetCurrentInstruction(kVmull, kFpNeon);
  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
}

void Disassembler::vmull(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVmull, kFpNeon);
  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vmvn(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVmvn, kFpNeon);
  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vmvn(Condition cond,
                        DataType dt,
                        QRegister rd,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVmvn, kFpNeon);
  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << operand;
}

void Disassembler::vneg(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVneg, kFpNeon);
  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vneg(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVneg, kFpNeon);
  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vneg(Condition cond,
                        DataType dt,
                        SRegister rd,
                        SRegister rm) {
  os().SetCurrentInstruction(kVneg, kFpNeon);
  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vnmla(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVnmla, kFpNeon);
  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vnmla(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVnmla, kFpNeon);
  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vnmls(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVnmls, kFpNeon);
  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vnmls(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVnmls, kFpNeon);
  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vnmul(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVnmul, kFpNeon);
  os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vnmul(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVnmul, kFpNeon);
  os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vorn(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVorn, kFpNeon);
  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vorn(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVorn, kFpNeon);
  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vorr(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rn,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVorr, kFpNeon);
  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vorr(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rn,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVorr, kFpNeon);
  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << operand;
}

void Disassembler::vpadal(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVpadal, kFpNeon);
  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vpadal(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVpadal, kFpNeon);
  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vpadd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVpadd, kFpNeon);
  os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vpaddl(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVpaddl, kFpNeon);
  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vpaddl(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVpaddl, kFpNeon);
  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vpmax(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVpmax, kFpNeon);
  os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vpmin(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVpmin, kFpNeon);
  os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
       << dreglist;
}

void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
       << sreglist;
}

void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
       << dreglist;
}

void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
       << sreglist;
}

void Disassembler::vqabs(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVqabs, kFpNeon);
  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqabs(Condition cond,
                         DataType dt,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVqabs, kFpNeon);
  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqadd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqadd, kFpNeon);
  os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqadd(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVqadd, kFpNeon);
  os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqdmlal(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vqdmlal(Condition cond,
                           DataType dt,
                           QRegister rd,
                           DRegister rn,
                           DRegister dm,
                           unsigned index) {
  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
}

void Disassembler::vqdmlsl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vqdmlsl(Condition cond,
                           DataType dt,
                           QRegister rd,
                           DRegister rn,
                           DRegister dm,
                           unsigned index) {
  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
}

void Disassembler::vqdmulh(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqdmulh(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqdmulh(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqdmulh(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqdmull(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqdmull, kFpNeon);
  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vqdmull(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVqdmull, kFpNeon);
  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vqmovn(Condition cond,
                          DataType dt,
                          DRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVqmovn, kFpNeon);
  os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqmovun(Condition cond,
                           DataType dt,
                           DRegister rd,
                           QRegister rm) {
  os().SetCurrentInstruction(kVqmovun, kFpNeon);
  os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqneg(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVqneg, kFpNeon);
  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqneg(Condition cond,
                         DataType dt,
                         QRegister rd,
                         QRegister rm) {
  os().SetCurrentInstruction(kVqneg, kFpNeon);
  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vqrdmulh(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqrdmulh(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqrdmulh(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqrdmulh(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqrshl(
    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
  os().SetCurrentInstruction(kVqrshl, kFpNeon);
  os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::vqrshl(
    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
  os().SetCurrentInstruction(kVqrshl, kFpNeon);
  os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::vqrshrn(Condition cond,
                           DataType dt,
                           DRegister rd,
                           QRegister rm,
                           const QOperand& operand) {
  os().SetCurrentInstruction(kVqrshrn, kFpNeon);
  os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vqrshrun(Condition cond,
                            DataType dt,
                            DRegister rd,
                            QRegister rm,
                            const QOperand& operand) {
  os().SetCurrentInstruction(kVqrshrun, kFpNeon);
  os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vqshl(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm,
                         const DOperand& operand) {
  os().SetCurrentInstruction(kVqshl, kFpNeon);
  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vqshl(Condition cond,
                         DataType dt,
                         QRegister rd,
                         QRegister rm,
                         const QOperand& operand) {
  os().SetCurrentInstruction(kVqshl, kFpNeon);
  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vqshlu(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm,
                          const DOperand& operand) {
  os().SetCurrentInstruction(kVqshlu, kFpNeon);
  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vqshlu(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm,
                          const QOperand& operand) {
  os().SetCurrentInstruction(kVqshlu, kFpNeon);
  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vqshrn(Condition cond,
                          DataType dt,
                          DRegister rd,
                          QRegister rm,
                          const QOperand& operand) {
  os().SetCurrentInstruction(kVqshrn, kFpNeon);
  os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vqshrun(Condition cond,
                           DataType dt,
                           DRegister rd,
                           QRegister rm,
                           const QOperand& operand) {
  os().SetCurrentInstruction(kVqshrun, kFpNeon);
  os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vqsub(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVqsub, kFpNeon);
  os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vqsub(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVqsub, kFpNeon);
  os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vraddhn(
    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVraddhn, kFpNeon);
  os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vrecpe(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrecpe, kFpNeon);
  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrecpe(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVrecpe, kFpNeon);
  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrecps(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVrecps, kFpNeon);
  os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrecps(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVrecps, kFpNeon);
  os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrev16(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrev16, kFpNeon);
  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrev16(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVrev16, kFpNeon);
  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrev32(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrev32, kFpNeon);
  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrev32(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVrev32, kFpNeon);
  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrev64(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrev64, kFpNeon);
  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrev64(Condition cond,
                          DataType dt,
                          QRegister rd,
                          QRegister rm) {
  os().SetCurrentInstruction(kVrev64, kFpNeon);
  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrhadd(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVrhadd, kFpNeon);
  os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrhadd(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVrhadd, kFpNeon);
  os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVrinta, kFpNeon);
  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrinta, kFpNeon);
  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVrinta, kFpNeon);
  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVrintm, kFpNeon);
  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrintm, kFpNeon);
  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVrintm, kFpNeon);
  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVrintn, kFpNeon);
  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrintn, kFpNeon);
  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVrintn, kFpNeon);
  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) {
  os().SetCurrentInstruction(kVrintp, kFpNeon);
  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrintp, kFpNeon);
  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) {
  os().SetCurrentInstruction(kVrintp, kFpNeon);
  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintr(Condition cond,
                          DataType dt,
                          SRegister rd,
                          SRegister rm) {
  os().SetCurrentInstruction(kVrintr, kFpNeon);
  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrintr(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrintr, kFpNeon);
  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrintx(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrintx, kFpNeon);
  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrintx, kFpNeon);
  os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintx(Condition cond,
                          DataType dt,
                          SRegister rd,
                          SRegister rm) {
  os().SetCurrentInstruction(kVrintx, kFpNeon);
  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrintz(Condition cond,
                          DataType dt,
                          DRegister rd,
                          DRegister rm) {
  os().SetCurrentInstruction(kVrintz, kFpNeon);
  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) {
  os().SetCurrentInstruction(kVrintz, kFpNeon);
  os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm;
}

void Disassembler::vrintz(Condition cond,
                          DataType dt,
                          SRegister rd,
                          SRegister rm) {
  os().SetCurrentInstruction(kVrintz, kFpNeon);
  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrshl(
    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
  os().SetCurrentInstruction(kVrshl, kFpNeon);
  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::vrshl(
    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
  os().SetCurrentInstruction(kVrshl, kFpNeon);
  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << rn;
}

void Disassembler::vrshr(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm,
                         const DOperand& operand) {
  os().SetCurrentInstruction(kVrshr, kFpNeon);
  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vrshr(Condition cond,
                         DataType dt,
                         QRegister rd,
                         QRegister rm,
                         const QOperand& operand) {
  os().SetCurrentInstruction(kVrshr, kFpNeon);
  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vrshrn(Condition cond,
                          DataType dt,
                          DRegister rd,
                          QRegister rm,
                          const QOperand& operand) {
  os().SetCurrentInstruction(kVrshrn, kFpNeon);
  os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vrsqrte(Condition cond,
                           DataType dt,
                           DRegister rd,
                           DRegister rm) {
  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrsqrte(Condition cond,
                           DataType dt,
                           QRegister rd,
                           QRegister rm) {
  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vrsqrts(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrsqrts(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vrsra(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm,
                         const DOperand& operand) {
  os().SetCurrentInstruction(kVrsra, kFpNeon);
  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vrsra(Condition cond,
                         DataType dt,
                         QRegister rd,
                         QRegister rm,
                         const QOperand& operand) {
  os().SetCurrentInstruction(kVrsra, kFpNeon);
  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vrsubhn(
    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVrsubhn, kFpNeon);
  os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vseleq(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVseleq, kFpNeon);
  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vseleq(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVseleq, kFpNeon);
  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselge(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVselge, kFpNeon);
  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselge(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVselge, kFpNeon);
  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselgt(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVselgt, kFpNeon);
  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselgt(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVselgt, kFpNeon);
  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselvs(DataType dt,
                          DRegister rd,
                          DRegister rn,
                          DRegister rm) {
  os().SetCurrentInstruction(kVselvs, kFpNeon);
  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vselvs(DataType dt,
                          SRegister rd,
                          SRegister rn,
                          SRegister rm) {
  os().SetCurrentInstruction(kVselvs, kFpNeon);
  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
}

void Disassembler::vshl(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVshl, kFpNeon);
  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vshl(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVshl, kFpNeon);
  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vshll(Condition cond,
                         DataType dt,
                         QRegister rd,
                         DRegister rm,
                         const DOperand& operand) {
  os().SetCurrentInstruction(kVshll, kFpNeon);
  os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vshr(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVshr, kFpNeon);
  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vshr(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVshr, kFpNeon);
  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vshrn(Condition cond,
                         DataType dt,
                         DRegister rd,
                         QRegister rm,
                         const QOperand& operand) {
  os().SetCurrentInstruction(kVshrn, kFpNeon);
  os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm << ", " << operand;
}

void Disassembler::vsli(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVsli, kFpNeon);
  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vsli(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVsli, kFpNeon);
  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vsqrt(Condition cond,
                         DataType dt,
                         SRegister rd,
                         SRegister rm) {
  os().SetCurrentInstruction(kVsqrt, kFpNeon);
  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vsqrt(Condition cond,
                         DataType dt,
                         DRegister rd,
                         DRegister rm) {
  os().SetCurrentInstruction(kVsqrt, kFpNeon);
  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vsra(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVsra, kFpNeon);
  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vsra(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVsra, kFpNeon);
  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vsri(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm,
                        const DOperand& operand) {
  os().SetCurrentInstruction(kVsri, kFpNeon);
  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vsri(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm,
                        const QOperand& operand) {
  os().SetCurrentInstruction(kVsri, kFpNeon);
  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rm) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rm << ", " << operand;
}

void Disassembler::vst1(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVst1, kFpNeon);
  os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
}

void Disassembler::vst2(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVst2, kFpNeon);
  os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
}

void Disassembler::vst3(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVst3, kFpNeon);
  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
}

void Disassembler::vst3(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVst3, kFpNeon);
  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
}

void Disassembler::vst4(Condition cond,
                        DataType dt,
                        const NeonRegisterList& nreglist,
                        const AlignedMemOperand& operand) {
  os().SetCurrentInstruction(kVst4, kFpNeon);
  os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
       << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
}

void Disassembler::vstm(Condition cond,
                        DataType dt,
                        Register rn,
                        WriteBack write_back,
                        DRegisterList dreglist) {
  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vstm(Condition cond,
                        DataType dt,
                        Register rn,
                        WriteBack write_back,
                        SRegisterList sreglist) {
  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vstmdb(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          DRegisterList dreglist) {
  os().SetCurrentInstruction(kVstmdb,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vstmdb(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          SRegisterList sreglist) {
  os().SetCurrentInstruction(kVstmdb,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vstmia(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          DRegisterList dreglist) {
  os().SetCurrentInstruction(kVstmia,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << dreglist;
}

void Disassembler::vstmia(Condition cond,
                          DataType dt,
                          Register rn,
                          WriteBack write_back,
                          SRegisterList sreglist) {
  os().SetCurrentInstruction(kVstmia,
                             kLoadStore | kLoadStoreMultiple | kFpNeon);
  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
       << rn << write_back << ", " << sreglist;
}

void Disassembler::vstr(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVstr, kFpNeon);
  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped64) << " " << rd << ", "
       << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
}

void Disassembler::vstr(Condition cond,
                        DataType dt,
                        SRegister rd,
                        const MemOperand& operand) {
  os().SetCurrentInstruction(kVstr, kFpNeon);
  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
       << DtPrinter(dt, Untyped32) << " " << rd << ", "
       << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
}

void Disassembler::vsub(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVsub, kFpNeon);
  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vsub(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVsub, kFpNeon);
  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vsub(
    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
  os().SetCurrentInstruction(kVsub, kFpNeon);
  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vsubhn(
    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVsubhn, kFpNeon);
  os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vsubl(
    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVsubl, kFpNeon);
  os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rn << ", " << rm;
}

void Disassembler::vsubw(
    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVsubw, kFpNeon);
  os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vswp(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVswp, kFpNeon);
  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vswp(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVswp, kFpNeon);
  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vtbl(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const NeonRegisterList& nreglist,
                        DRegister rm) {
  os().SetCurrentInstruction(kVtbl, kFpNeon);
  os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << nreglist << ", " << rm;
}

void Disassembler::vtbx(Condition cond,
                        DataType dt,
                        DRegister rd,
                        const NeonRegisterList& nreglist,
                        DRegister rm) {
  os().SetCurrentInstruction(kVtbx, kFpNeon);
  os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << nreglist << ", " << rm;
}

void Disassembler::vtrn(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVtrn, kFpNeon);
  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vtrn(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVtrn, kFpNeon);
  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vtst(
    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
  os().SetCurrentInstruction(kVtst, kFpNeon);
  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vtst(
    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
  os().SetCurrentInstruction(kVtst, kFpNeon);
  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
  os() << " ";
  if (!rd.Is(rn) || !use_short_hand_form_) {
    os() << rd << ", ";
  }
  os() << rn << ", " << rm;
}

void Disassembler::vuzp(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVuzp, kFpNeon);
  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vuzp(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVuzp, kFpNeon);
  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vzip(Condition cond,
                        DataType dt,
                        DRegister rd,
                        DRegister rm) {
  os().SetCurrentInstruction(kVzip, kFpNeon);
  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::vzip(Condition cond,
                        DataType dt,
                        QRegister rd,
                        QRegister rm) {
  os().SetCurrentInstruction(kVzip, kFpNeon);
  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
       << rd << ", " << rm;
}

void Disassembler::yield(Condition cond, EncodingSize size) {
  os().SetCurrentInstruction(kYield, kNoAttribute);
  os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
}

int Disassembler::T32Size(uint32_t instr) {
  if ((instr & 0xe0000000) == 0xe0000000) {
    switch (instr & 0x08000000) {
      case 0x00000000:
        if ((instr & 0x10000000) == 0x10000000) return 4;
        return 2;
      case 0x08000000:
        return 4;
      default:
        return 2;
    }
  }
  return 2;
}

void Disassembler::DecodeT32(uint32_t instr) {
  T32CodeAddressIncrementer incrementer(instr, &code_address_);
  ITBlockScope it_scope(&it_block_);

  switch (instr & 0xe0000000) {
    case 0x00000000: {
      // 0x00000000
      switch (instr & 0x18000000) {
        case 0x18000000: {
          // 0x18000000
          switch (instr & 0x06000000) {
            case 0x00000000: {
              // 0x18000000
              unsigned rd = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              unsigned rm = (instr >> 22) & 0x7;
              if (InITBlock()) {
                // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
                add(CurrentCond(),
                    Narrow,
                    Register(rd),
                    Register(rn),
                    Register(rm));
              } else {
                VIXL_ASSERT(OutsideITBlock());
                // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                adds(Condition::None(),
                     Narrow,
                     Register(rd),
                     Register(rn),
                     Register(rm));
              }
              break;
            }
            case 0x02000000: {
              // 0x1a000000
              unsigned rd = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              unsigned rm = (instr >> 22) & 0x7;
              if (InITBlock()) {
                // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
                sub(CurrentCond(),
                    Narrow,
                    Register(rd),
                    Register(rn),
                    Register(rm));
              } else {
                VIXL_ASSERT(OutsideITBlock());
                // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                subs(Condition::None(),
                     Narrow,
                     Register(rd),
                     Register(rn),
                     Register(rm));
              }
              break;
            }
            case 0x04000000: {
              // 0x1c000000
              unsigned rd = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              uint32_t imm = (instr >> 22) & 0x7;
              if (InITBlock()) {
                // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
                add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
              } else {
                VIXL_ASSERT(OutsideITBlock());
                // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
                adds(Condition::None(),
                     Narrow,
                     Register(rd),
                     Register(rn),
                     imm);
              }
              break;
            }
            case 0x06000000: {
              // 0x1e000000
              unsigned rd = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              uint32_t imm = (instr >> 22) & 0x7;
              if (InITBlock()) {
                // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
                sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
              } else {
                VIXL_ASSERT(OutsideITBlock());
                // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
                subs(Condition::None(),
                     Narrow,
                     Register(rd),
                     Register(rn),
                     imm);
              }
              break;
            }
          }
          break;
        }
        default: {
          if (((instr & 0x18000000) == 0x18000000)) {
            UnallocatedT32(instr);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
              InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            if (amount == 0) amount = 32;
            // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
              !InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            if (amount == 0) amount = 32;
            // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
              ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
              ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
              InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            if (amount == 0) amount = 32;
            // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
              !InITBlock()) {
            unsigned rd = (instr >> 16) & 0x7;
            unsigned rm = (instr >> 19) & 0x7;
            uint32_t amount = (instr >> 22) & 0x1f;
            if (amount == 0) amount = 32;
            // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
            lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
            return;
          }
          unsigned rd = (instr >> 16) & 0x7;
          unsigned rm = (instr >> 19) & 0x7;
          ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
                                              (instr >> 22) & 0x1f);
          if (InITBlock()) {
            // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
            mov(CurrentCond(),
                Narrow,
                Register(rd),
                Operand(Register(rm),
                        shift_operand.GetType(),
                        shift_operand.GetAmount()));
          } else {
            VIXL_ASSERT(OutsideITBlock());
            // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
            movs(Condition::None(),
                 Narrow,
                 Register(rd),
                 Operand(Register(rm),
                         shift_operand.GetType(),
                         shift_operand.GetAmount()));
          }
          break;
        }
      }
      break;
    }
    case 0x20000000: {
      // 0x20000000
      switch (instr & 0x18000000) {
        case 0x00000000: {
          // 0x20000000
          unsigned rd = (instr >> 24) & 0x7;
          uint32_t imm = (instr >> 16) & 0xff;
          if (InITBlock()) {
            // MOV<c>{<q>} <Rd>, #<imm8> ; T1
            mov(CurrentCond(), Narrow, Register(rd), imm);
          } else {
            VIXL_ASSERT(OutsideITBlock());
            // MOVS{<q>} <Rd>, #<imm8> ; T1
            movs(Condition::None(), Narrow, Register(rd), imm);
          }
          break;
        }
        case 0x08000000: {
          // 0x28000000
          unsigned rn = (instr >> 24) & 0x7;
          uint32_t imm = (instr >> 16) & 0xff;
          // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
          cmp(CurrentCond(), Narrow, Register(rn), imm);
          break;
        }
        case 0x10000000: {
          // 0x30000000
          unsigned rd = (instr >> 24) & 0x7;
          uint32_t imm = (instr >> 16) & 0xff;
          if (InITBlock() && ((imm <= 7))) {
            // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
            add(CurrentCond(), Register(rd), imm);
          } else if (InITBlock() && ((imm > 7))) {
            // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
            add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
          } else if (OutsideITBlock() && ((imm <= 7))) {
            // ADDS{<q>} <Rdn>, #<imm8> ; T2
            adds(Register(rd), imm);
          } else if (OutsideITBlock() && ((imm > 7))) {
            // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
            adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
          } else {
            UnallocatedT32(instr);
          }
          break;
        }
        case 0x18000000: {
          // 0x38000000
          unsigned rd = (instr >> 24) & 0x7;
          uint32_t imm = (instr >> 16) & 0xff;
          if (InITBlock() && ((imm <= 7))) {
            // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
            sub(CurrentCond(), Register(rd), imm);
          } else if (InITBlock() && ((imm > 7))) {
            // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
            sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
          } else if (OutsideITBlock() && ((imm <= 7))) {
            // SUBS{<q>} <Rdn>, #<imm8> ; T2
            subs(Register(rd), imm);
          } else if (OutsideITBlock() && ((imm > 7))) {
            // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
            subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
          } else {
            UnallocatedT32(instr);
          }
          break;
        }
      }
      break;
    }
    case 0x40000000: {
      // 0x40000000
      switch (instr & 0x18000000) {
        case 0x00000000: {
          // 0x40000000
          switch (instr & 0x07000000) {
            case 0x00000000: {
              // 0x40000000
              switch (instr & 0x00c00000) {
                case 0x00000000: {
                  // 0x40000000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    and_(CurrentCond(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    ands(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00400000: {
                  // 0x40400000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    eor(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    eors(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00800000: {
                  // 0x40800000
                  if (InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    lsl(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rs));
                    return;
                  }
                  if (!InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    lsls(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rs));
                    return;
                  }
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 16) & 0x7;
                  unsigned rs = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
                    mov(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Operand(Register(rm), LSL, Register(rs)));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
                    movs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Operand(Register(rm), LSL, Register(rs)));
                  }
                  break;
                }
                case 0x00c00000: {
                  // 0x40c00000
                  if (InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    lsr(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rs));
                    return;
                  }
                  if (!InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    lsrs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rs));
                    return;
                  }
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 16) & 0x7;
                  unsigned rs = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
                    mov(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Operand(Register(rm), LSR, Register(rs)));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
                    movs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Operand(Register(rm), LSR, Register(rs)));
                  }
                  break;
                }
              }
              break;
            }
            case 0x01000000: {
              // 0x41000000
              switch (instr & 0x00c00000) {
                case 0x00000000: {
                  // 0x41000000
                  if (InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    asr(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rs));
                    return;
                  }
                  if (!InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    asrs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rs));
                    return;
                  }
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 16) & 0x7;
                  unsigned rs = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
                    mov(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Operand(Register(rm), ASR, Register(rs)));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
                    movs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Operand(Register(rm), ASR, Register(rs)));
                  }
                  break;
                }
                case 0x00400000: {
                  // 0x41400000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    adc(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    adcs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00800000: {
                  // 0x41800000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    sbc(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    sbcs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00c00000: {
                  // 0x41c00000
                  if (InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    ror(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rs));
                    return;
                  }
                  if (!InITBlock()) {
                    unsigned rd = (instr >> 16) & 0x7;
                    unsigned rs = (instr >> 19) & 0x7;
                    // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
                    rors(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rs));
                    return;
                  }
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 16) & 0x7;
                  unsigned rs = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
                    mov(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Operand(Register(rm), ROR, Register(rs)));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
                    movs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Operand(Register(rm), ROR, Register(rs)));
                  }
                  break;
                }
              }
              break;
            }
            case 0x02000000: {
              // 0x42000000
              switch (instr & 0x00c00000) {
                case 0x00000000: {
                  // 0x42000000
                  unsigned rn = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  // TST{<c>}{<q>} <Rn>, <Rm> ; T1
                  tst(CurrentCond(), Narrow, Register(rn), Register(rm));
                  break;
                }
                case 0x00400000: {
                  // 0x42400000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rn = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
                    rsb(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rn),
                        UINT32_C(0));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
                    rsbs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rn),
                         UINT32_C(0));
                  }
                  break;
                }
                case 0x00800000: {
                  // 0x42800000
                  unsigned rn = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
                  cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
                  break;
                }
                case 0x00c00000: {
                  // 0x42c00000
                  unsigned rn = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
                  cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
                  break;
                }
              }
              break;
            }
            case 0x03000000: {
              // 0x43000000
              switch (instr & 0x00c00000) {
                case 0x00000000: {
                  // 0x43000000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    orr(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    orrs(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00400000: {
                  // 0x43400000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rn = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
                    mul(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rn),
                        Register(rd));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
                    muls(Condition::None(),
                         Register(rd),
                         Register(rn),
                         Register(rd));
                  }
                  break;
                }
                case 0x00800000: {
                  // 0x43800000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    bic(CurrentCond(),
                        Narrow,
                        Register(rd),
                        Register(rd),
                        Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
                    bics(Condition::None(),
                         Narrow,
                         Register(rd),
                         Register(rd),
                         Register(rm));
                  }
                  break;
                }
                case 0x00c00000: {
                  // 0x43c00000
                  unsigned rd = (instr >> 16) & 0x7;
                  unsigned rm = (instr >> 19) & 0x7;
                  if (InITBlock()) {
                    // MVN<c>{<q>} <Rd>, <Rm> ; T1
                    mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
                  } else {
                    VIXL_ASSERT(OutsideITBlock());
                    // MVNS{<q>} <Rd>, <Rm> ; T1
                    mvns(Condition::None(), Narrow, Register(rd), Register(rm));
                  }
                  break;
                }
              }
              break;
            }
            case 0x04000000: {
              // 0x44000000
              switch (instr & 0x00780000) {
                case 0x00680000: {
                  // 0x44680000
                  unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
                  // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
                  add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
                  break;
                }
                default: {
                  switch (instr & 0x00870000) {
                    case 0x00850000: {
                      // 0x44850000
                      if (((instr & 0x780000) == 0x680000)) {
                        UnallocatedT32(instr);
                        return;
                      }
                      unsigned rm = (instr >> 19) & 0xf;
                      // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
                      add(CurrentCond(), Narrow, sp, sp, Register(rm));
                      break;
                    }
                    default: {
                      if (((instr & 0x780000) == 0x680000) ||
                          ((instr & 0x870000) == 0x850000)) {
                        UnallocatedT32(instr);
                        return;
                      }
                      unsigned rd =
                          ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
                      unsigned rm = (instr >> 19) & 0xf;
                      if (InITBlock()) {
                        // ADD<c>{<q>} <Rdn>, <Rm> ; T2
                        add(CurrentCond(), Register(rd), Register(rm));
                      } else {
                        // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
                        add(CurrentCond(),
                            Narrow,
                            Register(rd),
                            Register(rd),
                            Register(rm));
                      }
                      break;
                    }
                  }
                  break;
                }
              }
              break;
            }
            case 0x05000000: {
              // 0x45000000
              unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
              unsigned rm = (instr >> 19) & 0xf;
              // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
              cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
              break;
            }
            case 0x06000000: {
              // 0x46000000
              unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
              unsigned rm = (instr >> 19) & 0xf;
              // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
              mov(CurrentCond(), Narrow, Register(rd), Register(rm));
              break;
            }
            case 0x07000000: {
              // 0x47000000
              switch (instr & 0x00800000) {
                case 0x00000000: {
                  // 0x47000000
                  unsigned rm = (instr >> 19) & 0xf;
                  // BX{<c>}{<q>} <Rm> ; T1
                  bx(CurrentCond(), Register(rm));
                  if (((instr & 0xff870000) != 0x47000000)) {
                    UnpredictableT32(instr);
                  }
                  break;
                }
                case 0x00800000: {
                  // 0x47800000
                  unsigned rm = (instr >> 19) & 0xf;
                  // BLX{<c>}{<q>} <Rm> ; T1
                  blx(CurrentCond(), Register(rm));
                  if (((instr & 0xff870000) != 0x47800000)) {
                    UnpredictableT32(instr);
                  }
                  break;
                }
              }
              break;
            }
          }
          break;
        }
        case 0x08000000: {
          // 0x48000000
          unsigned rt = (instr >> 24) & 0x7;
          int32_t imm = ((instr >> 16) & 0xff) << 2;
          Location location(imm, kT32PcDelta);
          // LDR{<c>}{<q>} <Rt>, <label> ; T1
          ldr(CurrentCond(), Narrow, Register(rt), &location);
          break;
        }
        case 0x10000000: {
          // 0x50000000
          switch (instr & 0x06000000) {
            case 0x00000000: {
              // 0x50000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              str(CurrentCond(),
                  Narrow,
                  Register(rt),
                  MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x02000000: {
              // 0x52000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              strh(CurrentCond(),
                   Narrow,
                   Register(rt),
                   MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x04000000: {
              // 0x54000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              strb(CurrentCond(),
                   Narrow,
                   Register(rt),
                   MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x06000000: {
              // 0x56000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              ldrsb(CurrentCond(),
                    Narrow,
                    Register(rt),
                    MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
          }
          break;
        }
        case 0x18000000: {
          // 0x58000000
          switch (instr & 0x06000000) {
            case 0x00000000: {
              // 0x58000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              ldr(CurrentCond(),
                  Narrow,
                  Register(rt),
                  MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x02000000: {
              // 0x5a000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              ldrh(CurrentCond(),
                   Narrow,
                   Register(rt),
                   MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x04000000: {
              // 0x5c000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              ldrb(CurrentCond(),
                   Narrow,
                   Register(rt),
                   MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
            case 0x06000000: {
              // 0x5e000000
              unsigned rt = (instr >> 16) & 0x7;
              unsigned rn = (instr >> 19) & 0x7;
              Sign sign(plus);
              unsigned rm = (instr >> 22) & 0x7;
              AddrMode addrmode = Offset;
              // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
              ldrsh(CurrentCond(),
                    Narrow,
                    Register(rt),
                    MemOperand(Register(rn), sign, Register(rm), addrmode));
              break;
            }
          }
          break;
        }
      }
      break;
    }
    case 0x60000000: {
      // 0x60000000
      switch (instr & 0x18000000) {
        case 0x00000000: {
          // 0x60000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = ((instr >> 22) & 0x1f) << 2;
          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          str(CurrentCond(),
              Narrow,
              Register(rt),
              MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
        case 0x08000000: {
          // 0x68000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = ((instr >> 22) & 0x1f) << 2;
          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          ldr(CurrentCond(),
              Narrow,
              Register(rt),
              MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
        case 0x10000000: {
          // 0x70000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = (instr >> 22) & 0x1f;
          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          strb(CurrentCond(),
               Narrow,
               Register(rt),
               MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
        case 0x18000000: {
          // 0x78000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = (instr >> 22) & 0x1f;
          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          ldrb(CurrentCond(),
               Narrow,
               Register(rt),
               MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
      }
      break;
    }
    case 0x80000000: {
      // 0x80000000
      switch (instr & 0x18000000) {
        case 0x00000000: {
          // 0x80000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = ((instr >> 22) & 0x1f) << 1;
          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          strh(CurrentCond(),
               Narrow,
               Register(rt),
               MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
        case 0x08000000: {
          // 0x88000000
          unsigned rt = (instr >> 16) & 0x7;
          unsigned rn = (instr >> 19) & 0x7;
          int32_t offset = ((instr >> 22) & 0x1f) << 1;
          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
          ldrh(CurrentCond(),
               Narrow,
               Register(rt),
               MemOperand(Register(rn), plus, offset, Offset));
          break;
        }
        case 0x10000000: {
          // 0x90000000
          unsigned rt = (instr >> 24) & 0x7;
          int32_t offset = ((instr >> 16) & 0xff) << 2;
          // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
          str(CurrentCond(),
              Narrow,
              Register(rt),
              MemOperand(sp, plus, offset, Offset));
          break;
        }
        case 0x18000000: {
          // 0x98000000
          unsigned rt = (instr >> 24) & 0x7;
          int32_t offset = ((instr >> 16) & 0xff) << 2;
          // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
          ldr(CurrentCond(),
              Narrow,
              Register(rt),
              MemOperand(sp, plus, offset, Offset));
          break;
        }
      }
      break;
    }
    case 0xa0000000: {
      // 0xa0000000
      switch (instr & 0x18000000) {
        case 0x00000000: {
          // 0xa0000000
          unsigned rd = (instr >> 24) & 0x7;
          int32_t imm = ((instr >> 16) & 0xff) << 2;
          Location location(imm, kT32PcDelta);
          // ADR{<c>}{<q>} <Rd>, <label> ; T1
          adr(CurrentCond(), Narrow, Register(rd), &location);
          break;
        }
        case 0x08000000: {
          // 0xa8000000
          unsigned rd = (instr >> 24) & 0x7;
          uint32_t imm = ((instr >> 16) & 0xff) << 2;
          // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
          add(CurrentCond(), Narrow, Register(rd), sp, imm);
          break;
        }
        case 0x10000000: {
          // 0xb0000000
          switch (instr & 0x04000000) {
            case 0x00000000: {
              // 0xb0000000
              switch (instr & 0x01000000) {
                case 0x00000000: {
                  // 0xb0000000
                  switch (instr & 0x02800000) {
                    case 0x00000000: {
                      // 0xb0000000
                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
                      // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
                      add(CurrentCond(), Narrow, sp, sp, imm);
                      break;
                    }
                    case 0x00800000: {
                      // 0xb0800000
                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
                      // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
                      sub(CurrentCond(), Narrow, sp, sp, imm);
                      break;
                    }
                    case 0x02000000: {
                      // 0xb2000000
                      switch (instr & 0x00400000) {
                        case 0x00000000: {
                          // 0xb2000000
                          unsigned rd = (instr >> 16) & 0x7;
                          unsigned rm = (instr >> 19) & 0x7;
                          // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
                          sxth(CurrentCond(),
                               Narrow,
                               Register(rd),
                               Register(rm));
                          break;
                        }
                        case 0x00400000: {
                          // 0xb2400000
                          unsigned rd = (instr >> 16) & 0x7;
                          unsigned rm = (instr >> 19) & 0x7;
                          // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
                          sxtb(CurrentCond(),
                               Narrow,
                               Register(rd),
                               Register(rm));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x02800000: {
                      // 0xb2800000
                      switch (instr & 0x00400000) {
                        case 0x00000000: {
                          // 0xb2800000
                          unsigned rd = (instr >> 16) & 0x7;
                          unsigned rm = (instr >> 19) & 0x7;
                          // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
                          uxth(CurrentCond(),
                               Narrow,
                               Register(rd),
                               Register(rm));
                          break;
                        }
                        case 0x00400000: {
                          // 0xb2c00000
                          unsigned rd = (instr >> 16) & 0x7;
                          unsigned rm = (instr >> 19) & 0x7;
                          // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
                          uxtb(CurrentCond(),
                               Narrow,
                               Register(rd),
                               Register(rm));
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x01000000: {
                  // 0xb1000000
                  unsigned rn = (instr >> 16) & 0x7;
                  int32_t imm =
                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
                  Location location(imm, kT32PcDelta);
                  // CBZ{<q>} <Rn>, <label> ; T1
                  cbz(Register(rn), &location);
                  break;
                }
              }
              break;
            }
            case 0x04000000: {
              // 0xb4000000
              switch (instr & 0x02000000) {
                case 0x00000000: {
                  // 0xb4000000
                  RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
                                         ((instr >> 16) & 0xff));
                  // PUSH{<c>}{<q>} <registers> ; T1
                  push(CurrentCond(), Narrow, registers);
                  break;
                }
                case 0x02000000: {
                  // 0xb6000000
                  switch (instr & 0x01e00000) {
                    case 0x00400000: {
                      // 0xb6400000
                      UnimplementedT32_16("SETEND", instr);
                      break;
                    }
                    case 0x00600000: {
                      // 0xb6600000
                      switch (instr & 0x00100000) {
                        case 0x00000000: {
                          // 0xb6600000
                          UnimplementedT32_16("CPSIE", instr);
                          break;
                        }
                        case 0x00100000: {
                          // 0xb6700000
                          UnimplementedT32_16("CPSID", instr);
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
              }
              break;
            }
          }
          break;
        }
        case 0x18000000: {
          // 0xb8000000
          switch (instr & 0x04000000) {
            case 0x00000000: {
              // 0xb8000000
              switch (instr & 0x01000000) {
                case 0x00000000: {
                  // 0xb8000000
                  switch (instr & 0x02c00000) {
                    case 0x02000000: {
                      // 0xba000000
                      unsigned rd = (instr >> 16) & 0x7;
                      unsigned rm = (instr >> 19) & 0x7;
                      // REV{<c>}{<q>} <Rd>, <Rm> ; T1
                      rev(CurrentCond(), Narrow, Register(rd), Register(rm));
                      break;
                    }
                    case 0x02400000: {
                      // 0xba400000
                      unsigned rd = (instr >> 16) & 0x7;
                      unsigned rm = (instr >> 19) & 0x7;
                      // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
                      rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
                      break;
                    }
                    case 0x02800000: {
                      // 0xba800000
                      uint32_t imm = (instr >> 16) & 0x3f;
                      // HLT{<q>} {#}<imm> ; T1
                      hlt(Condition::None(), imm);
                      break;
                    }
                    case 0x02c00000: {
                      // 0xbac00000
                      unsigned rd = (instr >> 16) & 0x7;
                      unsigned rm = (instr >> 19) & 0x7;
                      // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
                      revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01000000: {
                  // 0xb9000000
                  unsigned rn = (instr >> 16) & 0x7;
                  int32_t imm =
                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
                  Location location(imm, kT32PcDelta);
                  // CBNZ{<q>} <Rn>, <label> ; T1
                  cbnz(Register(rn), &location);
                  break;
                }
              }
              break;
            }
            case 0x04000000: {
              // 0xbc000000
              switch (instr & 0x02000000) {
                case 0x00000000: {
                  // 0xbc000000
                  RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
                                         ((instr >> 16) & 0xff));
                  // POP{<c>}{<q>} <registers> ; T1
                  pop(CurrentCond(), Narrow, registers);
                  break;
                }
                case 0x02000000: {
                  // 0xbe000000
                  switch (instr & 0x01000000) {
                    case 0x00000000: {
                      // 0xbe000000
                      uint32_t imm = (instr >> 16) & 0xff;
                      // BKPT{<q>} {#}<imm> ; T1
                      bkpt(Condition::None(), imm);
                      break;
                    }
                    case 0x01000000: {
                      // 0xbf000000
                      switch (instr & 0x000f0000) {
                        case 0x00000000: {
                          // 0xbf000000
                          switch (instr & 0x00f00000) {
                            case 0x00000000: {
                              // 0xbf000000
                              // NOP{<c>}{<q>} ; T1
                              nop(CurrentCond(), Narrow);
                              break;
                            }
                            case 0x00100000: {
                              // 0xbf100000
                              // YIELD{<c>}{<q>} ; T1
                              yield(CurrentCond(), Narrow);
                              break;
                            }
                            case 0x00200000: {
                              // 0xbf200000
                              UnimplementedT32_16("WFE", instr);
                              break;
                            }
                            case 0x00300000: {
                              // 0xbf300000
                              UnimplementedT32_16("WFI", instr);
                              break;
                            }
                            case 0x00400000: {
                              // 0xbf400000
                              UnimplementedT32_16("SEV", instr);
                              break;
                            }
                            case 0x00500000: {
                              // 0xbf500000
                              UnimplementedT32_16("SEVL", instr);
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0x0)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned first_cond = (instr >> 20) & 0xf;
                          unsigned mask = (instr >> 16) & 0xf;
                          bool was_in_it_block = InITBlock();
                          SetIT(Condition(first_cond), mask);
                          it(Condition(first_cond), mask);
                          if (was_in_it_block || (first_cond == 15) ||
                              ((first_cond == al) &&
                               (BitCount(Uint32(mask)) != 1))) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
              }
              break;
            }
          }
          break;
        }
      }
      break;
    }
    case 0xc0000000: {
      // 0xc0000000
      switch (instr & 0x10000000) {
        case 0x00000000: {
          // 0xc0000000
          switch (instr & 0x08000000) {
            case 0x00000000: {
              // 0xc0000000
              unsigned rn = (instr >> 24) & 0x7;
              RegisterList registers(((instr >> 16) & 0xff));
              // STM{<c>}{<q>} <Rn>!, <registers> ; T1
              stm(CurrentCond(),
                  Narrow,
                  Register(rn),
                  WriteBack(WRITE_BACK),
                  registers);
              break;
            }
            case 0x08000000: {
              // 0xc8000000
              unsigned rn = (instr >> 24) & 0x7;
              RegisterList registers(((instr >> 16) & 0xff));
              // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
              ldm(CurrentCond(),
                  Narrow,
                  Register(rn),
                  WriteBack(!registers.Includes(Register(rn))),
                  registers);
              break;
            }
          }
          break;
        }
        case 0x10000000: {
          // 0xd0000000
          switch (instr & 0x0e000000) {
            case 0x0e000000: {
              // 0xde000000
              switch (instr & 0x01000000) {
                case 0x00000000: {
                  // 0xde000000
                  uint32_t imm = (instr >> 16) & 0xff;
                  // UDF{<c>}{<q>} {#}<imm> ; T1
                  udf(CurrentCond(), Narrow, imm);
                  break;
                }
                case 0x01000000: {
                  // 0xdf000000
                  uint32_t imm = (instr >> 16) & 0xff;
                  // SVC{<c>}{<q>} {#}<imm> ; T1
                  svc(CurrentCond(), imm);
                  break;
                }
              }
              break;
            }
            default: {
              if (((instr & 0xe000000) == 0xe000000)) {
                UnallocatedT32(instr);
                return;
              }
              Condition condition((instr >> 24) & 0xf);
              int32_t imm = SignExtend<int32_t>(((instr >> 16) & 0xff) << 1, 9);
              Location location(imm, kT32PcDelta);
              // B<c>{<q>} <label> ; T1
              b(condition, Narrow, &location);
              if (InITBlock()) {
                UnpredictableT32(instr);
              }
              break;
            }
          }
          break;
        }
      }
      break;
    }
    case 0xe0000000: {
      // 0xe0000000
      switch (instr & 0x08000000) {
        case 0x00000000: {
          // 0xe0000000
          switch (instr & 0x10000000) {
            case 0x00000000: {
              // 0xe0000000
              int32_t imm =
                  SignExtend<int32_t>(((instr >> 16) & 0x7ff) << 1, 12);
              Location location(imm, kT32PcDelta);
              // B{<c>}{<q>} <label> ; T2
              b(CurrentCond(), Narrow, &location);
              if (!OutsideITBlockOrLast()) {
                UnpredictableT32(instr);
              }
              break;
            }
            case 0x10000000: {
              // 0xf0000000
              switch (instr & 0x00008000) {
                case 0x00000000: {
                  // 0xf0000000
                  switch (instr & 0x03f00000) {
                    case 0x00000000: {
                      // 0xf0000000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      and_(CurrentCond(),
                           Best,
                           Register(rd),
                           Register(rn),
                           imm);
                      break;
                    }
                    case 0x00100000: {
                      // 0xf0100000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xf0100f00
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // TST{<c>}{<q>} <Rn>, #<const> ; T1
                          tst(CurrentCond(), Best, Register(rn), imm);
                          break;
                        }
                        default: {
                          if (((instr & 0xf00) == 0xf00)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          ands(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xf0200000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
                      break;
                    }
                    case 0x00300000: {
                      // 0xf0300000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      bics(CurrentCond(),
                           Best,
                           Register(rd),
                           Register(rn),
                           imm);
                      break;
                    }
                    case 0x00400000: {
                      // 0xf0400000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf04f0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              ((rd < kNumberOfT32LowRegisters) &&
                               (imm <= 255))) {
                            // MOV<c>.W <Rd>, #<const> ; T2
                            mov(CurrentCond(), Wide, Register(rd), imm);
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // MOV{<c>}{<q>} <Rd>, #<const> ; T2
                            mov(CurrentCond(), Best, Register(rd), imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          orr(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00500000: {
                      // 0xf0500000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf05f0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if (OutsideITBlock() &&
                              (instr & 0x00100000) == 0x00100000 &&
                              ((rd < kNumberOfT32LowRegisters) &&
                               (imm <= 255))) {
                            // MOVS.W <Rd>, #<const> ; T2
                            movs(Condition::None(), Wide, Register(rd), imm);
                          } else if ((instr & 0x00100000) == 0x00100000) {
                            // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
                            movs(CurrentCond(), Best, Register(rd), imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          orrs(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xf0600000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf06f0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // MVN{<c>}{<q>} <Rd>, #<const> ; T1
                          mvn(CurrentCond(), Best, Register(rd), imm);
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          orn(CurrentCond(), Register(rd), Register(rn), imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00700000: {
                      // 0xf0700000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf07f0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
                          mvns(CurrentCond(), Best, Register(rd), imm);
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          orns(CurrentCond(), Register(rd), Register(rn), imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xf0800000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
                      break;
                    }
                    case 0x00900000: {
                      // 0xf0900000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xf0900f00
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
                          teq(CurrentCond(), Register(rn), imm);
                          break;
                        }
                        default: {
                          if (((instr & 0xf00) == 0xf00)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                          eors(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               imm);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01000000: {
                      // 0xf1000000
                      switch (instr & 0x000f0000) {
                        case 0x000d0000: {
                          // 0xf10d0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if ((instr & 0x00100000) == 0x00000000 &&
                              (((rd < kNumberOfT32LowRegisters) &&
                                ((imm <= 1020) && ((imm & 3) == 0))) ||
                               ((rd == sp.GetCode()) &&
                                ((imm <= 508) && ((imm & 3) == 0))))) {
                            // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
                            add(CurrentCond(), Wide, Register(rd), sp, imm);
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
                            add(CurrentCond(), Best, Register(rd), sp, imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xd0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              (((rd < kNumberOfT32LowRegisters) &&
                                (rn < kNumberOfT32LowRegisters) &&
                                (imm <= 7)) ||
                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                                (imm <= 255)))) {
                            // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
                            add(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
                            add(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01100000: {
                      // 0xf1100000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xf1100f00
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          // CMN{<c>}{<q>} <Rn>, #<const> ; T1
                          cmn(CurrentCond(), Best, Register(rn), imm);
                          break;
                        }
                        default: {
                          switch (instr & 0x000f0000) {
                            case 0x000d0000: {
                              // 0xf11d0000
                              if (((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              uint32_t imm = ImmediateT32::Decode(
                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
                                  ((instr >> 15) & 0x800));
                              // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
                              adds(CurrentCond(), Best, Register(rd), sp, imm);
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xd0000) ||
                                  ((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              uint32_t imm = ImmediateT32::Decode(
                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
                                  ((instr >> 15) & 0x800));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  (((rd < kNumberOfT32LowRegisters) &&
                                    (rn < kNumberOfT32LowRegisters) &&
                                    (imm <= 7)) ||
                                   ((rd == rn) &&
                                    (rd < kNumberOfT32LowRegisters) &&
                                    (imm <= 255)))) {
                                // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
                                adds(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rn),
                                     imm);
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
                                adds(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rn),
                                     imm);
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01400000: {
                      // 0xf1400000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
                      break;
                    }
                    case 0x01500000: {
                      // 0xf1500000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      adcs(CurrentCond(),
                           Best,
                           Register(rd),
                           Register(rn),
                           imm);
                      break;
                    }
                    case 0x01600000: {
                      // 0xf1600000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
                      break;
                    }
                    case 0x01700000: {
                      // 0xf1700000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
                      sbcs(CurrentCond(),
                           Best,
                           Register(rd),
                           Register(rn),
                           imm);
                      break;
                    }
                    case 0x01a00000: {
                      // 0xf1a00000
                      switch (instr & 0x000f0000) {
                        case 0x000d0000: {
                          // 0xf1ad0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if ((instr & 0x00100000) == 0x00000000 &&
                              ((rd == sp.GetCode()) &&
                               ((imm <= 508) && ((imm & 3) == 0)))) {
                            // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
                            sub(CurrentCond(), Wide, Register(rd), sp, imm);
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
                            sub(CurrentCond(), Best, Register(rd), sp, imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xd0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              (((rd < kNumberOfT32LowRegisters) &&
                                (rn < kNumberOfT32LowRegisters) &&
                                (imm <= 7)) ||
                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                                (imm <= 255)))) {
                            // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
                            sub(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
                            sub(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01b00000: {
                      // 0xf1b00000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xf1b00f00
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = ImmediateT32::Decode(
                              (instr & 0xff) | ((instr >> 4) & 0x700) |
                              ((instr >> 15) & 0x800));
                          if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
                            // CMP{<c>}.W <Rn>, #<const> ; T2
                            cmp(CurrentCond(), Wide, Register(rn), imm);
                          } else {
                            // CMP{<c>}{<q>} <Rn>, #<const> ; T2
                            cmp(CurrentCond(), Best, Register(rn), imm);
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000f0000) {
                            case 0x000d0000: {
                              // 0xf1bd0000
                              if (((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              uint32_t imm = ImmediateT32::Decode(
                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
                                  ((instr >> 15) & 0x800));
                              // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
                              subs(CurrentCond(), Best, Register(rd), sp, imm);
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xd0000) ||
                                  ((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              uint32_t imm = ImmediateT32::Decode(
                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
                                  ((instr >> 15) & 0x800));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  (((rd < kNumberOfT32LowRegisters) &&
                                    (rn < kNumberOfT32LowRegisters) &&
                                    (imm <= 7)) ||
                                   ((rd == rn) &&
                                    (rd < kNumberOfT32LowRegisters) &&
                                    (imm <= 255)))) {
                                // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
                                subs(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rn),
                                     imm);
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
                                subs(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rn),
                                     imm);
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01c00000: {
                      // 0xf1c00000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
                          (imm == 0) &&
                          ((rd < kNumberOfT32LowRegisters) &&
                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
                        // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
                        rsb(CurrentCond(),
                            Wide,
                            Register(rd),
                            Register(rn),
                            UINT32_C(0));
                      } else if ((instr & 0x00100000) == 0x00000000) {
                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
                        rsb(CurrentCond(),
                            Best,
                            Register(rd),
                            Register(rn),
                            imm);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x01d00000: {
                      // 0xf1d00000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t imm = ImmediateT32::Decode(
                          (instr & 0xff) | ((instr >> 4) & 0x700) |
                          ((instr >> 15) & 0x800));
                      if (OutsideITBlock() &&
                          (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
                          ((rd < kNumberOfT32LowRegisters) &&
                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
                        // RSBS.W {<Rd>}, <Rn>, #0 ; T2
                        rsbs(Condition::None(),
                             Wide,
                             Register(rd),
                             Register(rn),
                             UINT32_C(0));
                      } else if ((instr & 0x00100000) == 0x00100000) {
                        // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
                        rsbs(CurrentCond(),
                             Best,
                             Register(rd),
                             Register(rn),
                             imm);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x02000000: {
                      // 0xf2000000
                      switch (instr & 0x000d0000) {
                        case 0x000d0000: {
                          // 0xf20d0000
                          switch (instr & 0x00020000) {
                            case 0x00000000: {
                              // 0xf20d0000
                              unsigned rd = (instr >> 8) & 0xf;
                              uint32_t imm = (instr & 0xff) |
                                             ((instr >> 4) & 0x700) |
                                             ((instr >> 15) & 0x800);
                              if (((rd >= kNumberOfT32LowRegisters) ||
                                   ((imm > 1020) || ((imm & 3) != 0))) &&
                                  ((rd != sp.GetCode()) ||
                                   ((imm > 508) || ((imm & 3) != 0))) &&
                                  (!ImmediateT32::IsImmediateT32(imm))) {
                                // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
                                add(CurrentCond(), Best, Register(rd), sp, imm);
                              } else {
                                // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
                                addw(CurrentCond(), Register(rd), sp, imm);
                              }
                              break;
                            }
                            case 0x00020000: {
                              // 0xf20f0000
                              unsigned rd = (instr >> 8) & 0xf;
                              int32_t imm = (instr & 0xff) |
                                            ((instr >> 4) & 0x700) |
                                            ((instr >> 15) & 0x800);
                              Location location(imm, kT32PcDelta);
                              if ((imm >= 0) && (imm <= 4095) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (imm >= 0) && (imm <= 1020) &&
                                   ((imm & 3) == 0))) {
                                // ADR{<c>}.W <Rd>, <label> ; T3
                                adr(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    &location);
                              } else if ((imm >= 0) && (imm <= 4095)) {
                                // ADR{<c>}{<q>} <Rd>, <label> ; T3
                                adr(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    &location);
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xd0000) == 0xd0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = (instr & 0xff) |
                                         ((instr >> 4) & 0x700) |
                                         ((instr >> 15) & 0x800);
                          if ((InITBlock() ||
                               (rd >= kNumberOfT32LowRegisters) ||
                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
                              (InITBlock() || (rd != rn) ||
                               (rd >= kNumberOfT32LowRegisters) ||
                               (imm > 255)) &&
                              (!ImmediateT32::IsImmediateT32(imm))) {
                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
                            add(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else {
                            // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
                            addw(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 imm);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x02400000: {
                      // 0xf2400000
                      unsigned rd = (instr >> 8) & 0xf;
                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
                                     ((instr >> 15) & 0x800) |
                                     ((instr >> 4) & 0xf000);
                      if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
                           (imm > 255)) &&
                          (!ImmediateT32::IsImmediateT32(imm))) {
                        // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
                        mov(CurrentCond(), Best, Register(rd), imm);
                      } else {
                        // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
                        movw(CurrentCond(), Register(rd), imm);
                      }
                      break;
                    }
                    case 0x02a00000: {
                      // 0xf2a00000
                      switch (instr & 0x000d0000) {
                        case 0x000d0000: {
                          // 0xf2ad0000
                          switch (instr & 0x00020000) {
                            case 0x00000000: {
                              // 0xf2ad0000
                              unsigned rd = (instr >> 8) & 0xf;
                              uint32_t imm = (instr & 0xff) |
                                             ((instr >> 4) & 0x700) |
                                             ((instr >> 15) & 0x800);
                              if (((rd != sp.GetCode()) ||
                                   ((imm > 508) || ((imm & 3) != 0))) &&
                                  (!ImmediateT32::IsImmediateT32(imm))) {
                                // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
                                sub(CurrentCond(), Best, Register(rd), sp, imm);
                              } else {
                                // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
                                subw(CurrentCond(), Register(rd), sp, imm);
                              }
                              break;
                            }
                            case 0x00020000: {
                              // 0xf2af0000
                              if (((((Uint32((instr >> 26)) & Uint32(0x1))
                                     << 11) |
                                    ((Uint32((instr >> 12)) & Uint32(0x7))
                                     << 8) |
                                    (Uint32(instr) & Uint32(0xff))) ==
                                   Uint32(0x0))) {
                                unsigned rd = (instr >> 8) & 0xf;
                                uint32_t imm = (instr & 0xff) |
                                               ((instr >> 4) & 0x700) |
                                               ((instr >> 15) & 0x800);
                                // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
                                sub(CurrentCond(), Best, Register(rd), pc, imm);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              int32_t imm = (instr & 0xff) |
                                            ((instr >> 4) & 0x700) |
                                            ((instr >> 15) & 0x800);
                              Location location(-imm, kT32PcDelta);
                              // ADR{<c>}{<q>} <Rd>, <label> ; T2
                              adr(CurrentCond(), Best, Register(rd), &location);
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xd0000) == 0xd0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t imm = (instr & 0xff) |
                                         ((instr >> 4) & 0x700) |
                                         ((instr >> 15) & 0x800);
                          if ((InITBlock() ||
                               (rd >= kNumberOfT32LowRegisters) ||
                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
                              (InITBlock() || (rd != rn) ||
                               (rd >= kNumberOfT32LowRegisters) ||
                               (imm > 255)) &&
                              (!ImmediateT32::IsImmediateT32(imm))) {
                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
                            sub(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                imm);
                          } else {
                            // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
                            subw(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 imm);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x02c00000: {
                      // 0xf2c00000
                      unsigned rd = (instr >> 8) & 0xf;
                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
                                     ((instr >> 15) & 0x800) |
                                     ((instr >> 4) & 0xf000);
                      // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
                      movt(CurrentCond(), Register(rd), imm);
                      break;
                    }
                    case 0x03000000: {
                      // 0xf3000000
                      unsigned rd = (instr >> 8) & 0xf;
                      uint32_t imm = (instr & 0x1f) + 1;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t amount =
                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                      // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
                      ssat(CurrentCond(),
                           Register(rd),
                           imm,
                           Operand(Register(rn), LSL, amount));
                      if (((instr & 0xfff08020) != 0xf3000000)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x03200000: {
                      // 0xf3200000
                      switch (instr & 0x000070c0) {
                        case 0x00000000: {
                          // 0xf3200000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = (instr & 0xf) + 1;
                          unsigned rn = (instr >> 16) & 0xf;
                          // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
                          ssat16(CurrentCond(),
                                 Register(rd),
                                 imm,
                                 Register(rn));
                          if (((instr & 0xfff0f0f0) != 0xf3200000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70c0) == 0x0)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = (instr & 0x1f) + 1;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t amount =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
                          ssat(CurrentCond(),
                               Register(rd),
                               imm,
                               Operand(Register(rn), ASR, amount));
                          if (((instr & 0xfff08020) != 0xf3200000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x03400000: {
                      // 0xf3400000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t lsb =
                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                      uint32_t widthm1 = instr & 0x1f;
                      uint32_t width = widthm1 + 1;
                      // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
                      sbfx(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           lsb,
                           width);
                      if (((instr & 0xfff08020) != 0xf3400000)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x03600000: {
                      // 0xf3600000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf36f0000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t lsb =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          uint32_t msb = instr & 0x1f;
                          uint32_t width = msb - lsb + 1;
                          // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
                          bfc(CurrentCond(), Register(rd), lsb, width);
                          if (((instr & 0xffff8020) != 0xf36f0000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t lsb =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          uint32_t msb = instr & 0x1f;
                          uint32_t width = msb - lsb + 1;
                          // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
                          bfi(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              lsb,
                              width);
                          if (((instr & 0xfff08020) != 0xf3600000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x03800000: {
                      // 0xf3800000
                      unsigned rd = (instr >> 8) & 0xf;
                      uint32_t imm = instr & 0x1f;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t amount =
                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                      // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
                      usat(CurrentCond(),
                           Register(rd),
                           imm,
                           Operand(Register(rn), LSL, amount));
                      if (((instr & 0xfff08020) != 0xf3800000)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x03a00000: {
                      // 0xf3a00000
                      switch (instr & 0x000070c0) {
                        case 0x00000000: {
                          // 0xf3a00000
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = instr & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
                          usat16(CurrentCond(),
                                 Register(rd),
                                 imm,
                                 Register(rn));
                          if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70c0) == 0x0)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          uint32_t imm = instr & 0x1f;
                          unsigned rn = (instr >> 16) & 0xf;
                          uint32_t amount =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
                          usat(CurrentCond(),
                               Register(rd),
                               imm,
                               Operand(Register(rn), ASR, amount));
                          if (((instr & 0xfff08020) != 0xf3a00000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x03c00000: {
                      // 0xf3c00000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      uint32_t lsb =
                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                      uint32_t widthm1 = instr & 0x1f;
                      uint32_t width = widthm1 + 1;
                      // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
                      ubfx(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           lsb,
                           width);
                      if (((instr & 0xfff08020) != 0xf3c00000)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x00008000: {
                  // 0xf0008000
                  switch (instr & 0x00005000) {
                    case 0x00000000: {
                      // 0xf0008000
                      switch (instr & 0x03800000) {
                        case 0x03800000: {
                          // 0xf3808000
                          switch (instr & 0x04600000) {
                            case 0x00000000: {
                              // 0xf3808000
                              switch (instr & 0x00000020) {
                                case 0x00000000: {
                                  // 0xf3808000
                                  unsigned spec_reg = ((instr >> 8) & 0xf) |
                                                      ((instr >> 16) & 0x10);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
                                  msr(CurrentCond(),
                                      MaskedSpecialRegister(spec_reg),
                                      Register(rn));
                                  if (((instr & 0xffe0f0ff) != 0xf3808000)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000020: {
                                  // 0xf3808020
                                  UnimplementedT32_32("MSR", instr);
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00200000: {
                              // 0xf3a08000
                              switch (instr & 0x00100000) {
                                case 0x00000000: {
                                  // 0xf3a08000
                                  switch (instr & 0x00000700) {
                                    case 0x00000000: {
                                      // 0xf3a08000
                                      switch (instr & 0x000000f0) {
                                        case 0x00000000: {
                                          // 0xf3a08000
                                          switch (instr & 0x0000000f) {
                                            case 0x00000000: {
                                              // 0xf3a08000
                                              // NOP{<c>}.W ; T2
                                              nop(CurrentCond(), Wide);
                                              if (((instr & 0xffffffff) !=
                                                   0xf3af8000)) {
                                                UnpredictableT32(instr);
                                              }
                                              break;
                                            }
                                            case 0x00000001: {
                                              // 0xf3a08001
                                              // YIELD{<c>}.W ; T2
                                              yield(CurrentCond(), Wide);
                                              if (((instr & 0xffffffff) !=
                                                   0xf3af8001)) {
                                                UnpredictableT32(instr);
                                              }
                                              break;
                                            }
                                            case 0x00000002: {
                                              // 0xf3a08002
                                              UnimplementedT32_32("WFE", instr);
                                              break;
                                            }
                                            case 0x00000003: {
                                              // 0xf3a08003
                                              UnimplementedT32_32("WFI", instr);
                                              break;
                                            }
                                            case 0x00000004: {
                                              // 0xf3a08004
                                              UnimplementedT32_32("SEV", instr);
                                              break;
                                            }
                                            case 0x00000005: {
                                              // 0xf3a08005
                                              UnimplementedT32_32("SEVL",
                                                                  instr);
                                              break;
                                            }
                                            default:
                                              UnallocatedT32(instr);
                                              break;
                                          }
                                          break;
                                        }
                                        case 0x000000f0: {
                                          // 0xf3a080f0
                                          UnimplementedT32_32("DBG", instr);
                                          break;
                                        }
                                        default:
                                          UnallocatedT32(instr);
                                          break;
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xf3a08100
                                      if ((instr & 0x000000e0) == 0x00000000) {
                                        UnimplementedT32_32("CPS", instr);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000400: {
                                      // 0xf3a08400
                                      if ((instr & 0x0000001f) == 0x00000000) {
                                        UnimplementedT32_32("CPSIE", instr);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000500: {
                                      // 0xf3a08500
                                      UnimplementedT32_32("CPSIE", instr);
                                      break;
                                    }
                                    case 0x00000600: {
                                      // 0xf3a08600
                                      if ((instr & 0x0000001f) == 0x00000000) {
                                        UnimplementedT32_32("CPSID", instr);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000700: {
                                      // 0xf3a08700
                                      UnimplementedT32_32("CPSID", instr);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00100000: {
                                  // 0xf3b08000
                                  switch (instr & 0x000000f0) {
                                    case 0x00000020: {
                                      // 0xf3b08020
                                      // CLREX{<c>}{<q>} ; T1
                                      clrex(CurrentCond());
                                      if (((instr & 0xffffffff) !=
                                           0xf3bf8f2f)) {
                                        UnpredictableT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000040: {
                                      // 0xf3b08040
                                      MemoryBarrier option(instr & 0xf);
                                      // DSB{<c>}{<q>} {<option>} ; T1
                                      dsb(CurrentCond(), option);
                                      if (((instr & 0xfffffff0) !=
                                           0xf3bf8f40)) {
                                        UnpredictableT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000050: {
                                      // 0xf3b08050
                                      MemoryBarrier option(instr & 0xf);
                                      // DMB{<c>}{<q>} {<option>} ; T1
                                      dmb(CurrentCond(), option);
                                      if (((instr & 0xfffffff0) !=
                                           0xf3bf8f50)) {
                                        UnpredictableT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000060: {
                                      // 0xf3b08060
                                      MemoryBarrier option(instr & 0xf);
                                      // ISB{<c>}{<q>} {<option>} ; T1
                                      isb(CurrentCond(), option);
                                      if (((instr & 0xfffffff0) !=
                                           0xf3bf8f60)) {
                                        UnpredictableT32(instr);
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00400000: {
                              // 0xf3c08000
                              switch (instr & 0x00100000) {
                                case 0x00000000: {
                                  // 0xf3c08000
                                  unsigned rm = (instr >> 16) & 0xf;
                                  // BXJ{<c>}{<q>} <Rm> ; T1
                                  bxj(CurrentCond(), Register(rm));
                                  if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00100000: {
                                  // 0xf3d08000
                                  switch (instr & 0x000000ff) {
                                    case 0x00000000: {
                                      // 0xf3d08000
                                      if ((instr & 0x000f0000) == 0x000e0000) {
                                        UnimplementedT32_32("ERET", instr);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    default: {
                                      if (((instr & 0xff) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      uint32_t imm = instr & 0xff;
                                      // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
                                      subs(CurrentCond(), Best, pc, lr, imm);
                                      if (((instr & 0xffffff00) !=
                                           0xf3de8f00)) {
                                        UnpredictableT32(instr);
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00600000: {
                              // 0xf3e08000
                              switch (instr & 0x00000020) {
                                case 0x00000000: {
                                  // 0xf3e08000
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned spec_reg = (instr >> 20) & 0x1;
                                  // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
                                  mrs(CurrentCond(),
                                      Register(rd),
                                      SpecialRegister(spec_reg));
                                  if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000020: {
                                  // 0xf3e08020
                                  UnimplementedT32_32("MRS", instr);
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x04000000: {
                              // 0xf7808000
                              switch (instr & 0x001f2fff) {
                                case 0x000f0001: {
                                  // 0xf78f8001
                                  UnimplementedT32_32("DCPS1", instr);
                                  break;
                                }
                                case 0x000f0002: {
                                  // 0xf78f8002
                                  UnimplementedT32_32("DCPS2", instr);
                                  break;
                                }
                                case 0x000f0003: {
                                  // 0xf78f8003
                                  UnimplementedT32_32("DCPS3", instr);
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            case 0x04600000: {
                              // 0xf7e08000
                              switch (instr & 0x00102000) {
                                case 0x00000000: {
                                  // 0xf7e08000
                                  uint32_t imm =
                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
                                  // HVC{<q>} {#}<imm16> ; T1
                                  hvc(Condition::None(), imm);
                                  break;
                                }
                                case 0x00100000: {
                                  // 0xf7f08000
                                  UnimplementedT32_32("SMC", instr);
                                  break;
                                }
                                case 0x00102000: {
                                  // 0xf7f0a000
                                  uint32_t imm =
                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
                                  if ((imm <= 255)) {
                                    // UDF{<c>}.W {#}<imm> ; T2
                                    udf(CurrentCond(), Wide, imm);
                                  } else {
                                    // UDF{<c>}{<q>} {#}<imm> ; T2
                                    udf(CurrentCond(), Best, imm);
                                  }
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x3800000) == 0x3800000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          Condition condition((instr >> 22) & 0xf);
                          int32_t imm =
                              SignExtend<int32_t>(((instr & 0x7ff) |
                                                   ((instr >> 5) & 0x1f800) |
                                                   ((instr << 4) & 0x20000) |
                                                   ((instr << 7) & 0x40000) |
                                                   ((instr >> 7) & 0x80000))
                                                      << 1,
                                                  21);
                          Location location(imm, kT32PcDelta);
                          if ((imm >= -1048576) && (imm <= 1048574) &&
                              ((imm & 1) == 0) &&
                              ((imm >= -256) && (imm <= 254) &&
                               ((imm & 1) == 0))) {
                            // B<c>.W <label> ; T3
                            b(condition, Wide, &location);
                            if (InITBlock()) {
                              UnpredictableT32(instr);
                            }
                          } else if ((imm >= -1048576) && (imm <= 1048574) &&
                                     ((imm & 1) == 0)) {
                            // B<c>{<q>} <label> ; T3
                            b(condition, Best, &location);
                            if (InITBlock()) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00001000: {
                      // 0xf0009000
                      uint32_t encoded_imm =
                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
                          ((instr << 10) & 0x200000) |
                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
                      uint32_t S = encoded_imm & (1 << 23);
                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
                      Location location(imm, kT32PcDelta);
                      if ((imm >= -16777216) && (imm <= 16777214) &&
                          ((imm & 1) == 0) &&
                          ((imm >= -2048) && (imm <= 2046) &&
                           ((imm & 1) == 0))) {
                        // B{<c>}.W <label> ; T4
                        b(CurrentCond(), Wide, &location);
                      } else if ((imm >= -16777216) && (imm <= 16777214) &&
                                 ((imm & 1) == 0)) {
                        // B{<c>}{<q>} <label> ; T4
                        b(CurrentCond(), Best, &location);
                        if (!OutsideITBlockOrLast()) {
                          UnpredictableT32(instr);
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00004000: {
                      // 0xf000c000
                      if ((instr & 0x00000001) == 0x00000000) {
                        uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
                                               ((instr >> 6) & 0xffc00) |
                                               ((instr << 9) & 0x100000) |
                                               ((instr << 8) & 0x200000) |
                                               ((instr >> 4) & 0x400000);
                        uint32_t S = encoded_imm & (1 << 22);
                        encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
                        int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
                        Location location(imm, kT32PcDelta);
                        // BLX{<c>}{<q>} <label> ; T2
                        blx(CurrentCond(), &location);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00005000: {
                      // 0xf000d000
                      uint32_t encoded_imm =
                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
                          ((instr << 10) & 0x200000) |
                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
                      uint32_t S = encoded_imm & (1 << 23);
                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
                      Location location(imm, kT32PcDelta);
                      // BL{<c>}{<q>} <label> ; T1
                      bl(CurrentCond(), &location);
                      break;
                    }
                  }
                  break;
                }
              }
              break;
            }
          }
          break;
        }
        case 0x08000000: {
          // 0xe8000000
          switch (instr & 0x06000000) {
            case 0x00000000: {
              // 0xe8000000
              switch (instr & 0x10100000) {
                case 0x00000000: {
                  // 0xe8000000
                  switch (instr & 0x01400000) {
                    case 0x00000000: {
                      // 0xe8000000
                      switch (instr & 0x00800000) {
                        case 0x00000000: {
                          // 0xe8000000
                          UnimplementedT32_32("SRSDB", instr);
                          break;
                        }
                        case 0x00800000: {
                          // 0xe8800000
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          RegisterList registers(
                              (((instr >> 14) & 0x1) << kLRRegNum) |
                              (instr & 0x1fff));
                          if ((rn < kNumberOfT32LowRegisters) &&
                              write_back.DoesWriteBack() &&
                              ((registers.GetList() & ~0xff) == 0)) {
                            // STM{<c>}.W <Rn>{!}, <registers> ; T2
                            stm(CurrentCond(),
                                Wide,
                                Register(rn),
                                write_back,
                                registers);
                            if (((instr & 0xffd0a000) != 0xe8800000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
                            stm(CurrentCond(),
                                Best,
                                Register(rn),
                                write_back,
                                registers);
                            if (((instr & 0xffd0a000) != 0xe8800000)) {
                              UnpredictableT32(instr);
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xe8400000
                      switch (instr & 0x00200000) {
                        case 0x00000000: {
                          // 0xe8400000
                          switch (instr & 0x00800000) {
                            case 0x00000000: {
                              // 0xe8400000
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              int32_t offset = (instr & 0xff) << 2;
                              // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
                              strex(CurrentCond(),
                                    Register(rd),
                                    Register(rt),
                                    MemOperand(Register(rn),
                                               plus,
                                               offset,
                                               Offset));
                              break;
                            }
                            case 0x00800000: {
                              // 0xe8c00000
                              switch (instr & 0x000000f0) {
                                case 0x00000040: {
                                  // 0xe8c00040
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
                                  strexb(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000050: {
                                  // 0xe8c00050
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
                                  strexh(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000070: {
                                  // 0xe8c00070
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rt2 = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
                                  strexd(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         Register(rt2),
                                         MemOperand(Register(rn), Offset));
                                  break;
                                }
                                case 0x00000080: {
                                  // 0xe8c00080
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  stlb(CurrentCond(),
                                       Register(rt),
                                       MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000090: {
                                  // 0xe8c00090
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  stlh(CurrentCond(),
                                       Register(rt),
                                       MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000a0: {
                                  // 0xe8c000a0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  stl(CurrentCond(),
                                      Register(rt),
                                      MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8c00faf)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000c0: {
                                  // 0xe8c000c0
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
                                  stlexb(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000d0: {
                                  // 0xe8c000d0
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
                                  stlexh(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000e0: {
                                  // 0xe8c000e0
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
                                  stlex(CurrentCond(),
                                        Register(rd),
                                        Register(rt),
                                        MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000f0: {
                                  // 0xe8c000f0
                                  unsigned rd = instr & 0xf;
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rt2 = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
                                  stlexd(CurrentCond(),
                                         Register(rd),
                                         Register(rt),
                                         Register(rt2),
                                         MemOperand(Register(rn), Offset));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00200000: {
                          // 0xe8600000
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rt2 = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                 : plus);
                          int32_t offset = (instr & 0xff) << 2;
                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
                          strd(CurrentCond(),
                               Register(rt),
                               Register(rt2),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PostIndex));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01000000: {
                      // 0xe9000000
                      switch (instr & 0x00800000) {
                        case 0x00000000: {
                          // 0xe9000000
                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
                               Uint32(0x1)) &&
                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                               Uint32(0xd)) &&
                              (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
                                         << 13) |
                                        (Uint32(instr) & Uint32(0x1fff))) >
                               Int64(1))) {
                            RegisterList registers(
                                (((instr >> 14) & 0x1) << kLRRegNum) |
                                (instr & 0x1fff));
                            if (registers.IsR0toR7orLR()) {
                              // PUSH{<c>}.W <registers> ; T1
                              push(CurrentCond(), Wide, registers);
                              if (((instr & 0xffffa000) != 0xe92d0000)) {
                                UnpredictableT32(instr);
                              }
                            } else {
                              // PUSH{<c>}{<q>} <registers> ; T1
                              push(CurrentCond(), Best, registers);
                              if (((instr & 0xffffa000) != 0xe92d0000)) {
                                UnpredictableT32(instr);
                              }
                            }
                            return;
                          }
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          RegisterList registers(
                              (((instr >> 14) & 0x1) << kLRRegNum) |
                              (instr & 0x1fff));
                          // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
                          stmdb(CurrentCond(),
                                Best,
                                Register(rn),
                                write_back,
                                registers);
                          if (((instr & 0xffd0a000) != 0xe9000000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00800000: {
                          // 0xe9800000
                          UnimplementedT32_32("SRS{IA}", instr);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01400000: {
                      // 0xe9400000
                      switch (instr & 0x00200000) {
                        case 0x00000000: {
                          // 0xe9400000
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rt2 = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                 : plus);
                          int32_t offset = (instr & 0xff) << 2;
                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
                          strd(CurrentCond(),
                               Register(rt),
                               Register(rt2),
                               MemOperand(Register(rn), sign, offset, Offset));
                          break;
                        }
                        case 0x00200000: {
                          // 0xe9600000
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rt2 = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                 : plus);
                          int32_t offset = (instr & 0xff) << 2;
                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
                          strd(CurrentCond(),
                               Register(rt),
                               Register(rt2),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PreIndex));
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x00100000: {
                  // 0xe8100000
                  switch (instr & 0x00400000) {
                    case 0x00000000: {
                      // 0xe8100000
                      switch (instr & 0x01800000) {
                        case 0x00000000: {
                          // 0xe8100000
                          UnimplementedT32_32("RFEDB", instr);
                          break;
                        }
                        case 0x00800000: {
                          // 0xe8900000
                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
                               Uint32(0x1)) &&
                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                               Uint32(0xd)) &&
                              (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
                                         << 14) |
                                        ((Uint32((instr >> 14)) & Uint32(0x1))
                                         << 13) |
                                        (Uint32(instr) & Uint32(0x1fff))) >
                               Int64(1))) {
                            RegisterList registers(
                                (((instr >> 15) & 0x1) << kPCRegNum) |
                                (((instr >> 14) & 0x1) << kLRRegNum) |
                                (instr & 0x1fff));
                            if (registers.IsR0toR7orPC()) {
                              // POP{<c>}.W <registers> ; T2
                              pop(CurrentCond(), Wide, registers);
                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
                                UnpredictableT32(instr);
                              }
                            } else {
                              // POP{<c>}{<q>} <registers> ; T2
                              pop(CurrentCond(), Best, registers);
                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
                                UnpredictableT32(instr);
                              }
                            }
                            return;
                          }
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          RegisterList registers(
                              (((instr >> 15) & 0x1) << kPCRegNum) |
                              (((instr >> 14) & 0x1) << kLRRegNum) |
                              (instr & 0x1fff));
                          if ((rn < kNumberOfT32LowRegisters) &&
                              (((registers.GetList() & (1 << rn)) == 0) ==
                               write_back.DoesWriteBack()) &&
                              ((registers.GetList() & ~0xff) == 0)) {
                            // LDM{<c>}.W <Rn>{!}, <registers> ; T2
                            ldm(CurrentCond(),
                                Wide,
                                Register(rn),
                                write_back,
                                registers);
                            if (((instr & 0xffd02000) != 0xe8900000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
                            ldm(CurrentCond(),
                                Best,
                                Register(rn),
                                write_back,
                                registers);
                            if (((instr & 0xffd02000) != 0xe8900000)) {
                              UnpredictableT32(instr);
                            }
                          }
                          break;
                        }
                        case 0x01000000: {
                          // 0xe9100000
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          RegisterList registers(
                              (((instr >> 15) & 0x1) << kPCRegNum) |
                              (((instr >> 14) & 0x1) << kLRRegNum) |
                              (instr & 0x1fff));
                          // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
                          ldmdb(CurrentCond(),
                                Register(rn),
                                write_back,
                                registers);
                          if (((instr & 0xffd02000) != 0xe9100000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x01800000: {
                          // 0xe9900000
                          UnimplementedT32_32("RFE{IA}", instr);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xe8500000
                      switch (instr & 0x01200000) {
                        case 0x00000000: {
                          // 0xe8500000
                          switch (instr & 0x00800000) {
                            case 0x00000000: {
                              // 0xe8500000
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              int32_t offset = (instr & 0xff) << 2;
                              // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
                              ldrex(CurrentCond(),
                                    Register(rt),
                                    MemOperand(Register(rn),
                                               plus,
                                               offset,
                                               Offset));
                              if (((instr & 0xfff00f00) != 0xe8500f00)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x00800000: {
                              // 0xe8d00000
                              switch (instr & 0x000000f0) {
                                case 0x00000000: {
                                  // 0xe8d00000
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
                                  tbb(CurrentCond(),
                                      Register(rn),
                                      Register(rm));
                                  if (((instr & 0xfff0fff0) != 0xe8d0f000) ||
                                      !OutsideITBlockOrLast()) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000010: {
                                  // 0xe8d00010
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
                                  tbh(CurrentCond(),
                                      Register(rn),
                                      Register(rm));
                                  if (((instr & 0xfff0fff0) != 0xe8d0f010) ||
                                      !OutsideITBlockOrLast()) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000040: {
                                  // 0xe8d00040
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldrexb(CurrentCond(),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000050: {
                                  // 0xe8d00050
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldrexh(CurrentCond(),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000070: {
                                  // 0xe8d00070
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rt2 = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
                                  ldrexd(CurrentCond(),
                                         Register(rt),
                                         Register(rt2),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff000ff) != 0xe8d0007f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000080: {
                                  // 0xe8d00080
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldab(CurrentCond(),
                                       Register(rt),
                                       MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000090: {
                                  // 0xe8d00090
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldah(CurrentCond(),
                                       Register(rt),
                                       MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000a0: {
                                  // 0xe8d000a0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  lda(CurrentCond(),
                                      Register(rt),
                                      MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00faf)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000c0: {
                                  // 0xe8d000c0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldaexb(CurrentCond(),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000d0: {
                                  // 0xe8d000d0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldaexh(CurrentCond(),
                                         Register(rt),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000e0: {
                                  // 0xe8d000e0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
                                  ldaex(CurrentCond(),
                                        Register(rt),
                                        MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff00fff) != 0xe8d00fef)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                case 0x000000f0: {
                                  // 0xe8d000f0
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rt2 = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
                                  ldaexd(CurrentCond(),
                                         Register(rt),
                                         Register(rt2),
                                         MemOperand(Register(rn), Offset));
                                  if (((instr & 0xfff000ff) != 0xe8d000ff)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00200000: {
                          // 0xe8700000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xe87f0000
                              if (((instr & 0x1200000) == 0x0)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xff;
                              imm <<= 2;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
                              if (minus_zero) {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     MemOperand(pc, minus, 0));
                              } else {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     &location);
                              }
                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                     : plus);
                              int32_t offset = (instr & 0xff) << 2;
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
                              ldrd(CurrentCond(),
                                   Register(rt),
                                   Register(rt2),
                                   MemOperand(Register(rn),
                                              sign,
                                              offset,
                                              PostIndex));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x01000000: {
                          // 0xe9500000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xe95f0000
                              if (((instr & 0x1200000) == 0x0)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xff;
                              imm <<= 2;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
                              if (minus_zero) {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     MemOperand(pc, minus, 0));
                              } else {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     &location);
                              }
                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                     : plus);
                              int32_t offset = (instr & 0xff) << 2;
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
                              ldrd(CurrentCond(),
                                   Register(rt),
                                   Register(rt2),
                                   MemOperand(Register(rn),
                                              sign,
                                              offset,
                                              Offset));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x01200000: {
                          // 0xe9700000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xe97f0000
                              if (((instr & 0x1200000) == 0x0)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xff;
                              imm <<= 2;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
                              if (minus_zero) {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     MemOperand(pc, minus, 0));
                              } else {
                                ldrd(CurrentCond(),
                                     Register(rt),
                                     Register(rt2),
                                     &location);
                              }
                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rt2 = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                     : plus);
                              int32_t offset = (instr & 0xff) << 2;
                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
                              ldrd(CurrentCond(),
                                   Register(rt),
                                   Register(rt2),
                                   MemOperand(Register(rn),
                                              sign,
                                              offset,
                                              PreIndex));
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x10000000: {
                  // 0xf8000000
                  switch (instr & 0x01a00000) {
                    case 0x00000000: {
                      // 0xf8000000
                      switch (instr & 0x00400d00) {
                        case 0x00000000: {
                          // 0xf8000000
                          if ((instr & 0x000002c0) == 0x00000000) {
                            if (((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign(plus);
                            unsigned rm = instr & 0xf;
                            Shift shift = LSL;
                            uint32_t amount = (instr >> 4) & 0x3;
                            AddrMode addrmode = Offset;
                            if ((rt < kNumberOfT32LowRegisters) &&
                                (rn < kNumberOfT32LowRegisters) &&
                                (rm < kNumberOfT32LowRegisters) &&
                                shift.IsLSL() && (amount == 0) &&
                                sign.IsPlus()) {
                              // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
                              strb(CurrentCond(),
                                   Wide,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              sign,
                                              Register(rm),
                                              addrmode));
                            } else {
                              // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                              strb(CurrentCond(),
                                   Best,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              sign,
                                              Register(rm),
                                              shift,
                                              amount,
                                              addrmode));
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00000900: {
                          // 0xf8000900
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
                          strb(CurrentCond(),
                               Best,
                               Register(rt),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PostIndex));
                          break;
                        }
                        case 0x00000c00: {
                          // 0xf8000c00
                          switch (instr & 0x00000200) {
                            case 0x00000000: {
                              // 0xf8000c00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              int32_t offset = instr & 0xff;
                              // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
                              strb(CurrentCond(),
                                   Best,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              minus,
                                              offset,
                                              Offset));
                              break;
                            }
                            case 0x00000200: {
                              // 0xf8000e00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              UnimplementedT32_32("STRBT", instr);
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000d00: {
                          // 0xf8000d00
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
                          strb(CurrentCond(),
                               Best,
                               Register(rt),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PreIndex));
                          break;
                        }
                        case 0x00400000: {
                          // 0xf8400000
                          if ((instr & 0x000002c0) == 0x00000000) {
                            if (((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign(plus);
                            unsigned rm = instr & 0xf;
                            Shift shift = LSL;
                            uint32_t amount = (instr >> 4) & 0x3;
                            AddrMode addrmode = Offset;
                            if ((rt < kNumberOfT32LowRegisters) &&
                                (rn < kNumberOfT32LowRegisters) &&
                                (rm < kNumberOfT32LowRegisters) &&
                                shift.IsLSL() && (amount == 0) &&
                                sign.IsPlus()) {
                              // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
                              str(CurrentCond(),
                                  Wide,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             Register(rm),
                                             addrmode));
                            } else {
                              // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                              str(CurrentCond(),
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             Register(rm),
                                             shift,
                                             amount,
                                             addrmode));
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00400900: {
                          // 0xf8400900
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
                          str(CurrentCond(),
                              Best,
                              Register(rt),
                              MemOperand(Register(rn),
                                         sign,
                                         offset,
                                         PostIndex));
                          break;
                        }
                        case 0x00400c00: {
                          // 0xf8400c00
                          switch (instr & 0x00000200) {
                            case 0x00000000: {
                              // 0xf8400c00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              int32_t offset = instr & 0xff;
                              // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
                              str(CurrentCond(),
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             minus,
                                             offset,
                                             Offset));
                              break;
                            }
                            case 0x00000200: {
                              // 0xf8400e00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              UnimplementedT32_32("STRT", instr);
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00400d00: {
                          // 0xf8400d00
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
                               Uint32(0xd)) &&
                              ((Uint32((instr >> 9)) & Uint32(0x1)) ==
                               Uint32(0x0)) &&
                              ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
                            unsigned rt = (instr >> 12) & 0xf;
                            if ((rt <= 7) || (rt == kLRRegNum)) {
                              // PUSH{<c>}.W <single_register_list> ; T4
                              push(CurrentCond(), Wide, Register(rt));
                            } else {
                              // PUSH{<c>}{<q>} <single_register_list> ; T4
                              push(CurrentCond(), Best, Register(rt));
                            }
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
                          str(CurrentCond(),
                              Best,
                              Register(rt),
                              MemOperand(Register(rn), sign, offset, PreIndex));
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xf8200000
                      switch (instr & 0x00400d00) {
                        case 0x00000000: {
                          // 0xf8200000
                          if ((instr & 0x000002c0) == 0x00000000) {
                            if (((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign(plus);
                            unsigned rm = instr & 0xf;
                            Shift shift = LSL;
                            uint32_t amount = (instr >> 4) & 0x3;
                            AddrMode addrmode = Offset;
                            if ((rt < kNumberOfT32LowRegisters) &&
                                (rn < kNumberOfT32LowRegisters) &&
                                (rm < kNumberOfT32LowRegisters) &&
                                shift.IsLSL() && (amount == 0) &&
                                sign.IsPlus()) {
                              // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
                              strh(CurrentCond(),
                                   Wide,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              sign,
                                              Register(rm),
                                              addrmode));
                            } else {
                              // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                              strh(CurrentCond(),
                                   Best,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              sign,
                                              Register(rm),
                                              shift,
                                              amount,
                                              addrmode));
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00000900: {
                          // 0xf8200900
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
                          strh(CurrentCond(),
                               Best,
                               Register(rt),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PostIndex));
                          break;
                        }
                        case 0x00000c00: {
                          // 0xf8200c00
                          switch (instr & 0x00000200) {
                            case 0x00000000: {
                              // 0xf8200c00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              int32_t offset = instr & 0xff;
                              // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
                              strh(CurrentCond(),
                                   Best,
                                   Register(rt),
                                   MemOperand(Register(rn),
                                              minus,
                                              offset,
                                              Offset));
                              break;
                            }
                            case 0x00000200: {
                              // 0xf8200e00
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              UnimplementedT32_32("STRHT", instr);
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000d00: {
                          // 0xf8200d00
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
                          int32_t offset = instr & 0xff;
                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
                          strh(CurrentCond(),
                               Best,
                               Register(rt),
                               MemOperand(Register(rn),
                                          sign,
                                          offset,
                                          PreIndex));
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xf8800000
                      switch (instr & 0x00400000) {
                        case 0x00000000: {
                          // 0xf8800000
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          int32_t offset = instr & 0xfff;
                          if ((rt < kNumberOfT32LowRegisters) &&
                              (rn < kNumberOfT32LowRegisters) &&
                              ((offset >= 0) && (offset <= 31))) {
                            // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
                            strb(CurrentCond(),
                                 Wide,
                                 Register(rt),
                                 MemOperand(Register(rn),
                                            plus,
                                            offset,
                                            Offset));
                          } else {
                            // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
                            strb(CurrentCond(),
                                 Best,
                                 Register(rt),
                                 MemOperand(Register(rn),
                                            plus,
                                            offset,
                                            Offset));
                          }
                          break;
                        }
                        case 0x00400000: {
                          // 0xf8c00000
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          int32_t offset = instr & 0xfff;
                          if (((rt < kNumberOfT32LowRegisters) &&
                               (rn < kNumberOfT32LowRegisters) &&
                               ((offset >= 0) && (offset <= 124) &&
                                ((offset & 3) == 0))) ||
                              ((rt < kNumberOfT32LowRegisters) &&
                               (rn == sp.GetCode()) &&
                               ((offset >= 0) && (offset <= 1020) &&
                                ((offset & 3) == 0)))) {
                            // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
                            str(CurrentCond(),
                                Wide,
                                Register(rt),
                                MemOperand(Register(rn), plus, offset, Offset));
                          } else {
                            // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
                            str(CurrentCond(),
                                Best,
                                Register(rt),
                                MemOperand(Register(rn), plus, offset, Offset));
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00a00000: {
                      // 0xf8a00000
                      if ((instr & 0x00400000) == 0x00000000) {
                        if (((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedT32(instr);
                          return;
                        }
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        int32_t offset = instr & 0xfff;
                        if ((rt < kNumberOfT32LowRegisters) &&
                            (rn < kNumberOfT32LowRegisters) &&
                            ((offset >= 0) && (offset <= 62) &&
                             ((offset & 1) == 0))) {
                          // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
                          strh(CurrentCond(),
                               Wide,
                               Register(rt),
                               MemOperand(Register(rn), plus, offset, Offset));
                        } else {
                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
                          strh(CurrentCond(),
                               Best,
                               Register(rt),
                               MemOperand(Register(rn), plus, offset, Offset));
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x01000000: {
                      // 0xf9000000
                      switch (instr & 0x0000000d) {
                        case 0x0000000d: {
                          // 0xf900000d
                          switch (instr & 0x00000002) {
                            case 0x00000000: {
                              // 0xf900000d
                              switch (instr & 0x00000f00) {
                                case 0x00000000: {
                                  // 0xf900000d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xf900010d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xf900020d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xf900030d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000400: {
                                  // 0xf900040d
                                  if (((instr & 0x20) == 0x20)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000500: {
                                  // 0xf900050d
                                  if (((instr & 0x20) == 0x20)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000600: {
                                  // 0xf900060d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000700: {
                                  // 0xf900070d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000800: {
                                  // 0xf900080d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf900090d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000a00: {
                                  // 0xf9000a0d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            case 0x00000002: {
                              // 0xf900000f
                              switch (instr & 0x00000f00) {
                                case 0x00000000: {
                                  // 0xf900000d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xf900010d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xf900020d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xf900030d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000400: {
                                  // 0xf900040d
                                  if (((instr & 0x20) == 0x20)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000500: {
                                  // 0xf900050d
                                  if (((instr & 0x20) == 0x20)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000600: {
                                  // 0xf900060d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000700: {
                                  // 0xf900070d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000800: {
                                  // 0xf900080d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf900090d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000a00: {
                                  // 0xf9000a0d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_5_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x00000f00) {
                            case 0x00000000: {
                              // 0xf9000000
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_4_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x0:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                                case 0x1:
                                  length = 4;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst4(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000100: {
                              // 0xf9000100
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_4_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x0:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                                case 0x1:
                                  length = 4;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst4(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000200: {
                              // 0xf9000200
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_5_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000300: {
                              // 0xf9000300
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000400: {
                              // 0xf9000400
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0x20) == 0x20)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_3_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x4:
                                  length = 3;
                                  spacing = kSingle;
                                  break;
                                case 0x5:
                                  length = 3;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst3(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000500: {
                              // 0xf9000500
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0x20) == 0x20)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_3_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x4:
                                  length = 3;
                                  spacing = kSingle;
                                  break;
                                case 0x5:
                                  length = 3;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst3(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000600: {
                              // 0xf9000600
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_5_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000700: {
                              // 0xf9000700
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_5_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000800: {
                              // 0xf9000800
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000900: {
                              // 0xf9000900
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000a00: {
                              // 0xf9000a00
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_5_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vst1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01200000: {
                      // 0xf9200000
                      switch (instr & 0x0000000d) {
                        case 0x0000000d: {
                          // 0xf920000d
                          switch (instr & 0x00000002) {
                            case 0x00000000: {
                              // 0xf920000d
                              switch (instr & 0x00000f00) {
                                case 0x00000000: {
                                  // 0xf920000d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xf920010d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xf920020d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xf920030d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000400: {
                                  // 0xf920040d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000500: {
                                  // 0xf920050d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000600: {
                                  // 0xf920060d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000700: {
                                  // 0xf920070d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000800: {
                                  // 0xf920080d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf920090d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                case 0x00000a00: {
                                  // 0xf9200a0d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         PostIndex));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            case 0x00000002: {
                              // 0xf920000f
                              switch (instr & 0x00000f00) {
                                case 0x00000000: {
                                  // 0xf920000d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xf920010d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_4_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xf920020d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xf920030d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000400: {
                                  // 0xf920040d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000500: {
                                  // 0xf920050d
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_3_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x4:
                                      length = 3;
                                      spacing = kSingle;
                                      break;
                                    case 0x5:
                                      length = 3;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000600: {
                                  // 0xf920060d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000700: {
                                  // 0xf920070d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000800: {
                                  // 0xf920080d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf920090d
                                  if (((instr & 0xe30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_2_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x8:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x9:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                    case 0x3:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                case 0x00000a00: {
                                  // 0xf9200a0d
                                  if (((instr & 0xe20) == 0x620) ||
                                      ((instr & 0xf30) == 0xa30)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_6_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_align_1_Decode((instr >> 4) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 8) & 0xf) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x7:
                                      length = 1;
                                      break;
                                    case 0xa:
                                      length = 2;
                                      break;
                                    case 0x6:
                                      length = 3;
                                      break;
                                    case 0x2:
                                      length = 4;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kMultipleLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Offset));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x00000f00) {
                            case 0x00000000: {
                              // 0xf9200000
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_4_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x0:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                                case 0x1:
                                  length = 4;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld4(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000100: {
                              // 0xf9200100
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_4_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x0:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                                case 0x1:
                                  length = 4;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld4(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000200: {
                              // 0xf9200200
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_1_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000300: {
                              // 0xf9200300
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000400: {
                              // 0xf9200400
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_3_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x4:
                                  length = 3;
                                  spacing = kSingle;
                                  break;
                                case 0x5:
                                  length = 3;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld3(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000500: {
                              // 0xf9200500
                              if (((instr & 0xd) == 0xd)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_3_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x4:
                                  length = 3;
                                  spacing = kSingle;
                                  break;
                                case 0x5:
                                  length = 3;
                                  spacing = kDouble;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld3(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000600: {
                              // 0xf9200600
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_1_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000700: {
                              // 0xf9200700
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_1_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000800: {
                              // 0xf9200800
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000900: {
                              // 0xf9200900
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe30) == 0x830)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_2_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x8:
                                  length = 2;
                                  spacing = kSingle;
                                  break;
                                case 0x9:
                                  length = 2;
                                  spacing = kDouble;
                                  break;
                                case 0x3:
                                  length = 4;
                                  spacing = kSingle;
                                  break;
                              }
                              unsigned last =
                                  first +
                                  (length - 1) * (spacing == kSingle ? 1 : 2);
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld2(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            case 0x00000a00: {
                              // 0xf9200a00
                              if (((instr & 0xd) == 0xd) ||
                                  ((instr & 0xe20) == 0x620) ||
                                  ((instr & 0xf30) == 0xa30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_6_Decode((instr >> 6) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              Alignment align =
                                  Align_align_1_Decode((instr >> 4) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid) ||
                                  align.Is(kBadAlignment)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned first = ExtractDRegister(instr, 22, 12);
                              unsigned length;
                              SpacingType spacing = kSingle;
                              switch ((instr >> 8) & 0xf) {
                                default:
                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                case 0x7:
                                  length = 1;
                                  break;
                                case 0xa:
                                  length = 2;
                                  break;
                                case 0x6:
                                  length = 3;
                                  break;
                                case 0x2:
                                  length = 4;
                                  break;
                              }
                              unsigned last = first + length - 1;
                              TransferType transfer = kMultipleLanes;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                              vld1(CurrentCond(),
                                   dt,
                                   NeonRegisterList(DRegister(first),
                                                    DRegister(last),
                                                    spacing,
                                                    transfer),
                                   AlignedMemOperand(Register(rn),
                                                     align,
                                                     Register(rm),
                                                     PostIndex));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01800000: {
                      // 0xf9800000
                      switch (instr & 0x00000300) {
                        case 0x00000000: {
                          // 0xf9800000
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9800c00
                              UnallocatedT32(instr);
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf980000d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf980000d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_1_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 1;
                                      unsigned last = first + length - 1;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vst1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf980000f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_1_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 1;
                                      unsigned last = first + length - 1;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vst1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_1_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 1;
                                  unsigned last = first + length - 1;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vst1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000100: {
                          // 0xf9800100
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9800d00
                              UnallocatedT32(instr);
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf980010d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf980010d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_2_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 2;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vst2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf980010f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_2_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 2;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vst2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_2_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 2;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vst2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000200: {
                          // 0xf9800200
                          switch (instr & 0x00000c30) {
                            case 0x00000010: {
                              // 0xf9800210
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000030: {
                              // 0xf9800230
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000410: {
                              // 0xf9800610
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000430: {
                              // 0xf9800630
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000810: {
                              // 0xf9800a10
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000820: {
                              // 0xf9800a20
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000830: {
                              // 0xf9800a30
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000c00: {
                              // 0xf9800e00
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000c10: {
                              // 0xf9800e10
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000c20: {
                              // 0xf9800e20
                              UnallocatedT32(instr);
                              break;
                            }
                            case 0x00000c30: {
                              // 0xf9800e30
                              UnallocatedT32(instr);
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf980020d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf980020d
                                      if (((instr & 0xc00) == 0xc00) ||
                                          ((instr & 0x810) == 0x10) ||
                                          ((instr & 0xc30) == 0x810) ||
                                          ((instr & 0xc30) == 0x820) ||
                                          ((instr & 0xc30) == 0x830)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeon decode_neon =
                                          Index_1_Decode((instr >> 4) & 0xf,
                                                         dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 3;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
                                      vst3(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           MemOperand(Register(rn), PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf980020f
                                      if (((instr & 0xc00) == 0xc00) ||
                                          ((instr & 0x810) == 0x10) ||
                                          ((instr & 0xc30) == 0x810) ||
                                          ((instr & 0xc30) == 0x820) ||
                                          ((instr & 0xc30) == 0x830)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeon decode_neon =
                                          Index_1_Decode((instr >> 4) & 0xf,
                                                         dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 3;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
                                      vst3(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           MemOperand(Register(rn), Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd) ||
                                      ((instr & 0x810) == 0x10) ||
                                      ((instr & 0xc30) == 0x810) ||
                                      ((instr & 0xc30) == 0x820) ||
                                      ((instr & 0xc30) == 0x830)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeon decode_neon =
                                      Index_1_Decode((instr >> 4) & 0xf, dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 3;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign(plus);
                                  unsigned rm = instr & 0xf;
                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
                                  vst3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  Register(rm),
                                                  PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000300: {
                          // 0xf9800300
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9800f00
                              UnallocatedT32(instr);
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf980030d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf980030d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_3_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 4;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vst4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf980030f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_3_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 4;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vst4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_3_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 4;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vst4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x01a00000: {
                      // 0xf9a00000
                      switch (instr & 0x00000300) {
                        case 0x00000000: {
                          // 0xf9a00000
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9a00c00
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a00c0d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a00c0d
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_1_Decode((instr >> 4) & 0x1,
                                                           dt);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing = kSingle;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 1;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          break;
                                      }
                                      unsigned last = first + length - 1;
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a00c0f
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_1_Decode((instr >> 4) & 0x1,
                                                           dt);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing = kSingle;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 1;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          break;
                                      }
                                      unsigned last = first + length - 1;
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_a_1_Decode((instr >> 4) & 0x1, dt);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing = kSingle;
                                  switch ((instr >> 5) & 0x1) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 1;
                                      break;
                                    case 0x1:
                                      length = 2;
                                      break;
                                  }
                                  unsigned last = first + length - 1;
                                  TransferType transfer = kAllLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a0000d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a0000d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_1_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 1;
                                      unsigned last = first + length - 1;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a0000f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_1_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 1;
                                      unsigned last = first + length - 1;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld1(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_1_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 1;
                                  unsigned last = first + length - 1;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld1(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000100: {
                          // 0xf9a00100
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9a00d00
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a00d0d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a00d0d
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_2_Decode((instr >> 4) & 0x1,
                                                           dt);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 2;
                                          spacing = kSingle;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          spacing = kDouble;
                                          break;
                                      }
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a00d0f
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_2_Decode((instr >> 4) & 0x1,
                                                           dt);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 2;
                                          spacing = kSingle;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          spacing = kDouble;
                                          break;
                                      }
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_a_2_Decode((instr >> 4) & 0x1, dt);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 5) & 0x1) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 2;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 2;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kAllLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a0010d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a0010d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_2_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 2;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a0010f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_2_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 2;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld2(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_2_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 2;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld2(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000200: {
                          // 0xf9a00200
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9a00e00
                              switch (instr & 0x00000010) {
                                case 0x00000000: {
                                  // 0xf9a00e00
                                  switch (instr & 0x0000000d) {
                                    case 0x0000000d: {
                                      // 0xf9a00e0d
                                      switch (instr & 0x00000002) {
                                        case 0x00000000: {
                                          // 0xf9a00e0d
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 6) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned first =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned length;
                                          SpacingType spacing;
                                          switch ((instr >> 5) & 0x1) {
                                            default:
                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                            case 0x0:
                                              length = 3;
                                              spacing = kSingle;
                                              break;
                                            case 0x1:
                                              length = 3;
                                              spacing = kDouble;
                                              break;
                                          }
                                          unsigned last =
                                              first +
                                              (length - 1) *
                                                  (spacing == kSingle ? 1 : 2);
                                          TransferType transfer = kAllLanes;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
                                          vld3(CurrentCond(),
                                               dt,
                                               NeonRegisterList(DRegister(
                                                                    first),
                                                                DRegister(last),
                                                                spacing,
                                                                transfer),
                                               MemOperand(Register(rn),
                                                          PostIndex));
                                          break;
                                        }
                                        case 0x00000002: {
                                          // 0xf9a00e0f
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 6) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned first =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned length;
                                          SpacingType spacing;
                                          switch ((instr >> 5) & 0x1) {
                                            default:
                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                            case 0x0:
                                              length = 3;
                                              spacing = kSingle;
                                              break;
                                            case 0x1:
                                              length = 3;
                                              spacing = kDouble;
                                              break;
                                          }
                                          unsigned last =
                                              first +
                                              (length - 1) *
                                                  (spacing == kSingle ? 1 : 2);
                                          TransferType transfer = kAllLanes;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
                                          vld3(CurrentCond(),
                                               dt,
                                               NeonRegisterList(DRegister(
                                                                    first),
                                                                DRegister(last),
                                                                spacing,
                                                                transfer),
                                               MemOperand(Register(rn),
                                                          Offset));
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default: {
                                      if (((instr & 0xd) == 0xd)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 3;
                                          spacing = kSingle;
                                          break;
                                        case 0x1:
                                          length = 3;
                                          spacing = kDouble;
                                          break;
                                      }
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign(plus);
                                      unsigned rm = instr & 0xf;
                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
                                      vld3(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           MemOperand(Register(rn),
                                                      sign,
                                                      Register(rm),
                                                      PostIndex));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a0020d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a0020d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeon decode_neon =
                                          Index_1_Decode((instr >> 4) & 0xf,
                                                         dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 3;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
                                      vld3(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           MemOperand(Register(rn), PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a0020f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeon decode_neon =
                                          Index_1_Decode((instr >> 4) & 0xf,
                                                         dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 3;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
                                      vld3(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           MemOperand(Register(rn), Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeon decode_neon =
                                      Index_1_Decode((instr >> 4) & 0xf, dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 3;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign(plus);
                                  unsigned rm = instr & 0xf;
                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld3(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  Register(rm),
                                                  PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000300: {
                          // 0xf9a00300
                          switch (instr & 0x00000c00) {
                            case 0x00000c00: {
                              // 0xf9a00f00
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a00f0d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a00f0d
                                      DataType dt =
                                          Dt_size_8_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_3_Decode((instr >> 4) & 0x1,
                                                           dt,
                                                           (instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 4;
                                          spacing = kSingle;
                                          break;
                                        case 0x1:
                                          length = 4;
                                          spacing = kDouble;
                                          break;
                                      }
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a00f0f
                                      DataType dt =
                                          Dt_size_8_Decode((instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align =
                                          Align_a_3_Decode((instr >> 4) & 0x1,
                                                           dt,
                                                           (instr >> 6) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid) ||
                                          align.Is(kBadAlignment)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length;
                                      SpacingType spacing;
                                      switch ((instr >> 5) & 0x1) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 4;
                                          spacing = kSingle;
                                          break;
                                        case 0x1:
                                          length = 4;
                                          spacing = kDouble;
                                          break;
                                      }
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      TransferType transfer = kAllLanes;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_8_Decode((instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align =
                                      Align_a_3_Decode((instr >> 4) & 0x1,
                                                       dt,
                                                       (instr >> 6) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid) ||
                                      align.Is(kBadAlignment)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length;
                                  SpacingType spacing;
                                  switch ((instr >> 5) & 0x1) {
                                    default:
                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                    case 0x0:
                                      length = 4;
                                      spacing = kSingle;
                                      break;
                                    case 0x1:
                                      length = 4;
                                      spacing = kDouble;
                                      break;
                                  }
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  TransferType transfer = kAllLanes;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        transfer),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x0000000d) {
                                case 0x0000000d: {
                                  // 0xf9a0030d
                                  switch (instr & 0x00000002) {
                                    case 0x00000000: {
                                      // 0xf9a0030d
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_3_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 4;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
                                      vld4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             PostIndex));
                                      break;
                                    }
                                    case 0x00000002: {
                                      // 0xf9a0030f
                                      if (((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_7_Decode((instr >> 10) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DecodeNeonAndAlign decode_neon =
                                          Align_index_align_3_Decode((instr >>
                                                                      4) &
                                                                         0xf,
                                                                     dt);
                                      if (!decode_neon.IsValid()) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      Alignment align = decode_neon.GetAlign();
                                      int lane = decode_neon.GetLane();
                                      SpacingType spacing =
                                          decode_neon.GetSpacing();
                                      unsigned first =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned length = 4;
                                      unsigned last =
                                          first +
                                          (length - 1) *
                                              (spacing == kSingle ? 1 : 2);
                                      unsigned rn = (instr >> 16) & 0xf;
                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
                                      vld4(CurrentCond(),
                                           dt,
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            lane),
                                           AlignedMemOperand(Register(rn),
                                                             align,
                                                             Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xc00) == 0xc00) ||
                                      ((instr & 0xd) == 0xd)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_7_Decode((instr >> 10) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DecodeNeonAndAlign decode_neon =
                                      Align_index_align_3_Decode((instr >> 4) &
                                                                     0xf,
                                                                 dt);
                                  if (!decode_neon.IsValid()) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  Alignment align = decode_neon.GetAlign();
                                  int lane = decode_neon.GetLane();
                                  SpacingType spacing =
                                      decode_neon.GetSpacing();
                                  unsigned first =
                                      ExtractDRegister(instr, 22, 12);
                                  unsigned length = 4;
                                  unsigned last =
                                      first +
                                      (length - 1) *
                                          (spacing == kSingle ? 1 : 2);
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
                                  vld4(CurrentCond(),
                                       dt,
                                       NeonRegisterList(DRegister(first),
                                                        DRegister(last),
                                                        spacing,
                                                        lane),
                                       AlignedMemOperand(Register(rn),
                                                         align,
                                                         Register(rm),
                                                         PostIndex));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x10100000: {
                  // 0xf8100000
                  switch (instr & 0x01400000) {
                    case 0x00000000: {
                      // 0xf8100000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xf81f0000
                          switch (instr & 0x0000f000) {
                            case 0x0000f000: {
                              // 0xf81ff000
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xfff;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              // PLD{<c>}{<q>} <label> ; T1
                              if (minus_zero) {
                                pld(CurrentCond(), MemOperand(pc, minus, 0));
                              } else {
                                pld(CurrentCond(), &location);
                              }
                              if (((instr & 0xff7ff000) != 0xf81ff000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00200000) {
                                case 0x00000000: {
                                  // 0xf81f0000
                                  if (((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  uint32_t U = (instr >> 23) & 0x1;
                                  int32_t imm = instr & 0xfff;
                                  if (U == 0) imm = -imm;
                                  bool minus_zero = (imm == 0) && (U == 0);
                                  Location location(imm, kT32PcDelta);
                                  // LDRB{<c>}{<q>} <Rt>, <label> ; T1
                                  if (minus_zero) {
                                    ldrb(CurrentCond(),
                                         Best,
                                         Register(rt),
                                         MemOperand(pc, minus, 0));
                                  } else {
                                    ldrb(CurrentCond(),
                                         Register(rt),
                                         &location);
                                  }
                                  break;
                                }
                                case 0x00200000: {
                                  // 0xf83f0000
                                  if (((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  uint32_t U = (instr >> 23) & 0x1;
                                  int32_t imm = instr & 0xfff;
                                  if (U == 0) imm = -imm;
                                  bool minus_zero = (imm == 0) && (U == 0);
                                  Location location(imm, kT32PcDelta);
                                  // LDRH{<c>}{<q>} <Rt>, <label> ; T1
                                  if (minus_zero) {
                                    ldrh(CurrentCond(),
                                         Best,
                                         Register(rt),
                                         MemOperand(pc, minus, 0));
                                  } else {
                                    ldrh(CurrentCond(),
                                         Register(rt),
                                         &location);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x00a00000) {
                            case 0x00000000: {
                              // 0xf8100000
                              switch (instr & 0x00000d00) {
                                case 0x00000000: {
                                  // 0xf8100000
                                  switch (instr & 0x000002c0) {
                                    case 0x00000000: {
                                      // 0xf8100000
                                      switch (instr & 0x0000f000) {
                                        case 0x0000f000: {
                                          // 0xf810f000
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rn = (instr >> 16) & 0xf;
                                          Sign sign(plus);
                                          unsigned rm = instr & 0xf;
                                          Shift shift = LSL;
                                          uint32_t amount = (instr >> 4) & 0x3;
                                          AddrMode addrmode = Offset;
                                          // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
                                          pld(CurrentCond(),
                                              MemOperand(Register(rn),
                                                         sign,
                                                         Register(rm),
                                                         shift,
                                                         amount,
                                                         addrmode));
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0xf0000) == 0xf0000) ||
                                              ((instr & 0xf000) == 0xf000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          Sign sign(plus);
                                          unsigned rm = instr & 0xf;
                                          Shift shift = LSL;
                                          uint32_t amount = (instr >> 4) & 0x3;
                                          AddrMode addrmode = Offset;
                                          if ((rt < kNumberOfT32LowRegisters) &&
                                              (rn < kNumberOfT32LowRegisters) &&
                                              (rm < kNumberOfT32LowRegisters) &&
                                              shift.IsLSL() && (amount == 0) &&
                                              sign.IsPlus()) {
                                            // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
                                            ldrb(CurrentCond(),
                                                 Wide,
                                                 Register(rt),
                                                 MemOperand(Register(rn),
                                                            sign,
                                                            Register(rm),
                                                            addrmode));
                                          } else {
                                            // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                                            ldrb(CurrentCond(),
                                                 Best,
                                                 Register(rt),
                                                 MemOperand(Register(rn),
                                                            sign,
                                                            Register(rm),
                                                            shift,
                                                            amount,
                                                            addrmode));
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf8100900
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
                                                                        : plus);
                                  int32_t offset = instr & 0xff;
                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
                                  ldrb(CurrentCond(),
                                       Best,
                                       Register(rt),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  offset,
                                                  PostIndex));
                                  break;
                                }
                                case 0x00000c00: {
                                  // 0xf8100c00
                                  switch (instr & 0x00000200) {
                                    case 0x00000000: {
                                      // 0xf8100c00
                                      switch (instr & 0x0000f000) {
                                        case 0x0000f000: {
                                          // 0xf810fc00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                          pld(CurrentCond(),
                                              MemOperand(Register(rn),
                                                         minus,
                                                         offset,
                                                         Offset));
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0xf0000) == 0xf0000) ||
                                              ((instr & 0xf000) == 0xf000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
                                          ldrb(CurrentCond(),
                                               Best,
                                               Register(rt),
                                               MemOperand(Register(rn),
                                                          minus,
                                                          offset,
                                                          Offset));
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xf8100e00
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      UnimplementedT32_32("LDRBT", instr);
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000d00: {
                                  // 0xf8100d00
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
                                                                        : plus);
                                  int32_t offset = instr & 0xff;
                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
                                  ldrb(CurrentCond(),
                                       Best,
                                       Register(rt),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  offset,
                                                  PreIndex));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            case 0x00200000: {
                              // 0xf8300000
                              switch (instr & 0x00000d00) {
                                case 0x00000000: {
                                  // 0xf8300000
                                  switch (instr & 0x000002c0) {
                                    case 0x00000000: {
                                      // 0xf8300000
                                      switch (instr & 0x0000f000) {
                                        case 0x0000f000: {
                                          // 0xf830f000
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rn = (instr >> 16) & 0xf;
                                          Sign sign(plus);
                                          unsigned rm = instr & 0xf;
                                          Shift shift = LSL;
                                          uint32_t amount = (instr >> 4) & 0x3;
                                          AddrMode addrmode = Offset;
                                          // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
                                          pldw(CurrentCond(),
                                               MemOperand(Register(rn),
                                                          sign,
                                                          Register(rm),
                                                          shift,
                                                          amount,
                                                          addrmode));
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0xf0000) == 0xf0000) ||
                                              ((instr & 0xf000) == 0xf000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          Sign sign(plus);
                                          unsigned rm = instr & 0xf;
                                          Shift shift = LSL;
                                          uint32_t amount = (instr >> 4) & 0x3;
                                          AddrMode addrmode = Offset;
                                          if ((rt < kNumberOfT32LowRegisters) &&
                                              (rn < kNumberOfT32LowRegisters) &&
                                              (rm < kNumberOfT32LowRegisters) &&
                                              shift.IsLSL() && (amount == 0) &&
                                              sign.IsPlus()) {
                                            // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
                                            ldrh(CurrentCond(),
                                                 Wide,
                                                 Register(rt),
                                                 MemOperand(Register(rn),
                                                            sign,
                                                            Register(rm),
                                                            addrmode));
                                          } else {
                                            // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                                            ldrh(CurrentCond(),
                                                 Best,
                                                 Register(rt),
                                                 MemOperand(Register(rn),
                                                            sign,
                                                            Register(rm),
                                                            shift,
                                                            amount,
                                                            addrmode));
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00000900: {
                                  // 0xf8300900
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
                                                                        : plus);
                                  int32_t offset = instr & 0xff;
                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
                                  ldrh(CurrentCond(),
                                       Best,
                                       Register(rt),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  offset,
                                                  PostIndex));
                                  break;
                                }
                                case 0x00000c00: {
                                  // 0xf8300c00
                                  switch (instr & 0x00000200) {
                                    case 0x00000000: {
                                      // 0xf8300c00
                                      switch (instr & 0x0000f000) {
                                        case 0x0000f000: {
                                          // 0xf830fc00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                          pldw(CurrentCond(),
                                               MemOperand(Register(rn),
                                                          minus,
                                                          offset,
                                                          Offset));
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0xf0000) == 0xf0000) ||
                                              ((instr & 0xf000) == 0xf000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
                                          ldrh(CurrentCond(),
                                               Best,
                                               Register(rt),
                                               MemOperand(Register(rn),
                                                          minus,
                                                          offset,
                                                          Offset));
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xf8300e00
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      UnimplementedT32_32("LDRHT", instr);
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000d00: {
                                  // 0xf8300d00
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
                                                                        : plus);
                                  int32_t offset = instr & 0xff;
                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
                                  ldrh(CurrentCond(),
                                       Best,
                                       Register(rt),
                                       MemOperand(Register(rn),
                                                  sign,
                                                  offset,
                                                  PreIndex));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            case 0x00800000: {
                              // 0xf8900000
                              switch (instr & 0x0000f000) {
                                case 0x0000f000: {
                                  // 0xf890f000
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
                                  pld(CurrentCond(),
                                      MemOperand(Register(rn),
                                                 plus,
                                                 offset,
                                                 Offset));
                                  break;
                                }
                                default: {
                                  if (((instr & 0xf0000) == 0xf0000) ||
                                      ((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  if ((rt < kNumberOfT32LowRegisters) &&
                                      (rn < kNumberOfT32LowRegisters) &&
                                      ((offset >= 0) && (offset <= 31))) {
                                    // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                    ldrb(CurrentCond(),
                                         Wide,
                                         Register(rt),
                                         MemOperand(Register(rn),
                                                    plus,
                                                    offset,
                                                    Offset));
                                  } else {
                                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                    ldrb(CurrentCond(),
                                         Best,
                                         Register(rt),
                                         MemOperand(Register(rn),
                                                    plus,
                                                    offset,
                                                    Offset));
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00a00000: {
                              // 0xf8b00000
                              switch (instr & 0x0000f000) {
                                case 0x0000f000: {
                                  // 0xf8b0f000
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
                                  pldw(CurrentCond(),
                                       MemOperand(Register(rn),
                                                  plus,
                                                  offset,
                                                  Offset));
                                  break;
                                }
                                default: {
                                  if (((instr & 0xf0000) == 0xf0000) ||
                                      ((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  if ((rt < kNumberOfT32LowRegisters) &&
                                      (rn < kNumberOfT32LowRegisters) &&
                                      ((offset >= 0) && (offset <= 62) &&
                                       ((offset & 1) == 0))) {
                                    // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                    ldrh(CurrentCond(),
                                         Wide,
                                         Register(rt),
                                         MemOperand(Register(rn),
                                                    plus,
                                                    offset,
                                                    Offset));
                                  } else {
                                    // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                    ldrh(CurrentCond(),
                                         Best,
                                         Register(rt),
                                         MemOperand(Register(rn),
                                                    plus,
                                                    offset,
                                                    Offset));
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xf8500000
                      switch (instr & 0x00200000) {
                        case 0x00000000: {
                          // 0xf8500000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xf85f0000
                              unsigned rt = (instr >> 12) & 0xf;
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xfff;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              if ((imm >= -4095) && (imm <= 4095) &&
                                  ((rt < kNumberOfT32LowRegisters) &&
                                   (imm >= 0) && (imm <= 1020) &&
                                   ((imm & 3) == 0))) {
                                // LDR{<c>}.W <Rt>, <label> ; T2
                                if (minus_zero) {
                                  ldr(CurrentCond(),
                                      Wide,
                                      Register(rt),
                                      MemOperand(pc, minus, 0));
                                } else {
                                  ldr(CurrentCond(),
                                      Wide,
                                      Register(rt),
                                      &location);
                                }
                              } else if ((imm >= -4095) && (imm <= 4095)) {
                                // LDR{<c>}{<q>} <Rt>, <label> ; T2
                                if (minus_zero) {
                                  ldr(CurrentCond(),
                                      Best,
                                      Register(rt),
                                      MemOperand(pc, minus, 0));
                                } else {
                                  ldr(CurrentCond(),
                                      Best,
                                      Register(rt),
                                      &location);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00800000) {
                                case 0x00000000: {
                                  // 0xf8500000
                                  switch (instr & 0x00000d00) {
                                    case 0x00000000: {
                                      // 0xf8500000
                                      if ((instr & 0x000002c0) == 0x00000000) {
                                        if (((instr & 0xf0000) == 0xf0000)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rt = (instr >> 12) & 0xf;
                                        unsigned rn = (instr >> 16) & 0xf;
                                        Sign sign(plus);
                                        unsigned rm = instr & 0xf;
                                        Shift shift = LSL;
                                        uint32_t amount = (instr >> 4) & 0x3;
                                        AddrMode addrmode = Offset;
                                        if ((rt < kNumberOfT32LowRegisters) &&
                                            (rn < kNumberOfT32LowRegisters) &&
                                            (rm < kNumberOfT32LowRegisters) &&
                                            shift.IsLSL() && (amount == 0) &&
                                            sign.IsPlus()) {
                                          // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
                                          ldr(CurrentCond(),
                                              Wide,
                                              Register(rt),
                                              MemOperand(Register(rn),
                                                         sign,
                                                         Register(rm),
                                                         addrmode));
                                        } else {
                                          // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                                          ldr(CurrentCond(),
                                              Best,
                                              Register(rt),
                                              MemOperand(Register(rn),
                                                         sign,
                                                         Register(rm),
                                                         shift,
                                                         amount,
                                                         addrmode));
                                        }
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000900: {
                                      // 0xf8500900
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((Uint32((instr >> 16)) &
                                            Uint32(0xf)) == Uint32(0xd)) &&
                                          ((Uint32((instr >> 9)) &
                                            Uint32(0x1)) == Uint32(0x1)) &&
                                          ((Uint32(instr) & Uint32(0xff)) ==
                                           Uint32(0x4))) {
                                        unsigned rt = (instr >> 12) & 0xf;
                                        if ((rt <= 7) || (rt == kPCRegNum)) {
                                          // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
                                          pop(CurrentCond(),
                                              Wide,
                                              Register(rt));
                                        } else {
                                          // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
                                          pop(CurrentCond(),
                                              Best,
                                              Register(rt));
                                        }
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
                                      ldr(CurrentCond(),
                                          Best,
                                          Register(rt),
                                          MemOperand(Register(rn),
                                                     sign,
                                                     offset,
                                                     PostIndex));
                                      break;
                                    }
                                    case 0x00000c00: {
                                      // 0xf8500c00
                                      switch (instr & 0x00000200) {
                                        case 0x00000000: {
                                          // 0xf8500c00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
                                          ldr(CurrentCond(),
                                              Best,
                                              Register(rt),
                                              MemOperand(Register(rn),
                                                         minus,
                                                         offset,
                                                         Offset));
                                          break;
                                        }
                                        case 0x00000200: {
                                          // 0xf8500e00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          UnimplementedT32_32("LDRT", instr);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000d00: {
                                      // 0xf8500d00
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
                                      ldr(CurrentCond(),
                                          Best,
                                          Register(rt),
                                          MemOperand(Register(rn),
                                                     sign,
                                                     offset,
                                                     PreIndex));
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00800000: {
                                  // 0xf8d00000
                                  if (((instr & 0xf0000) == 0xf0000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  if (((rt < kNumberOfT32LowRegisters) &&
                                       (rn < kNumberOfT32LowRegisters) &&
                                       ((offset >= 0) && (offset <= 124) &&
                                        ((offset & 3) == 0))) ||
                                      ((rt < kNumberOfT32LowRegisters) &&
                                       (rn == sp.GetCode()) &&
                                       ((offset >= 0) && (offset <= 1020) &&
                                        ((offset & 3) == 0)))) {
                                    // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
                                    ldr(CurrentCond(),
                                        Wide,
                                        Register(rt),
                                        MemOperand(Register(rn),
                                                   plus,
                                                   offset,
                                                   Offset));
                                  } else {
                                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
                                    ldr(CurrentCond(),
                                        Best,
                                        Register(rt),
                                        MemOperand(Register(rn),
                                                   plus,
                                                   offset,
                                                   Offset));
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x01000000: {
                      // 0xf9100000
                      switch (instr & 0x00200000) {
                        case 0x00000000: {
                          // 0xf9100000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xf91f0000
                              switch (instr & 0x0000f000) {
                                case 0x0000f000: {
                                  // 0xf91ff000
                                  uint32_t U = (instr >> 23) & 0x1;
                                  int32_t imm = instr & 0xfff;
                                  if (U == 0) imm = -imm;
                                  bool minus_zero = (imm == 0) && (U == 0);
                                  Location location(imm, kT32PcDelta);
                                  // PLI{<c>}{<q>} <label> ; T3
                                  if (minus_zero) {
                                    pli(CurrentCond(),
                                        MemOperand(pc, minus, 0));
                                  } else {
                                    pli(CurrentCond(), &location);
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  uint32_t U = (instr >> 23) & 0x1;
                                  int32_t imm = instr & 0xfff;
                                  if (U == 0) imm = -imm;
                                  bool minus_zero = (imm == 0) && (U == 0);
                                  Location location(imm, kT32PcDelta);
                                  // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
                                  if (minus_zero) {
                                    ldrsb(CurrentCond(),
                                          Best,
                                          Register(rt),
                                          MemOperand(pc, minus, 0));
                                  } else {
                                    ldrsb(CurrentCond(),
                                          Register(rt),
                                          &location);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00800000) {
                                case 0x00000000: {
                                  // 0xf9100000
                                  switch (instr & 0x00000d00) {
                                    case 0x00000000: {
                                      // 0xf9100000
                                      switch (instr & 0x000002c0) {
                                        case 0x00000000: {
                                          // 0xf9100000
                                          switch (instr & 0x0000f000) {
                                            case 0x0000f000: {
                                              // 0xf910f000
                                              if (((instr & 0xf0000) ==
                                                   0xf0000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rn = (instr >> 16) & 0xf;
                                              Sign sign(plus);
                                              unsigned rm = instr & 0xf;
                                              Shift shift = LSL;
                                              uint32_t amount =
                                                  (instr >> 4) & 0x3;
                                              AddrMode addrmode = Offset;
                                              // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
                                              pli(CurrentCond(),
                                                  MemOperand(Register(rn),
                                                             sign,
                                                             Register(rm),
                                                             shift,
                                                             amount,
                                                             addrmode));
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0xf0000) ==
                                                   0xf0000) ||
                                                  ((instr & 0xf000) ==
                                                   0xf000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rt = (instr >> 12) & 0xf;
                                              unsigned rn = (instr >> 16) & 0xf;
                                              Sign sign(plus);
                                              unsigned rm = instr & 0xf;
                                              Shift shift = LSL;
                                              uint32_t amount =
                                                  (instr >> 4) & 0x3;
                                              AddrMode addrmode = Offset;
                                              if ((rt <
                                                   kNumberOfT32LowRegisters) &&
                                                  (rn <
                                                   kNumberOfT32LowRegisters) &&
                                                  (rm <
                                                   kNumberOfT32LowRegisters) &&
                                                  shift.IsLSL() &&
                                                  (amount == 0) &&
                                                  sign.IsPlus()) {
                                                // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
                                                ldrsb(CurrentCond(),
                                                      Wide,
                                                      Register(rt),
                                                      MemOperand(Register(rn),
                                                                 sign,
                                                                 Register(rm),
                                                                 addrmode));
                                              } else {
                                                // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                                                ldrsb(CurrentCond(),
                                                      Best,
                                                      Register(rt),
                                                      MemOperand(Register(rn),
                                                                 sign,
                                                                 Register(rm),
                                                                 shift,
                                                                 amount,
                                                                 addrmode));
                                              }
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        default:
                                          UnallocatedT32(instr);
                                          break;
                                      }
                                      break;
                                    }
                                    case 0x00000900: {
                                      // 0xf9100900
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
                                      ldrsb(CurrentCond(),
                                            Best,
                                            Register(rt),
                                            MemOperand(Register(rn),
                                                       sign,
                                                       offset,
                                                       PostIndex));
                                      break;
                                    }
                                    case 0x00000c00: {
                                      // 0xf9100c00
                                      switch (instr & 0x00000200) {
                                        case 0x00000000: {
                                          // 0xf9100c00
                                          switch (instr & 0x0000f000) {
                                            case 0x0000f000: {
                                              // 0xf910fc00
                                              if (((instr & 0xf0000) ==
                                                   0xf0000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rn = (instr >> 16) & 0xf;
                                              int32_t offset = instr & 0xff;
                                              // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                              pli(CurrentCond(),
                                                  MemOperand(Register(rn),
                                                             minus,
                                                             offset,
                                                             Offset));
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0xf0000) ==
                                                   0xf0000) ||
                                                  ((instr & 0xf000) ==
                                                   0xf000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rt = (instr >> 12) & 0xf;
                                              unsigned rn = (instr >> 16) & 0xf;
                                              int32_t offset = instr & 0xff;
                                              // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                              ldrsb(CurrentCond(),
                                                    Best,
                                                    Register(rt),
                                                    MemOperand(Register(rn),
                                                               minus,
                                                               offset,
                                                               Offset));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000200: {
                                          // 0xf9100e00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          UnimplementedT32_32("LDRSBT", instr);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000d00: {
                                      // 0xf9100d00
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
                                      ldrsb(CurrentCond(),
                                            Best,
                                            Register(rt),
                                            MemOperand(Register(rn),
                                                       sign,
                                                       offset,
                                                       PreIndex));
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00800000: {
                                  // 0xf9900000
                                  switch (instr & 0x0000f000) {
                                    case 0x0000f000: {
                                      // 0xf990f000
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn = (instr >> 16) & 0xf;
                                      int32_t offset = instr & 0xfff;
                                      // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
                                      pli(CurrentCond(),
                                          MemOperand(Register(rn),
                                                     plus,
                                                     offset,
                                                     Offset));
                                      break;
                                    }
                                    default: {
                                      if (((instr & 0xf0000) == 0xf0000) ||
                                          ((instr & 0xf000) == 0xf000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      int32_t offset = instr & 0xfff;
                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
                                      ldrsb(CurrentCond(),
                                            Best,
                                            Register(rt),
                                            MemOperand(Register(rn),
                                                       plus,
                                                       offset,
                                                       Offset));
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00200000: {
                          // 0xf9300000
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xf93f0000
                              if (((instr & 0xf000) == 0xf000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rt = (instr >> 12) & 0xf;
                              uint32_t U = (instr >> 23) & 0x1;
                              int32_t imm = instr & 0xfff;
                              if (U == 0) imm = -imm;
                              bool minus_zero = (imm == 0) && (U == 0);
                              Location location(imm, kT32PcDelta);
                              // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
                              if (minus_zero) {
                                ldrsh(CurrentCond(),
                                      Best,
                                      Register(rt),
                                      MemOperand(pc, minus, 0));
                              } else {
                                ldrsh(CurrentCond(), Register(rt), &location);
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00800000) {
                                case 0x00000000: {
                                  // 0xf9300000
                                  switch (instr & 0x00000d00) {
                                    case 0x00000000: {
                                      // 0xf9300000
                                      if ((instr & 0x000002c0) == 0x00000000) {
                                        if (((instr & 0xf0000) == 0xf0000) ||
                                            ((instr & 0xf000) == 0xf000)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rt = (instr >> 12) & 0xf;
                                        unsigned rn = (instr >> 16) & 0xf;
                                        Sign sign(plus);
                                        unsigned rm = instr & 0xf;
                                        Shift shift = LSL;
                                        uint32_t amount = (instr >> 4) & 0x3;
                                        AddrMode addrmode = Offset;
                                        if ((rt < kNumberOfT32LowRegisters) &&
                                            (rn < kNumberOfT32LowRegisters) &&
                                            (rm < kNumberOfT32LowRegisters) &&
                                            shift.IsLSL() && (amount == 0) &&
                                            sign.IsPlus()) {
                                          // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
                                          ldrsh(CurrentCond(),
                                                Wide,
                                                Register(rt),
                                                MemOperand(Register(rn),
                                                           sign,
                                                           Register(rm),
                                                           addrmode));
                                        } else {
                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
                                          ldrsh(CurrentCond(),
                                                Best,
                                                Register(rt),
                                                MemOperand(Register(rn),
                                                           sign,
                                                           Register(rm),
                                                           shift,
                                                           amount,
                                                           addrmode));
                                        }
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000900: {
                                      // 0xf9300900
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
                                      ldrsh(CurrentCond(),
                                            Best,
                                            Register(rt),
                                            MemOperand(Register(rn),
                                                       sign,
                                                       offset,
                                                       PostIndex));
                                      break;
                                    }
                                    case 0x00000c00: {
                                      // 0xf9300c00
                                      switch (instr & 0x00000200) {
                                        case 0x00000000: {
                                          // 0xf9300c00
                                          if (((instr & 0xf0000) == 0xf0000) ||
                                              ((instr & 0xf000) == 0xf000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rt = (instr >> 12) & 0xf;
                                          unsigned rn = (instr >> 16) & 0xf;
                                          int32_t offset = instr & 0xff;
                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
                                          ldrsh(CurrentCond(),
                                                Best,
                                                Register(rt),
                                                MemOperand(Register(rn),
                                                           minus,
                                                           offset,
                                                           Offset));
                                          break;
                                        }
                                        case 0x00000200: {
                                          // 0xf9300e00
                                          if (((instr & 0xf0000) == 0xf0000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          UnimplementedT32_32("LDRSHT", instr);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000d00: {
                                      // 0xf9300d00
                                      if (((instr & 0xf0000) == 0xf0000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rt = (instr >> 12) & 0xf;
                                      unsigned rn = (instr >> 16) & 0xf;
                                      Sign sign((((instr >> 9) & 0x1) == 0)
                                                    ? minus
                                                    : plus);
                                      int32_t offset = instr & 0xff;
                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
                                      ldrsh(CurrentCond(),
                                            Best,
                                            Register(rt),
                                            MemOperand(Register(rn),
                                                       sign,
                                                       offset,
                                                       PreIndex));
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00800000: {
                                  // 0xf9b00000
                                  if (((instr & 0xf0000) == 0xf0000) ||
                                      ((instr & 0xf000) == 0xf000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rt = (instr >> 12) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  int32_t offset = instr & 0xfff;
                                  // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
                                  ldrsh(CurrentCond(),
                                        Best,
                                        Register(rt),
                                        MemOperand(Register(rn),
                                                   plus,
                                                   offset,
                                                   Offset));
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
              }
              break;
            }
            case 0x02000000: {
              // 0xea000000
              switch (instr & 0x11900000) {
                case 0x00000000: {
                  // 0xea000000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xea000000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xea000030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          and_(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xea000030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                            and_(CurrentCond(),
                                 Wide,
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                            if (((instr & 0xfff08000) != 0xea000000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            and_(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rn),
                                 Operand(Register(rm),
                                         shift_operand.GetType(),
                                         shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xea000000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xea200000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xea200030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          bic(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xea200030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                            bic(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                            if (((instr & 0xfff08000) != 0xea200000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            bic(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xea200000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xea400000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xea4f0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea4f0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
                              rrx(CurrentCond(), Register(rd), Register(rm));
                              if (((instr & 0xfffff0f0) != 0xea4f0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x2))) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (amount == 0) amount = 32;
                                if (InITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 32)))) {
                                  // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
                                  asr(CurrentCond(),
                                      Wide,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  asr(CurrentCond(),
                                      Best,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x0)) &&
                                  ((instr & 0x000070c0) != 0x00000000)) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (InITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 31)))) {
                                  // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
                                  lsl(CurrentCond(),
                                      Wide,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  lsl(CurrentCond(),
                                      Best,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x1))) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (amount == 0) amount = 32;
                                if (InITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 32)))) {
                                  // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
                                  lsr(CurrentCond(),
                                      Wide,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  lsr(CurrentCond(),
                                      Best,
                                      Register(rd),
                                      Register(rm),
                                      amount);
                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x3)) &&
                                  ((instr & 0x000070c0) != 0x00000000)) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                ror(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Register(rm),
                                    amount);
                                if (((instr & 0xffff8030) != 0xea4f0030)) {
                                  UnpredictableT32(instr);
                                }
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if ((instr & 0x00100000) == 0x00000000 &&
                                  (shift_operand.GetShift().IsLSL() &&
                                   (shift_operand.GetAmount() == 0))) {
                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                mov(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea4f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if (InITBlock() &&
                                         (instr & 0x00100000) == 0x00000000 &&
                                         ((rd < kNumberOfT32LowRegisters) &&
                                          (rm < kNumberOfT32LowRegisters))) {
                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                mov(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea4f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                mov(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea4f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea400030
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                              orr(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea400030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (InITBlock() &&
                                  (instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd == rn) &&
                                   (rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                                orr(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08000) != 0xea400000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                orr(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xea400000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xea600000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xea6f0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea6f0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
                              mvn(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfffff0f0) != 0xea6f0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (InITBlock() &&
                                  (instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // MVN<c>.W <Rd>, <Rm> ; T2
                                mvn(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Register(rm));
                                if (((instr & 0xffff8000) != 0xea6f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                mvn(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea6f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea600030
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
                              orn(CurrentCond(),
                                  Register(rd),
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea600030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                              orn(CurrentCond(),
                                  Register(rd),
                                  Register(rn),
                                  Operand(Register(rm),
                                          shift_operand.GetType(),
                                          shift_operand.GetAmount()));
                              if (((instr & 0xfff08000) != 0xea600000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x00100000: {
                  // 0xea100000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xea100000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xea100f00
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea100f30
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
                              tst(CurrentCond(),
                                  Best,
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0fff0) != 0xea100f30)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rn < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // TST{<c>}.W <Rn>, <Rm> ; T2
                                tst(CurrentCond(),
                                    Wide,
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08f00) != 0xea100f00)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                tst(CurrentCond(),
                                    Best,
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08f00) != 0xea100f00)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea100030
                              if (((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                              ands(CurrentCond(),
                                   Best,
                                   Register(rd),
                                   Register(rn),
                                   Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea100030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30) ||
                                  ((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd == rn) &&
                                   (rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
                                ands(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rn),
                                     Register(rm));
                                if (((instr & 0xfff08000) != 0xea100000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                ands(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rn),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xea100000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xea300000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xea300030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          bics(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xea300030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (OutsideITBlock() &&
                              (instr & 0x00100000) == 0x00100000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
                            bics(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                            if (((instr & 0xfff08000) != 0xea300000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00100000) {
                            // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            bics(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rn),
                                 Operand(Register(rm),
                                         shift_operand.GetType(),
                                         shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xea300000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xea500000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xea5f0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea5f0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
                              rrxs(CurrentCond(), Register(rd), Register(rm));
                              if (((instr & 0xfffff0f0) != 0xea5f0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x2))) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (amount == 0) amount = 32;
                                if (OutsideITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 32)))) {
                                  // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
                                  asrs(Condition::None(),
                                       Wide,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  asrs(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x0)) &&
                                  ((instr & 0x000070c0) != 0x00000000)) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (OutsideITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 31)))) {
                                  // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
                                  lsls(Condition::None(),
                                       Wide,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  lsls(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x1))) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                if (amount == 0) amount = 32;
                                if (OutsideITBlock() &&
                                    ((rd < kNumberOfT32LowRegisters) &&
                                     (rm < kNumberOfT32LowRegisters) &&
                                     ((amount >= 1) && (amount <= 32)))) {
                                  // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
                                  lsrs(Condition::None(),
                                       Wide,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
                                    UnpredictableT32(instr);
                                  }
                                } else {
                                  // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                  lsrs(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       Register(rm),
                                       amount);
                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
                                    UnpredictableT32(instr);
                                  }
                                }
                                return;
                              }
                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
                                   Uint32(0x3)) &&
                                  ((instr & 0x000070c0) != 0x00000000)) {
                                unsigned rd = (instr >> 8) & 0xf;
                                unsigned rm = instr & 0xf;
                                uint32_t amount = ((instr >> 6) & 0x3) |
                                                  ((instr >> 10) & 0x1c);
                                // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
                                rors(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rm),
                                     amount);
                                if (((instr & 0xffff8030) != 0xea5f0030)) {
                                  UnpredictableT32(instr);
                                }
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
                                movs(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea5f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                movs(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea5f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea500030
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                              orrs(CurrentCond(),
                                   Best,
                                   Register(rd),
                                   Register(rn),
                                   Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea500030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd == rn) &&
                                   (rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
                                orrs(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rn),
                                     Register(rm));
                                if (((instr & 0xfff08000) != 0xea500000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                orrs(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rn),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xea500000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xea700000
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xea7f0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea7f0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
                              mvns(CurrentCond(),
                                   Best,
                                   Register(rd),
                                   Operand(Register(rm), RRX));
                              if (((instr & 0xfffff0f0) != 0xea7f0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // MVNS.W <Rd>, <Rm> ; T2
                                mvns(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rm));
                                if (((instr & 0xffff8000) != 0xea7f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                mvns(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xea7f0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea700030
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
                              orns(CurrentCond(),
                                   Register(rd),
                                   Register(rn),
                                   Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea700030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                              orns(CurrentCond(),
                                   Register(rd),
                                   Register(rn),
                                   Operand(Register(rm),
                                           shift_operand.GetType(),
                                           shift_operand.GetAmount()));
                              if (((instr & 0xfff08000) != 0xea700000)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x00800000: {
                  // 0xea800000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xea800000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xea800030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          eor(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xea800030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                            eor(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                            if (((instr & 0xfff08000) != 0xea800000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            eor(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xea800000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xeac00000
                      switch (instr & 0x00000030) {
                        case 0x00000000: {
                          // 0xeac00000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
                          pkhbt(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm), LSL, amount));
                          if (((instr & 0xfff08030) != 0xeac00000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00000020: {
                          // 0xeac00020
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount =
                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
                          if (amount == 0) amount = 32;
                          // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
                          pkhtb(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm), ASR, amount));
                          if (((instr & 0xfff08030) != 0xeac00020)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x00900000: {
                  // 0xea900000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xea900000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xea900f00
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea900f30
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
                              teq(CurrentCond(),
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0fff0) != 0xea900f30)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                              teq(CurrentCond(),
                                  Register(rn),
                                  Operand(Register(rm),
                                          shift_operand.GetType(),
                                          shift_operand.GetAmount()));
                              if (((instr & 0xfff08f00) != 0xea900f00)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xea900030
                              if (((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                              eors(CurrentCond(),
                                   Best,
                                   Register(rd),
                                   Register(rn),
                                   Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xea900030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30) ||
                                  ((instr & 0xf00) == 0xf00)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (OutsideITBlock() &&
                                  (instr & 0x00100000) == 0x00100000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd == rn) &&
                                   (rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
                                eors(Condition::None(),
                                     Wide,
                                     Register(rd),
                                     Register(rn),
                                     Register(rm));
                                if (((instr & 0xfff08000) != 0xea900000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00100000) {
                                // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                eors(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Register(rn),
                                     Operand(Register(rm),
                                             shift_operand.GetType(),
                                             shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xea900000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01000000: {
                  // 0xeb000000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xeb000000
                      switch (instr & 0x000f0000) {
                        case 0x000d0000: {
                          // 0xeb0d0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xeb0d0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
                              add(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  sp,
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if ((instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  (((rd == rm)) || ((rd == sp.GetCode())))) {
                                // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
                                add(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    sp,
                                    Register(rm));
                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                add(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    sp,
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xeb000030
                              if (((instr & 0xf0000) == 0xd0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
                              add(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xeb000030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xd0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (InITBlock() &&
                                  (instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rn < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
                                add(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08000) != 0xeb000000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000 &&
                                         shift_operand.GetShift().IsLSL() &&
                                         (shift_operand.GetAmount() == 0) &&
                                         ((rd == rn))) {
                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
                                add(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08000) != 0xeb000000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                add(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xeb000000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xeb400000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xeb400030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          adc(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xeb400030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                            adc(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                            if (((instr & 0xfff08000) != 0xeb400000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            adc(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xeb400000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xeb600000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xeb600030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          sbc(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xeb600030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (InITBlock() &&
                              (instr & 0x00100000) == 0x00000000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                            sbc(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                            if (((instr & 0xfff08000) != 0xeb600000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00000000) {
                            // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            sbc(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xeb600000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01100000: {
                  // 0xeb100000
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xeb100000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xeb100f00
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xeb100f30
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
                              cmn(CurrentCond(),
                                  Best,
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0fff0) != 0xeb100f30)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rn < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // CMN{<c>}.W <Rn>, <Rm> ; T2
                                cmn(CurrentCond(),
                                    Wide,
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                cmn(CurrentCond(),
                                    Best,
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000f0000) {
                            case 0x000d0000: {
                              // 0xeb1d0000
                              switch (instr & 0x000070f0) {
                                case 0x00000030: {
                                  // 0xeb1d0030
                                  if (((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
                                  adds(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       sp,
                                       Operand(Register(rm), RRX));
                                  if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0x70f0) == 0x30) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  ImmediateShiftOperand
                                      shift_operand((instr >> 4) & 0x3,
                                                    ((instr >> 6) & 0x3) |
                                                        ((instr >> 10) & 0x1c));
                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                  adds(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       sp,
                                       Operand(Register(rm),
                                               shift_operand.GetType(),
                                               shift_operand.GetAmount()));
                                  if (((instr & 0xffff8000) != 0xeb1d0000)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x000070f0) {
                                case 0x00000030: {
                                  // 0xeb100030
                                  if (((instr & 0xf0000) == 0xd0000) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
                                  adds(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       Register(rn),
                                       Operand(Register(rm), RRX));
                                  if (((instr & 0xfff0f0f0) != 0xeb100030)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xf0000) == 0xd0000) ||
                                      ((instr & 0x70f0) == 0x30) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  ImmediateShiftOperand
                                      shift_operand((instr >> 4) & 0x3,
                                                    ((instr >> 6) & 0x3) |
                                                        ((instr >> 10) & 0x1c));
                                  if (OutsideITBlock() &&
                                      (instr & 0x00100000) == 0x00100000 &&
                                      shift_operand.GetShift().IsLSL() &&
                                      (shift_operand.GetAmount() == 0) &&
                                      ((rd < kNumberOfT32LowRegisters) &&
                                       (rn < kNumberOfT32LowRegisters) &&
                                       (rm < kNumberOfT32LowRegisters))) {
                                    // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
                                    adds(Condition::None(),
                                         Wide,
                                         Register(rd),
                                         Register(rn),
                                         Register(rm));
                                    if (((instr & 0xfff08000) != 0xeb100000)) {
                                      UnpredictableT32(instr);
                                    }
                                  } else if ((instr & 0x00100000) ==
                                             0x00100000) {
                                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
                                    adds(CurrentCond(),
                                         Best,
                                         Register(rd),
                                         Register(rn),
                                         Operand(Register(rm),
                                                 shift_operand.GetType(),
                                                 shift_operand.GetAmount()));
                                    if (((instr & 0xfff08000) != 0xeb100000)) {
                                      UnpredictableT32(instr);
                                    }
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xeb500000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xeb500030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          adcs(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xeb500030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (OutsideITBlock() &&
                              (instr & 0x00100000) == 0x00100000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
                            adcs(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                            if (((instr & 0xfff08000) != 0xeb500000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00100000) {
                            // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            adcs(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rn),
                                 Operand(Register(rm),
                                         shift_operand.GetType(),
                                         shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xeb500000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xeb700000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xeb700030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                          sbcs(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xeb700030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          if (OutsideITBlock() &&
                              (instr & 0x00100000) == 0x00100000 &&
                              shift_operand.GetShift().IsLSL() &&
                              (shift_operand.GetAmount() == 0) &&
                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
                               (rm < kNumberOfT32LowRegisters))) {
                            // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
                            sbcs(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                            if (((instr & 0xfff08000) != 0xeb700000)) {
                              UnpredictableT32(instr);
                            }
                          } else if ((instr & 0x00100000) == 0x00100000) {
                            // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                            sbcs(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rn),
                                 Operand(Register(rm),
                                         shift_operand.GetType(),
                                         shift_operand.GetAmount()));
                            if (((instr & 0xfff08000) != 0xeb700000)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01800000: {
                  // 0xeb800000
                  switch (instr & 0x00600000) {
                    case 0x00200000: {
                      // 0xeba00000
                      switch (instr & 0x000f0000) {
                        case 0x000d0000: {
                          // 0xebad0000
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xebad0030
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
                              sub(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  sp,
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfffff0f0) != 0xebad0030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if ((instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0)) {
                                // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
                                sub(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    sp,
                                    Register(rm));
                                if (((instr & 0xffff8000) != 0xebad0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                                sub(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    sp,
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xffff8000) != 0xebad0000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xeba00030
                              if (((instr & 0xf0000) == 0xd0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                              sub(CurrentCond(),
                                  Best,
                                  Register(rd),
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0f0f0) != 0xeba00030)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xd0000) ||
                                  ((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (InITBlock() &&
                                  (instr & 0x00100000) == 0x00000000 &&
                                  shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rn < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
                                sub(CurrentCond(),
                                    Wide,
                                    Register(rd),
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08000) != 0xeba00000)) {
                                  UnpredictableT32(instr);
                                }
                              } else if ((instr & 0x00100000) == 0x00000000) {
                                // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                sub(CurrentCond(),
                                    Best,
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08000) != 0xeba00000)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xebc00000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xebc00030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
                          rsb(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xebc00030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                          rsb(CurrentCond(),
                              Best,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm),
                                      shift_operand.GetType(),
                                      shift_operand.GetAmount()));
                          if (((instr & 0xfff08000) != 0xebc00000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01900000: {
                  // 0xeb900000
                  switch (instr & 0x00600000) {
                    case 0x00200000: {
                      // 0xebb00000
                      switch (instr & 0x00000f00) {
                        case 0x00000f00: {
                          // 0xebb00f00
                          switch (instr & 0x000070f0) {
                            case 0x00000030: {
                              // 0xebb00f30
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
                              cmp(CurrentCond(),
                                  Best,
                                  Register(rn),
                                  Operand(Register(rm), RRX));
                              if (((instr & 0xfff0fff0) != 0xebb00f30)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0x70f0) == 0x30)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              ImmediateShiftOperand
                                  shift_operand((instr >> 4) & 0x3,
                                                ((instr >> 6) & 0x3) |
                                                    ((instr >> 10) & 0x1c));
                              if (shift_operand.GetShift().IsLSL() &&
                                  (shift_operand.GetAmount() == 0)) {
                                // CMP{<c>}.W <Rn>, <Rm> ; T3
                                cmp(CurrentCond(),
                                    Wide,
                                    Register(rn),
                                    Register(rm));
                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
                                cmp(CurrentCond(),
                                    Best,
                                    Register(rn),
                                    Operand(Register(rm),
                                            shift_operand.GetType(),
                                            shift_operand.GetAmount()));
                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x000f0000) {
                            case 0x000d0000: {
                              // 0xebbd0000
                              switch (instr & 0x000070f0) {
                                case 0x00000030: {
                                  // 0xebbd0030
                                  if (((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
                                  subs(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       sp,
                                       Operand(Register(rm), RRX));
                                  if (((instr & 0xfffff0f0) != 0xebbd0030)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0x70f0) == 0x30) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  ImmediateShiftOperand
                                      shift_operand((instr >> 4) & 0x3,
                                                    ((instr >> 6) & 0x3) |
                                                        ((instr >> 10) & 0x1c));
                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                                  subs(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       sp,
                                       Operand(Register(rm),
                                               shift_operand.GetType(),
                                               shift_operand.GetAmount()));
                                  if (((instr & 0xffff8000) != 0xebbd0000)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x000070f0) {
                                case 0x00000030: {
                                  // 0xebb00030
                                  if (((instr & 0xf0000) == 0xd0000) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
                                  subs(CurrentCond(),
                                       Best,
                                       Register(rd),
                                       Register(rn),
                                       Operand(Register(rm), RRX));
                                  if (((instr & 0xfff0f0f0) != 0xebb00030)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default: {
                                  if (((instr & 0xf0000) == 0xd0000) ||
                                      ((instr & 0x70f0) == 0x30) ||
                                      ((instr & 0xf00) == 0xf00)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = (instr >> 8) & 0xf;
                                  unsigned rn = (instr >> 16) & 0xf;
                                  unsigned rm = instr & 0xf;
                                  ImmediateShiftOperand
                                      shift_operand((instr >> 4) & 0x3,
                                                    ((instr >> 6) & 0x3) |
                                                        ((instr >> 10) & 0x1c));
                                  if (OutsideITBlock() &&
                                      (instr & 0x00100000) == 0x00100000 &&
                                      shift_operand.GetShift().IsLSL() &&
                                      (shift_operand.GetAmount() == 0) &&
                                      ((rd < kNumberOfT32LowRegisters) &&
                                       (rn < kNumberOfT32LowRegisters) &&
                                       (rm < kNumberOfT32LowRegisters))) {
                                    // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
                                    subs(Condition::None(),
                                         Wide,
                                         Register(rd),
                                         Register(rn),
                                         Register(rm));
                                    if (((instr & 0xfff08000) != 0xebb00000)) {
                                      UnpredictableT32(instr);
                                    }
                                  } else if ((instr & 0x00100000) ==
                                             0x00100000) {
                                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
                                    subs(CurrentCond(),
                                         Best,
                                         Register(rd),
                                         Register(rn),
                                         Operand(Register(rm),
                                                 shift_operand.GetType(),
                                                 shift_operand.GetAmount()));
                                    if (((instr & 0xfff08000) != 0xebb00000)) {
                                      UnpredictableT32(instr);
                                    }
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xebd00000
                      switch (instr & 0x000070f0) {
                        case 0x00000030: {
                          // 0xebd00030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
                          rsbs(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm), RRX));
                          if (((instr & 0xfff0f0f0) != 0xebd00030)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0x70f0) == 0x30)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          ImmediateShiftOperand
                              shift_operand((instr >> 4) & 0x3,
                                            ((instr >> 6) & 0x3) |
                                                ((instr >> 10) & 0x1c));
                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
                          rsbs(CurrentCond(),
                               Best,
                               Register(rd),
                               Register(rn),
                               Operand(Register(rm),
                                       shift_operand.GetType(),
                                       shift_operand.GetAmount()));
                          if (((instr & 0xfff08000) != 0xebd00000)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x10000000: {
                  // 0xfa000000
                  switch (instr & 0x0000f080) {
                    case 0x0000f000: {
                      // 0xfa00f000
                      if ((instr & 0x00000070) == 0x00000000) {
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x2))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (InITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
                            asr(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          } else {
                            // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            asr(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x0))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (InITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
                            lsl(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          } else {
                            // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            lsl(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x1))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (InITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
                            lsr(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          } else {
                            // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            lsr(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x3))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (InITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
                            ror(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          } else {
                            // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            ror(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm),
                                Register(rs));
                          }
                          return;
                        }
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = (instr >> 16) & 0xf;
                        Shift shift((instr >> 21) & 0x3);
                        unsigned rs = instr & 0xf;
                        if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
                            ((rd < kNumberOfT32LowRegisters) &&
                             (rm < kNumberOfT32LowRegisters) &&
                             (rs < kNumberOfT32LowRegisters))) {
                          // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
                          mov(CurrentCond(),
                              Wide,
                              Register(rd),
                              Operand(Register(rm),
                                      shift.GetType(),
                                      Register(rs)));
                        } else if ((instr & 0x00100000) == 0x00000000) {
                          // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
                          mov(CurrentCond(),
                              Best,
                              Register(rd),
                              Operand(Register(rm),
                                      shift.GetType(),
                                      Register(rs)));
                        } else {
                          UnallocatedT32(instr);
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0000f080: {
                      // 0xfa00f080
                      switch (instr & 0x00600000) {
                        case 0x00000000: {
                          // 0xfa00f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa0ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              if ((amount == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
                                sxth(CurrentCond(),
                                     Wide,
                                     Register(rd),
                                     Register(rm));
                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
                                sxth(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              sxtah(CurrentCond(),
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00200000: {
                          // 0xfa20f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa2ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              sxtb16(CurrentCond(),
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              sxtab16(CurrentCond(),
                                      Register(rd),
                                      Register(rn),
                                      Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00400000: {
                          // 0xfa40f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa4ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              if ((amount == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
                                sxtb(CurrentCond(),
                                     Wide,
                                     Register(rd),
                                     Register(rm));
                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
                                sxtb(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              sxtab(CurrentCond(),
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x10100000: {
                  // 0xfa100000
                  switch (instr & 0x0000f080) {
                    case 0x0000f000: {
                      // 0xfa10f000
                      if ((instr & 0x00000070) == 0x00000000) {
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x2))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (OutsideITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
                            asrs(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          } else {
                            // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            asrs(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x0))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (OutsideITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
                            lsls(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          } else {
                            // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            lsls(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x1))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (OutsideITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
                            lsrs(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          } else {
                            // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            lsrs(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          }
                          return;
                        }
                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
                             Uint32(0x3))) {
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rm = (instr >> 16) & 0xf;
                          unsigned rs = instr & 0xf;
                          if (OutsideITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rs < kNumberOfT32LowRegisters))) {
                            // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
                            rors(Condition::None(),
                                 Wide,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          } else {
                            // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
                            rors(CurrentCond(),
                                 Best,
                                 Register(rd),
                                 Register(rm),
                                 Register(rs));
                          }
                          return;
                        }
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = (instr >> 16) & 0xf;
                        Shift shift((instr >> 21) & 0x3);
                        unsigned rs = instr & 0xf;
                        if (OutsideITBlock() &&
                            (instr & 0x00100000) == 0x00100000 &&
                            ((rd < kNumberOfT32LowRegisters) &&
                             (rm < kNumberOfT32LowRegisters) &&
                             (rs < kNumberOfT32LowRegisters))) {
                          // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
                          movs(Condition::None(),
                               Wide,
                               Register(rd),
                               Operand(Register(rm),
                                       shift.GetType(),
                                       Register(rs)));
                        } else if ((instr & 0x00100000) == 0x00100000) {
                          // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
                          movs(CurrentCond(),
                               Best,
                               Register(rd),
                               Operand(Register(rm),
                                       shift.GetType(),
                                       Register(rs)));
                        } else {
                          UnallocatedT32(instr);
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0000f080: {
                      // 0xfa10f080
                      switch (instr & 0x00600000) {
                        case 0x00000000: {
                          // 0xfa10f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa1ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              if ((amount == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
                                uxth(CurrentCond(),
                                     Wide,
                                     Register(rd),
                                     Register(rm));
                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
                                uxth(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              uxtah(CurrentCond(),
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00200000: {
                          // 0xfa30f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa3ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              uxtb16(CurrentCond(),
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              uxtab16(CurrentCond(),
                                      Register(rd),
                                      Register(rn),
                                      Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00400000: {
                          // 0xfa50f080
                          switch (instr & 0x000f0000) {
                            case 0x000f0000: {
                              // 0xfa5ff080
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              if ((amount == 0) &&
                                  ((rd < kNumberOfT32LowRegisters) &&
                                   (rm < kNumberOfT32LowRegisters))) {
                                // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
                                uxtb(CurrentCond(),
                                     Wide,
                                     Register(rd),
                                     Register(rm));
                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
                                  UnpredictableT32(instr);
                                }
                              } else {
                                // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
                                uxtb(CurrentCond(),
                                     Best,
                                     Register(rd),
                                     Operand(Register(rm), ROR, amount));
                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
                                  UnpredictableT32(instr);
                                }
                              }
                              break;
                            }
                            default: {
                              if (((instr & 0xf0000) == 0xf0000)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = (instr >> 8) & 0xf;
                              unsigned rn = (instr >> 16) & 0xf;
                              unsigned rm = instr & 0xf;
                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
                              // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
                              uxtab(CurrentCond(),
                                    Register(rd),
                                    Register(rn),
                                    Operand(Register(rm), ROR, amount));
                              if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x10800000: {
                  // 0xfa800000
                  switch (instr & 0x0060f0f0) {
                    case 0x0000f000: {
                      // 0xfa80f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      sadd8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0000f010: {
                      // 0xfa80f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qadd8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0000f020: {
                      // 0xfa80f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shadd8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f040: {
                      // 0xfa80f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uadd8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0000f050: {
                      // 0xfa80f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqadd8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f060: {
                      // 0xfa80f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhadd8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f080: {
                      // 0xfa80f080
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
                      qadd(CurrentCond(),
                           Register(rd),
                           Register(rm),
                           Register(rn));
                      break;
                    }
                    case 0x0000f090: {
                      // 0xfa80f090
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
                      qdadd(CurrentCond(),
                            Register(rd),
                            Register(rm),
                            Register(rn));
                      break;
                    }
                    case 0x0000f0a0: {
                      // 0xfa80f0a0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
                      qsub(CurrentCond(),
                           Register(rd),
                           Register(rm),
                           Register(rn));
                      break;
                    }
                    case 0x0000f0b0: {
                      // 0xfa80f0b0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
                      qdsub(CurrentCond(),
                            Register(rd),
                            Register(rm),
                            Register(rn));
                      break;
                    }
                    case 0x0020f000: {
                      // 0xfaa0f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      sasx(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0020f010: {
                      // 0xfaa0f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qasx(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0020f020: {
                      // 0xfaa0f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shasx(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0020f040: {
                      // 0xfaa0f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uasx(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0020f050: {
                      // 0xfaa0f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqasx(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0020f060: {
                      // 0xfaa0f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhasx(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0020f080: {
                      // 0xfaa0f080
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      sel(CurrentCond(),
                          Register(rd),
                          Register(rn),
                          Register(rm));
                      break;
                    }
                    case 0x0040f000: {
                      // 0xfac0f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      ssub8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0040f010: {
                      // 0xfac0f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qsub8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0040f020: {
                      // 0xfac0f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shsub8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f040: {
                      // 0xfac0f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      usub8(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0040f050: {
                      // 0xfac0f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqsub8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f060: {
                      // 0xfac0f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhsub8(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f080: {
                      // 0xfac0f080
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32b(Condition::None(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f090: {
                      // 0xfac0f090
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32h(Condition::None(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f0a0: {
                      // 0xfac0f0a0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32w(Condition::None(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0060f000: {
                      // 0xfae0f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      ssax(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0060f010: {
                      // 0xfae0f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qsax(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0060f020: {
                      // 0xfae0f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shsax(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0060f040: {
                      // 0xfae0f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      usax(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      break;
                    }
                    case 0x0060f050: {
                      // 0xfae0f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqsax(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x0060f060: {
                      // 0xfae0f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhsax(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x10900000: {
                  // 0xfa900000
                  switch (instr & 0x0060f0f0) {
                    case 0x0000f000: {
                      // 0xfa90f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      sadd16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f010: {
                      // 0xfa90f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qadd16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f020: {
                      // 0xfa90f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shadd16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0000f040: {
                      // 0xfa90f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uadd16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0000f050: {
                      // 0xfa90f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqadd16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0000f060: {
                      // 0xfa90f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhadd16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0000f080: {
                      // 0xfa90f080
                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = instr & 0xf;
                        if ((rd < kNumberOfT32LowRegisters) &&
                            (rm < kNumberOfT32LowRegisters)) {
                          // REV{<c>}.W <Rd>, <Rm> ; T2
                          rev(CurrentCond(), Wide, Register(rd), Register(rm));
                        } else {
                          // REV{<c>}{<q>} <Rd>, <Rm> ; T2
                          rev(CurrentCond(), Best, Register(rd), Register(rm));
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0000f090: {
                      // 0xfa90f090
                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = instr & 0xf;
                        if ((rd < kNumberOfT32LowRegisters) &&
                            (rm < kNumberOfT32LowRegisters)) {
                          // REV16{<c>}.W <Rd>, <Rm> ; T2
                          rev16(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm));
                        } else {
                          // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
                          rev16(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm));
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0000f0a0: {
                      // 0xfa90f0a0
                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = instr & 0xf;
                        // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
                        rbit(CurrentCond(), Register(rd), Register(rm));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0000f0b0: {
                      // 0xfa90f0b0
                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = instr & 0xf;
                        if ((rd < kNumberOfT32LowRegisters) &&
                            (rm < kNumberOfT32LowRegisters)) {
                          // REVSH{<c>}.W <Rd>, <Rm> ; T2
                          revsh(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rm));
                        } else {
                          // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
                          revsh(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rm));
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0020f080: {
                      // 0xfab0f080
                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
                        unsigned rd = (instr >> 8) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
                        clz(CurrentCond(), Register(rd), Register(rm));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x0040f000: {
                      // 0xfad0f000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      ssub16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f010: {
                      // 0xfad0f010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      qsub16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f020: {
                      // 0xfad0f020
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      shsub16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0040f040: {
                      // 0xfad0f040
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      usub16(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x0040f050: {
                      // 0xfad0f050
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uqsub16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0040f060: {
                      // 0xfad0f060
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      uhsub16(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0040f080: {
                      // 0xfad0f080
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32cb(Condition::None(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0040f090: {
                      // 0xfad0f090
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32ch(Condition::None(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x0040f0a0: {
                      // 0xfad0f0a0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
                      crc32cw(Condition::None(),
                              Register(rd),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x11000000: {
                  // 0xfb000000
                  switch (instr & 0x006000f0) {
                    case 0x00000000: {
                      // 0xfb000000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb00f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          if (InITBlock() &&
                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
                               (rn < kNumberOfT32LowRegisters))) {
                            // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
                            mul(CurrentCond(),
                                Wide,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          } else {
                            // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
                            mul(CurrentCond(),
                                Best,
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          mla(CurrentCond(),
                              Register(rd),
                              Register(rn),
                              Register(rm),
                              Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000010: {
                      // 0xfb000010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned ra = (instr >> 12) & 0xf;
                      // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                      mls(CurrentCond(),
                          Register(rd),
                          Register(rn),
                          Register(rm),
                          Register(ra));
                      break;
                    }
                    case 0x00200000: {
                      // 0xfb200000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb20f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smuad(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlad(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm),
                                Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200010: {
                      // 0xfb200010
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb20f010
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smuadx(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smladx(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xfb400000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb40f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smusd(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlsd(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm),
                                Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400010: {
                      // 0xfb400010
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb40f010
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smusdx(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlsdx(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xfb600000
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned ra = (instr >> 12) & 0xf;
                      // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                      smmls(CurrentCond(),
                            Register(rd),
                            Register(rn),
                            Register(rm),
                            Register(ra));
                      break;
                    }
                    case 0x00600010: {
                      // 0xfb600010
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned ra = (instr >> 12) & 0xf;
                      // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                      smmlsr(CurrentCond(),
                             Register(rd),
                             Register(rn),
                             Register(rm),
                             Register(ra));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x11100000: {
                  // 0xfb100000
                  switch (instr & 0x006000f0) {
                    case 0x00000000: {
                      // 0xfb100000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb10f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smulbb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlabb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000010: {
                      // 0xfb100010
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb10f010
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smulbt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlabt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000020: {
                      // 0xfb100020
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb10f020
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smultb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlatb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000030: {
                      // 0xfb100030
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb10f030
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smultt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlatt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xfb300000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb30f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smulwb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlawb(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200010: {
                      // 0xfb300010
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb30f010
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smulwt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smlawt(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xfb500000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb50f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smmul(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smmla(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm),
                                Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00400010: {
                      // 0xfb500010
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb50f010
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          smmulr(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          smmlar(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00600000: {
                      // 0xfb700000
                      switch (instr & 0x0000f000) {
                        case 0x0000f000: {
                          // 0xfb70f000
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                          usad8(CurrentCond(),
                                Register(rd),
                                Register(rn),
                                Register(rm));
                          break;
                        }
                        default: {
                          if (((instr & 0xf000) == 0xf000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = (instr >> 8) & 0xf;
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned rm = instr & 0xf;
                          unsigned ra = (instr >> 12) & 0xf;
                          // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
                          usada8(CurrentCond(),
                                 Register(rd),
                                 Register(rn),
                                 Register(rm),
                                 Register(ra));
                          break;
                        }
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x11800000: {
                  // 0xfb800000
                  switch (instr & 0x006000f0) {
                    case 0x00000000: {
                      // 0xfb800000
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smull(CurrentCond(),
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x00200000: {
                      // 0xfba00000
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      umull(CurrentCond(),
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x00400000: {
                      // 0xfbc00000
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlal(CurrentCond(),
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x00400080: {
                      // 0xfbc00080
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlalbb(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x00400090: {
                      // 0xfbc00090
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlalbt(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x004000a0: {
                      // 0xfbc000a0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlaltb(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x004000b0: {
                      // 0xfbc000b0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlaltt(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x004000c0: {
                      // 0xfbc000c0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlald(CurrentCond(),
                             Register(rdlo),
                             Register(rdhi),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x004000d0: {
                      // 0xfbc000d0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlaldx(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    case 0x00600000: {
                      // 0xfbe00000
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      umlal(CurrentCond(),
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    case 0x00600060: {
                      // 0xfbe00060
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      umaal(CurrentCond(),
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x11900000: {
                  // 0xfb900000
                  switch (instr & 0x006000f0) {
                    case 0x000000f0: {
                      // 0xfb9000f0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      sdiv(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x002000f0: {
                      // 0xfbb000f0
                      unsigned rd = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
                      udiv(CurrentCond(),
                           Register(rd),
                           Register(rn),
                           Register(rm));
                      if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x004000c0: {
                      // 0xfbd000c0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlsld(CurrentCond(),
                             Register(rdlo),
                             Register(rdhi),
                             Register(rn),
                             Register(rm));
                      break;
                    }
                    case 0x004000d0: {
                      // 0xfbd000d0
                      unsigned rdlo = (instr >> 12) & 0xf;
                      unsigned rdhi = (instr >> 8) & 0xf;
                      unsigned rn = (instr >> 16) & 0xf;
                      unsigned rm = instr & 0xf;
                      // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
                      smlsldx(CurrentCond(),
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
              }
              break;
            }
            case 0x04000000: {
              // 0xec000000
              switch (instr & 0x11100e00) {
                case 0x00000a00: {
                  // 0xec000a00
                  switch (instr & 0x00800100) {
                    case 0x00000000: {
                      // 0xec000a00
                      if ((instr & 0x006000d0) == 0x00400010) {
                        unsigned rm = ExtractSRegister(instr, 5, 0);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rt2 = (instr >> 16) & 0xf;
                        // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
                        vmov(CurrentCond(),
                             SRegister(rm),
                             SRegister(rm + 1),
                             Register(rt),
                             Register(rt2));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00000100: {
                      // 0xec000b00
                      if ((instr & 0x006000d0) == 0x00400010) {
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rt2 = (instr >> 16) & 0xf;
                        // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
                        vmov(CurrentCond(),
                             DRegister(rm),
                             Register(rt),
                             Register(rt2));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xec800a00
                      unsigned rn = (instr >> 16) & 0xf;
                      WriteBack write_back((instr >> 21) & 0x1);
                      unsigned first = ExtractSRegister(instr, 22, 12);
                      unsigned len = instr & 0xff;
                      // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
                      vstm(CurrentCond(),
                           kDataTypeValueNone,
                           Register(rn),
                           write_back,
                           SRegisterList(SRegister(first), len));
                      if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x00800100: {
                      // 0xec800b00
                      switch (instr & 0x00000001) {
                        case 0x00000000: {
                          // 0xec800b00
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
                          vstm(CurrentCond(),
                               kDataTypeValueNone,
                               Register(rn),
                               write_back,
                               DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) ||
                              (end > kMaxNumberOfDRegisters)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00000001: {
                          // 0xec800b01
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
                          fstmiax(CurrentCond(),
                                  Register(rn),
                                  write_back,
                                  DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) || (end > 16)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x00000e00: {
                  // 0xec000e00
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xec000e00
                      if ((instr & 0x0080f100) == 0x00805000) {
                        UnimplementedT32_32("STC", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xec200e00
                      if ((instr & 0x0000f100) == 0x00005000) {
                        UnimplementedT32_32("STC", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xec400e00
                      if ((instr & 0x00800000) == 0x00000000) {
                        UnimplementedT32_32("MCRR", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x00100a00: {
                  // 0xec100a00
                  switch (instr & 0x00800100) {
                    case 0x00000000: {
                      // 0xec100a00
                      if ((instr & 0x006000d0) == 0x00400010) {
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rt2 = (instr >> 16) & 0xf;
                        unsigned rm = ExtractSRegister(instr, 5, 0);
                        // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
                        vmov(CurrentCond(),
                             Register(rt),
                             Register(rt2),
                             SRegister(rm),
                             SRegister(rm + 1));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00000100: {
                      // 0xec100b00
                      if ((instr & 0x006000d0) == 0x00400010) {
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rt2 = (instr >> 16) & 0xf;
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
                        vmov(CurrentCond(),
                             Register(rt),
                             Register(rt2),
                             DRegister(rm));
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xec900a00
                      if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
                           Uint32(0x1)) &&
                          ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                           Uint32(0xd))) {
                        unsigned first = ExtractSRegister(instr, 22, 12);
                        unsigned len = instr & 0xff;
                        // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
                        vpop(CurrentCond(),
                             kDataTypeValueNone,
                             SRegisterList(SRegister(first), len));
                        if ((len == 0) ||
                            ((first + len) > kNumberOfSRegisters)) {
                          UnpredictableT32(instr);
                        }
                        return;
                      }
                      unsigned rn = (instr >> 16) & 0xf;
                      WriteBack write_back((instr >> 21) & 0x1);
                      unsigned first = ExtractSRegister(instr, 22, 12);
                      unsigned len = instr & 0xff;
                      // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
                      vldm(CurrentCond(),
                           kDataTypeValueNone,
                           Register(rn),
                           write_back,
                           SRegisterList(SRegister(first), len));
                      if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x00800100: {
                      // 0xec900b00
                      switch (instr & 0x00000001) {
                        case 0x00000000: {
                          // 0xec900b00
                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
                               Uint32(0x1)) &&
                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                               Uint32(0xd))) {
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned imm8 = (instr & 0xff);
                            unsigned len = imm8 / 2;
                            unsigned end = first + len;
                            // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
                            vpop(CurrentCond(),
                                 kDataTypeValueNone,
                                 DRegisterList(DRegister(first), len));
                            if ((len == 0) || (len > 16) ||
                                (end > kMaxNumberOfDRegisters)) {
                              UnpredictableT32(instr);
                            }
                            return;
                          }
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
                          vldm(CurrentCond(),
                               kDataTypeValueNone,
                               Register(rn),
                               write_back,
                               DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) ||
                              (end > kMaxNumberOfDRegisters)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00000001: {
                          // 0xec900b01
                          unsigned rn = (instr >> 16) & 0xf;
                          WriteBack write_back((instr >> 21) & 0x1);
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
                          fldmiax(CurrentCond(),
                                  Register(rn),
                                  write_back,
                                  DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) || (end > 16)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x00100e00: {
                  // 0xec100e00
                  switch (instr & 0x00600000) {
                    case 0x00000000: {
                      // 0xec100e00
                      if ((instr & 0x0080f100) == 0x00805000) {
                        if (((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedT32(instr);
                          return;
                        }
                        UnimplementedT32_32("LDC", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xec300e00
                      if ((instr & 0x0000f100) == 0x00005000) {
                        if (((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedT32(instr);
                          return;
                        }
                        UnimplementedT32_32("LDC", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00400000: {
                      // 0xec500e00
                      if ((instr & 0x00800000) == 0x00000000) {
                        UnimplementedT32_32("MRRC", instr);
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01000a00: {
                  // 0xed000a00
                  switch (instr & 0x00200100) {
                    case 0x00000000: {
                      // 0xed000a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = (instr >> 16) & 0xf;
                      Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                      int32_t offset = (instr & 0xff) << 2;
                      // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2
                      vstr(CurrentCond(),
                           Untyped32,
                           SRegister(rd),
                           MemOperand(Register(rn), sign, offset, Offset));
                      break;
                    }
                    case 0x00000100: {
                      // 0xed000b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = (instr >> 16) & 0xf;
                      Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                      int32_t offset = (instr & 0xff) << 2;
                      // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1
                      vstr(CurrentCond(),
                           Untyped64,
                           DRegister(rd),
                           MemOperand(Register(rn), sign, offset, Offset));
                      break;
                    }
                    case 0x00200000: {
                      // 0xed200a00
                      if ((instr & 0x00800000) == 0x00000000) {
                        if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
                             Uint32(0xd))) {
                          unsigned first = ExtractSRegister(instr, 22, 12);
                          unsigned len = instr & 0xff;
                          // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
                          vpush(CurrentCond(),
                                kDataTypeValueNone,
                                SRegisterList(SRegister(first), len));
                          if ((len == 0) ||
                              ((first + len) > kNumberOfSRegisters)) {
                            UnpredictableT32(instr);
                          }
                          return;
                        }
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned first = ExtractSRegister(instr, 22, 12);
                        unsigned len = instr & 0xff;
                        // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
                        vstmdb(CurrentCond(),
                               kDataTypeValueNone,
                               Register(rn),
                               WriteBack(WRITE_BACK),
                               SRegisterList(SRegister(first), len));
                        if ((len == 0) ||
                            ((first + len) > kNumberOfSRegisters)) {
                          UnpredictableT32(instr);
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00200100: {
                      // 0xed200b00
                      switch (instr & 0x00800001) {
                        case 0x00000000: {
                          // 0xed200b00
                          if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
                               Uint32(0xd))) {
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned imm8 = (instr & 0xff);
                            unsigned len = imm8 / 2;
                            unsigned end = first + len;
                            // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
                            vpush(CurrentCond(),
                                  kDataTypeValueNone,
                                  DRegisterList(DRegister(first), len));
                            if ((len == 0) || (len > 16) ||
                                (end > kMaxNumberOfDRegisters)) {
                              UnpredictableT32(instr);
                            }
                            return;
                          }
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
                          vstmdb(CurrentCond(),
                                 kDataTypeValueNone,
                                 Register(rn),
                                 WriteBack(WRITE_BACK),
                                 DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) ||
                              (end > kMaxNumberOfDRegisters)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00000001: {
                          // 0xed200b01
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
                          fstmdbx(CurrentCond(),
                                  Register(rn),
                                  WriteBack(WRITE_BACK),
                                  DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) || (end > 16)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x01000e00: {
                  // 0xed000e00
                  switch (instr & 0x0060f100) {
                    case 0x00005000: {
                      // 0xed005e00
                      UnimplementedT32_32("STC", instr);
                      break;
                    }
                    case 0x00205000: {
                      // 0xed205e00
                      UnimplementedT32_32("STC", instr);
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01100a00: {
                  // 0xed100a00
                  switch (instr & 0x00200100) {
                    case 0x00000000: {
                      // 0xed100a00
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xed1f0a00
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          uint32_t U = (instr >> 23) & 0x1;
                          int32_t imm = instr & 0xff;
                          imm <<= 2;
                          if (U == 0) imm = -imm;
                          bool minus_zero = (imm == 0) && (U == 0);
                          Location location(imm, kT32PcDelta);
                          // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
                          if (minus_zero) {
                            vldr(CurrentCond(),
                                 Untyped32,
                                 SRegister(rd),
                                 MemOperand(pc, minus, 0));
                          } else {
                            vldr(CurrentCond(),
                                 Untyped32,
                                 SRegister(rd),
                                 &location);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                 : plus);
                          int32_t offset = (instr & 0xff) << 2;
                          // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
                          vldr(CurrentCond(),
                               Untyped32,
                               SRegister(rd),
                               MemOperand(Register(rn), sign, offset, Offset));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000100: {
                      // 0xed100b00
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xed1f0b00
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          uint32_t U = (instr >> 23) & 0x1;
                          int32_t imm = instr & 0xff;
                          imm <<= 2;
                          if (U == 0) imm = -imm;
                          bool minus_zero = (imm == 0) && (U == 0);
                          Location location(imm, kT32PcDelta);
                          // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
                          if (minus_zero) {
                            vldr(CurrentCond(),
                                 Untyped64,
                                 DRegister(rd),
                                 MemOperand(pc, minus, 0));
                          } else {
                            vldr(CurrentCond(),
                                 Untyped64,
                                 DRegister(rd),
                                 &location);
                          }
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = (instr >> 16) & 0xf;
                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                 : plus);
                          int32_t offset = (instr & 0xff) << 2;
                          // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
                          vldr(CurrentCond(),
                               Untyped64,
                               DRegister(rd),
                               MemOperand(Register(rn), sign, offset, Offset));
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00200000: {
                      // 0xed300a00
                      if ((instr & 0x00800000) == 0x00000000) {
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned first = ExtractSRegister(instr, 22, 12);
                        unsigned len = instr & 0xff;
                        // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
                        vldmdb(CurrentCond(),
                               kDataTypeValueNone,
                               Register(rn),
                               WriteBack(WRITE_BACK),
                               SRegisterList(SRegister(first), len));
                        if ((len == 0) ||
                            ((first + len) > kNumberOfSRegisters)) {
                          UnpredictableT32(instr);
                        }
                      } else {
                        UnallocatedT32(instr);
                      }
                      break;
                    }
                    case 0x00200100: {
                      // 0xed300b00
                      switch (instr & 0x00800001) {
                        case 0x00000000: {
                          // 0xed300b00
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
                          vldmdb(CurrentCond(),
                                 kDataTypeValueNone,
                                 Register(rn),
                                 WriteBack(WRITE_BACK),
                                 DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) ||
                              (end > kMaxNumberOfDRegisters)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00000001: {
                          // 0xed300b01
                          unsigned rn = (instr >> 16) & 0xf;
                          unsigned first = ExtractDRegister(instr, 22, 12);
                          unsigned imm8 = (instr & 0xff);
                          unsigned len = imm8 / 2;
                          unsigned end = first + len;
                          // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
                          fldmdbx(CurrentCond(),
                                  Register(rn),
                                  WriteBack(WRITE_BACK),
                                  DRegisterList(DRegister(first), len));
                          if ((len == 0) || (len > 16) || (end > 16)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x01100e00: {
                  // 0xed100e00
                  switch (instr & 0x0060f100) {
                    case 0x00005000: {
                      // 0xed105e00
                      switch (instr & 0x000f0000) {
                        case 0x000f0000: {
                          // 0xed1f5e00
                          UnimplementedT32_32("LDC", instr);
                          break;
                        }
                        default: {
                          if (((instr & 0xf0000) == 0xf0000)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          UnimplementedT32_32("LDC", instr);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00205000: {
                      // 0xed305e00
                      if (((instr & 0xf0000) == 0xf0000)) {
                        UnallocatedT32(instr);
                        return;
                      }
                      UnimplementedT32_32("LDC", instr);
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                default:
                  UnallocatedT32(instr);
                  break;
              }
              break;
            }
            case 0x06000000: {
              // 0xee000000
              switch (instr & 0x01000010) {
                case 0x00000000: {
                  // 0xee000000
                  switch (instr & 0x10b00f40) {
                    case 0x00000a00: {
                      // 0xee000a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vmla(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00000a40: {
                      // 0xee000a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vmls(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00000b00: {
                      // 0xee000b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vmla(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00000b40: {
                      // 0xee000b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vmls(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00100a00: {
                      // 0xee100a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
                      vnmls(CurrentCond(),
                            F32,
                            SRegister(rd),
                            SRegister(rn),
                            SRegister(rm));
                      break;
                    }
                    case 0x00100a40: {
                      // 0xee100a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
                      vnmla(CurrentCond(),
                            F32,
                            SRegister(rd),
                            SRegister(rn),
                            SRegister(rm));
                      break;
                    }
                    case 0x00100b00: {
                      // 0xee100b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
                      vnmls(CurrentCond(),
                            F64,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                      break;
                    }
                    case 0x00100b40: {
                      // 0xee100b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
                      vnmla(CurrentCond(),
                            F64,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                      break;
                    }
                    case 0x00200a00: {
                      // 0xee200a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
                      vmul(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00200a40: {
                      // 0xee200a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
                      vnmul(CurrentCond(),
                            F32,
                            SRegister(rd),
                            SRegister(rn),
                            SRegister(rm));
                      break;
                    }
                    case 0x00200b00: {
                      // 0xee200b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
                      vmul(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00200b40: {
                      // 0xee200b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
                      vnmul(CurrentCond(),
                            F64,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                      break;
                    }
                    case 0x00300a00: {
                      // 0xee300a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
                      vadd(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00300a40: {
                      // 0xee300a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
                      vsub(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00300b00: {
                      // 0xee300b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
                      vadd(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00300b40: {
                      // 0xee300b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
                      vsub(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00800a00: {
                      // 0xee800a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
                      vdiv(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00800b00: {
                      // 0xee800b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
                      vdiv(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00900a00: {
                      // 0xee900a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
                      vfnms(CurrentCond(),
                            F32,
                            SRegister(rd),
                            SRegister(rn),
                            SRegister(rm));
                      break;
                    }
                    case 0x00900a40: {
                      // 0xee900a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
                      vfnma(CurrentCond(),
                            F32,
                            SRegister(rd),
                            SRegister(rn),
                            SRegister(rm));
                      break;
                    }
                    case 0x00900b00: {
                      // 0xee900b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
                      vfnms(CurrentCond(),
                            F64,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                      break;
                    }
                    case 0x00900b40: {
                      // 0xee900b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
                      vfnma(CurrentCond(),
                            F64,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                      break;
                    }
                    case 0x00a00a00: {
                      // 0xeea00a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vfma(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00a00a40: {
                      // 0xeea00a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vfms(CurrentCond(),
                           F32,
                           SRegister(rd),
                           SRegister(rn),
                           SRegister(rm));
                      break;
                    }
                    case 0x00a00b00: {
                      // 0xeea00b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vfma(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00a00b40: {
                      // 0xeea00b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vfms(CurrentCond(),
                           F64,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                      break;
                    }
                    case 0x00b00a00: {
                      // 0xeeb00a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      uint32_t encoded_imm =
                          (instr & 0xf) | ((instr >> 12) & 0xf0);
                      NeonImmediate imm =
                          ImmediateVFP::Decode<float>(encoded_imm);
                      // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
                      vmov(CurrentCond(), F32, SRegister(rd), imm);
                      if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x00b00a40: {
                      // 0xeeb00a40
                      switch (instr & 0x000e0000) {
                        case 0x00000000: {
                          // 0xeeb00a40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb00a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
                              vmov(CurrentCond(),
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb00ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
                              vabs(CurrentCond(),
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb10a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
                              vneg(CurrentCond(),
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb10ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vsqrt(CurrentCond(),
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00020000: {
                          // 0xeeb20a40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb20a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
                              vcvtb(CurrentCond(),
                                    F32,
                                    F16,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb20ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
                              vcvtt(CurrentCond(),
                                    F32,
                                    F16,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb30a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
                              vcvtb(CurrentCond(),
                                    F16,
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb30ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
                              vcvtt(CurrentCond(),
                                    F16,
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00040000: {
                          // 0xeeb40a40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb40a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vcmp(CurrentCond(),
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb40ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vcmpe(CurrentCond(),
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb50a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
                              vcmp(CurrentCond(), F32, SRegister(rd), 0.0);
                              if (((instr & 0xffbf0fff) != 0xeeb50a40)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb50ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
                              vcmpe(CurrentCond(), F32, SRegister(rd), 0.0);
                              if (((instr & 0xffbf0fff) != 0xeeb50ac0)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00060000: {
                          // 0xeeb60a40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb60a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vrintr(CurrentCond(),
                                     F32,
                                     SRegister(rd),
                                     SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb60ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vrintz(CurrentCond(),
                                     F32,
                                     SRegister(rd),
                                     SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb70a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
                              vrintx(CurrentCond(),
                                     F32,
                                     SRegister(rd),
                                     SRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb70ac0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
                              vcvt(CurrentCond(),
                                   F64,
                                   F32,
                                   DRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00080000: {
                          // 0xeeb80a40
                          if ((instr & 0x00010000) == 0x00000000) {
                            DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
                            vcvt(CurrentCond(),
                                 F32,
                                 dt,
                                 SRegister(rd),
                                 SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000a0000: {
                          // 0xeeba0a40
                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                         ((instr >> 15) & 0x2));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned offset = 32;
                          if (dt.Is(S16) || dt.Is(U16)) {
                            offset = 16;
                          }
                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                     ((instr << 1) & 0x1e));
                          // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1
                          vcvt(CurrentCond(),
                               F32,
                               dt,
                               SRegister(rd),
                               SRegister(rd),
                               fbits);
                          break;
                        }
                        case 0x000c0000: {
                          // 0xeebc0a40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeebc0a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
                              vcvtr(CurrentCond(),
                                    U32,
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeebc0ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
                              vcvt(CurrentCond(),
                                   U32,
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeebd0a40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
                              vcvtr(CurrentCond(),
                                    S32,
                                    F32,
                                    SRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeebd0ac0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
                              vcvt(CurrentCond(),
                                   S32,
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x000e0000: {
                          // 0xeebe0a40
                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                         ((instr >> 15) & 0x2));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned offset = 32;
                          if (dt.Is(S16) || dt.Is(U16)) {
                            offset = 16;
                          }
                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                     ((instr << 1) & 0x1e));
                          // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1
                          vcvt(CurrentCond(),
                               dt,
                               F32,
                               SRegister(rd),
                               SRegister(rd),
                               fbits);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00b00b00: {
                      // 0xeeb00b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      uint32_t encoded_imm =
                          (instr & 0xf) | ((instr >> 12) & 0xf0);
                      NeonImmediate imm =
                          ImmediateVFP::Decode<double>(encoded_imm);
                      // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
                      vmov(CurrentCond(), F64, DRegister(rd), imm);
                      if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x00b00b40: {
                      // 0xeeb00b40
                      switch (instr & 0x000e0000) {
                        case 0x00000000: {
                          // 0xeeb00b40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb00b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
                              vmov(CurrentCond(),
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb00bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
                              vabs(CurrentCond(),
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb10b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
                              vneg(CurrentCond(),
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb10bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vsqrt(CurrentCond(),
                                    F64,
                                    DRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00020000: {
                          // 0xeeb20b40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb20b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
                              vcvtb(CurrentCond(),
                                    F64,
                                    F16,
                                    DRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb20bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractSRegister(instr, 5, 0);
                              // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
                              vcvtt(CurrentCond(),
                                    F64,
                                    F16,
                                    DRegister(rd),
                                    SRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb30b40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
                              vcvtb(CurrentCond(),
                                    F16,
                                    F64,
                                    SRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb30bc0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
                              vcvtt(CurrentCond(),
                                    F16,
                                    F64,
                                    SRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00040000: {
                          // 0xeeb40b40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb40b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vcmp(CurrentCond(),
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb40bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vcmpe(CurrentCond(),
                                    F64,
                                    DRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb50b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
                              vcmp(CurrentCond(), F64, DRegister(rd), 0.0);
                              if (((instr & 0xffbf0fff) != 0xeeb50b40)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb50bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
                              vcmpe(CurrentCond(), F64, DRegister(rd), 0.0);
                              if (((instr & 0xffbf0fff) != 0xeeb50bc0)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00060000: {
                          // 0xeeb60b40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeeb60b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vrintr(CurrentCond(),
                                     F64,
                                     DRegister(rd),
                                     DRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeeb60bc0
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vrintz(CurrentCond(),
                                     F64,
                                     DRegister(rd),
                                     DRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeeb70b40
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
                              vrintx(CurrentCond(),
                                     F64,
                                     DRegister(rd),
                                     DRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeeb70bc0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
                              vcvt(CurrentCond(),
                                   F32,
                                   F64,
                                   SRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00080000: {
                          // 0xeeb80b40
                          if ((instr & 0x00010000) == 0x00000000) {
                            DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
                            vcvt(CurrentCond(),
                                 F64,
                                 dt,
                                 DRegister(rd),
                                 SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000a0000: {
                          // 0xeeba0b40
                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                         ((instr >> 15) & 0x2));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned offset = 32;
                          if (dt.Is(S16) || dt.Is(U16)) {
                            offset = 16;
                          }
                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                     ((instr << 1) & 0x1e));
                          // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1
                          vcvt(CurrentCond(),
                               F64,
                               dt,
                               DRegister(rd),
                               DRegister(rd),
                               fbits);
                          break;
                        }
                        case 0x000c0000: {
                          // 0xeebc0b40
                          switch (instr & 0x00010080) {
                            case 0x00000000: {
                              // 0xeebc0b40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
                              vcvtr(CurrentCond(),
                                    U32,
                                    F64,
                                    SRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                            case 0x00000080: {
                              // 0xeebc0bc0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
                              vcvt(CurrentCond(),
                                   U32,
                                   F64,
                                   SRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00010000: {
                              // 0xeebd0b40
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
                              vcvtr(CurrentCond(),
                                    S32,
                                    F64,
                                    SRegister(rd),
                                    DRegister(rm));
                              break;
                            }
                            case 0x00010080: {
                              // 0xeebd0bc0
                              unsigned rd = ExtractSRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
                              vcvt(CurrentCond(),
                                   S32,
                                   F64,
                                   SRegister(rd),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x000e0000: {
                          // 0xeebe0b40
                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                         ((instr >> 15) & 0x2));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned offset = 32;
                          if (dt.Is(S16) || dt.Is(U16)) {
                            offset = 16;
                          }
                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                     ((instr << 1) & 0x1e));
                          // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1
                          vcvt(CurrentCond(),
                               dt,
                               F64,
                               DRegister(rd),
                               DRegister(rd),
                               fbits);
                          break;
                        }
                      }
                      break;
                    }
                    case 0x10000a00: {
                      // 0xfe000a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
                      vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10000b00: {
                      // 0xfe000b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
                      vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10100a00: {
                      // 0xfe100a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
                      vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10100b00: {
                      // 0xfe100b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
                      vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10200a00: {
                      // 0xfe200a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
                      vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10200b00: {
                      // 0xfe200b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
                      vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10300a00: {
                      // 0xfe300a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
                      vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10300b00: {
                      // 0xfe300b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
                      vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10800a00: {
                      // 0xfe800a00
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10800a40: {
                      // 0xfe800a40
                      unsigned rd = ExtractSRegister(instr, 22, 12);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rm = ExtractSRegister(instr, 5, 0);
                      // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
                      vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10800b00: {
                      // 0xfe800b00
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10800b40: {
                      // 0xfe800b40
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
                      vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
                      if (InITBlock()) {
                        UnpredictableT32(instr);
                      }
                      break;
                    }
                    case 0x10b00a40: {
                      // 0xfeb00a40
                      switch (instr & 0x000f0000) {
                        case 0x00080000: {
                          // 0xfeb80a40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTA{<q>}.F32 <Sd>, <Sm> ; T1
                            vrinta(F32, SRegister(rd), SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00090000: {
                          // 0xfeb90a40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTN{<q>}.F32 <Sd>, <Sm> ; T1
                            vrintn(F32, SRegister(rd), SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000a0000: {
                          // 0xfeba0a40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTP{<q>}.F32 <Sd>, <Sm> ; T1
                            vrintp(F32, SRegister(rd), SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000b0000: {
                          // 0xfebb0a40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTM{<q>}.F32 <Sd>, <Sm> ; T1
                            vrintm(F32, SRegister(rd), SRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000c0000: {
                          // 0xfebc0a40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
                          vcvta(dt, F32, SRegister(rd), SRegister(rm));
                          break;
                        }
                        case 0x000d0000: {
                          // 0xfebd0a40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
                          vcvtn(dt, F32, SRegister(rd), SRegister(rm));
                          break;
                        }
                        case 0x000e0000: {
                          // 0xfebe0a40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
                          vcvtp(dt, F32, SRegister(rd), SRegister(rm));
                          break;
                        }
                        case 0x000f0000: {
                          // 0xfebf0a40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
                          vcvtm(dt, F32, SRegister(rd), SRegister(rm));
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x10b00b40: {
                      // 0xfeb00b40
                      switch (instr & 0x000f0000) {
                        case 0x00080000: {
                          // 0xfeb80b40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTA{<q>}.F64 <Dd>, <Dm> ; T1
                            vrinta(F64, DRegister(rd), DRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00090000: {
                          // 0xfeb90b40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTN{<q>}.F64 <Dd>, <Dm> ; T1
                            vrintn(F64, DRegister(rd), DRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000a0000: {
                          // 0xfeba0b40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTP{<q>}.F64 <Dd>, <Dm> ; T1
                            vrintp(F64, DRegister(rd), DRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000b0000: {
                          // 0xfebb0b40
                          if ((instr & 0x00000080) == 0x00000000) {
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTM{<q>}.F64 <Dd>, <Dm> ; T1
                            vrintm(F64, DRegister(rd), DRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x000c0000: {
                          // 0xfebc0b40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
                          vcvta(dt, F64, SRegister(rd), DRegister(rm));
                          break;
                        }
                        case 0x000d0000: {
                          // 0xfebd0b40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
                          vcvtn(dt, F64, SRegister(rd), DRegister(rm));
                          break;
                        }
                        case 0x000e0000: {
                          // 0xfebe0b40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
                          vcvtp(dt, F64, SRegister(rd), DRegister(rm));
                          break;
                        }
                        case 0x000f0000: {
                          // 0xfebf0b40
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
                          vcvtm(dt, F64, SRegister(rd), DRegister(rm));
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x00000010: {
                  // 0xee000010
                  switch (instr & 0x10100e00) {
                    case 0x00000a00: {
                      // 0xee000a10
                      switch (instr & 0x00800100) {
                        case 0x00000000: {
                          // 0xee000a10
                          if ((instr & 0x00600000) == 0x00000000) {
                            unsigned rn = ExtractSRegister(instr, 7, 16);
                            unsigned rt = (instr >> 12) & 0xf;
                            // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
                            vmov(CurrentCond(), SRegister(rn), Register(rt));
                            if (((instr & 0xfff00f7f) != 0xee000a10)) {
                              UnpredictableT32(instr);
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00000100: {
                          // 0xee000b10
                          unsigned lane;
                          DataType dt =
                              Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
                                                        ((instr >> 19) & 0xc),
                                                    &lane);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 7, 16);
                          unsigned rt = (instr >> 12) & 0xf;
                          // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
                          vmov(CurrentCond(),
                               dt,
                               DRegisterLane(rd, lane),
                               Register(rt));
                          if (((instr & 0xff900f1f) != 0xee000b10)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                        case 0x00800000: {
                          // 0xee800a10
                          if ((instr & 0x00600000) == 0x00600000) {
                            unsigned spec_reg = (instr >> 16) & 0xf;
                            unsigned rt = (instr >> 12) & 0xf;
                            switch (spec_reg) {
                              case 0x0:
                              case 0x1:
                              case 0x8: {
                                // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
                                vmsr(CurrentCond(),
                                     SpecialFPRegister(spec_reg),
                                     Register(rt));
                                if (((instr & 0xfff00fff) != 0xeee00a10)) {
                                  UnpredictableT32(instr);
                                }
                                break;
                              }
                              default:
                                UnallocatedT32(instr);
                                break;
                            }
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00800100: {
                          // 0xee800b10
                          switch (instr & 0x00200040) {
                            case 0x00000000: {
                              // 0xee800b10
                              DataType dt = Dt_B_E_1_Decode(
                                  ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 7, 16);
                              unsigned rt = (instr >> 12) & 0xf;
                              // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
                              vdup(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   Register(rt));
                              if (((instr & 0xffb00f5f) != 0xee800b10)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x00200000: {
                              // 0xeea00b10
                              DataType dt = Dt_B_E_1_Decode(
                                  ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 7, 16);
                              unsigned rt = (instr >> 12) & 0xf;
                              // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
                              vdup(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   Register(rt));
                              if (((instr & 0xffb00f5f) != 0xeea00b10)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000e00: {
                      // 0xee000e10
                      UnimplementedT32_32("MCR", instr);
                      break;
                    }
                    case 0x00100a00: {
                      // 0xee100a10
                      switch (instr & 0x00000100) {
                        case 0x00000000: {
                          // 0xee100a10
                          switch (instr & 0x00e00000) {
                            case 0x00000000: {
                              // 0xee100a10
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned rn = ExtractSRegister(instr, 7, 16);
                              // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
                              vmov(CurrentCond(), Register(rt), SRegister(rn));
                              if (((instr & 0xfff00f7f) != 0xee100a10)) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x00e00000: {
                              // 0xeef00a10
                              unsigned rt = (instr >> 12) & 0xf;
                              unsigned spec_reg = (instr >> 16) & 0xf;
                              switch (spec_reg) {
                                case 0x0:
                                case 0x1:
                                case 0x5:
                                case 0x6:
                                case 0x7:
                                case 0x8: {
                                  // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
                                  vmrs(CurrentCond(),
                                       RegisterOrAPSR_nzcv(rt),
                                       SpecialFPRegister(spec_reg));
                                  if (((instr & 0xfff00fff) != 0xeef00a10)) {
                                    UnpredictableT32(instr);
                                  }
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000100: {
                          // 0xee100b10
                          unsigned lane;
                          DataType dt =
                              Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
                                                          ((instr >> 19) &
                                                           0xc) |
                                                          ((instr >> 19) &
                                                           0x10),
                                                      &lane);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rt = (instr >> 12) & 0xf;
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
                          vmov(CurrentCond(),
                               dt,
                               Register(rt),
                               DRegisterLane(rn, lane));
                          if (((instr & 0xff100f1f) != 0xee100b10)) {
                            UnpredictableT32(instr);
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00100e00: {
                      // 0xee100e10
                      UnimplementedT32_32("MRC", instr);
                      break;
                    }
                    default:
                      UnallocatedT32(instr);
                      break;
                  }
                  break;
                }
                case 0x01000000: {
                  // 0xef000000
                  switch (instr & 0x00800000) {
                    case 0x00000000: {
                      // 0xef000000
                      switch (instr & 0x00000f40) {
                        case 0x00000000: {
                          // 0xef000000
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vhadd(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000040: {
                          // 0xef000040
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vhadd(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rn),
                                QRegister(rm));
                          break;
                        }
                        case 0x00000100: {
                          // 0xef000100
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vrhadd(CurrentCond(),
                                 dt,
                                 DRegister(rd),
                                 DRegister(rn),
                                 DRegister(rm));
                          break;
                        }
                        case 0x00000140: {
                          // 0xef000140
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vrhadd(CurrentCond(),
                                 dt,
                                 QRegister(rd),
                                 QRegister(rn),
                                 QRegister(rm));
                          break;
                        }
                        case 0x00000200: {
                          // 0xef000200
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vhsub(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000240: {
                          // 0xef000240
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vhsub(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rn),
                                QRegister(rm));
                          break;
                        }
                        case 0x00000300: {
                          // 0xef000300
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vcgt(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000340: {
                          // 0xef000340
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vcgt(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000400: {
                          // 0xef000400
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
                          vshl(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rm),
                               DRegister(rn));
                          break;
                        }
                        case 0x00000440: {
                          // 0xef000440
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
                          vshl(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rm),
                               QRegister(rn));
                          break;
                        }
                        case 0x00000500: {
                          // 0xef000500
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
                          vrshl(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rm),
                                DRegister(rn));
                          break;
                        }
                        case 0x00000540: {
                          // 0xef000540
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
                          vrshl(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rm),
                                QRegister(rn));
                          break;
                        }
                        case 0x00000600: {
                          // 0xef000600
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vmax(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000640: {
                          // 0xef000640
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vmax(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000700: {
                          // 0xef000700
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vabd(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000740: {
                          // 0xef000740
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vabd(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000800: {
                          // 0xef000800
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000800
                              DataType dt =
                                  Dt_size_2_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vadd(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000800
                              DataType dt =
                                  Dt_size_2_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vsub(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000840: {
                          // 0xef000840
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000840
                              DataType dt =
                                  Dt_size_2_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vadd(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000840
                              DataType dt =
                                  Dt_size_2_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vsub(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000900: {
                          // 0xef000900
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000900
                              DataType dt =
                                  Dt_size_10_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                              vmla(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000900
                              DataType dt =
                                  Dt_size_10_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                              vmls(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000940: {
                          // 0xef000940
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000940
                              DataType dt =
                                  Dt_size_10_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                              vmla(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000940
                              DataType dt =
                                  Dt_size_10_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                              vmls(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000a00: {
                          // 0xef000a00
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vpmax(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000b00: {
                          // 0xef000b00
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000b00
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vqdmulh(CurrentCond(),
                                      dt,
                                      DRegister(rd),
                                      DRegister(rn),
                                      DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000b00
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vqrdmulh(CurrentCond(),
                                       dt,
                                       DRegister(rd),
                                       DRegister(rn),
                                       DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000b40: {
                          // 0xef000b40
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000b40
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vqdmulh(CurrentCond(),
                                      dt,
                                      QRegister(rd),
                                      QRegister(rn),
                                      QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000b40
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vqrdmulh(CurrentCond(),
                                       dt,
                                       QRegister(rd),
                                       QRegister(rn),
                                       QRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000c40: {
                          // 0xef000c40
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000c40
                              UnimplementedT32_32("SHA1C", instr);
                              break;
                            }
                            case 0x00100000: {
                              // 0xef100c40
                              UnimplementedT32_32("SHA1P", instr);
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200c40
                              UnimplementedT32_32("SHA1M", instr);
                              break;
                            }
                            case 0x00300000: {
                              // 0xef300c40
                              UnimplementedT32_32("SHA1SU0", instr);
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000c40
                              UnimplementedT32_32("SHA256H", instr);
                              break;
                            }
                            case 0x10100000: {
                              // 0xff100c40
                              UnimplementedT32_32("SHA256H2", instr);
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200c40
                              UnimplementedT32_32("SHA256SU1", instr);
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000d00: {
                          // 0xef000d00
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000d00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vadd(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200d00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vsub(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000d00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vpadd(CurrentCond(),
                                    F32,
                                    DRegister(rd),
                                    DRegister(rn),
                                    DRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200d00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vabd(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000d40: {
                          // 0xef000d40
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000d40
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vadd(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200d40
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vsub(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200d40
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vabd(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000e00: {
                          // 0xef000e00
                          switch (instr & 0x10200000) {
                            case 0x00000000: {
                              // 0xef000e00
                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
                              vceq(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000e00
                              if ((instr & 0x00100000) == 0x00000000) {
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rn = ExtractDRegister(instr, 7, 16);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
                                vcge(CurrentCond(),
                                     F32,
                                     DRegister(rd),
                                     DRegister(rn),
                                     DRegister(rm));
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200e00
                              if ((instr & 0x00100000) == 0x00000000) {
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rn = ExtractDRegister(instr, 7, 16);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
                                vcgt(CurrentCond(),
                                     F32,
                                     DRegister(rd),
                                     DRegister(rn),
                                     DRegister(rm));
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000e40: {
                          // 0xef000e40
                          switch (instr & 0x10200000) {
                            case 0x00000000: {
                              // 0xef000e40
                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
                              vceq(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000e40
                              if ((instr & 0x00100000) == 0x00000000) {
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if (((instr >> 16) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rn = ExtractQRegister(instr, 7, 16);
                                if ((instr & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
                                vcge(CurrentCond(),
                                     F32,
                                     QRegister(rd),
                                     QRegister(rn),
                                     QRegister(rm));
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200e40
                              if ((instr & 0x00100000) == 0x00000000) {
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if (((instr >> 16) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rn = ExtractQRegister(instr, 7, 16);
                                if ((instr & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
                                vcgt(CurrentCond(),
                                     F32,
                                     QRegister(rd),
                                     QRegister(rn),
                                     QRegister(rm));
                              } else {
                                UnallocatedT32(instr);
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000f00: {
                          // 0xef000f00
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000f00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vmax(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200f00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vmin(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000f00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vpmax(CurrentCond(),
                                    F32,
                                    DRegister(rd),
                                    DRegister(rn),
                                    DRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200f00
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vpmin(CurrentCond(),
                                    F32,
                                    DRegister(rd),
                                    DRegister(rn),
                                    DRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000f40: {
                          // 0xef000f40
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000f40
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vmax(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200f40
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vmin(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xef800000
                      switch (instr & 0x00300000) {
                        case 0x00300000: {
                          // 0xefb00000
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xefb00000
                              switch (instr & 0x00000040) {
                                case 0x00000000: {
                                  // 0xefb00000
                                  if (((instr & 0x800) == 0x800)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm = (instr >> 8) & 0xf;
                                  // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vext(CurrentCond(),
                                       Untyped8,
                                       DRegister(rd),
                                       DRegister(rn),
                                       DRegister(rm),
                                       imm);
                                  break;
                                }
                                case 0x00000040: {
                                  // 0xefb00040
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if (((instr >> 16) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = ExtractQRegister(instr, 7, 16);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm = (instr >> 8) & 0xf;
                                  // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vext(CurrentCond(),
                                       Untyped8,
                                       QRegister(rd),
                                       QRegister(rn),
                                       QRegister(rm),
                                       imm);
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x10000000: {
                              // 0xffb00000
                              switch (instr & 0x00000800) {
                                case 0x00000000: {
                                  // 0xffb00000
                                  switch (instr & 0x00030200) {
                                    case 0x00000000: {
                                      // 0xffb00000
                                      switch (instr & 0x000005c0) {
                                        case 0x00000000: {
                                          // 0xffb00000
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vrev64(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb00040
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vrev64(CurrentCond(),
                                                 dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000080: {
                                          // 0xffb00080
                                          DataType dt = Dt_size_15_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vrev32(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x000000c0: {
                                          // 0xffb000c0
                                          DataType dt = Dt_size_15_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vrev32(CurrentCond(),
                                                 dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb00100
                                          DataType dt = Dt_size_1_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vrev16(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000140: {
                                          // 0xffb00140
                                          DataType dt = Dt_size_1_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vrev16(CurrentCond(),
                                                 dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000400: {
                                          // 0xffb00400
                                          DataType dt = Dt_size_5_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vcls(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x00000440: {
                                          // 0xffb00440
                                          DataType dt = Dt_size_5_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vcls(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000480: {
                                          // 0xffb00480
                                          DataType dt = Dt_size_4_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vclz(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x000004c0: {
                                          // 0xffb004c0
                                          DataType dt = Dt_size_4_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vclz(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000500: {
                                          // 0xffb00500
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            unsigned rm =
                                                ExtractDRegister(instr, 5, 0);
                                            // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
                                            vcnt(CurrentCond(),
                                                 Untyped8,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000540: {
                                          // 0xffb00540
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            if ((instr & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rm =
                                                ExtractQRegister(instr, 5, 0);
                                            // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
                                            vcnt(CurrentCond(),
                                                 Untyped8,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000580: {
                                          // 0xffb00580
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            unsigned rm =
                                                ExtractDRegister(instr, 5, 0);
                                            // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                            vmvn(CurrentCond(),
                                                 kDataTypeValueNone,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x000005c0: {
                                          // 0xffb005c0
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            if ((instr & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rm =
                                                ExtractQRegister(instr, 5, 0);
                                            // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                            vmvn(CurrentCond(),
                                                 kDataTypeValueNone,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        default:
                                          UnallocatedT32(instr);
                                          break;
                                      }
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xffb00200
                                      switch (instr & 0x00000540) {
                                        case 0x00000000: {
                                          // 0xffb00200
                                          DataType dt = Dt_op_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 5) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vpaddl(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb00240
                                          DataType dt = Dt_op_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 5) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vpaddl(CurrentCond(),
                                                 dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb00300
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb00300
                                              UnimplementedT32_32("AESE",
                                                                  instr);
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb00380
                                              UnimplementedT32_32("AESMC",
                                                                  instr);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000140: {
                                          // 0xffb00340
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb00340
                                              UnimplementedT32_32("AESD",
                                                                  instr);
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb003c0
                                              UnimplementedT32_32("AESIMC",
                                                                  instr);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000400: {
                                          // 0xffb00600
                                          DataType dt = Dt_op_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 5) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vpadal(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000440: {
                                          // 0xffb00640
                                          DataType dt = Dt_op_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 5) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vpadal(CurrentCond(),
                                                 dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000500: {
                                          // 0xffb00700
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb00700
                                              DataType dt = Dt_size_5_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vqabs(CurrentCond(),
                                                    dt,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb00780
                                              DataType dt = Dt_size_5_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vqneg(CurrentCond(),
                                                    dt,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000540: {
                                          // 0xffb00740
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb00740
                                              DataType dt = Dt_size_5_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vqabs(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb007c0
                                              DataType dt = Dt_size_5_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vqneg(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00010000: {
                                      // 0xffb10000
                                      switch (instr & 0x000001c0) {
                                        case 0x00000000: {
                                          // 0xffb10000
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcgt(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb10040
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcgt(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000080: {
                                          // 0xffb10080
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcge(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x000000c0: {
                                          // 0xffb100c0
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcge(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb10100
                                          DataType dt = Dt_F_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vceq(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000140: {
                                          // 0xffb10140
                                          DataType dt = Dt_F_size_2_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vceq(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000180: {
                                          // 0xffb10180
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcle(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x000001c0: {
                                          // 0xffb101c0
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vcle(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00010200: {
                                      // 0xffb10200
                                      switch (instr & 0x000001c0) {
                                        case 0x00000000: {
                                          // 0xffb10200
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vclt(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb10240
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
                                          vclt(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm),
                                               UINT32_C(0));
                                          break;
                                        }
                                        case 0x000000c0: {
                                          // 0xffb102c0
                                          if ((instr & 0x000c0400) ==
                                              0x00080000) {
                                            UnimplementedT32_32("SHA1H", instr);
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb10300
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vabs(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x00000140: {
                                          // 0xffb10340
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vabs(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000180: {
                                          // 0xffb10380
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vneg(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x000001c0: {
                                          // 0xffb103c0
                                          DataType dt = Dt_F_size_1_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 8) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vneg(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        default:
                                          UnallocatedT32(instr);
                                          break;
                                      }
                                      break;
                                    }
                                    case 0x00020000: {
                                      // 0xffb20000
                                      switch (instr & 0x000005c0) {
                                        case 0x00000000: {
                                          // 0xffb20000
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            unsigned rm =
                                                ExtractDRegister(instr, 5, 0);
                                            // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                            vswp(CurrentCond(),
                                                 kDataTypeValueNone,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb20040
                                          if ((instr & 0x000c0000) ==
                                              0x00000000) {
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            if ((instr & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rm =
                                                ExtractQRegister(instr, 5, 0);
                                            // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                            vswp(CurrentCond(),
                                                 kDataTypeValueNone,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000080: {
                                          // 0xffb20080
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vtrn(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x000000c0: {
                                          // 0xffb200c0
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vtrn(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb20100
                                          DataType dt = Dt_size_15_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vuzp(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x00000140: {
                                          // 0xffb20140
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vuzp(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000180: {
                                          // 0xffb20180
                                          DataType dt = Dt_size_15_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vzip(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x000001c0: {
                                          // 0xffb201c0
                                          DataType dt = Dt_size_7_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vzip(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        case 0x00000400: {
                                          // 0xffb20400
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VRINTN{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vrintn(dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000440: {
                                          // 0xffb20440
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VRINTN{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vrintn(dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000480: {
                                          // 0xffb20480
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VRINTX{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vrintx(Condition::None(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x000004c0: {
                                          // 0xffb204c0
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VRINTX{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vrintx(dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000500: {
                                          // 0xffb20500
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VRINTA{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vrinta(dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x00000540: {
                                          // 0xffb20540
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VRINTA{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vrinta(dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000580: {
                                          // 0xffb20580
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; T1
                                          vrintz(Condition::None(),
                                                 dt,
                                                 DRegister(rd),
                                                 DRegister(rm));
                                          break;
                                        }
                                        case 0x000005c0: {
                                          // 0xffb205c0
                                          DataType dt = Dt_size_16_Decode(
                                              (instr >> 18) & 0x3);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; T1
                                          vrintz(dt,
                                                 QRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00020200: {
                                      // 0xffb20200
                                      switch (instr & 0x00000580) {
                                        case 0x00000000: {
                                          // 0xffb20200
                                          switch (instr & 0x00000040) {
                                            case 0x00000000: {
                                              // 0xffb20200
                                              DataType dt = Dt_size_3_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vmovn(CurrentCond(),
                                                    dt,
                                                    DRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                            case 0x00000040: {
                                              // 0xffb20240
                                              DataType dt = Dt_size_14_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vqmovun(CurrentCond(),
                                                      dt,
                                                      DRegister(rd),
                                                      QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000080: {
                                          // 0xffb20280
                                          DataType dt = Dt_op_size_3_Decode(
                                              ((instr >> 18) & 0x3) |
                                              ((instr >> 4) & 0x4));
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vqmovn(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 QRegister(rm));
                                          break;
                                        }
                                        case 0x00000100: {
                                          // 0xffb20300
                                          if ((instr & 0x00000040) ==
                                              0x00000000) {
                                            DataType dt = Dt_size_17_Decode(
                                                (instr >> 18) & 0x3);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            unsigned rm =
                                                ExtractDRegister(instr, 5, 0);
                                            uint32_t imm = dt.GetSize();
                                            // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
                                            vshll(CurrentCond(),
                                                  dt,
                                                  QRegister(rd),
                                                  DRegister(rm),
                                                  imm);
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000180: {
                                          // 0xffb20380
                                          switch (instr & 0x000c0040) {
                                            case 0x00080000: {
                                              // 0xffba0380
                                              UnimplementedT32_32("SHA1SU1",
                                                                  instr);
                                              break;
                                            }
                                            case 0x00080040: {
                                              // 0xffba03c0
                                              UnimplementedT32_32("SHA256SU0",
                                                                  instr);
                                              break;
                                            }
                                            default:
                                              UnallocatedT32(instr);
                                              break;
                                          }
                                          break;
                                        }
                                        case 0x00000400: {
                                          // 0xffb20600
                                          if ((instr & 0x000c0040) ==
                                              0x00040000) {
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            if ((instr & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rm =
                                                ExtractQRegister(instr, 5, 0);
                                            // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                            vcvt(CurrentCond(),
                                                 F16,
                                                 F32,
                                                 DRegister(rd),
                                                 QRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000480: {
                                          // 0xffb20680
                                          switch (instr & 0x00000040) {
                                            case 0x00000000: {
                                              // 0xffb20680
                                              DataType dt = Dt_size_16_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VRINTM{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vrintm(dt,
                                                     DRegister(rd),
                                                     DRegister(rm));
                                              break;
                                            }
                                            case 0x00000040: {
                                              // 0xffb206c0
                                              DataType dt = Dt_size_16_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VRINTM{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vrintm(dt,
                                                     QRegister(rd),
                                                     QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000500: {
                                          // 0xffb20700
                                          if ((instr & 0x000c0040) ==
                                              0x00040000) {
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedT32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            unsigned rm =
                                                ExtractDRegister(instr, 5, 0);
                                            // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                            vcvt(CurrentCond(),
                                                 F32,
                                                 F16,
                                                 QRegister(rd),
                                                 DRegister(rm));
                                          } else {
                                            UnallocatedT32(instr);
                                          }
                                          break;
                                        }
                                        case 0x00000580: {
                                          // 0xffb20780
                                          switch (instr & 0x00000040) {
                                            case 0x00000000: {
                                              // 0xffb20780
                                              DataType dt = Dt_size_16_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VRINTP{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vrintp(dt,
                                                     DRegister(rd),
                                                     DRegister(rm));
                                              break;
                                            }
                                            case 0x00000040: {
                                              // 0xffb207c0
                                              DataType dt = Dt_size_16_Decode(
                                                  (instr >> 18) & 0x3);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VRINTP{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vrintp(dt,
                                                     QRegister(rd),
                                                     QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00030000: {
                                      // 0xffb30000
                                      switch (instr & 0x00000440) {
                                        case 0x00000000: {
                                          // 0xffb30000
                                          switch (instr & 0x000c0100) {
                                            case 0x00080000: {
                                              // 0xffbb0000
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vcvta(dt,
                                                    F32,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00080100: {
                                              // 0xffbb0100
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtn(dt,
                                                    F32,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            default:
                                              UnallocatedT32(instr);
                                              break;
                                          }
                                          break;
                                        }
                                        case 0x00000040: {
                                          // 0xffb30040
                                          switch (instr & 0x000c0100) {
                                            case 0x00080000: {
                                              // 0xffbb0040
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vcvta(dt,
                                                    F32,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                            case 0x00080100: {
                                              // 0xffbb0140
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtn(dt,
                                                    F32,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                            default:
                                              UnallocatedT32(instr);
                                              break;
                                          }
                                          break;
                                        }
                                        case 0x00000400: {
                                          // 0xffb30400
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb30400
                                              DataType dt = Dt_F_size_4_Decode(
                                                  ((instr >> 18) & 0x3) |
                                                  ((instr >> 6) & 0x4));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vrecpe(CurrentCond(),
                                                     dt,
                                                     DRegister(rd),
                                                     DRegister(rm));
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb30480
                                              DataType dt = Dt_F_size_4_Decode(
                                                  ((instr >> 18) & 0x3) |
                                                  ((instr >> 6) & 0x4));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vrsqrte(CurrentCond(),
                                                      dt,
                                                      DRegister(rd),
                                                      DRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00000440: {
                                          // 0xffb30440
                                          switch (instr & 0x00000080) {
                                            case 0x00000000: {
                                              // 0xffb30440
                                              DataType dt = Dt_F_size_4_Decode(
                                                  ((instr >> 18) & 0x3) |
                                                  ((instr >> 6) & 0x4));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vrecpe(CurrentCond(),
                                                     dt,
                                                     QRegister(rd),
                                                     QRegister(rm));
                                              break;
                                            }
                                            case 0x00000080: {
                                              // 0xffb304c0
                                              DataType dt = Dt_F_size_4_Decode(
                                                  ((instr >> 18) & 0x3) |
                                                  ((instr >> 6) & 0x4));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vrsqrte(CurrentCond(),
                                                      dt,
                                                      QRegister(rd),
                                                      QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00030200: {
                                      // 0xffb30200
                                      switch (instr & 0x000c0440) {
                                        case 0x00080000: {
                                          // 0xffbb0200
                                          switch (instr & 0x00000100) {
                                            case 0x00000000: {
                                              // 0xffbb0200
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtp(dt,
                                                    F32,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00000100: {
                                              // 0xffbb0300
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtm(dt,
                                                    F32,
                                                    DRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00080040: {
                                          // 0xffbb0240
                                          switch (instr & 0x00000100) {
                                            case 0x00000000: {
                                              // 0xffbb0240
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtp(dt,
                                                    F32,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                            case 0x00000100: {
                                              // 0xffbb0340
                                              DataType dt = Dt_op_3_Decode(
                                                  (instr >> 7) & 0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              if ((instr & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rm =
                                                  ExtractQRegister(instr, 5, 0);
                                              // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                              vcvtm(dt,
                                                    F32,
                                                    QRegister(rd),
                                                    QRegister(rm));
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                        case 0x00080400: {
                                          // 0xffbb0600
                                          DataType dt1 = Dt_op_1_Decode1(
                                              (instr >> 7) & 0x3);
                                          if (dt1.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt2 = Dt_op_1_Decode2(
                                              (instr >> 7) & 0x3);
                                          if (dt2.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                          vcvt(CurrentCond(),
                                               dt1,
                                               dt2,
                                               DRegister(rd),
                                               DRegister(rm));
                                          break;
                                        }
                                        case 0x00080440: {
                                          // 0xffbb0640
                                          DataType dt1 = Dt_op_1_Decode1(
                                              (instr >> 7) & 0x3);
                                          if (dt1.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt2 = Dt_op_1_Decode2(
                                              (instr >> 7) & 0x3);
                                          if (dt2.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                          vcvt(CurrentCond(),
                                               dt1,
                                               dt2,
                                               QRegister(rd),
                                               QRegister(rm));
                                          break;
                                        }
                                        default:
                                          UnallocatedT32(instr);
                                          break;
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000800: {
                                  // 0xffb00800
                                  switch (instr & 0x00000440) {
                                    case 0x00000000: {
                                      // 0xffb00800
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned first =
                                          ExtractDRegister(instr, 7, 16);
                                      unsigned length;
                                      SpacingType spacing = kSingle;
                                      switch ((instr >> 8) & 0x3) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 1;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          break;
                                        case 0x2:
                                          length = 3;
                                          break;
                                        case 0x3:
                                          length = 4;
                                          break;
                                      }
                                      unsigned last = first + length - 1;
                                      TransferType transfer = kMultipleLanes;
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                      vtbl(CurrentCond(),
                                           Untyped8,
                                           DRegister(rd),
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           DRegister(rm));
                                      break;
                                    }
                                    case 0x00000040: {
                                      // 0xffb00840
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned first =
                                          ExtractDRegister(instr, 7, 16);
                                      unsigned length;
                                      SpacingType spacing = kSingle;
                                      switch ((instr >> 8) & 0x3) {
                                        default:
                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                        case 0x0:
                                          length = 1;
                                          break;
                                        case 0x1:
                                          length = 2;
                                          break;
                                        case 0x2:
                                          length = 3;
                                          break;
                                        case 0x3:
                                          length = 4;
                                          break;
                                      }
                                      unsigned last = first + length - 1;
                                      TransferType transfer = kMultipleLanes;
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                      vtbx(CurrentCond(),
                                           Untyped8,
                                           DRegister(rd),
                                           NeonRegisterList(DRegister(first),
                                                            DRegister(last),
                                                            spacing,
                                                            transfer),
                                           DRegister(rm));
                                      break;
                                    }
                                    case 0x00000400: {
                                      // 0xffb00c00
                                      if ((instr & 0x00000380) == 0x00000000) {
                                        unsigned lane;
                                        DataType dt =
                                            Dt_imm4_1_Decode((instr >> 16) &
                                                                 0xf,
                                                             &lane);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractDRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                        vdup(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             DRegisterLane(rm, lane));
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                    case 0x00000440: {
                                      // 0xffb00c40
                                      if ((instr & 0x00000380) == 0x00000000) {
                                        unsigned lane;
                                        DataType dt =
                                            Dt_imm4_1_Decode((instr >> 16) &
                                                                 0xf,
                                                             &lane);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                        vdup(CurrentCond(),
                                             dt,
                                             QRegister(rd),
                                             DRegisterLane(rm, lane));
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        default: {
                          switch (instr & 0x00000c40) {
                            case 0x00000000: {
                              // 0xef800000
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800000
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
                                  vaddl(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800100
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if (((instr >> 16) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = ExtractQRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                  vaddw(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        QRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800200
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
                                  vsubl(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800300
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if (((instr >> 16) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = ExtractQRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                  vsubw(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        QRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000040: {
                              // 0xef800040
                              switch (instr & 0x00000200) {
                                case 0x00000000: {
                                  // 0xef800040
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800040
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmla(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rn),
                                           DRegisterLane(rm, lane));
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800040
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmla(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rn),
                                           DRegisterLane(rm, lane));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800240
                                  switch (instr & 0x00000100) {
                                    case 0x00000000: {
                                      // 0xef800240
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_11_Decode((instr >> 20) & 0x3,
                                                            (instr >> 28) &
                                                                0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmlal(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegisterLane(rm, lane));
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800340
                                      if ((instr & 0x10000000) == 0x00000000) {
                                        if (((instr & 0x300000) == 0x300000)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_size_13_Decode(
                                            (instr >> 20) & 0x3);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rn =
                                            ExtractDRegister(instr, 7, 16);
                                        uint32_t mvm = (instr & 0xf) |
                                                       ((instr >> 1) & 0x10);
                                        uint32_t shift = 4;
                                        if (dt.Is(S16)) {
                                          shift = 3;
                                        }
                                        uint32_t vm = mvm & ((1 << shift) - 1);
                                        uint32_t index = mvm >> shift;
                                        // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
                                        vqdmlal(CurrentCond(),
                                                dt,
                                                QRegister(rd),
                                                DRegister(rn),
                                                DRegister(vm),
                                                index);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000400: {
                              // 0xef800400
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800400
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800400
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_3_Decode((instr >> 20) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                      vaddhn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rn),
                                             QRegister(rm));
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800400
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_3_Decode((instr >> 20) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                      vraddhn(CurrentCond(),
                                              dt,
                                              DRegister(rd),
                                              QRegister(rn),
                                              QRegister(rm));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800500
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
                                  vabal(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800600
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800600
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_3_Decode((instr >> 20) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                      vsubhn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rn),
                                             QRegister(rm));
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800600
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_3_Decode((instr >> 20) & 0x3);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
                                      vrsubhn(CurrentCond(),
                                              dt,
                                              DRegister(rd),
                                              QRegister(rn),
                                              QRegister(rm));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800700
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 26) & 0x4));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
                                  vabdl(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000440: {
                              // 0xef800440
                              switch (instr & 0x00000200) {
                                case 0x00000000: {
                                  // 0xef800440
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800440
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmls(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rn),
                                           DRegisterLane(rm, lane));
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800440
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmls(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rn),
                                           DRegisterLane(rm, lane));
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800640
                                  switch (instr & 0x00000100) {
                                    case 0x00000000: {
                                      // 0xef800640
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_size_11_Decode((instr >> 20) & 0x3,
                                                            (instr >> 28) &
                                                                0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      int lane;
                                      unsigned rm =
                                          ExtractDRegisterAndLane(instr,
                                                                  dt,
                                                                  5,
                                                                  0,
                                                                  &lane);
                                      // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
                                      vmlsl(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegisterLane(rm, lane));
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800740
                                      if ((instr & 0x10000000) == 0x00000000) {
                                        if (((instr & 0x300000) == 0x300000)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_size_13_Decode(
                                            (instr >> 20) & 0x3);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rn =
                                            ExtractDRegister(instr, 7, 16);
                                        uint32_t mvm = (instr & 0xf) |
                                                       ((instr >> 1) & 0x10);
                                        uint32_t shift = 4;
                                        if (dt.Is(S16)) {
                                          shift = 3;
                                        }
                                        uint32_t vm = mvm & ((1 << shift) - 1);
                                        uint32_t index = mvm >> shift;
                                        // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
                                        vqdmlsl(CurrentCond(),
                                                dt,
                                                QRegister(rd),
                                                DRegister(rn),
                                                DRegister(vm),
                                                index);
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000800: {
                              // 0xef800800
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800800
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_12_Decode((instr >> 20) & 0x3,
                                                        (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                  vmlal(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800900
                                  if ((instr & 0x10000000) == 0x00000000) {
                                    if (((instr & 0x300000) == 0x300000)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_size_13_Decode((instr >> 20) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    unsigned rn =
                                        ExtractDRegister(instr, 7, 16);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                    vqdmlal(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegister(rm));
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800a00
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_12_Decode((instr >> 20) & 0x3,
                                                        (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                  vmlsl(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800b00
                                  if ((instr & 0x10000000) == 0x00000000) {
                                    if (((instr & 0x300000) == 0x300000)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_size_13_Decode((instr >> 20) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    unsigned rn =
                                        ExtractDRegister(instr, 7, 16);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                    vqdmlsl(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegister(rm));
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000840: {
                              // 0xef800840
                              switch (instr & 0x00000200) {
                                case 0x00000000: {
                                  // 0xef800840
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800840
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_F_size_3_Decode(
                                          ((instr >> 20) & 0x3) |
                                          ((instr >> 6) & 0x4));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      uint32_t mvm =
                                          (instr & 0xf) | ((instr >> 1) & 0x10);
                                      uint32_t shift = 4;
                                      if (dt.Is(I16)) {
                                        shift = 3;
                                      }
                                      uint32_t vm = mvm & ((1 << shift) - 1);
                                      uint32_t index = mvm >> shift;
                                      // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
                                      vmul(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rn),
                                           DRegister(vm),
                                           index);
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800840
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_F_size_3_Decode(
                                          ((instr >> 20) & 0x3) |
                                          ((instr >> 6) & 0x4));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      if (((instr >> 16) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rn =
                                          ExtractQRegister(instr, 7, 16);
                                      uint32_t mvm =
                                          (instr & 0xf) | ((instr >> 1) & 0x10);
                                      uint32_t shift = 4;
                                      if (dt.Is(I16)) {
                                        shift = 3;
                                      }
                                      uint32_t vm = mvm & ((1 << shift) - 1);
                                      uint32_t index = mvm >> shift;
                                      // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
                                      vmul(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rn),
                                           DRegister(vm),
                                           index);
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800a40
                                  switch (instr & 0x00000100) {
                                    case 0x00000000: {
                                      // 0xef800a40
                                      if (((instr & 0x300000) == 0x300000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_U_size_2_Decode(
                                          ((instr >> 20) & 0x3) |
                                          ((instr >> 26) & 0x4));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rn =
                                          ExtractDRegister(instr, 7, 16);
                                      uint32_t mvm =
                                          (instr & 0xf) | ((instr >> 1) & 0x10);
                                      uint32_t shift = 4;
                                      if (dt.Is(S16) || dt.Is(U16)) {
                                        shift = 3;
                                      }
                                      uint32_t vm = mvm & ((1 << shift) - 1);
                                      uint32_t index = mvm >> shift;
                                      // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
                                      vmull(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegister(vm),
                                            index);
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800b40
                                      if ((instr & 0x10000000) == 0x00000000) {
                                        if (((instr & 0x300000) == 0x300000)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_size_13_Decode(
                                            (instr >> 20) & 0x3);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedT32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rn =
                                            ExtractDRegister(instr, 7, 16);
                                        int lane;
                                        unsigned rm =
                                            ExtractDRegisterAndLane(instr,
                                                                    dt,
                                                                    5,
                                                                    0,
                                                                    &lane);
                                        // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
                                        vqdmull(CurrentCond(),
                                                dt,
                                                QRegister(rd),
                                                DRegister(rn),
                                                DRegisterLane(rm, lane));
                                      } else {
                                        UnallocatedT32(instr);
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000c00: {
                              // 0xef800c00
                              switch (instr & 0x00000100) {
                                case 0x00000000: {
                                  // 0xef800c00
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt = Dt_op_U_size_1_Decode(
                                      ((instr >> 20) & 0x3) |
                                      ((instr >> 26) & 0x4) |
                                      ((instr >> 6) & 0x8));
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
                                  vmull(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        DRegister(rn),
                                        DRegister(rm));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800d00
                                  if ((instr & 0x10000200) == 0x00000000) {
                                    if (((instr & 0x300000) == 0x300000)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_size_13_Decode((instr >> 20) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    unsigned rn =
                                        ExtractDRegister(instr, 7, 16);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                    vqdmull(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rn),
                                            DRegister(rm));
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            case 0x00000c40: {
                              // 0xef800c40
                              switch (instr & 0x10000300) {
                                case 0x00000000: {
                                  // 0xef800c40
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_13_Decode((instr >> 20) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  int lane;
                                  unsigned rm = ExtractDRegisterAndLane(instr,
                                                                        dt,
                                                                        5,
                                                                        0,
                                                                        &lane);
                                  // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
                                  vqdmulh(CurrentCond(),
                                          dt,
                                          DRegister(rd),
                                          DRegister(rn),
                                          DRegisterLane(rm, lane));
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800d40
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_13_Decode((instr >> 20) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rn = ExtractDRegister(instr, 7, 16);
                                  int lane;
                                  unsigned rm = ExtractDRegisterAndLane(instr,
                                                                        dt,
                                                                        5,
                                                                        0,
                                                                        &lane);
                                  // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
                                  vqrdmulh(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rn),
                                           DRegisterLane(rm, lane));
                                  break;
                                }
                                case 0x10000000: {
                                  // 0xff800c40
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_13_Decode((instr >> 20) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if (((instr >> 16) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = ExtractQRegister(instr, 7, 16);
                                  int lane;
                                  unsigned rm = ExtractDRegisterAndLane(instr,
                                                                        dt,
                                                                        5,
                                                                        0,
                                                                        &lane);
                                  // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
                                  vqdmulh(CurrentCond(),
                                          dt,
                                          QRegister(rd),
                                          QRegister(rn),
                                          DRegisterLane(rm, lane));
                                  break;
                                }
                                case 0x10000100: {
                                  // 0xff800d40
                                  if (((instr & 0x300000) == 0x300000)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_size_13_Decode((instr >> 20) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if (((instr >> 16) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rn = ExtractQRegister(instr, 7, 16);
                                  int lane;
                                  unsigned rm = ExtractDRegisterAndLane(instr,
                                                                        dt,
                                                                        5,
                                                                        0,
                                                                        &lane);
                                  // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
                                  vqrdmulh(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rn),
                                           DRegisterLane(rm, lane));
                                  break;
                                }
                                default:
                                  UnallocatedT32(instr);
                                  break;
                              }
                              break;
                            }
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
                case 0x01000010: {
                  // 0xef000010
                  switch (instr & 0x00800040) {
                    case 0x00000000: {
                      // 0xef000010
                      switch (instr & 0x00000f00) {
                        case 0x00000000: {
                          // 0xef000010
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vqadd(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000100: {
                          // 0xef000110
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vand(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00100000: {
                              // 0xef100110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vbic(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200110
                              if (((instr & 0x00000040) == 0x00000000) &&
                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
                                     << 4) |
                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
                                   (((Uint32((instr >> 5)) & Uint32(0x1))
                                     << 4) |
                                    (Uint32(instr) & Uint32(0xf))))) {
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 7, 16);
                                // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
                                vmov(CurrentCond(),
                                     kDataTypeValueNone,
                                     DRegister(rd),
                                     DRegister(rm));
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vorr(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00300000: {
                              // 0xef300110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vorn(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              veor(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10100000: {
                              // 0xff100110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vbsl(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vbit(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10300000: {
                              // 0xff300110
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
                              vbif(CurrentCond(),
                                   kDataTypeValueNone,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000200: {
                          // 0xef000210
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vqsub(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000300: {
                          // 0xef000310
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vcge(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000400: {
                          // 0xef000410
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
                          vqshl(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rm),
                                DRegister(rn));
                          break;
                        }
                        case 0x00000500: {
                          // 0xef000510
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
                          vqrshl(CurrentCond(),
                                 dt,
                                 DRegister(rd),
                                 DRegister(rm),
                                 DRegister(rn));
                          break;
                        }
                        case 0x00000600: {
                          // 0xef000610
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vmin(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000700: {
                          // 0xef000710
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
                          vaba(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000800: {
                          // 0xef000810
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000810
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vtst(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000810
                              DataType dt =
                                  Dt_size_4_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                              vceq(CurrentCond(),
                                   dt,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000900: {
                          // 0xef000910
                          DataType dt = Dt_op_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vmul(CurrentCond(),
                               dt,
                               DRegister(rd),
                               DRegister(rn),
                               DRegister(rm));
                          break;
                        }
                        case 0x00000a00: {
                          // 0xef000a10
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                          vpmin(CurrentCond(),
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegister(rm));
                          break;
                        }
                        case 0x00000b00: {
                          // 0xef000b10
                          if ((instr & 0x10000000) == 0x00000000) {
                            DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedT32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
                            vpadd(CurrentCond(),
                                  dt,
                                  DRegister(rd),
                                  DRegister(rn),
                                  DRegister(rm));
                          } else {
                            UnallocatedT32(instr);
                          }
                          break;
                        }
                        case 0x00000c00: {
                          // 0xef000c10
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000c10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vfma(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200c10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vfms(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000d00: {
                          // 0xef000d10
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000d10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vmla(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200d10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vmls(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000d10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vmul(CurrentCond(),
                                   F32,
                                   DRegister(rd),
                                   DRegister(rn),
                                   DRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000e00: {
                          // 0xef000e10
                          switch (instr & 0x10300000) {
                            case 0x10000000: {
                              // 0xff000e10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vacge(CurrentCond(),
                                    F32,
                                    DRegister(rd),
                                    DRegister(rn),
                                    DRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200e10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vacgt(CurrentCond(),
                                    F32,
                                    DRegister(rd),
                                    DRegister(rn),
                                    DRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000f00: {
                          // 0xef000f10
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000f10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vrecps(CurrentCond(),
                                     F32,
                                     DRegister(rd),
                                     DRegister(rn),
                                     DRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200f10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
                              vrsqrts(CurrentCond(),
                                      F32,
                                      DRegister(rd),
                                      DRegister(rn),
                                      DRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000f10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vmaxnm(F32,
                                     DRegister(rd),
                                     DRegister(rn),
                                     DRegister(rm));
                              if (InITBlock()) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200f10
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
                              vminnm(F32,
                                     DRegister(rd),
                                     DRegister(rn),
                                     DRegister(rm));
                              if (InITBlock()) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00000040: {
                      // 0xef000050
                      switch (instr & 0x00000f00) {
                        case 0x00000000: {
                          // 0xef000050
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vqadd(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rn),
                                QRegister(rm));
                          break;
                        }
                        case 0x00000100: {
                          // 0xef000150
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vand(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00100000: {
                              // 0xef100150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vbic(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200150
                              if (((instr & 0x00000040) == 0x00000040) &&
                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
                                     << 4) |
                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
                                   (((Uint32((instr >> 5)) & Uint32(0x1))
                                     << 4) |
                                    (Uint32(instr) & Uint32(0xf))))) {
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if (((instr >> 16) & 1) != 0) {
                                  UnallocatedT32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 7, 16);
                                // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
                                vmov(CurrentCond(),
                                     kDataTypeValueNone,
                                     QRegister(rd),
                                     QRegister(rm));
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vorr(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00300000: {
                              // 0xef300150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vorn(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              veor(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10100000: {
                              // 0xff100150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vbsl(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vbit(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10300000: {
                              // 0xff300150
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
                              vbif(CurrentCond(),
                                   kDataTypeValueNone,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000200: {
                          // 0xef000250
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vqsub(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rn),
                                QRegister(rm));
                          break;
                        }
                        case 0x00000300: {
                          // 0xef000350
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vcge(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000400: {
                          // 0xef000450
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
                          vqshl(CurrentCond(),
                                dt,
                                QRegister(rd),
                                QRegister(rm),
                                QRegister(rn));
                          break;
                        }
                        case 0x00000500: {
                          // 0xef000550
                          DataType dt = Dt_U_size_3_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
                          vqrshl(CurrentCond(),
                                 dt,
                                 QRegister(rd),
                                 QRegister(rm),
                                 QRegister(rn));
                          break;
                        }
                        case 0x00000600: {
                          // 0xef000650
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vmin(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000700: {
                          // 0xef000750
                          DataType dt = Dt_U_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
                          vaba(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000800: {
                          // 0xef000850
                          switch (instr & 0x10000000) {
                            case 0x00000000: {
                              // 0xef000850
                              DataType dt =
                                  Dt_size_7_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vtst(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000850
                              DataType dt =
                                  Dt_size_4_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedT32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                              vceq(CurrentCond(),
                                   dt,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000900: {
                          // 0xef000950
                          DataType dt = Dt_op_size_1_Decode(
                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedT32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          if (((instr >> 16) & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rn = ExtractQRegister(instr, 7, 16);
                          if ((instr & 1) != 0) {
                            UnallocatedT32(instr);
                            return;
                          }
                          unsigned rm = ExtractQRegister(instr, 5, 0);
                          // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
                          vmul(CurrentCond(),
                               dt,
                               QRegister(rd),
                               QRegister(rn),
                               QRegister(rm));
                          break;
                        }
                        case 0x00000c00: {
                          // 0xef000c50
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000c50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vfma(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200c50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vfms(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000d00: {
                          // 0xef000d50
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000d50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vmla(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200d50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vmls(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000d50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vmul(CurrentCond(),
                                   F32,
                                   QRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000e00: {
                          // 0xef000e50
                          switch (instr & 0x10300000) {
                            case 0x10000000: {
                              // 0xff000e50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vacge(CurrentCond(),
                                    F32,
                                    QRegister(rd),
                                    QRegister(rn),
                                    QRegister(rm));
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200e50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vacgt(CurrentCond(),
                                    F32,
                                    QRegister(rd),
                                    QRegister(rn),
                                    QRegister(rm));
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000f00: {
                          // 0xef000f50
                          switch (instr & 0x10300000) {
                            case 0x00000000: {
                              // 0xef000f50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vrecps(CurrentCond(),
                                     F32,
                                     QRegister(rd),
                                     QRegister(rn),
                                     QRegister(rm));
                              break;
                            }
                            case 0x00200000: {
                              // 0xef200f50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
                              vrsqrts(CurrentCond(),
                                      F32,
                                      QRegister(rd),
                                      QRegister(rn),
                                      QRegister(rm));
                              break;
                            }
                            case 0x10000000: {
                              // 0xff000f50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vmaxnm(F32,
                                     QRegister(rd),
                                     QRegister(rn),
                                     QRegister(rm));
                              if (InITBlock()) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            case 0x10200000: {
                              // 0xff200f50
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if (((instr >> 16) & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rn = ExtractQRegister(instr, 7, 16);
                              if ((instr & 1) != 0) {
                                UnallocatedT32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
                              vminnm(F32,
                                     QRegister(rd),
                                     QRegister(rn),
                                     QRegister(rm));
                              if (InITBlock()) {
                                UnpredictableT32(instr);
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        default:
                          UnallocatedT32(instr);
                          break;
                      }
                      break;
                    }
                    case 0x00800000: {
                      // 0xef800010
                      switch (instr & 0x00000c00) {
                        case 0x00000000: {
                          // 0xef800010
                          switch (instr & 0x00380080) {
                            case 0x00000000: {
                              // 0xef800010
                              switch (instr & 0x00000100) {
                                case 0x00000000: {
                                  // 0xef800010
                                  switch (instr & 0x00000200) {
                                    default: {
                                      switch (instr & 0x00000020) {
                                        case 0x00000020: {
                                          // 0xef800030
                                          if (((instr & 0xd00) == 0x100) ||
                                              ((instr & 0xd00) == 0x500) ||
                                              ((instr & 0xd00) == 0x900) ||
                                              ((instr & 0xe00) == 0xe00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVmvn::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmvn::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmvn(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800110
                                  switch (instr & 0x00000020) {
                                    case 0x00000000: {
                                      // 0xef800110
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVorr::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      DOperand imm =
                                          ImmediateVorr::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vorr(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rd),
                                           imm);
                                      break;
                                    }
                                    case 0x00000020: {
                                      // 0xef800130
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVbic::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      DOperand imm =
                                          ImmediateVbic::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vbic(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rd),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800010
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vshr(CurrentCond(),
                                       dt,
                                       DRegister(rd),
                                       DRegister(rm),
                                       imm);
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800110
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vsra(CurrentCond(),
                                       dt,
                                       DRegister(rd),
                                       DRegister(rm),
                                       imm);
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800210
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vrshr(CurrentCond(),
                                        dt,
                                        DRegister(rd),
                                        DRegister(rm),
                                        imm);
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800310
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vrsra(CurrentCond(),
                                        dt,
                                        DRegister(rd),
                                        DRegister(rm),
                                        imm);
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000400: {
                          // 0xef800410
                          switch (instr & 0x00380080) {
                            case 0x00000000: {
                              // 0xef800410
                              switch (instr & 0x00000100) {
                                case 0x00000000: {
                                  // 0xef800410
                                  switch (instr & 0x00000200) {
                                    default: {
                                      switch (instr & 0x00000020) {
                                        case 0x00000020: {
                                          // 0xef800430
                                          if (((instr & 0xd00) == 0x100) ||
                                              ((instr & 0xd00) == 0x500) ||
                                              ((instr & 0xd00) == 0x900) ||
                                              ((instr & 0xe00) == 0xe00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVmvn::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmvn::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmvn(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800510
                                  switch (instr & 0x00000020) {
                                    case 0x00000000: {
                                      // 0xef800510
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVorr::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      DOperand imm =
                                          ImmediateVorr::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vorr(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rd),
                                           imm);
                                      break;
                                    }
                                    case 0x00000020: {
                                      // 0xef800530
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVbic::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      DOperand imm =
                                          ImmediateVbic::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vbic(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rd),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800410
                                  if ((instr & 0x10000000) == 0x10000000) {
                                    if (((instr & 0x380080) == 0x0)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt = Dt_L_imm6_4_Decode(
                                        ((instr >> 19) & 0x7) |
                                        ((instr >> 4) & 0x8));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm =
                                        (dt.IsSize(64) ? 64
                                                       : (dt.GetSize() * 2)) -
                                        imm6;
                                    // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                    vsri(CurrentCond(),
                                         dt,
                                         DRegister(rd),
                                         DRegister(rm),
                                         imm);
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800510
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800510
                                      if (((instr & 0x380080) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_L_imm6_3_Decode(
                                          ((instr >> 19) & 0x7) |
                                          ((instr >> 4) & 0x8));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm =
                                          imm6 -
                                          (dt.IsSize(64) ? 0 : dt.GetSize());
                                      // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshl(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rm),
                                           imm);
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800510
                                      if (((instr & 0x380080) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_L_imm6_4_Decode(
                                          ((instr >> 19) & 0x7) |
                                          ((instr >> 4) & 0x8));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm =
                                          imm6 -
                                          (dt.IsSize(64) ? 0 : dt.GetSize());
                                      // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vsli(CurrentCond(),
                                           dt,
                                           DRegister(rd),
                                           DRegister(rm),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800610
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                  // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vqshlu(CurrentCond(),
                                         dt,
                                         DRegister(rd),
                                         DRegister(rm),
                                         imm);
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800710
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                  // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vqshl(CurrentCond(),
                                        dt,
                                        DRegister(rd),
                                        DRegister(rm),
                                        imm);
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000800: {
                          // 0xef800810
                          switch (instr & 0x00000080) {
                            case 0x00000000: {
                              // 0xef800810
                              switch (instr & 0x00380000) {
                                case 0x00000000: {
                                  // 0xef800810
                                  switch (instr & 0x00000100) {
                                    case 0x00000000: {
                                      // 0xef800810
                                      switch (instr & 0x00000200) {
                                        default: {
                                          switch (instr & 0x00000020) {
                                            case 0x00000020: {
                                              // 0xef800830
                                              if (((instr & 0xd00) == 0x100) ||
                                                  ((instr & 0xd00) == 0x500) ||
                                                  ((instr & 0xd00) == 0x900) ||
                                                  ((instr & 0xe00) == 0xe00)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  (instr >> 8) & 0xf;
                                              DataType dt =
                                                  ImmediateVmvn::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              DOperand imm = ImmediateVmvn::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmvn(CurrentCond(),
                                                   dt,
                                                   DRegister(rd),
                                                   imm);
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0x920) == 0x100) ||
                                                  ((instr & 0x520) == 0x100) ||
                                                  ((instr & 0x820) == 0x20) ||
                                                  ((instr & 0x420) == 0x20) ||
                                                  ((instr & 0x220) == 0x20) ||
                                                  ((instr & 0x120) == 0x120)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  ((instr >> 8) & 0xf) |
                                                  ((instr >> 1) & 0x10);
                                              DataType dt =
                                                  ImmediateVmov::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              DOperand imm = ImmediateVmov::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmov(CurrentCond(),
                                                   dt,
                                                   DRegister(rd),
                                                   imm);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800910
                                      switch (instr & 0x00000020) {
                                        case 0x00000000: {
                                          // 0xef800910
                                          if (((instr & 0x100) == 0x0) ||
                                              ((instr & 0xc00) == 0xc00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVorr::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVorr::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vorr(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                        case 0x00000020: {
                                          // 0xef800930
                                          if (((instr & 0x100) == 0x0) ||
                                              ((instr & 0xc00) == 0xc00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVbic::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVbic::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vbic(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00180000: {
                                  // 0xef980810
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xef980810
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xef980810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshrn(CurrentCond(),
                                                dt,
                                                DRegister(rd),
                                                QRegister(rm),
                                                imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xff980810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqshrun(CurrentCond(),
                                                  dt,
                                                  DRegister(rd),
                                                  QRegister(rm),
                                                  imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef980910
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqshrn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xef980a10
                                      if (((instr & 0x380000) == 0x0) ||
                                          ((instr & 0x3f0000) == 0x80000) ||
                                          ((instr & 0x3f0000) == 0x100000) ||
                                          ((instr & 0x3f0000) == 0x200000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = imm6 - dt.GetSize();
                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshll(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rm),
                                            imm);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00280000: {
                                  // 0xefa80810
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xefa80810
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xefa80810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshrn(CurrentCond(),
                                                dt,
                                                DRegister(rd),
                                                QRegister(rm),
                                                imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xffa80810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqshrun(CurrentCond(),
                                                  dt,
                                                  DRegister(rd),
                                                  QRegister(rm),
                                                  imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xefa80910
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqshrn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xefa80a10
                                      if (((instr & 0x380000) == 0x0) ||
                                          ((instr & 0x3f0000) == 0x80000) ||
                                          ((instr & 0x3f0000) == 0x100000) ||
                                          ((instr & 0x3f0000) == 0x200000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = imm6 - dt.GetSize();
                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshll(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rm),
                                            imm);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00300000: {
                                  // 0xefb00810
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xefb00810
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xefb00810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshrn(CurrentCond(),
                                                dt,
                                                DRegister(rd),
                                                QRegister(rm),
                                                imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xffb00810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqshrun(CurrentCond(),
                                                  dt,
                                                  DRegister(rd),
                                                  QRegister(rm),
                                                  imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xefb00910
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqshrn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xefb00a10
                                      if (((instr & 0x380000) == 0x0) ||
                                          ((instr & 0x3f0000) == 0x80000) ||
                                          ((instr & 0x3f0000) == 0x100000) ||
                                          ((instr & 0x3f0000) == 0x200000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = imm6 - dt.GetSize();
                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshll(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rm),
                                            imm);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                case 0x00380000: {
                                  // 0xefb80810
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xefb80810
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xefb80810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshrn(CurrentCond(),
                                                dt,
                                                DRegister(rd),
                                                QRegister(rm),
                                                imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xffb80810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqshrun(CurrentCond(),
                                                  dt,
                                                  DRegister(rd),
                                                  QRegister(rm),
                                                  imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xefb80910
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqshrn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xefb80a10
                                      if (((instr & 0x380000) == 0x0) ||
                                          ((instr & 0x3f0000) == 0x80000) ||
                                          ((instr & 0x3f0000) == 0x100000) ||
                                          ((instr & 0x3f0000) == 0x200000)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      unsigned rm =
                                          ExtractDRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = imm6 - dt.GetSize();
                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshll(CurrentCond(),
                                            dt,
                                            QRegister(rd),
                                            DRegister(rm),
                                            imm);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                default: {
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xef800810
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xef800810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshrn(CurrentCond(),
                                                dt,
                                                DRegister(rd),
                                                QRegister(rm),
                                                imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xff800810
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqshrun(CurrentCond(),
                                                  dt,
                                                  DRegister(rd),
                                                  QRegister(rm),
                                                  imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800910
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqshrn(CurrentCond(),
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                      break;
                                    }
                                    case 0x00000200: {
                                      // 0xef800a10
                                      switch (instr & 0x00070000) {
                                        case 0x00000000: {
                                          // 0xef800a10
                                          switch (instr & 0x003f0000) {
                                            case 0x00080000: {
                                              // 0xef880a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x380000) ==
                                                   0x180000) ||
                                                  ((instr & 0x380000) ==
                                                   0x280000) ||
                                                  ((instr & 0x380000) ==
                                                   0x300000) ||
                                                  ((instr & 0x380000) ==
                                                   0x380000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt = Dt_U_imm3H_1_Decode(
                                                  ((instr >> 19) & 0x7) |
                                                  ((instr >> 25) & 0x8));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vmovl(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00090000: {
                                              // 0xef890a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000a0000: {
                                              // 0xef8a0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000b0000: {
                                              // 0xef8b0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000c0000: {
                                              // 0xef8c0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000d0000: {
                                              // 0xef8d0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000e0000: {
                                              // 0xef8e0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x000f0000: {
                                              // 0xef8f0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00100000: {
                                              // 0xef900a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x380000) ==
                                                   0x180000) ||
                                                  ((instr & 0x380000) ==
                                                   0x280000) ||
                                                  ((instr & 0x380000) ==
                                                   0x300000) ||
                                                  ((instr & 0x380000) ==
                                                   0x380000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt = Dt_U_imm3H_1_Decode(
                                                  ((instr >> 19) & 0x7) |
                                                  ((instr >> 25) & 0x8));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vmovl(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00110000: {
                                              // 0xef910a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00120000: {
                                              // 0xef920a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00130000: {
                                              // 0xef930a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00140000: {
                                              // 0xef940a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00150000: {
                                              // 0xef950a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00160000: {
                                              // 0xef960a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00170000: {
                                              // 0xef970a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00180000: {
                                              // 0xef980a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00190000: {
                                              // 0xef990a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001a0000: {
                                              // 0xef9a0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001b0000: {
                                              // 0xef9b0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001c0000: {
                                              // 0xef9c0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001d0000: {
                                              // 0xef9d0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001e0000: {
                                              // 0xef9e0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x001f0000: {
                                              // 0xef9f0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00200000: {
                                              // 0xefa00a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x380000) ==
                                                   0x180000) ||
                                                  ((instr & 0x380000) ==
                                                   0x280000) ||
                                                  ((instr & 0x380000) ==
                                                   0x300000) ||
                                                  ((instr & 0x380000) ==
                                                   0x380000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt = Dt_U_imm3H_1_Decode(
                                                  ((instr >> 19) & 0x7) |
                                                  ((instr >> 25) & 0x8));
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
                                              vmovl(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm));
                                              break;
                                            }
                                            case 0x00210000: {
                                              // 0xefa10a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00220000: {
                                              // 0xefa20a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00230000: {
                                              // 0xefa30a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00240000: {
                                              // 0xefa40a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00250000: {
                                              // 0xefa50a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00260000: {
                                              // 0xefa60a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00270000: {
                                              // 0xefa70a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00280000: {
                                              // 0xefa80a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00290000: {
                                              // 0xefa90a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002a0000: {
                                              // 0xefaa0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002b0000: {
                                              // 0xefab0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002c0000: {
                                              // 0xefac0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002d0000: {
                                              // 0xefad0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002e0000: {
                                              // 0xefae0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x002f0000: {
                                              // 0xefaf0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00300000: {
                                              // 0xefb00a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00310000: {
                                              // 0xefb10a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00320000: {
                                              // 0xefb20a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00330000: {
                                              // 0xefb30a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00340000: {
                                              // 0xefb40a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00350000: {
                                              // 0xefb50a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00360000: {
                                              // 0xefb60a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00370000: {
                                              // 0xefb70a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00380000: {
                                              // 0xefb80a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x00390000: {
                                              // 0xefb90a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003a0000: {
                                              // 0xefba0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003b0000: {
                                              // 0xefbb0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003c0000: {
                                              // 0xefbc0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003d0000: {
                                              // 0xefbd0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003e0000: {
                                              // 0xefbe0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            case 0x003f0000: {
                                              // 0xefbf0a10
                                              if (((instr & 0x380000) == 0x0) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x80000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x100000) ||
                                                  ((instr & 0x3f0000) ==
                                                   0x200000)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              DataType dt =
                                                  Dt_imm6_4_Decode((instr >>
                                                                    19) &
                                                                       0x7,
                                                                   (instr >>
                                                                    28) &
                                                                       0x1);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              unsigned rm =
                                                  ExtractDRegister(instr, 5, 0);
                                              uint32_t imm6 =
                                                  (instr >> 16) & 0x3f;
                                              uint32_t imm =
                                                  imm6 - dt.GetSize();
                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vshll(CurrentCond(),
                                                    dt,
                                                    QRegister(rd),
                                                    DRegister(rm),
                                                    imm);
                                              break;
                                            }
                                            default:
                                              UnallocatedT32(instr);
                                              break;
                                          }
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0x380000) == 0x0) ||
                                              ((instr & 0x3f0000) == 0x80000) ||
                                              ((instr & 0x3f0000) ==
                                               0x100000) ||
                                              ((instr & 0x3f0000) ==
                                               0x200000)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_4_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          unsigned rm =
                                              ExtractDRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = imm6 - dt.GetSize();
                                          // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vshll(CurrentCond(),
                                                dt,
                                                QRegister(rd),
                                                DRegister(rm),
                                                imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000c00: {
                          // 0xef800c10
                          switch (instr & 0x00000080) {
                            case 0x00000000: {
                              // 0xef800c10
                              switch (instr & 0x00200000) {
                                case 0x00000000: {
                                  // 0xef800c10
                                  switch (instr & 0x00180000) {
                                    case 0x00000000: {
                                      // 0xef800c10
                                      switch (instr & 0x00000300) {
                                        case 0x00000200: {
                                          // 0xef800e10
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                        case 0x00000300: {
                                          // 0xef800f10
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          DOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               DRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          switch (instr & 0x00000020) {
                                            case 0x00000020: {
                                              // 0xef800c30
                                              switch (instr & 0x00000f20) {
                                                case 0x00000000: {
                                                  // 0xef800c10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000020: {
                                                  // 0xef800c30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000200: {
                                                  // 0xef800e10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000220: {
                                                  // 0xef800e30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000400: {
                                                  // 0xef800c10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000420: {
                                                  // 0xef800c30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000600: {
                                                  // 0xef800e10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000620: {
                                                  // 0xef800e30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000800: {
                                                  // 0xef800c10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000820: {
                                                  // 0xef800c30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000a00: {
                                                  // 0xef800e10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000a20: {
                                                  // 0xef800e30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000c00: {
                                                  // 0xef800c10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000c20: {
                                                  // 0xef800c30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000d00: {
                                                  // 0xef800d10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000d20: {
                                                  // 0xef800d30
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000e00: {
                                                  // 0xef800e10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000e20: {
                                                  // 0xef800e30
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000f00: {
                                                  // 0xef800f10
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractDRegister(instr,
                                                                       22,
                                                                       12);
                                                  DOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       DRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                default:
                                                  UnallocatedT32(instr);
                                                  break;
                                              }
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0x920) == 0x100) ||
                                                  ((instr & 0x520) == 0x100) ||
                                                  ((instr & 0x820) == 0x20) ||
                                                  ((instr & 0x420) == 0x20) ||
                                                  ((instr & 0x220) == 0x20) ||
                                                  ((instr & 0x120) == 0x120)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  ((instr >> 8) & 0xf) |
                                                  ((instr >> 1) & 0x10);
                                              DataType dt =
                                                  ImmediateVmov::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractDRegister(instr,
                                                                   22,
                                                                   12);
                                              DOperand imm = ImmediateVmov::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmov(CurrentCond(),
                                                   dt,
                                                   DRegister(rd),
                                                   imm);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                default: {
                                  if ((instr & 0x00000200) == 0x00000200) {
                                    if (((instr & 0x200000) == 0x0)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt1 = Dt_op_U_1_Decode1(
                                        ((instr >> 28) & 0x1) |
                                        ((instr >> 7) & 0x2));
                                    if (dt1.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt2 = Dt_op_U_1_Decode2(
                                        ((instr >> 28) & 0x1) |
                                        ((instr >> 7) & 0x2));
                                    if (dt2.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    uint32_t fbits =
                                        64 - ((instr >> 16) & 0x3f);
                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
                                    vcvt(CurrentCond(),
                                         dt1,
                                         dt2,
                                         DRegister(rd),
                                         DRegister(rm),
                                         fbits);
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                    case 0x00800040: {
                      // 0xef800050
                      switch (instr & 0x00000c00) {
                        case 0x00000000: {
                          // 0xef800050
                          switch (instr & 0x00380080) {
                            case 0x00000000: {
                              // 0xef800050
                              switch (instr & 0x00000100) {
                                case 0x00000000: {
                                  // 0xef800050
                                  switch (instr & 0x00000200) {
                                    default: {
                                      switch (instr & 0x00000020) {
                                        case 0x00000020: {
                                          // 0xef800070
                                          if (((instr & 0xd00) == 0x100) ||
                                              ((instr & 0xd00) == 0x500) ||
                                              ((instr & 0xd00) == 0x900) ||
                                              ((instr & 0xe00) == 0xe00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVmvn::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmvn::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmvn(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800150
                                  switch (instr & 0x00000020) {
                                    case 0x00000000: {
                                      // 0xef800150
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVorr::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      QOperand imm =
                                          ImmediateVorr::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vorr(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rd),
                                           imm);
                                      break;
                                    }
                                    case 0x00000020: {
                                      // 0xef800170
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVbic::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      QOperand imm =
                                          ImmediateVbic::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vbic(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rd),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800050
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vshr(CurrentCond(),
                                       dt,
                                       QRegister(rd),
                                       QRegister(rm),
                                       imm);
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800150
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vsra(CurrentCond(),
                                       dt,
                                       QRegister(rd),
                                       QRegister(rm),
                                       imm);
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800250
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vrshr(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        QRegister(rm),
                                        imm);
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800350
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      (dt.IsSize(64) ? 64
                                                     : (dt.GetSize() * 2)) -
                                      imm6;
                                  // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vrsra(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        QRegister(rm),
                                        imm);
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000400: {
                          // 0xef800450
                          switch (instr & 0x00380080) {
                            case 0x00000000: {
                              // 0xef800450
                              switch (instr & 0x00000100) {
                                case 0x00000000: {
                                  // 0xef800450
                                  switch (instr & 0x00000200) {
                                    default: {
                                      switch (instr & 0x00000020) {
                                        case 0x00000020: {
                                          // 0xef800470
                                          if (((instr & 0xd00) == 0x100) ||
                                              ((instr & 0xd00) == 0x500) ||
                                              ((instr & 0xd00) == 0x900) ||
                                              ((instr & 0xe00) == 0xe00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVmvn::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmvn::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmvn(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800550
                                  switch (instr & 0x00000020) {
                                    case 0x00000000: {
                                      // 0xef800550
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVorr::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      QOperand imm =
                                          ImmediateVorr::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vorr(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rd),
                                           imm);
                                      break;
                                    }
                                    case 0x00000020: {
                                      // 0xef800570
                                      if (((instr & 0x100) == 0x0) ||
                                          ((instr & 0xc00) == 0xc00)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned cmode = (instr >> 8) & 0xf;
                                      DataType dt =
                                          ImmediateVbic::DecodeDt(cmode);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      QOperand imm =
                                          ImmediateVbic::DecodeImmediate(
                                              cmode,
                                              (instr & 0xf) |
                                                  ((instr >> 12) & 0x70) |
                                                  ((instr >> 21) & 0x80));
                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vbic(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rd),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default: {
                              switch (instr & 0x00000300) {
                                case 0x00000000: {
                                  // 0xef800450
                                  if ((instr & 0x10000000) == 0x10000000) {
                                    if (((instr & 0x380080) == 0x0)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt = Dt_L_imm6_4_Decode(
                                        ((instr >> 19) & 0x7) |
                                        ((instr >> 4) & 0x8));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm =
                                        (dt.IsSize(64) ? 64
                                                       : (dt.GetSize() * 2)) -
                                        imm6;
                                    // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                    vsri(CurrentCond(),
                                         dt,
                                         QRegister(rd),
                                         QRegister(rm),
                                         imm);
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                                case 0x00000100: {
                                  // 0xef800550
                                  switch (instr & 0x10000000) {
                                    case 0x00000000: {
                                      // 0xef800550
                                      if (((instr & 0x380080) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_L_imm6_3_Decode(
                                          ((instr >> 19) & 0x7) |
                                          ((instr >> 4) & 0x8));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm =
                                          imm6 -
                                          (dt.IsSize(64) ? 0 : dt.GetSize());
                                      // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vshl(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rm),
                                           imm);
                                      break;
                                    }
                                    case 0x10000000: {
                                      // 0xff800550
                                      if (((instr & 0x380080) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt = Dt_L_imm6_4_Decode(
                                          ((instr >> 19) & 0x7) |
                                          ((instr >> 4) & 0x8));
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      if (((instr >> 12) & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractQRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm =
                                          imm6 -
                                          (dt.IsSize(64) ? 0 : dt.GetSize());
                                      // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vsli(CurrentCond(),
                                           dt,
                                           QRegister(rd),
                                           QRegister(rm),
                                           imm);
                                      break;
                                    }
                                  }
                                  break;
                                }
                                case 0x00000200: {
                                  // 0xef800650
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                  // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vqshlu(CurrentCond(),
                                         dt,
                                         QRegister(rd),
                                         QRegister(rm),
                                         imm);
                                  break;
                                }
                                case 0x00000300: {
                                  // 0xef800750
                                  if (((instr & 0x380080) == 0x0)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  DataType dt =
                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                             ((instr >> 4) &
                                                              0x8),
                                                         (instr >> 28) & 0x1);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedT32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  uint32_t imm6 = (instr >> 16) & 0x3f;
                                  uint32_t imm =
                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                  // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                  vqshl(CurrentCond(),
                                        dt,
                                        QRegister(rd),
                                        QRegister(rm),
                                        imm);
                                  break;
                                }
                              }
                              break;
                            }
                          }
                          break;
                        }
                        case 0x00000800: {
                          // 0xef800850
                          switch (instr & 0x00000080) {
                            case 0x00000000: {
                              // 0xef800850
                              switch (instr & 0x00380000) {
                                case 0x00000000: {
                                  // 0xef800850
                                  switch (instr & 0x00000100) {
                                    case 0x00000000: {
                                      // 0xef800850
                                      switch (instr & 0x00000200) {
                                        default: {
                                          switch (instr & 0x00000020) {
                                            case 0x00000020: {
                                              // 0xef800870
                                              if (((instr & 0xd00) == 0x100) ||
                                                  ((instr & 0xd00) == 0x500) ||
                                                  ((instr & 0xd00) == 0x900) ||
                                                  ((instr & 0xe00) == 0xe00)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  (instr >> 8) & 0xf;
                                              DataType dt =
                                                  ImmediateVmvn::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              QOperand imm = ImmediateVmvn::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmvn(CurrentCond(),
                                                   dt,
                                                   QRegister(rd),
                                                   imm);
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0x920) == 0x100) ||
                                                  ((instr & 0x520) == 0x100) ||
                                                  ((instr & 0x820) == 0x20) ||
                                                  ((instr & 0x420) == 0x20) ||
                                                  ((instr & 0x220) == 0x20) ||
                                                  ((instr & 0x120) == 0x120)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  ((instr >> 8) & 0xf) |
                                                  ((instr >> 1) & 0x10);
                                              DataType dt =
                                                  ImmediateVmov::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              QOperand imm = ImmediateVmov::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmov(CurrentCond(),
                                                   dt,
                                                   QRegister(rd),
                                                   imm);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800950
                                      switch (instr & 0x00000020) {
                                        case 0x00000000: {
                                          // 0xef800950
                                          if (((instr & 0x100) == 0x0) ||
                                              ((instr & 0xc00) == 0xc00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVorr::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVorr::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vorr(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                        case 0x00000020: {
                                          // 0xef800970
                                          if (((instr & 0x100) == 0x0) ||
                                              ((instr & 0xc00) == 0xc00)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode = (instr >> 8) & 0xf;
                                          DataType dt =
                                              ImmediateVbic::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVbic::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vbic(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                  }
                                  break;
                                }
                                default: {
                                  switch (instr & 0x00000300) {
                                    case 0x00000000: {
                                      // 0xef800850
                                      switch (instr & 0x10000000) {
                                        case 0x00000000: {
                                          // 0xef800850
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt = Dt_imm6_3_Decode(
                                              (instr >> 19) & 0x7);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vrshrn(CurrentCond(),
                                                 dt,
                                                 DRegister(rd),
                                                 QRegister(rm),
                                                 imm);
                                          break;
                                        }
                                        case 0x10000000: {
                                          // 0xff800850
                                          if (((instr & 0x380000) == 0x0)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          DataType dt =
                                              Dt_imm6_2_Decode((instr >> 19) &
                                                                   0x7,
                                                               (instr >> 28) &
                                                                   0x1);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractDRegister(instr, 22, 12);
                                          if ((instr & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rm =
                                              ExtractQRegister(instr, 5, 0);
                                          uint32_t imm6 = (instr >> 16) & 0x3f;
                                          uint32_t imm = dt.GetSize() - imm6;
                                          // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vqrshrun(CurrentCond(),
                                                   dt,
                                                   DRegister(rd),
                                                   QRegister(rm),
                                                   imm);
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    case 0x00000100: {
                                      // 0xef800950
                                      if (((instr & 0x380000) == 0x0)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      DataType dt =
                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                           (instr >> 28) & 0x1);
                                      if (dt.Is(kDataTypeValueInvalid)) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rd =
                                          ExtractDRegister(instr, 22, 12);
                                      if ((instr & 1) != 0) {
                                        UnallocatedT32(instr);
                                        return;
                                      }
                                      unsigned rm =
                                          ExtractQRegister(instr, 5, 0);
                                      uint32_t imm6 = (instr >> 16) & 0x3f;
                                      uint32_t imm = dt.GetSize() - imm6;
                                      // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                      vqrshrn(CurrentCond(),
                                              dt,
                                              DRegister(rd),
                                              QRegister(rm),
                                              imm);
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                        case 0x00000c00: {
                          // 0xef800c50
                          switch (instr & 0x00000080) {
                            case 0x00000000: {
                              // 0xef800c50
                              switch (instr & 0x00200000) {
                                case 0x00000000: {
                                  // 0xef800c50
                                  switch (instr & 0x00180000) {
                                    case 0x00000000: {
                                      // 0xef800c50
                                      switch (instr & 0x00000300) {
                                        case 0x00000200: {
                                          // 0xef800e50
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                        case 0x00000300: {
                                          // 0xef800f50
                                          if (((instr & 0x920) == 0x100) ||
                                              ((instr & 0x520) == 0x100) ||
                                              ((instr & 0x820) == 0x20) ||
                                              ((instr & 0x420) == 0x20) ||
                                              ((instr & 0x220) == 0x20) ||
                                              ((instr & 0x120) == 0x120)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned cmode =
                                              ((instr >> 8) & 0xf) |
                                              ((instr >> 1) & 0x10);
                                          DataType dt =
                                              ImmediateVmov::DecodeDt(cmode);
                                          if (dt.Is(kDataTypeValueInvalid)) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          if (((instr >> 12) & 1) != 0) {
                                            UnallocatedT32(instr);
                                            return;
                                          }
                                          unsigned rd =
                                              ExtractQRegister(instr, 22, 12);
                                          QOperand imm =
                                              ImmediateVmov::DecodeImmediate(
                                                  cmode,
                                                  (instr & 0xf) |
                                                      ((instr >> 12) & 0x70) |
                                                      ((instr >> 21) & 0x80));
                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                          vmov(CurrentCond(),
                                               dt,
                                               QRegister(rd),
                                               imm);
                                          break;
                                        }
                                        default: {
                                          switch (instr & 0x00000020) {
                                            case 0x00000020: {
                                              // 0xef800c70
                                              switch (instr & 0x00000f20) {
                                                case 0x00000000: {
                                                  // 0xef800c50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000020: {
                                                  // 0xef800c70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000200: {
                                                  // 0xef800e50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000220: {
                                                  // 0xef800e70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000400: {
                                                  // 0xef800c50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000420: {
                                                  // 0xef800c70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000600: {
                                                  // 0xef800e50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000620: {
                                                  // 0xef800e70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000800: {
                                                  // 0xef800c50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000820: {
                                                  // 0xef800c70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000a00: {
                                                  // 0xef800e50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000a20: {
                                                  // 0xef800e70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000c00: {
                                                  // 0xef800c50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000c20: {
                                                  // 0xef800c70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000d00: {
                                                  // 0xef800d50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000d20: {
                                                  // 0xef800d70
                                                  if (((instr & 0xd00) ==
                                                       0x100) ||
                                                      ((instr & 0xd00) ==
                                                       0x500) ||
                                                      ((instr & 0xd00) ==
                                                       0x900) ||
                                                      ((instr & 0xe00) ==
                                                       0xe00)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      (instr >> 8) & 0xf;
                                                  DataType dt =
                                                      ImmediateVmvn::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmvn::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmvn(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000e00: {
                                                  // 0xef800e50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000e20: {
                                                  // 0xef800e70
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                case 0x00000f00: {
                                                  // 0xef800f50
                                                  if (((instr & 0x920) ==
                                                       0x100) ||
                                                      ((instr & 0x520) ==
                                                       0x100) ||
                                                      ((instr & 0x820) ==
                                                       0x20) ||
                                                      ((instr & 0x420) ==
                                                       0x20) ||
                                                      ((instr & 0x220) ==
                                                       0x20) ||
                                                      ((instr & 0x120) ==
                                                       0x120)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned cmode =
                                                      ((instr >> 8) & 0xf) |
                                                      ((instr >> 1) & 0x10);
                                                  DataType dt =
                                                      ImmediateVmov::DecodeDt(
                                                          cmode);
                                                  if (dt.Is(
                                                          kDataTypeValueInvalid)) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  if (((instr >> 12) & 1) !=
                                                      0) {
                                                    UnallocatedT32(instr);
                                                    return;
                                                  }
                                                  unsigned rd =
                                                      ExtractQRegister(instr,
                                                                       22,
                                                                       12);
                                                  QOperand imm = ImmediateVmov::
                                                      DecodeImmediate(
                                                          cmode,
                                                          (instr & 0xf) |
                                                              ((instr >> 12) &
                                                               0x70) |
                                                              ((instr >> 21) &
                                                               0x80));
                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                                  vmov(CurrentCond(),
                                                       dt,
                                                       QRegister(rd),
                                                       imm);
                                                  break;
                                                }
                                                default:
                                                  UnallocatedT32(instr);
                                                  break;
                                              }
                                              break;
                                            }
                                            default: {
                                              if (((instr & 0x920) == 0x100) ||
                                                  ((instr & 0x520) == 0x100) ||
                                                  ((instr & 0x820) == 0x20) ||
                                                  ((instr & 0x420) == 0x20) ||
                                                  ((instr & 0x220) == 0x20) ||
                                                  ((instr & 0x120) == 0x120)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned cmode =
                                                  ((instr >> 8) & 0xf) |
                                                  ((instr >> 1) & 0x10);
                                              DataType dt =
                                                  ImmediateVmov::DecodeDt(
                                                      cmode);
                                              if (dt.Is(
                                                      kDataTypeValueInvalid)) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              if (((instr >> 12) & 1) != 0) {
                                                UnallocatedT32(instr);
                                                return;
                                              }
                                              unsigned rd =
                                                  ExtractQRegister(instr,
                                                                   22,
                                                                   12);
                                              QOperand imm = ImmediateVmov::
                                                  DecodeImmediate(cmode,
                                                                  (instr &
                                                                   0xf) |
                                                                      ((instr >>
                                                                        12) &
                                                                       0x70) |
                                                                      ((instr >>
                                                                        21) &
                                                                       0x80));
                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
                                              vmov(CurrentCond(),
                                                   dt,
                                                   QRegister(rd),
                                                   imm);
                                              break;
                                            }
                                          }
                                          break;
                                        }
                                      }
                                      break;
                                    }
                                    default:
                                      UnallocatedT32(instr);
                                      break;
                                  }
                                  break;
                                }
                                default: {
                                  if ((instr & 0x00000200) == 0x00000200) {
                                    if (((instr & 0x200000) == 0x0)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt1 = Dt_op_U_1_Decode1(
                                        ((instr >> 28) & 0x1) |
                                        ((instr >> 7) & 0x2));
                                    if (dt1.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    DataType dt2 = Dt_op_U_1_Decode2(
                                        ((instr >> 28) & 0x1) |
                                        ((instr >> 7) & 0x2));
                                    if (dt2.Is(kDataTypeValueInvalid)) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedT32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t fbits =
                                        64 - ((instr >> 16) & 0x3f);
                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
                                    vcvt(CurrentCond(),
                                         dt1,
                                         dt2,
                                         QRegister(rd),
                                         QRegister(rm),
                                         fbits);
                                  } else {
                                    UnallocatedT32(instr);
                                  }
                                  break;
                                }
                              }
                              break;
                            }
                            default:
                              UnallocatedT32(instr);
                              break;
                          }
                          break;
                        }
                      }
                      break;
                    }
                  }
                  break;
                }
              }
              break;
            }
          }
          break;
        }
      }
      break;
    }
  }
}  // NOLINT(readability/fn_size)

void Disassembler::DecodeA32(uint32_t instr) {
  A32CodeAddressIncrementer incrementer(&code_address_);
  if ((instr & 0xf0000000) == 0xf0000000) {
    switch (instr & 0x0e000000) {
      case 0x00000000: {
        // 0xf0000000
        switch (instr & 0x01f10020) {
          case 0x01000000: {
            // 0xf1000000
            switch (instr & 0x000e0000) {
              case 0x00020000: {
                // 0xf1020000
                if ((instr & 0x000001c0) == 0x00000000) {
                  UnimplementedA32("CPS", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00080000: {
                // 0xf1080000
                if ((instr & 0x0000001f) == 0x00000000) {
                  UnimplementedA32("CPSIE", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000a0000: {
                // 0xf10a0000
                UnimplementedA32("CPSIE", instr);
                break;
              }
              case 0x000c0000: {
                // 0xf10c0000
                if ((instr & 0x0000001f) == 0x00000000) {
                  UnimplementedA32("CPSID", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000e0000: {
                // 0xf10e0000
                UnimplementedA32("CPSID", instr);
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01010000: {
            // 0xf1010000
            if ((instr & 0x000000d0) == 0x00000000) {
              UnimplementedA32("SETEND", instr);
            } else {
              UnallocatedA32(instr);
            }
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      case 0x02000000: {
        // 0xf2000000
        switch (instr & 0x00800010) {
          case 0x00000000: {
            // 0xf2000000
            switch (instr & 0x00000f40) {
              case 0x00000000: {
                // 0xf2000000
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000040: {
                // 0xf2000040
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000100: {
                // 0xf2000100
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000140: {
                // 0xf2000140
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000200: {
                // 0xf2000200
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000240: {
                // 0xf2000240
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000300: {
                // 0xf2000300
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000340: {
                // 0xf2000340
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000400: {
                // 0xf2000400
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
                vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
                break;
              }
              case 0x00000440: {
                // 0xf2000440
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
                vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
                break;
              }
              case 0x00000500: {
                // 0xf2000500
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
                vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
                break;
              }
              case 0x00000540: {
                // 0xf2000540
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
                vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
                break;
              }
              case 0x00000600: {
                // 0xf2000600
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000640: {
                // 0xf2000640
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000700: {
                // 0xf2000700
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000740: {
                // 0xf2000740
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000800: {
                // 0xf2000800
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000800
                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000800
                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000840: {
                // 0xf2000840
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000840
                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000840
                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000900: {
                // 0xf2000900
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000900
                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
                    vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000900
                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
                    vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000940: {
                // 0xf2000940
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000940
                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
                    vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000940
                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
                    vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000a00: {
                // 0xf2000a00
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000b00: {
                // 0xf2000b00
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000b00
                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vqdmulh(al,
                            dt,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000b00
                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vqrdmulh(al,
                             dt,
                             DRegister(rd),
                             DRegister(rn),
                             DRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000b40: {
                // 0xf2000b40
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000b40
                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vqdmulh(al,
                            dt,
                            QRegister(rd),
                            QRegister(rn),
                            QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000b40
                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vqrdmulh(al,
                             dt,
                             QRegister(rd),
                             QRegister(rn),
                             QRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000c40: {
                // 0xf2000c40
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000c40
                    UnimplementedA32("SHA1C", instr);
                    break;
                  }
                  case 0x00100000: {
                    // 0xf2100c40
                    UnimplementedA32("SHA1P", instr);
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200c40
                    UnimplementedA32("SHA1M", instr);
                    break;
                  }
                  case 0x00300000: {
                    // 0xf2300c40
                    UnimplementedA32("SHA1SU0", instr);
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000c40
                    UnimplementedA32("SHA256H", instr);
                    break;
                  }
                  case 0x01100000: {
                    // 0xf3100c40
                    UnimplementedA32("SHA256H2", instr);
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200c40
                    UnimplementedA32("SHA256SU1", instr);
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000d00: {
                // 0xf2000d00
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000d00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200d00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000d00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200d00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000d40: {
                // 0xf2000d40
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000d40
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200d40
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200d40
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000e00: {
                // 0xf2000e00
                switch (instr & 0x01200000) {
                  case 0x00000000: {
                    // 0xf2000e00
                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000e00
                    if ((instr & 0x00100000) == 0x00000000) {
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
                      vcge(al,
                           F32,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200e00
                    if ((instr & 0x00100000) == 0x00000000) {
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rn = ExtractDRegister(instr, 7, 16);
                      unsigned rm = ExtractDRegister(instr, 5, 0);
                      // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
                      vcgt(al,
                           F32,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000e40: {
                // 0xf2000e40
                switch (instr & 0x01200000) {
                  case 0x00000000: {
                    // 0xf2000e40
                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000e40
                    if ((instr & 0x00100000) == 0x00000000) {
                      if (((instr >> 12) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rd = ExtractQRegister(instr, 22, 12);
                      if (((instr >> 16) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rn = ExtractQRegister(instr, 7, 16);
                      if ((instr & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rm = ExtractQRegister(instr, 5, 0);
                      // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
                      vcge(al,
                           F32,
                           QRegister(rd),
                           QRegister(rn),
                           QRegister(rm));
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200e40
                    if ((instr & 0x00100000) == 0x00000000) {
                      if (((instr >> 12) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rd = ExtractQRegister(instr, 22, 12);
                      if (((instr >> 16) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rn = ExtractQRegister(instr, 7, 16);
                      if ((instr & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rm = ExtractQRegister(instr, 5, 0);
                      // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
                      vcgt(al,
                           F32,
                           QRegister(rd),
                           QRegister(rn),
                           QRegister(rm));
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000f00: {
                // 0xf2000f00
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000f00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200f00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000f00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200f00
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000f40: {
                // 0xf2000f40
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000f40
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200f40
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00000010: {
            // 0xf2000010
            switch (instr & 0x00000f40) {
              case 0x00000000: {
                // 0xf2000010
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000040: {
                // 0xf2000050
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000100: {
                // 0xf2000110
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vand(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00100000: {
                    // 0xf2100110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vbic(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200110
                    if (((instr & 0x00000040) == 0x00000000) &&
                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
                          (Uint32(instr) & Uint32(0xf))))) {
                      unsigned rd = ExtractDRegister(instr, 22, 12);
                      unsigned rm = ExtractDRegister(instr, 7, 16);
                      // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
                      vmov(al,
                           kDataTypeValueNone,
                           DRegister(rd),
                           DRegister(rm));
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vorr(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00300000: {
                    // 0xf2300110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vorn(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    veor(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x01100000: {
                    // 0xf3100110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vbsl(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vbit(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x01300000: {
                    // 0xf3300110
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
                    vbif(al,
                         kDataTypeValueNone,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000140: {
                // 0xf2000150
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vand(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x00100000: {
                    // 0xf2100150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vbic(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200150
                    if (((instr & 0x00000040) == 0x00000040) &&
                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
                          (Uint32(instr) & Uint32(0xf))))) {
                      if (((instr >> 12) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rd = ExtractQRegister(instr, 22, 12);
                      if (((instr >> 16) & 1) != 0) {
                        UnallocatedA32(instr);
                        return;
                      }
                      unsigned rm = ExtractQRegister(instr, 7, 16);
                      // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
                      vmov(al,
                           kDataTypeValueNone,
                           QRegister(rd),
                           QRegister(rm));
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vorr(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x00300000: {
                    // 0xf2300150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vorn(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    veor(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x01100000: {
                    // 0xf3100150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vbsl(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vbit(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                  case 0x01300000: {
                    // 0xf3300150
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
                    vbif(al,
                         kDataTypeValueNone,
                         QRegister(rd),
                         QRegister(rn),
                         QRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000200: {
                // 0xf2000210
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000240: {
                // 0xf2000250
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000300: {
                // 0xf2000310
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000340: {
                // 0xf2000350
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000400: {
                // 0xf2000410
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
                vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
                break;
              }
              case 0x00000440: {
                // 0xf2000450
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
                vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
                break;
              }
              case 0x00000500: {
                // 0xf2000510
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
                vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
                break;
              }
              case 0x00000540: {
                // 0xf2000550
                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
                vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
                break;
              }
              case 0x00000600: {
                // 0xf2000610
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000640: {
                // 0xf2000650
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000700: {
                // 0xf2000710
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
                vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000740: {
                // 0xf2000750
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
                vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000800: {
                // 0xf2000810
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000810
                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000810
                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000840: {
                // 0xf2000850
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2000850
                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000850
                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                }
                break;
              }
              case 0x00000900: {
                // 0xf2000910
                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
                                                  ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000940: {
                // 0xf2000950
                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
                                                  ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((instr >> 12) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractQRegister(instr, 22, 12);
                if (((instr >> 16) & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = ExtractQRegister(instr, 7, 16);
                if ((instr & 1) != 0) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rm = ExtractQRegister(instr, 5, 0);
                // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
                vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
                break;
              }
              case 0x00000a00: {
                // 0xf2000a10
                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                 ((instr >> 22) & 0x4));
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = ExtractDRegister(instr, 7, 16);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                break;
              }
              case 0x00000b00: {
                // 0xf2000b10
                if ((instr & 0x01000000) == 0x00000000) {
                  DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
                  if (dt.Is(kDataTypeValueInvalid)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  unsigned rd = ExtractDRegister(instr, 22, 12);
                  unsigned rn = ExtractDRegister(instr, 7, 16);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
                  vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00000c00: {
                // 0xf2000c10
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000c10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200c10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000c40: {
                // 0xf2000c50
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000c50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200c50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000d00: {
                // 0xf2000d10
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000d10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200d10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000d10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000d40: {
                // 0xf2000d50
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000d50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200d50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000d50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000e00: {
                // 0xf2000e10
                switch (instr & 0x01300000) {
                  case 0x01000000: {
                    // 0xf3000e10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200e10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000e40: {
                // 0xf2000e50
                switch (instr & 0x01300000) {
                  case 0x01000000: {
                    // 0xf3000e50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200e50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000f00: {
                // 0xf2000f10
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000f10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vrecps(al,
                           F32,
                           DRegister(rd),
                           DRegister(rn),
                           DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200f10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
                    vrsqrts(al,
                            F32,
                            DRegister(rd),
                            DRegister(rn),
                            DRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000f10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200f10
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
                    vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000f40: {
                // 0xf2000f50
                switch (instr & 0x01300000) {
                  case 0x00000000: {
                    // 0xf2000f50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vrecps(al,
                           F32,
                           QRegister(rd),
                           QRegister(rn),
                           QRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0xf2200f50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
                    vrsqrts(al,
                            F32,
                            QRegister(rd),
                            QRegister(rn),
                            QRegister(rm));
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3000f50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  case 0x01200000: {
                    // 0xf3200f50
                    if (((instr >> 12) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractQRegister(instr, 22, 12);
                    if (((instr >> 16) & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = ExtractQRegister(instr, 7, 16);
                    if ((instr & 1) != 0) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rm = ExtractQRegister(instr, 5, 0);
                    // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
                    vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00800000: {
            // 0xf2800000
            switch (instr & 0x00300000) {
              case 0x00300000: {
                // 0xf2b00000
                switch (instr & 0x01000000) {
                  case 0x00000000: {
                    // 0xf2b00000
                    switch (instr & 0x00000040) {
                      case 0x00000000: {
                        // 0xf2b00000
                        if (((instr & 0x800) == 0x800)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        uint32_t imm = (instr >> 8) & 0xf;
                        // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
                        vext(al,
                             Untyped8,
                             DRegister(rd),
                             DRegister(rn),
                             DRegister(rm),
                             imm);
                        break;
                      }
                      case 0x00000040: {
                        // 0xf2b00040
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rn = ExtractQRegister(instr, 7, 16);
                        if ((instr & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rm = ExtractQRegister(instr, 5, 0);
                        uint32_t imm = (instr >> 8) & 0xf;
                        // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
                        vext(al,
                             Untyped8,
                             QRegister(rd),
                             QRegister(rn),
                             QRegister(rm),
                             imm);
                        break;
                      }
                    }
                    break;
                  }
                  case 0x01000000: {
                    // 0xf3b00000
                    switch (instr & 0x00000800) {
                      case 0x00000000: {
                        // 0xf3b00000
                        switch (instr & 0x00030200) {
                          case 0x00000000: {
                            // 0xf3b00000
                            switch (instr & 0x000005c0) {
                              case 0x00000000: {
                                // 0xf3b00000
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrev64(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b00040
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrev64(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000080: {
                                // 0xf3b00080
                                DataType dt =
                                    Dt_size_15_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrev32(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000000c0: {
                                // 0xf3b000c0
                                DataType dt =
                                    Dt_size_15_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrev32(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b00100
                                DataType dt =
                                    Dt_size_1_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrev16(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000140: {
                                // 0xf3b00140
                                DataType dt =
                                    Dt_size_1_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrev16(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000400: {
                                // 0xf3b00400
                                DataType dt =
                                    Dt_size_5_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vcls(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000440: {
                                // 0xf3b00440
                                DataType dt =
                                    Dt_size_5_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vcls(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000480: {
                                // 0xf3b00480
                                DataType dt =
                                    Dt_size_4_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vclz(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000004c0: {
                                // 0xf3b004c0
                                DataType dt =
                                    Dt_size_4_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vclz(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000500: {
                                // 0xf3b00500
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
                                  vcnt(al,
                                       Untyped8,
                                       DRegister(rd),
                                       DRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000540: {
                                // 0xf3b00540
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
                                  vcnt(al,
                                       Untyped8,
                                       QRegister(rd),
                                       QRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000580: {
                                // 0xf3b00580
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
                                  vmvn(al,
                                       kDataTypeValueNone,
                                       DRegister(rd),
                                       DRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x000005c0: {
                                // 0xf3b005c0
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
                                  vmvn(al,
                                       kDataTypeValueNone,
                                       QRegister(rd),
                                       QRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0xf3b00200
                            switch (instr & 0x00000540) {
                              case 0x00000000: {
                                // 0xf3b00200
                                DataType dt =
                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
                                                        ((instr >> 5) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vpaddl(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b00240
                                DataType dt =
                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
                                                        ((instr >> 5) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vpaddl(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b00300
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b00300
                                    UnimplementedA32("AESE", instr);
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b00380
                                    UnimplementedA32("AESMC", instr);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000140: {
                                // 0xf3b00340
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b00340
                                    UnimplementedA32("AESD", instr);
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b003c0
                                    UnimplementedA32("AESIMC", instr);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000400: {
                                // 0xf3b00600
                                DataType dt =
                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
                                                        ((instr >> 5) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vpadal(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000440: {
                                // 0xf3b00640
                                DataType dt =
                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
                                                        ((instr >> 5) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vpadal(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000500: {
                                // 0xf3b00700
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b00700
                                    DataType dt =
                                        Dt_size_5_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vqabs(al, dt, DRegister(rd), DRegister(rm));
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b00780
                                    DataType dt =
                                        Dt_size_5_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vqneg(al, dt, DRegister(rd), DRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000540: {
                                // 0xf3b00740
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b00740
                                    DataType dt =
                                        Dt_size_5_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vqabs(al, dt, QRegister(rd), QRegister(rm));
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b007c0
                                    DataType dt =
                                        Dt_size_5_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vqneg(al, dt, QRegister(rd), QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00010000: {
                            // 0xf3b10000
                            switch (instr & 0x000001c0) {
                              case 0x00000000: {
                                // 0xf3b10000
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
                                vcgt(al,
                                     dt,
                                     DRegister(rd),
                                     DRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b10040
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
                                vcgt(al,
                                     dt,
                                     QRegister(rd),
                                     QRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000080: {
                                // 0xf3b10080
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
                                vcge(al,
                                     dt,
                                     DRegister(rd),
                                     DRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x000000c0: {
                                // 0xf3b100c0
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
                                vcge(al,
                                     dt,
                                     QRegister(rd),
                                     QRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b10100
                                DataType dt =
                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
                                vceq(al,
                                     dt,
                                     DRegister(rd),
                                     DRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000140: {
                                // 0xf3b10140
                                DataType dt =
                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
                                vceq(al,
                                     dt,
                                     QRegister(rd),
                                     QRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000180: {
                                // 0xf3b10180
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
                                vcle(al,
                                     dt,
                                     DRegister(rd),
                                     DRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x000001c0: {
                                // 0xf3b101c0
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
                                vcle(al,
                                     dt,
                                     QRegister(rd),
                                     QRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00010200: {
                            // 0xf3b10200
                            switch (instr & 0x000001c0) {
                              case 0x00000000: {
                                // 0xf3b10200
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
                                vclt(al,
                                     dt,
                                     DRegister(rd),
                                     DRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b10240
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
                                vclt(al,
                                     dt,
                                     QRegister(rd),
                                     QRegister(rm),
                                     UINT32_C(0));
                                break;
                              }
                              case 0x000000c0: {
                                // 0xf3b102c0
                                if ((instr & 0x000c0400) == 0x00080000) {
                                  UnimplementedA32("SHA1H", instr);
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b10300
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vabs(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000140: {
                                // 0xf3b10340
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vabs(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000180: {
                                // 0xf3b10380
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vneg(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000001c0: {
                                // 0xf3b103c0
                                DataType dt =
                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
                                                       ((instr >> 8) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vneg(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          case 0x00020000: {
                            // 0xf3b20000
                            switch (instr & 0x000005c0) {
                              case 0x00000000: {
                                // 0xf3b20000
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
                                  vswp(al,
                                       kDataTypeValueNone,
                                       DRegister(rd),
                                       DRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b20040
                                if ((instr & 0x000c0000) == 0x00000000) {
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
                                  vswp(al,
                                       kDataTypeValueNone,
                                       QRegister(rd),
                                       QRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000080: {
                                // 0xf3b20080
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vtrn(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000000c0: {
                                // 0xf3b200c0
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vtrn(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b20100
                                DataType dt =
                                    Dt_size_15_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vuzp(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000140: {
                                // 0xf3b20140
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vuzp(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000180: {
                                // 0xf3b20180
                                DataType dt =
                                    Dt_size_15_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                vzip(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000001c0: {
                                // 0xf3b201c0
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                vzip(al, dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000400: {
                                // 0xf3b20400
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VRINTN{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrintn(dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000440: {
                                // 0xf3b20440
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VRINTN{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrintn(dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000480: {
                                // 0xf3b20480
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VRINTX{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrintx(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000004c0: {
                                // 0xf3b204c0
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VRINTX{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrintx(dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000500: {
                                // 0xf3b20500
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VRINTA{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrinta(dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x00000540: {
                                // 0xf3b20540
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VRINTA{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrinta(dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000580: {
                                // 0xf3b20580
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; A1
                                vrintz(al, dt, DRegister(rd), DRegister(rm));
                                break;
                              }
                              case 0x000005c0: {
                                // 0xf3b205c0
                                DataType dt =
                                    Dt_size_16_Decode((instr >> 18) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; A1
                                vrintz(dt, QRegister(rd), QRegister(rm));
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00020200: {
                            // 0xf3b20200
                            switch (instr & 0x00000580) {
                              case 0x00000000: {
                                // 0xf3b20200
                                switch (instr & 0x00000040) {
                                  case 0x00000000: {
                                    // 0xf3b20200
                                    DataType dt =
                                        Dt_size_3_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
                                    vmovn(al, dt, DRegister(rd), QRegister(rm));
                                    break;
                                  }
                                  case 0x00000040: {
                                    // 0xf3b20240
                                    DataType dt =
                                        Dt_size_14_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
                                    vqmovun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000080: {
                                // 0xf3b20280
                                DataType dt =
                                    Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
                                                        ((instr >> 4) & 0x4));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
                                vqmovn(al, dt, DRegister(rd), QRegister(rm));
                                break;
                              }
                              case 0x00000100: {
                                // 0xf3b20300
                                if ((instr & 0x00000040) == 0x00000000) {
                                  DataType dt =
                                      Dt_size_17_Decode((instr >> 18) & 0x3);
                                  if (dt.Is(kDataTypeValueInvalid)) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  uint32_t imm = dt.GetSize();
                                  // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
                                  vshll(al,
                                        dt,
                                        QRegister(rd),
                                        DRegister(rm),
                                        imm);
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000180: {
                                // 0xf3b20380
                                switch (instr & 0x000c0040) {
                                  case 0x00080000: {
                                    // 0xf3ba0380
                                    UnimplementedA32("SHA1SU1", instr);
                                    break;
                                  }
                                  case 0x00080040: {
                                    // 0xf3ba03c0
                                    UnimplementedA32("SHA256SU0", instr);
                                    break;
                                  }
                                  default:
                                    UnallocatedA32(instr);
                                    break;
                                }
                                break;
                              }
                              case 0x00000400: {
                                // 0xf3b20600
                                if ((instr & 0x000c0040) == 0x00040000) {
                                  unsigned rd = ExtractDRegister(instr, 22, 12);
                                  if ((instr & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rm = ExtractQRegister(instr, 5, 0);
                                  // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
                                  vcvt(al,
                                       F16,
                                       F32,
                                       DRegister(rd),
                                       QRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000480: {
                                // 0xf3b20680
                                switch (instr & 0x00000040) {
                                  case 0x00000000: {
                                    // 0xf3b20680
                                    DataType dt =
                                        Dt_size_16_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VRINTM{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vrintm(dt, DRegister(rd), DRegister(rm));
                                    break;
                                  }
                                  case 0x00000040: {
                                    // 0xf3b206c0
                                    DataType dt =
                                        Dt_size_16_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VRINTM{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vrintm(dt, QRegister(rd), QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000500: {
                                // 0xf3b20700
                                if ((instr & 0x000c0040) == 0x00040000) {
                                  if (((instr >> 12) & 1) != 0) {
                                    UnallocatedA32(instr);
                                    return;
                                  }
                                  unsigned rd = ExtractQRegister(instr, 22, 12);
                                  unsigned rm = ExtractDRegister(instr, 5, 0);
                                  // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
                                  vcvt(al,
                                       F32,
                                       F16,
                                       QRegister(rd),
                                       DRegister(rm));
                                } else {
                                  UnallocatedA32(instr);
                                }
                                break;
                              }
                              case 0x00000580: {
                                // 0xf3b20780
                                switch (instr & 0x00000040) {
                                  case 0x00000000: {
                                    // 0xf3b20780
                                    DataType dt =
                                        Dt_size_16_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VRINTP{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vrintp(dt, DRegister(rd), DRegister(rm));
                                    break;
                                  }
                                  case 0x00000040: {
                                    // 0xf3b207c0
                                    DataType dt =
                                        Dt_size_16_Decode((instr >> 18) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VRINTP{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vrintp(dt, QRegister(rd), QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00030000: {
                            // 0xf3b30000
                            switch (instr & 0x00000440) {
                              case 0x00000000: {
                                // 0xf3b30000
                                switch (instr & 0x000c0100) {
                                  case 0x00080000: {
                                    // 0xf3bb0000
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
                                    vcvta(dt,
                                          F32,
                                          DRegister(rd),
                                          DRegister(rm));
                                    break;
                                  }
                                  case 0x00080100: {
                                    // 0xf3bb0100
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
                                    vcvtn(dt,
                                          F32,
                                          DRegister(rd),
                                          DRegister(rm));
                                    break;
                                  }
                                  default:
                                    UnallocatedA32(instr);
                                    break;
                                }
                                break;
                              }
                              case 0x00000040: {
                                // 0xf3b30040
                                switch (instr & 0x000c0100) {
                                  case 0x00080000: {
                                    // 0xf3bb0040
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
                                    vcvta(dt,
                                          F32,
                                          QRegister(rd),
                                          QRegister(rm));
                                    break;
                                  }
                                  case 0x00080100: {
                                    // 0xf3bb0140
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
                                    vcvtn(dt,
                                          F32,
                                          QRegister(rd),
                                          QRegister(rm));
                                    break;
                                  }
                                  default:
                                    UnallocatedA32(instr);
                                    break;
                                }
                                break;
                              }
                              case 0x00000400: {
                                // 0xf3b30400
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b30400
                                    DataType dt = Dt_F_size_4_Decode(
                                        ((instr >> 18) & 0x3) |
                                        ((instr >> 6) & 0x4));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vrecpe(al,
                                           dt,
                                           DRegister(rd),
                                           DRegister(rm));
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b30480
                                    DataType dt = Dt_F_size_4_Decode(
                                        ((instr >> 18) & 0x3) |
                                        ((instr >> 6) & 0x4));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
                                    vrsqrte(al,
                                            dt,
                                            DRegister(rd),
                                            DRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000440: {
                                // 0xf3b30440
                                switch (instr & 0x00000080) {
                                  case 0x00000000: {
                                    // 0xf3b30440
                                    DataType dt = Dt_F_size_4_Decode(
                                        ((instr >> 18) & 0x3) |
                                        ((instr >> 6) & 0x4));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vrecpe(al,
                                           dt,
                                           QRegister(rd),
                                           QRegister(rm));
                                    break;
                                  }
                                  case 0x00000080: {
                                    // 0xf3b304c0
                                    DataType dt = Dt_F_size_4_Decode(
                                        ((instr >> 18) & 0x3) |
                                        ((instr >> 6) & 0x4));
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
                                    vrsqrte(al,
                                            dt,
                                            QRegister(rd),
                                            QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00030200: {
                            // 0xf3b30200
                            switch (instr & 0x000c0440) {
                              case 0x00080000: {
                                // 0xf3bb0200
                                switch (instr & 0x00000100) {
                                  case 0x00000000: {
                                    // 0xf3bb0200
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
                                    vcvtp(dt,
                                          F32,
                                          DRegister(rd),
                                          DRegister(rm));
                                    break;
                                  }
                                  case 0x00000100: {
                                    // 0xf3bb0300
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
                                    vcvtm(dt,
                                          F32,
                                          DRegister(rd),
                                          DRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00080040: {
                                // 0xf3bb0240
                                switch (instr & 0x00000100) {
                                  case 0x00000000: {
                                    // 0xf3bb0240
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
                                    vcvtp(dt,
                                          F32,
                                          QRegister(rd),
                                          QRegister(rm));
                                    break;
                                  }
                                  case 0x00000100: {
                                    // 0xf3bb0340
                                    DataType dt =
                                        Dt_op_3_Decode((instr >> 7) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
                                    vcvtm(dt,
                                          F32,
                                          QRegister(rd),
                                          QRegister(rm));
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00080400: {
                                // 0xf3bb0600
                                DataType dt1 =
                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
                                if (dt1.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt2 =
                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
                                if (dt2.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
                                vcvt(al,
                                     dt1,
                                     dt2,
                                     DRegister(rd),
                                     DRegister(rm));
                                break;
                              }
                              case 0x00080440: {
                                // 0xf3bb0640
                                DataType dt1 =
                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
                                if (dt1.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt2 =
                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
                                if (dt2.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
                                vcvt(al,
                                     dt1,
                                     dt2,
                                     QRegister(rd),
                                     QRegister(rm));
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000800: {
                        // 0xf3b00800
                        switch (instr & 0x00000440) {
                          case 0x00000000: {
                            // 0xf3b00800
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned first = ExtractDRegister(instr, 7, 16);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0x3) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 1;
                                break;
                              case 0x1:
                                length = 2;
                                break;
                              case 0x2:
                                length = 3;
                                break;
                              case 0x3:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
                            vtbl(al,
                                 Untyped8,
                                 DRegister(rd),
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 DRegister(rm));
                            break;
                          }
                          case 0x00000040: {
                            // 0xf3b00840
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned first = ExtractDRegister(instr, 7, 16);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0x3) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 1;
                                break;
                              case 0x1:
                                length = 2;
                                break;
                              case 0x2:
                                length = 3;
                                break;
                              case 0x3:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
                            vtbx(al,
                                 Untyped8,
                                 DRegister(rd),
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 DRegister(rm));
                            break;
                          }
                          case 0x00000400: {
                            // 0xf3b00c00
                            if ((instr & 0x00000380) == 0x00000000) {
                              unsigned lane;
                              DataType dt =
                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
                              vdup(al,
                                   dt,
                                   DRegister(rd),
                                   DRegisterLane(rm, lane));
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                          case 0x00000440: {
                            // 0xf3b00c40
                            if ((instr & 0x00000380) == 0x00000000) {
                              unsigned lane;
                              DataType dt =
                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
                              vdup(al,
                                   dt,
                                   QRegister(rd),
                                   DRegisterLane(rm, lane));
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              default: {
                switch (instr & 0x00000c40) {
                  case 0x00000000: {
                    // 0xf2800000
                    switch (instr & 0x00000300) {
                      case 0x00000000: {
                        // 0xf2800000
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                        vaddl(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf2800100
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rn = ExtractQRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
                        vaddw(al,
                              dt,
                              QRegister(rd),
                              QRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800200
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                        vsubl(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000300: {
                        // 0xf2800300
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rn = ExtractQRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
                        vsubw(al,
                              dt,
                              QRegister(rd),
                              QRegister(rn),
                              DRegister(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0xf2800040
                    switch (instr & 0x00000200) {
                      case 0x00000000: {
                        // 0xf2800040
                        switch (instr & 0x01000000) {
                          case 0x00000000: {
                            // 0xf2800040
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmla(al,
                                 dt,
                                 DRegister(rd),
                                 DRegister(rn),
                                 DRegisterLane(rm, lane));
                            break;
                          }
                          case 0x01000000: {
                            // 0xf3800040
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmla(al,
                                 dt,
                                 QRegister(rd),
                                 QRegister(rn),
                                 DRegisterLane(rm, lane));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800240
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800240
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_size_11_Decode((instr >> 20) & 0x3,
                                                  (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmlal(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegisterLane(rm, lane));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800340
                            if ((instr & 0x01000000) == 0x00000000) {
                              if (((instr & 0x300000) == 0x300000)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              uint32_t mvm =
                                  (instr & 0xf) | ((instr >> 1) & 0x10);
                              uint32_t shift = 4;
                              if (dt.Is(S16)) {
                                shift = 3;
                              }
                              uint32_t vm = mvm & ((1 << shift) - 1);
                              uint32_t index = mvm >> shift;
                              // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
                              vqdmlal(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rn),
                                      DRegister(vm),
                                      index);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000400: {
                    // 0xf2800400
                    switch (instr & 0x00000300) {
                      case 0x00000000: {
                        // 0xf2800400
                        switch (instr & 0x01000000) {
                          case 0x00000000: {
                            // 0xf2800400
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
                            vaddhn(al,
                                   dt,
                                   DRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                            break;
                          }
                          case 0x01000000: {
                            // 0xf3800400
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
                            vraddhn(al,
                                    dt,
                                    DRegister(rd),
                                    QRegister(rn),
                                    QRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000100: {
                        // 0xf2800500
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                        vabal(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800600
                        switch (instr & 0x01000000) {
                          case 0x00000000: {
                            // 0xf2800600
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
                            vsubhn(al,
                                   dt,
                                   DRegister(rd),
                                   QRegister(rn),
                                   QRegister(rm));
                            break;
                          }
                          case 0x01000000: {
                            // 0xf3800600
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
                            vrsubhn(al,
                                    dt,
                                    DRegister(rd),
                                    QRegister(rn),
                                    QRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000300: {
                        // 0xf2800700
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
                                                         ((instr >> 22) & 0x4));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                        vabdl(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000440: {
                    // 0xf2800440
                    switch (instr & 0x00000200) {
                      case 0x00000000: {
                        // 0xf2800440
                        switch (instr & 0x01000000) {
                          case 0x00000000: {
                            // 0xf2800440
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmls(al,
                                 dt,
                                 DRegister(rd),
                                 DRegister(rn),
                                 DRegisterLane(rm, lane));
                            break;
                          }
                          case 0x01000000: {
                            // 0xf3800440
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
                                                           (instr >> 8) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmls(al,
                                 dt,
                                 QRegister(rd),
                                 QRegister(rn),
                                 DRegisterLane(rm, lane));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800640
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800640
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_size_11_Decode((instr >> 20) & 0x3,
                                                  (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            int lane;
                            unsigned rm =
                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                            // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
                            vmlsl(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegisterLane(rm, lane));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800740
                            if ((instr & 0x01000000) == 0x00000000) {
                              if (((instr & 0x300000) == 0x300000)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              uint32_t mvm =
                                  (instr & 0xf) | ((instr >> 1) & 0x10);
                              uint32_t shift = 4;
                              if (dt.Is(S16)) {
                                shift = 3;
                              }
                              uint32_t vm = mvm & ((1 << shift) - 1);
                              uint32_t index = mvm >> shift;
                              // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
                              vqdmlsl(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rn),
                                      DRegister(vm),
                                      index);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000800: {
                    // 0xf2800800
                    switch (instr & 0x00000300) {
                      case 0x00000000: {
                        // 0xf2800800
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
                                                        (instr >> 24) & 0x1);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
                        vmlal(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf2800900
                        if ((instr & 0x01000000) == 0x00000000) {
                          if (((instr & 0x300000) == 0x300000)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedA32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                          vqdmlal(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegister(rm));
                        } else {
                          UnallocatedA32(instr);
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800a00
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
                                                        (instr >> 24) & 0x1);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
                        vmlsl(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000300: {
                        // 0xf2800b00
                        if ((instr & 0x01000000) == 0x00000000) {
                          if (((instr & 0x300000) == 0x300000)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedA32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                          vqdmlsl(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegister(rm));
                        } else {
                          UnallocatedA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000840: {
                    // 0xf2800840
                    switch (instr & 0x00000200) {
                      case 0x00000000: {
                        // 0xf2800840
                        switch (instr & 0x01000000) {
                          case 0x00000000: {
                            // 0xf2800840
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_F_size_3_Decode(
                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            uint32_t mvm =
                                (instr & 0xf) | ((instr >> 1) & 0x10);
                            uint32_t shift = 4;
                            if (dt.Is(I16)) {
                              shift = 3;
                            }
                            uint32_t vm = mvm & ((1 << shift) - 1);
                            uint32_t index = mvm >> shift;
                            // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
                            vmul(al,
                                 dt,
                                 DRegister(rd),
                                 DRegister(rn),
                                 DRegister(vm),
                                 index);
                            break;
                          }
                          case 0x01000000: {
                            // 0xf3800840
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_F_size_3_Decode(
                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if (((instr >> 16) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rn = ExtractQRegister(instr, 7, 16);
                            uint32_t mvm =
                                (instr & 0xf) | ((instr >> 1) & 0x10);
                            uint32_t shift = 4;
                            if (dt.Is(I16)) {
                              shift = 3;
                            }
                            uint32_t vm = mvm & ((1 << shift) - 1);
                            uint32_t index = mvm >> shift;
                            // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
                            vmul(al,
                                 dt,
                                 QRegister(rd),
                                 QRegister(rn),
                                 DRegister(vm),
                                 index);
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0xf2800a40
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800a40
                            if (((instr & 0x300000) == 0x300000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_U_size_2_Decode(
                                ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            unsigned rn = ExtractDRegister(instr, 7, 16);
                            uint32_t mvm =
                                (instr & 0xf) | ((instr >> 1) & 0x10);
                            uint32_t shift = 4;
                            if (dt.Is(S16) || dt.Is(U16)) {
                              shift = 3;
                            }
                            uint32_t vm = mvm & ((1 << shift) - 1);
                            uint32_t index = mvm >> shift;
                            // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
                            vmull(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegister(vm),
                                  index);
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800b40
                            if ((instr & 0x01000000) == 0x00000000) {
                              if (((instr & 0x300000) == 0x300000)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt =
                                  Dt_size_13_Decode((instr >> 20) & 0x3);
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              unsigned rn = ExtractDRegister(instr, 7, 16);
                              int lane;
                              unsigned rm = ExtractDRegisterAndLane(instr,
                                                                    dt,
                                                                    5,
                                                                    0,
                                                                    &lane);
                              // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
                              vqdmull(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rn),
                                      DRegisterLane(rm, lane));
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000c00: {
                    // 0xf2800c00
                    switch (instr & 0x00000100) {
                      case 0x00000000: {
                        // 0xf2800c00
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_op_U_size_1_Decode(
                            ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
                            ((instr >> 6) & 0x8));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        unsigned rm = ExtractDRegister(instr, 5, 0);
                        // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                        vmull(al,
                              dt,
                              QRegister(rd),
                              DRegister(rn),
                              DRegister(rm));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf2800d00
                        if ((instr & 0x01000200) == 0x00000000) {
                          if (((instr & 0x300000) == 0x300000)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          if (((instr >> 12) & 1) != 0) {
                            UnallocatedA32(instr);
                            return;
                          }
                          unsigned rd = ExtractQRegister(instr, 22, 12);
                          unsigned rn = ExtractDRegister(instr, 7, 16);
                          unsigned rm = ExtractDRegister(instr, 5, 0);
                          // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
                          vqdmull(al,
                                  dt,
                                  QRegister(rd),
                                  DRegister(rn),
                                  DRegister(rm));
                        } else {
                          UnallocatedA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000c40: {
                    // 0xf2800c40
                    switch (instr & 0x01000300) {
                      case 0x00000000: {
                        // 0xf2800c40
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        int lane;
                        unsigned rm =
                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                        // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
                        vqdmulh(al,
                                dt,
                                DRegister(rd),
                                DRegister(rn),
                                DRegisterLane(rm, lane));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf2800d40
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 22, 12);
                        unsigned rn = ExtractDRegister(instr, 7, 16);
                        int lane;
                        unsigned rm =
                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                        // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
                        vqrdmulh(al,
                                 dt,
                                 DRegister(rd),
                                 DRegister(rn),
                                 DRegisterLane(rm, lane));
                        break;
                      }
                      case 0x01000000: {
                        // 0xf3800c40
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rn = ExtractQRegister(instr, 7, 16);
                        int lane;
                        unsigned rm =
                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                        // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
                        vqdmulh(al,
                                dt,
                                QRegister(rd),
                                QRegister(rn),
                                DRegisterLane(rm, lane));
                        break;
                      }
                      case 0x01000100: {
                        // 0xf3800d40
                        if (((instr & 0x300000) == 0x300000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 12) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 22, 12);
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rn = ExtractQRegister(instr, 7, 16);
                        int lane;
                        unsigned rm =
                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
                        // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
                        vqrdmulh(al,
                                 dt,
                                 QRegister(rd),
                                 QRegister(rn),
                                 DRegisterLane(rm, lane));
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00800010: {
            // 0xf2800010
            switch (instr & 0x00000040) {
              case 0x00000000: {
                // 0xf2800010
                switch (instr & 0x00000c00) {
                  case 0x00000000: {
                    // 0xf2800010
                    switch (instr & 0x00380080) {
                      case 0x00000000: {
                        // 0xf2800010
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800010
                            switch (instr & 0x00000200) {
                              default: {
                                switch (instr & 0x00000020) {
                                  case 0x00000020: {
                                    // 0xf2800030
                                    if (((instr & 0xd00) == 0x100) ||
                                        ((instr & 0xd00) == 0x500) ||
                                        ((instr & 0xd00) == 0x900) ||
                                        ((instr & 0xe00) == 0xe00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVmvn::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmvn::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmvn(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmov(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800110
                            switch (instr & 0x00000020) {
                              case 0x00000000: {
                                // 0xf2800110
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVorr::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                DOperand imm = ImmediateVorr::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
                                break;
                              }
                              case 0x00000020: {
                                // 0xf2800130
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVbic::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                DOperand imm = ImmediateVbic::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
                                break;
                              }
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0xf2800010
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vshr(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800110
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vsra(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                          case 0x00000200: {
                            // 0xf2800210
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                          case 0x00000300: {
                            // 0xf2800310
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000400: {
                    // 0xf2800410
                    switch (instr & 0x00380080) {
                      case 0x00000000: {
                        // 0xf2800410
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800410
                            switch (instr & 0x00000200) {
                              default: {
                                switch (instr & 0x00000020) {
                                  case 0x00000020: {
                                    // 0xf2800430
                                    if (((instr & 0xd00) == 0x100) ||
                                        ((instr & 0xd00) == 0x500) ||
                                        ((instr & 0xd00) == 0x900) ||
                                        ((instr & 0xe00) == 0xe00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVmvn::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmvn::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmvn(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmov(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800510
                            switch (instr & 0x00000020) {
                              case 0x00000000: {
                                // 0xf2800510
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVorr::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                DOperand imm = ImmediateVorr::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
                                break;
                              }
                              case 0x00000020: {
                                // 0xf2800530
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVbic::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                DOperand imm = ImmediateVbic::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
                                break;
                              }
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0xf2800410
                            if ((instr & 0x01000000) == 0x01000000) {
                              if (((instr & 0x380080) == 0x0)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt = Dt_L_imm6_4_Decode(
                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              uint32_t imm6 = (instr >> 16) & 0x3f;
                              uint32_t imm =
                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                  imm6;
                              // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
                              vsri(al, dt, DRegister(rd), DRegister(rm), imm);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800510
                            switch (instr & 0x01000000) {
                              case 0x00000000: {
                                // 0xf2800510
                                if (((instr & 0x380080) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm =
                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshl(al, dt, DRegister(rd), DRegister(rm), imm);
                                break;
                              }
                              case 0x01000000: {
                                // 0xf3800510
                                if (((instr & 0x380080) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm =
                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
                                vsli(al, dt, DRegister(rd), DRegister(rm), imm);
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0xf2800610
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                            // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                          case 0x00000300: {
                            // 0xf2800710
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                            // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000800: {
                    // 0xf2800810
                    switch (instr & 0x00000080) {
                      case 0x00000000: {
                        // 0xf2800810
                        switch (instr & 0x00380000) {
                          case 0x00000000: {
                            // 0xf2800810
                            switch (instr & 0x00000100) {
                              case 0x00000000: {
                                // 0xf2800810
                                switch (instr & 0x00000200) {
                                  default: {
                                    switch (instr & 0x00000020) {
                                      case 0x00000020: {
                                        // 0xf2800830
                                        if (((instr & 0xd00) == 0x100) ||
                                            ((instr & 0xd00) == 0x500) ||
                                            ((instr & 0xd00) == 0x900) ||
                                            ((instr & 0xe00) == 0xe00)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = (instr >> 8) & 0xf;
                                        DataType dt =
                                            ImmediateVmvn::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractDRegister(instr, 22, 12);
                                        DOperand imm =
                                            ImmediateVmvn::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                        vmvn(al, dt, DRegister(rd), imm);
                                        break;
                                      }
                                      default: {
                                        if (((instr & 0x920) == 0x100) ||
                                            ((instr & 0x520) == 0x100) ||
                                            ((instr & 0x820) == 0x20) ||
                                            ((instr & 0x420) == 0x20) ||
                                            ((instr & 0x220) == 0x20) ||
                                            ((instr & 0x120) == 0x120)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = ((instr >> 8) & 0xf) |
                                                         ((instr >> 1) & 0x10);
                                        DataType dt =
                                            ImmediateVmov::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractDRegister(instr, 22, 12);
                                        DOperand imm =
                                            ImmediateVmov::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                        vmov(al, dt, DRegister(rd), imm);
                                        break;
                                      }
                                    }
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2800910
                                switch (instr & 0x00000020) {
                                  case 0x00000000: {
                                    // 0xf2800910
                                    if (((instr & 0x100) == 0x0) ||
                                        ((instr & 0xc00) == 0xc00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVorr::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVorr::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vorr(al,
                                         dt,
                                         DRegister(rd),
                                         DRegister(rd),
                                         imm);
                                    break;
                                  }
                                  case 0x00000020: {
                                    // 0xf2800930
                                    if (((instr & 0x100) == 0x0) ||
                                        ((instr & 0xc00) == 0xc00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVbic::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVbic::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vbic(al,
                                         dt,
                                         DRegister(rd),
                                         DRegister(rd),
                                         imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00180000: {
                            // 0xf2980810
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2980810
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2980810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshrn(al,
                                          dt,
                                          DRegister(rd),
                                          QRegister(rm),
                                          imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3980810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqshrun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm),
                                            imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2980910
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqshrn(al,
                                       dt,
                                       DRegister(rd),
                                       QRegister(rm),
                                       imm);
                                break;
                              }
                              case 0x00000200: {
                                // 0xf2980a10
                                if (((instr & 0x380000) == 0x0) ||
                                    ((instr & 0x3f0000) == 0x80000) ||
                                    ((instr & 0x3f0000) == 0x100000) ||
                                    ((instr & 0x3f0000) == 0x200000)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = imm6 - dt.GetSize();
                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshll(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rm),
                                      imm);
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          case 0x00280000: {
                            // 0xf2a80810
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2a80810
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2a80810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshrn(al,
                                          dt,
                                          DRegister(rd),
                                          QRegister(rm),
                                          imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3a80810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqshrun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm),
                                            imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2a80910
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqshrn(al,
                                       dt,
                                       DRegister(rd),
                                       QRegister(rm),
                                       imm);
                                break;
                              }
                              case 0x00000200: {
                                // 0xf2a80a10
                                if (((instr & 0x380000) == 0x0) ||
                                    ((instr & 0x3f0000) == 0x80000) ||
                                    ((instr & 0x3f0000) == 0x100000) ||
                                    ((instr & 0x3f0000) == 0x200000)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = imm6 - dt.GetSize();
                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshll(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rm),
                                      imm);
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          case 0x00300000: {
                            // 0xf2b00810
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2b00810
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2b00810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshrn(al,
                                          dt,
                                          DRegister(rd),
                                          QRegister(rm),
                                          imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3b00810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqshrun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm),
                                            imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2b00910
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqshrn(al,
                                       dt,
                                       DRegister(rd),
                                       QRegister(rm),
                                       imm);
                                break;
                              }
                              case 0x00000200: {
                                // 0xf2b00a10
                                if (((instr & 0x380000) == 0x0) ||
                                    ((instr & 0x3f0000) == 0x80000) ||
                                    ((instr & 0x3f0000) == 0x100000) ||
                                    ((instr & 0x3f0000) == 0x200000)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = imm6 - dt.GetSize();
                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshll(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rm),
                                      imm);
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          case 0x00380000: {
                            // 0xf2b80810
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2b80810
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2b80810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshrn(al,
                                          dt,
                                          DRegister(rd),
                                          QRegister(rm),
                                          imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3b80810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqshrun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm),
                                            imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2b80910
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqshrn(al,
                                       dt,
                                       DRegister(rd),
                                       QRegister(rm),
                                       imm);
                                break;
                              }
                              case 0x00000200: {
                                // 0xf2b80a10
                                if (((instr & 0x380000) == 0x0) ||
                                    ((instr & 0x3f0000) == 0x80000) ||
                                    ((instr & 0x3f0000) == 0x100000) ||
                                    ((instr & 0x3f0000) == 0x200000)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                unsigned rm = ExtractDRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = imm6 - dt.GetSize();
                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshll(al,
                                      dt,
                                      QRegister(rd),
                                      DRegister(rm),
                                      imm);
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          default: {
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2800810
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2800810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshrn(al,
                                          dt,
                                          DRegister(rd),
                                          QRegister(rm),
                                          imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3800810
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqshrun(al,
                                            dt,
                                            DRegister(rd),
                                            QRegister(rm),
                                            imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2800910
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqshrn(al,
                                       dt,
                                       DRegister(rd),
                                       QRegister(rm),
                                       imm);
                                break;
                              }
                              case 0x00000200: {
                                // 0xf2800a10
                                switch (instr & 0x00070000) {
                                  case 0x00000000: {
                                    // 0xf2800a10
                                    switch (instr & 0x003f0000) {
                                      case 0x00080000: {
                                        // 0xf2880a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x380000) == 0x180000) ||
                                            ((instr & 0x380000) == 0x280000) ||
                                            ((instr & 0x380000) == 0x300000) ||
                                            ((instr & 0x380000) == 0x380000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_U_imm3H_1_Decode(
                                            ((instr >> 19) & 0x7) |
                                            ((instr >> 21) & 0x8));
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
                                        vmovl(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm));
                                        break;
                                      }
                                      case 0x00090000: {
                                        // 0xf2890a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000a0000: {
                                        // 0xf28a0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000b0000: {
                                        // 0xf28b0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000c0000: {
                                        // 0xf28c0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000d0000: {
                                        // 0xf28d0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000e0000: {
                                        // 0xf28e0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x000f0000: {
                                        // 0xf28f0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00100000: {
                                        // 0xf2900a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x380000) == 0x180000) ||
                                            ((instr & 0x380000) == 0x280000) ||
                                            ((instr & 0x380000) == 0x300000) ||
                                            ((instr & 0x380000) == 0x380000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_U_imm3H_1_Decode(
                                            ((instr >> 19) & 0x7) |
                                            ((instr >> 21) & 0x8));
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
                                        vmovl(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm));
                                        break;
                                      }
                                      case 0x00110000: {
                                        // 0xf2910a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00120000: {
                                        // 0xf2920a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00130000: {
                                        // 0xf2930a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00140000: {
                                        // 0xf2940a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00150000: {
                                        // 0xf2950a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00160000: {
                                        // 0xf2960a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00170000: {
                                        // 0xf2970a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00180000: {
                                        // 0xf2980a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00190000: {
                                        // 0xf2990a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001a0000: {
                                        // 0xf29a0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001b0000: {
                                        // 0xf29b0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001c0000: {
                                        // 0xf29c0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001d0000: {
                                        // 0xf29d0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001e0000: {
                                        // 0xf29e0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x001f0000: {
                                        // 0xf29f0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00200000: {
                                        // 0xf2a00a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x380000) == 0x180000) ||
                                            ((instr & 0x380000) == 0x280000) ||
                                            ((instr & 0x380000) == 0x300000) ||
                                            ((instr & 0x380000) == 0x380000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt = Dt_U_imm3H_1_Decode(
                                            ((instr >> 19) & 0x7) |
                                            ((instr >> 21) & 0x8));
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
                                        vmovl(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm));
                                        break;
                                      }
                                      case 0x00210000: {
                                        // 0xf2a10a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00220000: {
                                        // 0xf2a20a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00230000: {
                                        // 0xf2a30a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00240000: {
                                        // 0xf2a40a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00250000: {
                                        // 0xf2a50a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00260000: {
                                        // 0xf2a60a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00270000: {
                                        // 0xf2a70a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00280000: {
                                        // 0xf2a80a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00290000: {
                                        // 0xf2a90a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002a0000: {
                                        // 0xf2aa0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002b0000: {
                                        // 0xf2ab0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002c0000: {
                                        // 0xf2ac0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002d0000: {
                                        // 0xf2ad0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002e0000: {
                                        // 0xf2ae0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x002f0000: {
                                        // 0xf2af0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00300000: {
                                        // 0xf2b00a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00310000: {
                                        // 0xf2b10a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00320000: {
                                        // 0xf2b20a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00330000: {
                                        // 0xf2b30a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00340000: {
                                        // 0xf2b40a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00350000: {
                                        // 0xf2b50a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00360000: {
                                        // 0xf2b60a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00370000: {
                                        // 0xf2b70a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00380000: {
                                        // 0xf2b80a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x00390000: {
                                        // 0xf2b90a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003a0000: {
                                        // 0xf2ba0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003b0000: {
                                        // 0xf2bb0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003c0000: {
                                        // 0xf2bc0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003d0000: {
                                        // 0xf2bd0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003e0000: {
                                        // 0xf2be0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      case 0x003f0000: {
                                        // 0xf2bf0a10
                                        if (((instr & 0x380000) == 0x0) ||
                                            ((instr & 0x3f0000) == 0x80000) ||
                                            ((instr & 0x3f0000) == 0x100000) ||
                                            ((instr & 0x3f0000) == 0x200000)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        DataType dt =
                                            Dt_imm6_4_Decode((instr >> 19) &
                                                                 0x7,
                                                             (instr >> 24) &
                                                                 0x1);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        unsigned rm =
                                            ExtractDRegister(instr, 5, 0);
                                        uint32_t imm6 = (instr >> 16) & 0x3f;
                                        uint32_t imm = imm6 - dt.GetSize();
                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                        vshll(al,
                                              dt,
                                              QRegister(rd),
                                              DRegister(rm),
                                              imm);
                                        break;
                                      }
                                      default:
                                        UnallocatedA32(instr);
                                        break;
                                    }
                                    break;
                                  }
                                  default: {
                                    if (((instr & 0x380000) == 0x0) ||
                                        ((instr & 0x3f0000) == 0x80000) ||
                                        ((instr & 0x3f0000) == 0x100000) ||
                                        ((instr & 0x3f0000) == 0x200000)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_4_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    unsigned rm = ExtractDRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = imm6 - dt.GetSize();
                                    // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vshll(al,
                                          dt,
                                          QRegister(rd),
                                          DRegister(rm),
                                          imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000c00: {
                    // 0xf2800c10
                    switch (instr & 0x00000080) {
                      case 0x00000000: {
                        // 0xf2800c10
                        switch (instr & 0x00200000) {
                          case 0x00000000: {
                            // 0xf2800c10
                            switch (instr & 0x00180000) {
                              case 0x00000000: {
                                // 0xf2800c10
                                switch (instr & 0x00000300) {
                                  case 0x00000200: {
                                    // 0xf2800e10
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmov(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                  case 0x00000300: {
                                    // 0xf2800f10
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    DOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                    vmov(al, dt, DRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    switch (instr & 0x00000020) {
                                      case 0x00000020: {
                                        // 0xf2800c30
                                        switch (instr & 0x00000f20) {
                                          case 0x00000000: {
                                            // 0xf2800c10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000020: {
                                            // 0xf2800c30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000200: {
                                            // 0xf2800e10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000220: {
                                            // 0xf2800e30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000400: {
                                            // 0xf2800c10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000420: {
                                            // 0xf2800c30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000600: {
                                            // 0xf2800e10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000620: {
                                            // 0xf2800e30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000800: {
                                            // 0xf2800c10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000820: {
                                            // 0xf2800c30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000a00: {
                                            // 0xf2800e10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000a20: {
                                            // 0xf2800e30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000c00: {
                                            // 0xf2800c10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000c20: {
                                            // 0xf2800c30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000d00: {
                                            // 0xf2800d10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000d20: {
                                            // 0xf2800d30
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000e00: {
                                            // 0xf2800e10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000e20: {
                                            // 0xf2800e30
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000f00: {
                                            // 0xf2800f10
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractDRegister(instr, 22, 12);
                                            DOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, DRegister(rd), imm);
                                            break;
                                          }
                                          default:
                                            UnallocatedA32(instr);
                                            break;
                                        }
                                        break;
                                      }
                                      default: {
                                        if (((instr & 0x920) == 0x100) ||
                                            ((instr & 0x520) == 0x100) ||
                                            ((instr & 0x820) == 0x20) ||
                                            ((instr & 0x420) == 0x20) ||
                                            ((instr & 0x220) == 0x20) ||
                                            ((instr & 0x120) == 0x120)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = ((instr >> 8) & 0xf) |
                                                         ((instr >> 1) & 0x10);
                                        DataType dt =
                                            ImmediateVmov::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractDRegister(instr, 22, 12);
                                        DOperand imm =
                                            ImmediateVmov::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
                                        vmov(al, dt, DRegister(rd), imm);
                                        break;
                                      }
                                    }
                                    break;
                                  }
                                }
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          default: {
                            if ((instr & 0x00000200) == 0x00000200) {
                              if (((instr & 0x200000) == 0x0)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt1 = Dt_op_U_1_Decode1(
                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
                              if (dt1.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt2 = Dt_op_U_1_Decode2(
                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
                              if (dt2.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractDRegister(instr, 22, 12);
                              unsigned rm = ExtractDRegister(instr, 5, 0);
                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
                              // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
                              vcvt(al,
                                   dt1,
                                   dt2,
                                   DRegister(rd),
                                   DRegister(rm),
                                   fbits);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000040: {
                // 0xf2800050
                switch (instr & 0x00000c00) {
                  case 0x00000000: {
                    // 0xf2800050
                    switch (instr & 0x00380080) {
                      case 0x00000000: {
                        // 0xf2800050
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800050
                            switch (instr & 0x00000200) {
                              default: {
                                switch (instr & 0x00000020) {
                                  case 0x00000020: {
                                    // 0xf2800070
                                    if (((instr & 0xd00) == 0x100) ||
                                        ((instr & 0xd00) == 0x500) ||
                                        ((instr & 0xd00) == 0x900) ||
                                        ((instr & 0xe00) == 0xe00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVmvn::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmvn::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmvn(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmov(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800150
                            switch (instr & 0x00000020) {
                              case 0x00000000: {
                                // 0xf2800150
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVorr::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                QOperand imm = ImmediateVorr::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
                                break;
                              }
                              case 0x00000020: {
                                // 0xf2800170
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVbic::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                QOperand imm = ImmediateVbic::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
                                break;
                              }
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0xf2800050
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vshr(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800150
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vsra(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                          case 0x00000200: {
                            // 0xf2800250
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                          case 0x00000300: {
                            // 0xf2800350
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                imm6;
                            // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000400: {
                    // 0xf2800450
                    switch (instr & 0x00380080) {
                      case 0x00000000: {
                        // 0xf2800450
                        switch (instr & 0x00000100) {
                          case 0x00000000: {
                            // 0xf2800450
                            switch (instr & 0x00000200) {
                              default: {
                                switch (instr & 0x00000020) {
                                  case 0x00000020: {
                                    // 0xf2800470
                                    if (((instr & 0xd00) == 0x100) ||
                                        ((instr & 0xd00) == 0x500) ||
                                        ((instr & 0xd00) == 0x900) ||
                                        ((instr & 0xe00) == 0xe00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVmvn::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmvn::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmvn(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmov(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800550
                            switch (instr & 0x00000020) {
                              case 0x00000000: {
                                // 0xf2800550
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVorr::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                QOperand imm = ImmediateVorr::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
                                break;
                              }
                              case 0x00000020: {
                                // 0xf2800570
                                if (((instr & 0x100) == 0x0) ||
                                    ((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned cmode = (instr >> 8) & 0xf;
                                DataType dt = ImmediateVbic::DecodeDt(cmode);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                QOperand imm = ImmediateVbic::DecodeImmediate(
                                    cmode,
                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
                                        ((instr >> 17) & 0x80));
                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
                                break;
                              }
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0xf2800450
                            if ((instr & 0x01000000) == 0x01000000) {
                              if (((instr & 0x380080) == 0x0)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt = Dt_L_imm6_4_Decode(
                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
                              if (dt.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if ((instr & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              uint32_t imm6 = (instr >> 16) & 0x3f;
                              uint32_t imm =
                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
                                  imm6;
                              // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
                              vsri(al, dt, QRegister(rd), QRegister(rm), imm);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                          case 0x00000100: {
                            // 0xf2800550
                            switch (instr & 0x01000000) {
                              case 0x00000000: {
                                // 0xf2800550
                                if (((instr & 0x380080) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm =
                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vshl(al, dt, QRegister(rd), QRegister(rm), imm);
                                break;
                              }
                              case 0x01000000: {
                                // 0xf3800550
                                if (((instr & 0x380080) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8));
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                if (((instr >> 12) & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractQRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm =
                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                                // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
                                vsli(al, dt, QRegister(rd), QRegister(rm), imm);
                                break;
                              }
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0xf2800650
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                            // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                          case 0x00000300: {
                            // 0xf2800750
                            if (((instr & 0x380080) == 0x0)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt =
                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
                                                       ((instr >> 4) & 0x8),
                                                   (instr >> 24) & 0x1);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            if (((instr >> 12) & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rd = ExtractQRegister(instr, 22, 12);
                            if ((instr & 1) != 0) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned rm = ExtractQRegister(instr, 5, 0);
                            uint32_t imm6 = (instr >> 16) & 0x3f;
                            uint32_t imm =
                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
                            // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                            vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000800: {
                    // 0xf2800850
                    switch (instr & 0x00000080) {
                      case 0x00000000: {
                        // 0xf2800850
                        switch (instr & 0x00380000) {
                          case 0x00000000: {
                            // 0xf2800850
                            switch (instr & 0x00000100) {
                              case 0x00000000: {
                                // 0xf2800850
                                switch (instr & 0x00000200) {
                                  default: {
                                    switch (instr & 0x00000020) {
                                      case 0x00000020: {
                                        // 0xf2800870
                                        if (((instr & 0xd00) == 0x100) ||
                                            ((instr & 0xd00) == 0x500) ||
                                            ((instr & 0xd00) == 0x900) ||
                                            ((instr & 0xe00) == 0xe00)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = (instr >> 8) & 0xf;
                                        DataType dt =
                                            ImmediateVmvn::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        QOperand imm =
                                            ImmediateVmvn::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                        vmvn(al, dt, QRegister(rd), imm);
                                        break;
                                      }
                                      default: {
                                        if (((instr & 0x920) == 0x100) ||
                                            ((instr & 0x520) == 0x100) ||
                                            ((instr & 0x820) == 0x20) ||
                                            ((instr & 0x420) == 0x20) ||
                                            ((instr & 0x220) == 0x20) ||
                                            ((instr & 0x120) == 0x120)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = ((instr >> 8) & 0xf) |
                                                         ((instr >> 1) & 0x10);
                                        DataType dt =
                                            ImmediateVmov::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        QOperand imm =
                                            ImmediateVmov::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                        vmov(al, dt, QRegister(rd), imm);
                                        break;
                                      }
                                    }
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2800950
                                switch (instr & 0x00000020) {
                                  case 0x00000000: {
                                    // 0xf2800950
                                    if (((instr & 0x100) == 0x0) ||
                                        ((instr & 0xc00) == 0xc00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVorr::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVorr::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vorr(al,
                                         dt,
                                         QRegister(rd),
                                         QRegister(rd),
                                         imm);
                                    break;
                                  }
                                  case 0x00000020: {
                                    // 0xf2800970
                                    if (((instr & 0x100) == 0x0) ||
                                        ((instr & 0xc00) == 0xc00)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = (instr >> 8) & 0xf;
                                    DataType dt =
                                        ImmediateVbic::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVbic::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vbic(al,
                                         dt,
                                         QRegister(rd),
                                         QRegister(rd),
                                         imm);
                                    break;
                                  }
                                }
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            switch (instr & 0x00000300) {
                              case 0x00000000: {
                                // 0xf2800850
                                switch (instr & 0x01000000) {
                                  case 0x00000000: {
                                    // 0xf2800850
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vrshrn(al,
                                           dt,
                                           DRegister(rd),
                                           QRegister(rm),
                                           imm);
                                    break;
                                  }
                                  case 0x01000000: {
                                    // 0xf3800850
                                    if (((instr & 0x380000) == 0x0)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    DataType dt =
                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
                                                         (instr >> 24) & 0x1);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractDRegister(instr, 22, 12);
                                    if ((instr & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rm = ExtractQRegister(instr, 5, 0);
                                    uint32_t imm6 = (instr >> 16) & 0x3f;
                                    uint32_t imm = dt.GetSize() - imm6;
                                    // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                    vqrshrun(al,
                                             dt,
                                             DRegister(rd),
                                             QRegister(rm),
                                             imm);
                                    break;
                                  }
                                }
                                break;
                              }
                              case 0x00000100: {
                                // 0xf2800950
                                if (((instr & 0x380000) == 0x0)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
                                                     (instr >> 24) & 0x1);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rd = ExtractDRegister(instr, 22, 12);
                                if ((instr & 1) != 0) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned rm = ExtractQRegister(instr, 5, 0);
                                uint32_t imm6 = (instr >> 16) & 0x3f;
                                uint32_t imm = dt.GetSize() - imm6;
                                // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                vqrshrn(al,
                                        dt,
                                        DRegister(rd),
                                        QRegister(rm),
                                        imm);
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000c00: {
                    // 0xf2800c50
                    switch (instr & 0x00000080) {
                      case 0x00000000: {
                        // 0xf2800c50
                        switch (instr & 0x00200000) {
                          case 0x00000000: {
                            // 0xf2800c50
                            switch (instr & 0x00180000) {
                              case 0x00000000: {
                                // 0xf2800c50
                                switch (instr & 0x00000300) {
                                  case 0x00000200: {
                                    // 0xf2800e50
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmov(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                  case 0x00000300: {
                                    // 0xf2800f50
                                    if (((instr & 0x920) == 0x100) ||
                                        ((instr & 0x520) == 0x100) ||
                                        ((instr & 0x820) == 0x20) ||
                                        ((instr & 0x420) == 0x20) ||
                                        ((instr & 0x220) == 0x20) ||
                                        ((instr & 0x120) == 0x120)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned cmode = ((instr >> 8) & 0xf) |
                                                     ((instr >> 1) & 0x10);
                                    DataType dt =
                                        ImmediateVmov::DecodeDt(cmode);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    if (((instr >> 12) & 1) != 0) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned rd =
                                        ExtractQRegister(instr, 22, 12);
                                    QOperand imm =
                                        ImmediateVmov::DecodeImmediate(
                                            cmode,
                                            (instr & 0xf) |
                                                ((instr >> 12) & 0x70) |
                                                ((instr >> 17) & 0x80));
                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                    vmov(al, dt, QRegister(rd), imm);
                                    break;
                                  }
                                  default: {
                                    switch (instr & 0x00000020) {
                                      case 0x00000020: {
                                        // 0xf2800c70
                                        switch (instr & 0x00000f20) {
                                          case 0x00000000: {
                                            // 0xf2800c50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000020: {
                                            // 0xf2800c70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000200: {
                                            // 0xf2800e50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000220: {
                                            // 0xf2800e70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000400: {
                                            // 0xf2800c50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000420: {
                                            // 0xf2800c70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000600: {
                                            // 0xf2800e50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000620: {
                                            // 0xf2800e70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000800: {
                                            // 0xf2800c50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000820: {
                                            // 0xf2800c70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000a00: {
                                            // 0xf2800e50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000a20: {
                                            // 0xf2800e70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000c00: {
                                            // 0xf2800c50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000c20: {
                                            // 0xf2800c70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000d00: {
                                            // 0xf2800d50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000d20: {
                                            // 0xf2800d70
                                            if (((instr & 0xd00) == 0x100) ||
                                                ((instr & 0xd00) == 0x500) ||
                                                ((instr & 0xd00) == 0x900) ||
                                                ((instr & 0xe00) == 0xe00)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode = (instr >> 8) & 0xf;
                                            DataType dt =
                                                ImmediateVmvn::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmvn::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmvn(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000e00: {
                                            // 0xf2800e50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000e20: {
                                            // 0xf2800e70
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          case 0x00000f00: {
                                            // 0xf2800f50
                                            if (((instr & 0x920) == 0x100) ||
                                                ((instr & 0x520) == 0x100) ||
                                                ((instr & 0x820) == 0x20) ||
                                                ((instr & 0x420) == 0x20) ||
                                                ((instr & 0x220) == 0x20) ||
                                                ((instr & 0x120) == 0x120)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned cmode =
                                                ((instr >> 8) & 0xf) |
                                                ((instr >> 1) & 0x10);
                                            DataType dt =
                                                ImmediateVmov::DecodeDt(cmode);
                                            if (dt.Is(kDataTypeValueInvalid)) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            if (((instr >> 12) & 1) != 0) {
                                              UnallocatedA32(instr);
                                              return;
                                            }
                                            unsigned rd =
                                                ExtractQRegister(instr, 22, 12);
                                            QOperand imm =
                                                ImmediateVmov::DecodeImmediate(
                                                    cmode,
                                                    (instr & 0xf) |
                                                        ((instr >> 12) & 0x70) |
                                                        ((instr >> 17) & 0x80));
                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
                                            vmov(al, dt, QRegister(rd), imm);
                                            break;
                                          }
                                          default:
                                            UnallocatedA32(instr);
                                            break;
                                        }
                                        break;
                                      }
                                      default: {
                                        if (((instr & 0x920) == 0x100) ||
                                            ((instr & 0x520) == 0x100) ||
                                            ((instr & 0x820) == 0x20) ||
                                            ((instr & 0x420) == 0x20) ||
                                            ((instr & 0x220) == 0x20) ||
                                            ((instr & 0x120) == 0x120)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned cmode = ((instr >> 8) & 0xf) |
                                                         ((instr >> 1) & 0x10);
                                        DataType dt =
                                            ImmediateVmov::DecodeDt(cmode);
                                        if (dt.Is(kDataTypeValueInvalid)) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        if (((instr >> 12) & 1) != 0) {
                                          UnallocatedA32(instr);
                                          return;
                                        }
                                        unsigned rd =
                                            ExtractQRegister(instr, 22, 12);
                                        QOperand imm =
                                            ImmediateVmov::DecodeImmediate(
                                                cmode,
                                                (instr & 0xf) |
                                                    ((instr >> 12) & 0x70) |
                                                    ((instr >> 17) & 0x80));
                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
                                        vmov(al, dt, QRegister(rd), imm);
                                        break;
                                      }
                                    }
                                    break;
                                  }
                                }
                                break;
                              }
                              default:
                                UnallocatedA32(instr);
                                break;
                            }
                            break;
                          }
                          default: {
                            if ((instr & 0x00000200) == 0x00000200) {
                              if (((instr & 0x200000) == 0x0)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt1 = Dt_op_U_1_Decode1(
                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
                              if (dt1.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              DataType dt2 = Dt_op_U_1_Decode2(
                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
                              if (dt2.Is(kDataTypeValueInvalid)) {
                                UnallocatedA32(instr);
                                return;
                              }
                              if (((instr >> 12) & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rd = ExtractQRegister(instr, 22, 12);
                              if ((instr & 1) != 0) {
                                UnallocatedA32(instr);
                                return;
                              }
                              unsigned rm = ExtractQRegister(instr, 5, 0);
                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
                              // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
                              vcvt(al,
                                   dt1,
                                   dt2,
                                   QRegister(rd),
                                   QRegister(rm),
                                   fbits);
                            } else {
                              UnallocatedA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
        }
        break;
      }
      case 0x04000000: {
        // 0xf4000000
        switch (instr & 0x01300000) {
          case 0x00000000: {
            // 0xf4000000
            switch (instr & 0x00800000) {
              case 0x00000000: {
                // 0xf4000000
                switch (instr & 0x0000000d) {
                  case 0x0000000d: {
                    // 0xf400000d
                    switch (instr & 0x00000002) {
                      case 0x00000000: {
                        // 0xf400000d
                        switch (instr & 0x00000f00) {
                          case 0x00000000: {
                            // 0xf400000d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf400010d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000200: {
                            // 0xf400020d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000300: {
                            // 0xf400030d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000400: {
                            // 0xf400040d
                            if (((instr & 0x20) == 0x20)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000500: {
                            // 0xf400050d
                            if (((instr & 0x20) == 0x20)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000600: {
                            // 0xf400060d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000700: {
                            // 0xf400070d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000800: {
                            // 0xf400080d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000900: {
                            // 0xf400090d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000a00: {
                            // 0xf4000a0d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      case 0x00000002: {
                        // 0xf400000f
                        switch (instr & 0x00000f00) {
                          case 0x00000000: {
                            // 0xf400000d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf400010d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000200: {
                            // 0xf400020d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000300: {
                            // 0xf400030d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000400: {
                            // 0xf400040d
                            if (((instr & 0x20) == 0x20)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000500: {
                            // 0xf400050d
                            if (((instr & 0x20) == 0x20)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000600: {
                            // 0xf400060d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000700: {
                            // 0xf400070d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000800: {
                            // 0xf400080d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000900: {
                            // 0xf400090d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000a00: {
                            // 0xf4000a0d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_5_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    switch (instr & 0x00000f00) {
                      case 0x00000000: {
                        // 0xf4000000
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_4_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x0:
                            length = 4;
                            spacing = kSingle;
                            break;
                          case 0x1:
                            length = 4;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst4(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf4000100
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_4_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x0:
                            length = 4;
                            spacing = kSingle;
                            break;
                          case 0x1:
                            length = 4;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst4(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000200: {
                        // 0xf4000200
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_5_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000300: {
                        // 0xf4000300
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000400: {
                        // 0xf4000400
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0x20) == 0x20)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_3_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x4:
                            length = 3;
                            spacing = kSingle;
                            break;
                          case 0x5:
                            length = 3;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst3(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000500: {
                        // 0xf4000500
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0x20) == 0x20)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_3_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x4:
                            length = 3;
                            spacing = kSingle;
                            break;
                          case 0x5:
                            length = 3;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst3(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000600: {
                        // 0xf4000600
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_5_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000700: {
                        // 0xf4000700
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_5_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000800: {
                        // 0xf4000800
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000900: {
                        // 0xf4000900
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000a00: {
                        // 0xf4000a00
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_5_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vst1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0xf4800000
                switch (instr & 0x00000300) {
                  case 0x00000000: {
                    // 0xf4800000
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4800c00
                        UnallocatedA32(instr);
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf480000d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf480000d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_1_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 1;
                                unsigned last = first + length - 1;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vst1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf480000f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_1_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 1;
                                unsigned last = first + length - 1;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vst1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_1_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 1;
                            unsigned last = first + length - 1;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vst1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000100: {
                    // 0xf4800100
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4800d00
                        UnallocatedA32(instr);
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf480010d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf480010d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_2_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 2;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vst2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf480010f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_2_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 2;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vst2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_2_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 2;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vst2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000200: {
                    // 0xf4800200
                    switch (instr & 0x00000c30) {
                      case 0x00000010: {
                        // 0xf4800210
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000030: {
                        // 0xf4800230
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000410: {
                        // 0xf4800610
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000430: {
                        // 0xf4800630
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000810: {
                        // 0xf4800a10
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000820: {
                        // 0xf4800a20
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000830: {
                        // 0xf4800a30
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000c00: {
                        // 0xf4800e00
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000c10: {
                        // 0xf4800e10
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000c20: {
                        // 0xf4800e20
                        UnallocatedA32(instr);
                        break;
                      }
                      case 0x00000c30: {
                        // 0xf4800e30
                        UnallocatedA32(instr);
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf480020d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf480020d
                                if (((instr & 0xc00) == 0xc00) ||
                                    ((instr & 0x810) == 0x10) ||
                                    ((instr & 0xc30) == 0x810) ||
                                    ((instr & 0xc30) == 0x820) ||
                                    ((instr & 0xc30) == 0x830)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeon decode_neon =
                                    Index_1_Decode((instr >> 4) & 0xf, dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 3;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
                                vst3(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     MemOperand(Register(rn), PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf480020f
                                if (((instr & 0xc00) == 0xc00) ||
                                    ((instr & 0x810) == 0x10) ||
                                    ((instr & 0xc30) == 0x810) ||
                                    ((instr & 0xc30) == 0x820) ||
                                    ((instr & 0xc30) == 0x830)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeon decode_neon =
                                    Index_1_Decode((instr >> 4) & 0xf, dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 3;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
                                vst3(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     MemOperand(Register(rn), Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd) ||
                                ((instr & 0x810) == 0x10) ||
                                ((instr & 0xc30) == 0x810) ||
                                ((instr & 0xc30) == 0x820) ||
                                ((instr & 0xc30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeon decode_neon =
                                Index_1_Decode((instr >> 4) & 0xf, dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 3;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign(plus);
                            unsigned rm = instr & 0xf;
                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
                            vst3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 MemOperand(Register(rn),
                                            sign,
                                            Register(rm),
                                            PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000300: {
                    // 0xf4800300
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4800f00
                        UnallocatedA32(instr);
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf480030d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf480030d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_3_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 4;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vst4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf480030f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_3_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 4;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vst4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_3_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 4;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vst4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00100000: {
            // 0xf4100000
            switch (instr & 0x00400000) {
              case 0x00400000: {
                // 0xf4500000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0xf45f0000
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // PLI{<c>}{<q>} <label> ; A1
                    if (minus_zero) {
                      pli(al, MemOperand(pc, minus, 0));
                    } else {
                      pli(al, &location);
                    }
                    if (((instr & 0xff7ff000) != 0xf45ff000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
                    pli(al, MemOperand(Register(rn), sign, offset, Offset));
                    if (((instr & 0xff70f000) != 0xf450f000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00200000: {
            // 0xf4200000
            switch (instr & 0x00800000) {
              case 0x00000000: {
                // 0xf4200000
                switch (instr & 0x0000000d) {
                  case 0x0000000d: {
                    // 0xf420000d
                    switch (instr & 0x00000002) {
                      case 0x00000000: {
                        // 0xf420000d
                        switch (instr & 0x00000f00) {
                          case 0x00000000: {
                            // 0xf420000d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf420010d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000200: {
                            // 0xf420020d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000300: {
                            // 0xf420030d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000400: {
                            // 0xf420040d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000500: {
                            // 0xf420050d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000600: {
                            // 0xf420060d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000700: {
                            // 0xf420070d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000800: {
                            // 0xf420080d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000900: {
                            // 0xf420090d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          case 0x00000a00: {
                            // 0xf4200a0d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   PostIndex));
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      case 0x00000002: {
                        // 0xf420000f
                        switch (instr & 0x00000f00) {
                          case 0x00000000: {
                            // 0xf420000d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000100: {
                            // 0xf420010d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_4_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000200: {
                            // 0xf420020d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000300: {
                            // 0xf420030d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000400: {
                            // 0xf420040d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000500: {
                            // 0xf420050d
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_3_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x4:
                                length = 3;
                                spacing = kSingle;
                                break;
                              case 0x5:
                                length = 3;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000600: {
                            // 0xf420060d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000700: {
                            // 0xf420070d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000800: {
                            // 0xf420080d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000900: {
                            // 0xf420090d
                            if (((instr & 0xe30) == 0x830)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_2_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x8:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x9:
                                length = 2;
                                spacing = kDouble;
                                break;
                              case 0x3:
                                length = 4;
                                spacing = kSingle;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          case 0x00000a00: {
                            // 0xf4200a0d
                            if (((instr & 0xe20) == 0x620) ||
                                ((instr & 0xf30) == 0xa30)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_align_1_Decode((instr >> 4) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 8) & 0xf) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x7:
                                length = 1;
                                break;
                              case 0xa:
                                length = 2;
                                break;
                              case 0x6:
                                length = 3;
                                break;
                              case 0x2:
                                length = 4;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kMultipleLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Offset));
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    switch (instr & 0x00000f00) {
                      case 0x00000000: {
                        // 0xf4200000
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_4_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x0:
                            length = 4;
                            spacing = kSingle;
                            break;
                          case 0x1:
                            length = 4;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld4(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000100: {
                        // 0xf4200100
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_4_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x0:
                            length = 4;
                            spacing = kSingle;
                            break;
                          case 0x1:
                            length = 4;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld4(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000200: {
                        // 0xf4200200
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_1_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000300: {
                        // 0xf4200300
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000400: {
                        // 0xf4200400
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_3_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x4:
                            length = 3;
                            spacing = kSingle;
                            break;
                          case 0x5:
                            length = 3;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld3(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000500: {
                        // 0xf4200500
                        if (((instr & 0xd) == 0xd)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_3_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x4:
                            length = 3;
                            spacing = kSingle;
                            break;
                          case 0x5:
                            length = 3;
                            spacing = kDouble;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld3(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000600: {
                        // 0xf4200600
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_1_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000700: {
                        // 0xf4200700
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_1_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000800: {
                        // 0xf4200800
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000900: {
                        // 0xf4200900
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe30) == 0x830)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_2_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x8:
                            length = 2;
                            spacing = kSingle;
                            break;
                          case 0x9:
                            length = 2;
                            spacing = kDouble;
                            break;
                          case 0x3:
                            length = 4;
                            spacing = kSingle;
                            break;
                        }
                        unsigned last =
                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld2(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      case 0x00000a00: {
                        // 0xf4200a00
                        if (((instr & 0xd) == 0xd) ||
                            ((instr & 0xe20) == 0x620) ||
                            ((instr & 0xf30) == 0xa30)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Alignment align =
                            Align_align_1_Decode((instr >> 4) & 0x3);
                        if (dt.Is(kDataTypeValueInvalid) ||
                            align.Is(kBadAlignment)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned first = ExtractDRegister(instr, 22, 12);
                        unsigned length;
                        SpacingType spacing = kSingle;
                        switch ((instr >> 8) & 0xf) {
                          default:
                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
                          case 0x7:
                            length = 1;
                            break;
                          case 0xa:
                            length = 2;
                            break;
                          case 0x6:
                            length = 3;
                            break;
                          case 0x2:
                            length = 4;
                            break;
                        }
                        unsigned last = first + length - 1;
                        TransferType transfer = kMultipleLanes;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                        vld1(al,
                             dt,
                             NeonRegisterList(DRegister(first),
                                              DRegister(last),
                                              spacing,
                                              transfer),
                             AlignedMemOperand(Register(rn),
                                               align,
                                               Register(rm),
                                               PostIndex));
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0xf4a00000
                switch (instr & 0x00000300) {
                  case 0x00000000: {
                    // 0xf4a00000
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4a00c00
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a00c0d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a00c0d
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing = kSingle;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 1;
                                    break;
                                  case 0x1:
                                    length = 2;
                                    break;
                                }
                                unsigned last = first + length - 1;
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a00c0f
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing = kSingle;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 1;
                                    break;
                                  case 0x1:
                                    length = 2;
                                    break;
                                }
                                unsigned last = first + length - 1;
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_a_1_Decode((instr >> 4) & 0x1, dt);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing = kSingle;
                            switch ((instr >> 5) & 0x1) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 1;
                                break;
                              case 0x1:
                                length = 2;
                                break;
                            }
                            unsigned last = first + length - 1;
                            TransferType transfer = kAllLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a0000d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a0000d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_1_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 1;
                                unsigned last = first + length - 1;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a0000f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_1_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 1;
                                unsigned last = first + length - 1;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld1(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_1_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 1;
                            unsigned last = first + length - 1;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld1(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000100: {
                    // 0xf4a00100
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4a00d00
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a00d0d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a00d0d
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 2;
                                    spacing = kSingle;
                                    break;
                                  case 0x1:
                                    length = 2;
                                    spacing = kDouble;
                                    break;
                                }
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a00d0f
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 2;
                                    spacing = kSingle;
                                    break;
                                  case 0x1:
                                    length = 2;
                                    spacing = kDouble;
                                    break;
                                }
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_a_2_Decode((instr >> 4) & 0x1, dt);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 5) & 0x1) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 2;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 2;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kAllLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a0010d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a0010d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_2_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 2;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a0010f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_2_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 2;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld2(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_2_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 2;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld2(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000200: {
                    // 0xf4a00200
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4a00e00
                        switch (instr & 0x00000010) {
                          case 0x00000000: {
                            // 0xf4a00e00
                            switch (instr & 0x0000000d) {
                              case 0x0000000d: {
                                // 0xf4a00e0d
                                switch (instr & 0x00000002) {
                                  case 0x00000000: {
                                    // 0xf4a00e0d
                                    DataType dt =
                                        Dt_size_7_Decode((instr >> 6) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned first =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned length;
                                    SpacingType spacing;
                                    switch ((instr >> 5) & 0x1) {
                                      default:
                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                      case 0x0:
                                        length = 3;
                                        spacing = kSingle;
                                        break;
                                      case 0x1:
                                        length = 3;
                                        spacing = kDouble;
                                        break;
                                    }
                                    unsigned last =
                                        first +
                                        (length - 1) *
                                            (spacing == kSingle ? 1 : 2);
                                    TransferType transfer = kAllLanes;
                                    unsigned rn = (instr >> 16) & 0xf;
                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
                                    vld3(al,
                                         dt,
                                         NeonRegisterList(DRegister(first),
                                                          DRegister(last),
                                                          spacing,
                                                          transfer),
                                         MemOperand(Register(rn), PostIndex));
                                    break;
                                  }
                                  case 0x00000002: {
                                    // 0xf4a00e0f
                                    DataType dt =
                                        Dt_size_7_Decode((instr >> 6) & 0x3);
                                    if (dt.Is(kDataTypeValueInvalid)) {
                                      UnallocatedA32(instr);
                                      return;
                                    }
                                    unsigned first =
                                        ExtractDRegister(instr, 22, 12);
                                    unsigned length;
                                    SpacingType spacing;
                                    switch ((instr >> 5) & 0x1) {
                                      default:
                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                      case 0x0:
                                        length = 3;
                                        spacing = kSingle;
                                        break;
                                      case 0x1:
                                        length = 3;
                                        spacing = kDouble;
                                        break;
                                    }
                                    unsigned last =
                                        first +
                                        (length - 1) *
                                            (spacing == kSingle ? 1 : 2);
                                    TransferType transfer = kAllLanes;
                                    unsigned rn = (instr >> 16) & 0xf;
                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
                                    vld3(al,
                                         dt,
                                         NeonRegisterList(DRegister(first),
                                                          DRegister(last),
                                                          spacing,
                                                          transfer),
                                         MemOperand(Register(rn), Offset));
                                    break;
                                  }
                                }
                                break;
                              }
                              default: {
                                if (((instr & 0xd) == 0xd)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 3;
                                    spacing = kSingle;
                                    break;
                                  case 0x1:
                                    length = 3;
                                    spacing = kDouble;
                                    break;
                                }
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                Sign sign(plus);
                                unsigned rm = instr & 0xf;
                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
                                vld3(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     MemOperand(Register(rn),
                                                sign,
                                                Register(rm),
                                                PostIndex));
                                break;
                              }
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a0020d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a0020d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeon decode_neon =
                                    Index_1_Decode((instr >> 4) & 0xf, dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 3;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
                                vld3(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     MemOperand(Register(rn), PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a0020f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeon decode_neon =
                                    Index_1_Decode((instr >> 4) & 0xf, dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 3;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
                                vld3(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     MemOperand(Register(rn), Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeon decode_neon =
                                Index_1_Decode((instr >> 4) & 0xf, dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 3;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign(plus);
                            unsigned rm = instr & 0xf;
                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
                            vld3(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 MemOperand(Register(rn),
                                            sign,
                                            Register(rm),
                                            PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000300: {
                    // 0xf4a00300
                    switch (instr & 0x00000c00) {
                      case 0x00000c00: {
                        // 0xf4a00f00
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a00f0d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a00f0d
                                DataType dt =
                                    Dt_size_8_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_3_Decode((instr >> 4) & 0x1,
                                                     dt,
                                                     (instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 4;
                                    spacing = kSingle;
                                    break;
                                  case 0x1:
                                    length = 4;
                                    spacing = kDouble;
                                    break;
                                }
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a00f0f
                                DataType dt =
                                    Dt_size_8_Decode((instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align =
                                    Align_a_3_Decode((instr >> 4) & 0x1,
                                                     dt,
                                                     (instr >> 6) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid) ||
                                    align.Is(kBadAlignment)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length;
                                SpacingType spacing;
                                switch ((instr >> 5) & 0x1) {
                                  default:
                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
                                  case 0x0:
                                    length = 4;
                                    spacing = kSingle;
                                    break;
                                  case 0x1:
                                    length = 4;
                                    spacing = kDouble;
                                    break;
                                }
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                TransferType transfer = kAllLanes;
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      transfer),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align =
                                Align_a_3_Decode((instr >> 4) & 0x1,
                                                 dt,
                                                 (instr >> 6) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid) ||
                                align.Is(kBadAlignment)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length;
                            SpacingType spacing;
                            switch ((instr >> 5) & 0x1) {
                              default:
                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
                              case 0x0:
                                length = 4;
                                spacing = kSingle;
                                break;
                              case 0x1:
                                length = 4;
                                spacing = kDouble;
                                break;
                            }
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            TransferType transfer = kAllLanes;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  transfer),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x0000000d) {
                          case 0x0000000d: {
                            // 0xf4a0030d
                            switch (instr & 0x00000002) {
                              case 0x00000000: {
                                // 0xf4a0030d
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_3_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 4;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
                                vld4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       PostIndex));
                                break;
                              }
                              case 0x00000002: {
                                // 0xf4a0030f
                                if (((instr & 0xc00) == 0xc00)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DataType dt =
                                    Dt_size_7_Decode((instr >> 10) & 0x3);
                                if (dt.Is(kDataTypeValueInvalid)) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                DecodeNeonAndAlign decode_neon =
                                    Align_index_align_3_Decode((instr >> 4) &
                                                                   0xf,
                                                               dt);
                                if (!decode_neon.IsValid()) {
                                  UnallocatedA32(instr);
                                  return;
                                }
                                Alignment align = decode_neon.GetAlign();
                                int lane = decode_neon.GetLane();
                                SpacingType spacing = decode_neon.GetSpacing();
                                unsigned first =
                                    ExtractDRegister(instr, 22, 12);
                                unsigned length = 4;
                                unsigned last =
                                    first +
                                    (length - 1) * (spacing == kSingle ? 1 : 2);
                                unsigned rn = (instr >> 16) & 0xf;
                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
                                vld4(al,
                                     dt,
                                     NeonRegisterList(DRegister(first),
                                                      DRegister(last),
                                                      spacing,
                                                      lane),
                                     AlignedMemOperand(Register(rn),
                                                       align,
                                                       Offset));
                                break;
                              }
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xc00) == 0xc00) ||
                                ((instr & 0xd) == 0xd)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
                            if (dt.Is(kDataTypeValueInvalid)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            DecodeNeonAndAlign decode_neon =
                                Align_index_align_3_Decode((instr >> 4) & 0xf,
                                                           dt);
                            if (!decode_neon.IsValid()) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Alignment align = decode_neon.GetAlign();
                            int lane = decode_neon.GetLane();
                            SpacingType spacing = decode_neon.GetSpacing();
                            unsigned first = ExtractDRegister(instr, 22, 12);
                            unsigned length = 4;
                            unsigned last =
                                first +
                                (length - 1) * (spacing == kSingle ? 1 : 2);
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
                            vld4(al,
                                 dt,
                                 NeonRegisterList(DRegister(first),
                                                  DRegister(last),
                                                  spacing,
                                                  lane),
                                 AlignedMemOperand(Register(rn),
                                                   align,
                                                   Register(rm),
                                                   PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x01100000: {
            // 0xf5100000
            switch (instr & 0x000f0000) {
              case 0x000f0000: {
                // 0xf51f0000
                uint32_t U = (instr >> 23) & 0x1;
                int32_t imm = instr & 0xfff;
                if (U == 0) imm = -imm;
                bool minus_zero = (imm == 0) && (U == 0);
                Location location(imm, kA32PcDelta);
                // PLD{<c>}{<q>} <label> ; A1
                if (minus_zero) {
                  pld(al, MemOperand(pc, minus, 0));
                } else {
                  pld(al, &location);
                }
                if (((instr & 0xff7ff000) != 0xf55ff000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              default: {
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0xf5100000
                    if (((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
                    pldw(al, MemOperand(Register(rn), sign, offset, Offset));
                    if (((instr & 0xff70f000) != 0xf510f000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0xf5500000
                    if (((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
                    pld(al, MemOperand(Register(rn), sign, offset, Offset));
                    if (((instr & 0xff70f000) != 0xf550f000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x01300000: {
            // 0xf5300000
            switch (instr & 0x00c000f0) {
              case 0x00400010: {
                // 0xf5700010
                // CLREX{<c>}{<q>} ; A1
                clrex(al);
                if (((instr & 0xffffffff) != 0xf57ff01f)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400040: {
                // 0xf5700040
                MemoryBarrier option(instr & 0xf);
                // DSB{<c>}{<q>} {<option>} ; A1
                dsb(al, option);
                if (((instr & 0xfffffff0) != 0xf57ff040)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400050: {
                // 0xf5700050
                MemoryBarrier option(instr & 0xf);
                // DMB{<c>}{<q>} {<option>} ; A1
                dmb(al, option);
                if (((instr & 0xfffffff0) != 0xf57ff050)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400060: {
                // 0xf5700060
                MemoryBarrier option(instr & 0xf);
                // ISB{<c>}{<q>} {<option>} ; A1
                isb(al, option);
                if (((instr & 0xfffffff0) != 0xf57ff060)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      case 0x06000000: {
        // 0xf6000000
        switch (instr & 0x01700010) {
          case 0x00500000: {
            // 0xf6500000
            switch (instr & 0x00000fe0) {
              case 0x00000060: {
                // 0xf6500060
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                Shift shift = RRX;
                uint32_t amount = 0;
                AddrMode addrmode = Offset;
                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
                pli(al,
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                if (((instr & 0xff70fff0) != 0xf650f060)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              default: {
                if (((instr & 0xfe0) == 0x60)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                    (instr >> 7) & 0x1f);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
                pli(al,
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                if (((instr & 0xff70f010) != 0xf650f000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01100000: {
            // 0xf7100000
            switch (instr & 0x00000fe0) {
              case 0x00000060: {
                // 0xf7100060
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                Shift shift = RRX;
                uint32_t amount = 0;
                AddrMode addrmode = Offset;
                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
                pldw(al,
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                if (((instr & 0xff70fff0) != 0xf710f060)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              default: {
                if (((instr & 0xfe0) == 0x60)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                    (instr >> 7) & 0x1f);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
                pldw(al,
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                if (((instr & 0xff70f010) != 0xf710f000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01500000: {
            // 0xf7500000
            switch (instr & 0x00000fe0) {
              case 0x00000060: {
                // 0xf7500060
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                Shift shift = RRX;
                uint32_t amount = 0;
                AddrMode addrmode = Offset;
                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
                pld(al,
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                if (((instr & 0xff70fff0) != 0xf750f060)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              default: {
                if (((instr & 0xfe0) == 0x60)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                    (instr >> 7) & 0x1f);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
                pld(al,
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                if (((instr & 0xff70f010) != 0xf750f000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      case 0x08000000: {
        // 0xf8000000
        switch (instr & 0x01d00000) {
          case 0x00100000: {
            // 0xf8100000
            UnimplementedA32("RFEDA", instr);
            break;
          }
          case 0x00400000: {
            // 0xf8400000
            UnimplementedA32("SRSDA", instr);
            break;
          }
          case 0x00900000: {
            // 0xf8900000
            UnimplementedA32("RFE{IA}", instr);
            break;
          }
          case 0x00c00000: {
            // 0xf8c00000
            UnimplementedA32("SRS{IA}", instr);
            break;
          }
          case 0x01100000: {
            // 0xf9100000
            UnimplementedA32("RFEDB", instr);
            break;
          }
          case 0x01400000: {
            // 0xf9400000
            UnimplementedA32("SRSDB", instr);
            break;
          }
          case 0x01900000: {
            // 0xf9900000
            UnimplementedA32("RFEIB", instr);
            break;
          }
          case 0x01c00000: {
            // 0xf9c00000
            UnimplementedA32("SRSIB", instr);
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      case 0x0a000000: {
        // 0xfa000000
        int32_t imm = SignExtend<int32_t>((((instr >> 24) & 0x1) |
                                           ((instr << 1) & 0x1fffffe))
                                              << 1,
                                          26);
        Location location(imm, kA32PcDelta);
        // BLX{<c>}{<q>} <label> ; A2
        blx(al, &location);
        break;
      }
      case 0x0e000000: {
        // 0xfe000000
        switch (instr & 0x01b00f50) {
          case 0x00000a00: {
            // 0xfe000a00
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
            vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00000b00: {
            // 0xfe000b00
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
            vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00100a00: {
            // 0xfe100a00
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
            vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00100b00: {
            // 0xfe100b00
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
            vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00200a00: {
            // 0xfe200a00
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
            vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00200b00: {
            // 0xfe200b00
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
            vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00300a00: {
            // 0xfe300a00
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
            vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00300b00: {
            // 0xfe300b00
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
            vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00800a00: {
            // 0xfe800a00
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
            vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00800a40: {
            // 0xfe800a40
            unsigned rd = ExtractSRegister(instr, 22, 12);
            unsigned rn = ExtractSRegister(instr, 7, 16);
            unsigned rm = ExtractSRegister(instr, 5, 0);
            // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
            vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
            break;
          }
          case 0x00800b00: {
            // 0xfe800b00
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
            vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00800b40: {
            // 0xfe800b40
            unsigned rd = ExtractDRegister(instr, 22, 12);
            unsigned rn = ExtractDRegister(instr, 7, 16);
            unsigned rm = ExtractDRegister(instr, 5, 0);
            // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
            vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
            break;
          }
          case 0x00b00a40: {
            // 0xfeb00a40
            switch (instr & 0x000f0000) {
              case 0x00080000: {
                // 0xfeb80a40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractSRegister(instr, 22, 12);
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  // VRINTA{<q>}.F32 <Sd>, <Sm> ; A1
                  vrinta(F32, SRegister(rd), SRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00090000: {
                // 0xfeb90a40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractSRegister(instr, 22, 12);
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  // VRINTN{<q>}.F32 <Sd>, <Sm> ; A1
                  vrintn(F32, SRegister(rd), SRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000a0000: {
                // 0xfeba0a40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractSRegister(instr, 22, 12);
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  // VRINTP{<q>}.F32 <Sd>, <Sm> ; A1
                  vrintp(F32, SRegister(rd), SRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000b0000: {
                // 0xfebb0a40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractSRegister(instr, 22, 12);
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  // VRINTM{<q>}.F32 <Sd>, <Sm> ; A1
                  vrintm(F32, SRegister(rd), SRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000c0000: {
                // 0xfebc0a40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractSRegister(instr, 5, 0);
                // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
                vcvta(dt, F32, SRegister(rd), SRegister(rm));
                break;
              }
              case 0x000d0000: {
                // 0xfebd0a40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractSRegister(instr, 5, 0);
                // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
                vcvtn(dt, F32, SRegister(rd), SRegister(rm));
                break;
              }
              case 0x000e0000: {
                // 0xfebe0a40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractSRegister(instr, 5, 0);
                // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
                vcvtp(dt, F32, SRegister(rd), SRegister(rm));
                break;
              }
              case 0x000f0000: {
                // 0xfebf0a40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractSRegister(instr, 5, 0);
                // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
                vcvtm(dt, F32, SRegister(rd), SRegister(rm));
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00b00b40: {
            // 0xfeb00b40
            switch (instr & 0x000f0000) {
              case 0x00080000: {
                // 0xfeb80b40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractDRegister(instr, 22, 12);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VRINTA{<q>}.F64 <Dd>, <Dm> ; A1
                  vrinta(F64, DRegister(rd), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00090000: {
                // 0xfeb90b40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractDRegister(instr, 22, 12);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VRINTN{<q>}.F64 <Dd>, <Dm> ; A1
                  vrintn(F64, DRegister(rd), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000a0000: {
                // 0xfeba0b40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractDRegister(instr, 22, 12);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VRINTP{<q>}.F64 <Dd>, <Dm> ; A1
                  vrintp(F64, DRegister(rd), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000b0000: {
                // 0xfebb0b40
                if ((instr & 0x00000080) == 0x00000000) {
                  unsigned rd = ExtractDRegister(instr, 22, 12);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VRINTM{<q>}.F64 <Dd>, <Dm> ; A1
                  vrintm(F64, DRegister(rd), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x000c0000: {
                // 0xfebc0b40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
                vcvta(dt, F64, SRegister(rd), DRegister(rm));
                break;
              }
              case 0x000d0000: {
                // 0xfebd0b40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
                vcvtn(dt, F64, SRegister(rd), DRegister(rm));
                break;
              }
              case 0x000e0000: {
                // 0xfebe0b40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
                vcvtp(dt, F64, SRegister(rd), DRegister(rm));
                break;
              }
              case 0x000f0000: {
                // 0xfebf0b40
                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                if (dt.Is(kDataTypeValueInvalid)) {
                  UnallocatedA32(instr);
                  return;
                }
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rm = ExtractDRegister(instr, 5, 0);
                // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
                vcvtm(dt, F64, SRegister(rd), DRegister(rm));
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      default:
        UnallocatedA32(instr);
        break;
    }
  } else {
    switch (instr & 0x0e000000) {
      case 0x00000000: {
        // 0x00000000
        switch (instr & 0x00100010) {
          case 0x00000000: {
            // 0x00000000
            switch (instr & 0x01a00000) {
              case 0x00000000: {
                // 0x00000000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x00000000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00000060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        and_(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        and_(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm),
                                     shift_operand.GetType(),
                                     shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x00400000
                    switch (instr & 0x000f0000) {
                      case 0x000d0000: {
                        // 0x004d0000
                        switch (instr & 0x00000fe0) {
                          case 0x00000060: {
                            // 0x004d0060
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rm = instr & 0xf;
                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
                            sub(condition,
                                Best,
                                Register(rd),
                                sp,
                                Operand(Register(rm), RRX));
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xfe0) == 0x60)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rm = instr & 0xf;
                            ImmediateShiftOperand shift_operand((instr >> 5) &
                                                                    0x3,
                                                                (instr >> 7) &
                                                                    0x1f);
                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                            sub(condition,
                                Best,
                                Register(rd),
                                sp,
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000fe0) {
                          case 0x00000060: {
                            // 0x00400060
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xd0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                            sub(condition,
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm), RRX));
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xd0000) ||
                                ((instr & 0xfe0) == 0x60)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            ImmediateShiftOperand shift_operand((instr >> 5) &
                                                                    0x3,
                                                                (instr >> 7) &
                                                                    0x1f);
                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                            sub(condition,
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00200000: {
                // 0x00200000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x00200000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00200060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        eor(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        eor(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x00600000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00600060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        rsb(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        rsb(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0x00800000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x00800000
                    switch (instr & 0x000f0000) {
                      case 0x000d0000: {
                        // 0x008d0000
                        switch (instr & 0x00000fe0) {
                          case 0x00000060: {
                            // 0x008d0060
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rm = instr & 0xf;
                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
                            add(condition,
                                Best,
                                Register(rd),
                                sp,
                                Operand(Register(rm), RRX));
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xfe0) == 0x60)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rm = instr & 0xf;
                            ImmediateShiftOperand shift_operand((instr >> 5) &
                                                                    0x3,
                                                                (instr >> 7) &
                                                                    0x1f);
                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                            add(condition,
                                Best,
                                Register(rd),
                                sp,
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            break;
                          }
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x00000fe0) {
                          case 0x00000060: {
                            // 0x00800060
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xd0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                            add(condition,
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm), RRX));
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xd0000) ||
                                ((instr & 0xfe0) == 0x60)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            unsigned rm = instr & 0xf;
                            ImmediateShiftOperand shift_operand((instr >> 5) &
                                                                    0x3,
                                                                (instr >> 7) &
                                                                    0x1f);
                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                            add(condition,
                                Best,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm),
                                        shift_operand.GetType(),
                                        shift_operand.GetAmount()));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x00c00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00c00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        sbc(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        sbc(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00a00000: {
                // 0x00a00000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x00a00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00a00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        adc(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        adc(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x00e00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00e00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        rsc(condition,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        rsc(condition,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01000000: {
                // 0x01000000
                switch (instr & 0x000000e0) {
                  case 0x00000000: {
                    // 0x01000000
                    switch (instr & 0x00000200) {
                      case 0x00000000: {
                        // 0x01000000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned spec_reg = (instr >> 22) & 0x1;
                        // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
                        mrs(condition, Register(rd), SpecialRegister(spec_reg));
                        if (((instr & 0xfbf0fff) != 0x10f0000)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0x01000200
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("MRS", instr);
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x01000040
                    switch (instr & 0x00400200) {
                      case 0x00000000: {
                        // 0x01000040
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32b(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1000040)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0x01000240
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32cb(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1000240)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00400000: {
                        // 0x01400040
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32w(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1400040)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00400200: {
                        // 0x01400240
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32cw(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1400240)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x01000080
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x01000080
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlabb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x01400080
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlalbb(condition,
                                Register(rdlo),
                                Register(rdhi),
                                Register(rn),
                                Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000a0: {
                    // 0x010000a0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x010000a0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlatb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x014000a0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlaltb(condition,
                                Register(rdlo),
                                Register(rdhi),
                                Register(rn),
                                Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000c0: {
                    // 0x010000c0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x010000c0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlabt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x014000c0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlalbt(condition,
                                Register(rdlo),
                                Register(rdhi),
                                Register(rn),
                                Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000e0: {
                    // 0x010000e0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x010000e0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlatt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x014000e0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlaltt(condition,
                                Register(rdlo),
                                Register(rdhi),
                                Register(rn),
                                Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x01200000: {
                // 0x01200000
                switch (instr & 0x000000e0) {
                  case 0x00000000: {
                    // 0x01200000
                    switch (instr & 0x00000200) {
                      case 0x00000000: {
                        // 0x01200000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned spec_reg =
                            ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
                        unsigned rn = instr & 0xf;
                        // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
                        msr(condition,
                            MaskedSpecialRegister(spec_reg),
                            Register(rn));
                        if (((instr & 0xfb0fff0) != 0x120f000)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0x01200200
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("MSR", instr);
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000020: {
                    // 0x01200020
                    if ((instr & 0x00400000) == 0x00000000) {
                      if (((instr & 0xf0000000) == 0xf0000000)) {
                        UnallocatedA32(instr);
                        return;
                      }
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rm = instr & 0xf;
                      // BXJ{<c>}{<q>} <Rm> ; A1
                      bxj(condition, Register(rm));
                      if (((instr & 0xffffff0) != 0x12fff20)) {
                        UnpredictableA32(instr);
                      }
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x01200040
                    switch (instr & 0x00400200) {
                      case 0x00000000: {
                        // 0x01200040
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32h(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1200040)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000200: {
                        // 0x01200240
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
                        crc32ch(al, Register(rd), Register(rn), Register(rm));
                        if (((instr & 0xff00ff0) != 0x1200240)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000060: {
                    // 0x01200060
                    if ((instr & 0x00400000) == 0x00400000) {
                      if (((instr & 0xf0000000) == 0xf0000000)) {
                        UnallocatedA32(instr);
                        return;
                      }
                      UnimplementedA32("ERET", instr);
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x01200080
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x01200080
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlawb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x01600080
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smulbb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x1600080)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000a0: {
                    // 0x012000a0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x012000a0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smulwb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x12000a0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00400000: {
                        // 0x016000a0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smultb(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x16000a0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000c0: {
                    // 0x012000c0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x012000c0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smlawt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                      case 0x00400000: {
                        // 0x016000c0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smulbt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x16000c0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x000000e0: {
                    // 0x012000e0
                    switch (instr & 0x00400000) {
                      case 0x00000000: {
                        // 0x012000e0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smulwt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x12000e0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00400000: {
                        // 0x016000e0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smultt(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        if (((instr & 0xff0f0f0) != 0x16000e0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01800000: {
                // 0x01800000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x01800000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x01800060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        orr(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        orr(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x01c00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x01c00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        bic(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        bic(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01a00000: {
                // 0x01a00000
                switch (instr & 0x00400000) {
                  case 0x00000000: {
                    // 0x01a00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x01a00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr & 0xf0000000) != 0xf0000000)) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          unsigned rm = instr & 0xf;
                          // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
                          rrx(condition, Register(rd), Register(rm));
                          if (((instr & 0xfff0ff0) != 0x1a00060)) {
                            UnpredictableA32(instr);
                          }
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
                        mov(condition,
                            Best,
                            Register(rd),
                            Operand(Register(rm), RRX));
                        if (((instr & 0xfff0ff0) != 0x1a00060)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
                             Uint32(0x2)) &&
                            ((instr & 0xf0000000) != 0xf0000000)) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount = (instr >> 7) & 0x1f;
                          if (amount == 0) amount = 32;
                          // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                          asr(condition,
                              Best,
                              Register(rd),
                              Register(rm),
                              amount);
                          if (((instr & 0xfff0070) != 0x1a00040)) {
                            UnpredictableA32(instr);
                          }
                          return;
                        }
                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
                             Uint32(0x0)) &&
                            ((instr & 0xf0000000) != 0xf0000000) &&
                            ((instr & 0x00000f80) != 0x00000000)) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount = (instr >> 7) & 0x1f;
                          // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                          lsl(condition,
                              Best,
                              Register(rd),
                              Register(rm),
                              amount);
                          if (((instr & 0xfff0070) != 0x1a00000)) {
                            UnpredictableA32(instr);
                          }
                          return;
                        }
                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
                             Uint32(0x1)) &&
                            ((instr & 0xf0000000) != 0xf0000000)) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount = (instr >> 7) & 0x1f;
                          if (amount == 0) amount = 32;
                          // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                          lsr(condition,
                              Best,
                              Register(rd),
                              Register(rm),
                              amount);
                          if (((instr & 0xfff0070) != 0x1a00020)) {
                            UnpredictableA32(instr);
                          }
                          return;
                        }
                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
                             Uint32(0x3)) &&
                            ((instr & 0xf0000000) != 0xf0000000) &&
                            ((instr & 0x00000f80) != 0x00000000)) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          unsigned rm = instr & 0xf;
                          uint32_t amount = (instr >> 7) & 0x1f;
                          // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                          ror(condition,
                              Best,
                              Register(rd),
                              Register(rm),
                              amount);
                          if (((instr & 0xfff0070) != 0x1a00060)) {
                            UnpredictableA32(instr);
                          }
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
                        mov(condition,
                            Best,
                            Register(rd),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        if (((instr & 0xfff0010) != 0x1a00000)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00400000: {
                    // 0x01e00000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x01e00060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
                        mvn(condition,
                            Best,
                            Register(rd),
                            Operand(Register(rm), RRX));
                        if (((instr & 0xfff0ff0) != 0x1e00060)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
                        mvn(condition,
                            Best,
                            Register(rd),
                            Operand(Register(rm),
                                    shift_operand.GetType(),
                                    shift_operand.GetAmount()));
                        if (((instr & 0xfff0010) != 0x1e00000)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00000010: {
            // 0x00000010
            switch (instr & 0x00400080) {
              case 0x00000000: {
                // 0x00000010
                switch (instr & 0x01a00000) {
                  case 0x00000000: {
                    // 0x00000010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    and_(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00200000: {
                    // 0x00200010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    eor(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00800000: {
                    // 0x00800010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    add(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x00a00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    adc(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01000000: {
                    // 0x01000010
                    switch (instr & 0x00000060) {
                      case 0x00000040: {
                        // 0x01000050
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
                        qadd(condition,
                             Register(rd),
                             Register(rm),
                             Register(rn));
                        if (((instr & 0xff00ff0) != 0x1000050)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000060: {
                        // 0x01000070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
                        // HLT{<q>} {#}<imm> ; A1
                        hlt(al, imm);
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01200010
                    switch (instr & 0x00000060) {
                      case 0x00000000: {
                        // 0x01200010
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rm = instr & 0xf;
                        // BX{<c>}{<q>} <Rm> ; A1
                        bx(condition, Register(rm));
                        if (((instr & 0xffffff0) != 0x12fff10)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000020: {
                        // 0x01200030
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rm = instr & 0xf;
                        // BLX{<c>}{<q>} <Rm> ; A1
                        blx(condition, Register(rm));
                        if (((instr & 0xffffff0) != 0x12fff30)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000040: {
                        // 0x01200050
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
                        qsub(condition,
                             Register(rd),
                             Register(rm),
                             Register(rn));
                        if (((instr & 0xff00ff0) != 0x1200050)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000060: {
                        // 0x01200070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
                        // BKPT{<q>} {#}<imm> ; A1
                        bkpt(al, imm);
                        break;
                      }
                    }
                    break;
                  }
                  case 0x01800000: {
                    // 0x01800010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    orr(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01a00000: {
                    // 0x01a00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      asr(condition,
                          Best,
                          Register(rd),
                          Register(rm),
                          Register(rs));
                      if (((instr & 0xfff00f0) != 0x1a00050)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      lsl(condition,
                          Best,
                          Register(rd),
                          Register(rm),
                          Register(rs));
                      if (((instr & 0xfff00f0) != 0x1a00010)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      lsr(condition,
                          Best,
                          Register(rd),
                          Register(rm),
                          Register(rs));
                      if (((instr & 0xfff00f0) != 0x1a00030)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      ror(condition,
                          Best,
                          Register(rd),
                          Register(rm),
                          Register(rs));
                      if (((instr & 0xfff00f0) != 0x1a00070)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
                    mov(condition,
                        Best,
                        Register(rd),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xfff0090) != 0x1a00010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000080: {
                // 0x00000090
                switch (instr & 0x01200060) {
                  case 0x00000000: {
                    // 0x00000090
                    switch (instr & 0x00800000) {
                      case 0x00000000: {
                        // 0x00000090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
                        mul(condition,
                            Best,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                        if (((instr & 0xff0f0f0) != 0x90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800000: {
                        // 0x00800090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        umull(condition,
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000020: {
                    // 0x000000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
                    strh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    PostIndex));
                    if (((instr & 0xf700ff0) != 0xb0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x000000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
                    ldrd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    PostIndex));
                    if (((instr & 0xf700ff0) != 0xd0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000060: {
                    // 0x000000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
                    strd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    PostIndex));
                    if (((instr & 0xf700ff0) != 0xf0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00200000: {
                    // 0x00200090
                    switch (instr & 0x00800000) {
                      case 0x00000000: {
                        // 0x00200090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        mla(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm),
                            Register(ra));
                        break;
                      }
                      case 0x00800000: {
                        // 0x00a00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        umlal(condition,
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00200020: {
                    // 0x002000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("STRHT", instr);
                    break;
                  }
                  case 0x01000000: {
                    // 0x01000090
                    switch (instr & 0x00800300) {
                      case 0x00800000: {
                        // 0x01800090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
                        stl(condition,
                            Register(rt),
                            MemOperand(Register(rn), Offset));
                        if (((instr & 0xff0fff0) != 0x180fc90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800200: {
                        // 0x01800290
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rt = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
                        stlex(condition,
                              Register(rd),
                              Register(rt),
                              MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00ff0) != 0x1800e90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800300: {
                        // 0x01800390
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rt = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
                        strex(condition,
                              Register(rd),
                              Register(rt),
                              MemOperand(Register(rn), plus, 0, Offset));
                        if (((instr & 0xff00ff0) != 0x1800f90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01000020: {
                    // 0x010000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
                    strh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x10000b0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01000040: {
                    // 0x010000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
                    ldrd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x10000d0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01000060: {
                    // 0x010000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
                    strd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x10000f0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01200090
                    switch (instr & 0x00800300) {
                      case 0x00800200: {
                        // 0x01a00290
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rt = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
                        stlexd(condition,
                               Register(rd),
                               Register(rt),
                               Register(rt + 1),
                               MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00ff0) != 0x1a00e90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800300: {
                        // 0x01a00390
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rt = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
                        strexd(condition,
                               Register(rd),
                               Register(rt),
                               Register(rt + 1),
                               MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00ff0) != 0x1a00f90)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01200020: {
                    // 0x012000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
                    strh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x12000b0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200040: {
                    // 0x012000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
                    ldrd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x12000d0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200060: {
                    // 0x012000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
                    strd(condition,
                         Register(rt),
                         Register(rt + 1),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x12000f0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00400000: {
                // 0x00400010
                switch (instr & 0x01a00000) {
                  case 0x00000000: {
                    // 0x00400010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    sub(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00200000: {
                    // 0x00600010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    rsb(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00800000: {
                    // 0x00c00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    sbc(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x00e00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    rsc(condition,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01000000: {
                    // 0x01400010
                    switch (instr & 0x00000060) {
                      case 0x00000040: {
                        // 0x01400050
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
                        qdadd(condition,
                              Register(rd),
                              Register(rm),
                              Register(rn));
                        if (((instr & 0xff00ff0) != 0x1400050)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000060: {
                        // 0x01400070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
                        // HVC{<q>} {#}<imm16> ; A1
                        hvc(al, imm);
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01600010
                    switch (instr & 0x00000060) {
                      case 0x00000000: {
                        // 0x01600010
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
                        clz(condition, Register(rd), Register(rm));
                        if (((instr & 0xfff0ff0) != 0x16f0f10)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000040: {
                        // 0x01600050
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
                        qdsub(condition,
                              Register(rd),
                              Register(rm),
                              Register(rn));
                        if (((instr & 0xff00ff0) != 0x1600050)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000060: {
                        // 0x01600070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("SMC", instr);
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01800000: {
                    // 0x01c00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    bic(condition,
                        Best,
                        Register(rd),
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01a00000: {
                    // 0x01e00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
                    mvn(condition,
                        Best,
                        Register(rd),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xfff0090) != 0x1e00010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00400080: {
                // 0x00400090
                switch (instr & 0x00000060) {
                  case 0x00000000: {
                    // 0x00400090
                    switch (instr & 0x01a00000) {
                      case 0x00000000: {
                        // 0x00400090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        umaal(condition,
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                      case 0x00200000: {
                        // 0x00600090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        mls(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm),
                            Register(ra));
                        break;
                      }
                      case 0x00800000: {
                        // 0x00c00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smull(condition,
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                      case 0x00a00000: {
                        // 0x00e00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlal(condition,
                              Register(rdlo),
                              Register(rdhi),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                      case 0x01800000: {
                        // 0x01c00090
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0x01c00090
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            stlb(condition,
                                 Register(rt),
                                 MemOperand(Register(rn), Offset));
                            if (((instr & 0xff0fff0) != 0x1c0fc90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0x01c00290
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
                            stlexb(condition,
                                   Register(rd),
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00ff0) != 0x1c00e90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000300: {
                            // 0x01c00390
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
                            strexb(condition,
                                   Register(rd),
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00ff0) != 0x1c00f90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      case 0x01a00000: {
                        // 0x01e00090
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0x01e00090
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            stlh(condition,
                                 Register(rt),
                                 MemOperand(Register(rn), Offset));
                            if (((instr & 0xff0fff0) != 0x1e0fc90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0x01e00290
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
                            stlexh(condition,
                                   Register(rd),
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00ff0) != 0x1e00e90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000300: {
                            // 0x01e00390
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = (instr >> 12) & 0xf;
                            unsigned rt = instr & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
                            strexh(condition,
                                   Register(rd),
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00ff0) != 0x1e00f90)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000020: {
                    // 0x004000b0
                    switch (instr & 0x01200000) {
                      case 0x00000000: {
                        // 0x004000b0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                        strh(condition,
                             Best,
                             Register(rt),
                             MemOperand(Register(rn), sign, offset, PostIndex));
                        break;
                      }
                      case 0x00200000: {
                        // 0x006000b0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("STRHT", instr);
                        break;
                      }
                      case 0x01000000: {
                        // 0x014000b0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                        strh(condition,
                             Best,
                             Register(rt),
                             MemOperand(Register(rn), sign, offset, Offset));
                        break;
                      }
                      case 0x01200000: {
                        // 0x016000b0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
                        strh(condition,
                             Best,
                             Register(rt),
                             MemOperand(Register(rn), sign, offset, PreIndex));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x004000d0
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x004f00d0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        uint32_t U = (instr >> 23) & 0x1;
                        int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        if (U == 0) imm = -imm;
                        bool minus_zero = (imm == 0) && (U == 0);
                        Location location(imm, kA32PcDelta);
                        // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
                        if (minus_zero) {
                          ldrd(condition,
                               Register(rt),
                               Register(rt + 1),
                               MemOperand(pc, minus, 0));
                        } else {
                          ldrd(condition,
                               Register(rt),
                               Register(rt + 1),
                               &location);
                        }
                        if (((instr & 0xf7f00f0) != 0x14f00d0)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        switch (instr & 0x01200000) {
                          case 0x00000000: {
                            // 0x004000d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
                            ldrd(condition,
                                 Register(rt),
                                 Register(rt + 1),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            PostIndex));
                            break;
                          }
                          case 0x01000000: {
                            // 0x014000d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
                            ldrd(condition,
                                 Register(rt),
                                 Register(rt + 1),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            Offset));
                            break;
                          }
                          case 0x01200000: {
                            // 0x016000d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
                            ldrd(condition,
                                 Register(rt),
                                 Register(rt + 1),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            PreIndex));
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000060: {
                    // 0x004000f0
                    switch (instr & 0x01200000) {
                      case 0x00000000: {
                        // 0x004000f0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
                        strd(condition,
                             Register(rt),
                             Register(rt + 1),
                             MemOperand(Register(rn), sign, offset, PostIndex));
                        break;
                      }
                      case 0x01000000: {
                        // 0x014000f0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
                        strd(condition,
                             Register(rt),
                             Register(rt + 1),
                             MemOperand(Register(rn), sign, offset, Offset));
                        break;
                      }
                      case 0x01200000: {
                        // 0x016000f0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
                        strd(condition,
                             Register(rt),
                             Register(rt + 1),
                             MemOperand(Register(rn), sign, offset, PreIndex));
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00100000: {
            // 0x00100000
            switch (instr & 0x01e00000) {
              case 0x00000000: {
                // 0x00100000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00100060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    ands(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    ands(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x00200000: {
                // 0x00300000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00300060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    eors(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    eors(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x00400000: {
                // 0x00500000
                switch (instr & 0x000f0000) {
                  case 0x000d0000: {
                    // 0x005d0000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x005d0060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
                        subs(condition,
                             Best,
                             Register(rd),
                             sp,
                             Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        subs(condition,
                             Best,
                             Register(rd),
                             sp,
                             Operand(Register(rm),
                                     shift_operand.GetType(),
                                     shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00500060
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xd0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        subs(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xd0000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        subs(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm),
                                     shift_operand.GetType(),
                                     shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00600000: {
                // 0x00700000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00700060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    rsbs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    rsbs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0x00900000
                switch (instr & 0x000f0000) {
                  case 0x000d0000: {
                    // 0x009d0000
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x009d0060
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
                        adds(condition,
                             Best,
                             Register(rd),
                             sp,
                             Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        adds(condition,
                             Best,
                             Register(rd),
                             sp,
                             Operand(Register(rm),
                                     shift_operand.GetType(),
                                     shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    switch (instr & 0x00000fe0) {
                      case 0x00000060: {
                        // 0x00900060
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xd0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                        adds(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm), RRX));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xd0000) ||
                            ((instr & 0xfe0) == 0x60)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                            (instr >> 7) &
                                                                0x1f);
                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                        adds(condition,
                             Best,
                             Register(rd),
                             Register(rn),
                             Operand(Register(rm),
                                     shift_operand.GetType(),
                                     shift_operand.GetAmount()));
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00a00000: {
                // 0x00b00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00b00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    adcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    adcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x00c00000: {
                // 0x00d00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00d00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    sbcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    sbcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x00e00000: {
                // 0x00f00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x00f00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    rscs(condition,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    rscs(condition,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x01000000: {
                // 0x01100000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01100060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
                    tst(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), RRX));
                    if (((instr & 0xff0fff0) != 0x1100060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
                    tst(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm),
                                shift_operand.GetType(),
                                shift_operand.GetAmount()));
                    if (((instr & 0xff0f010) != 0x1100000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01200000: {
                // 0x01300000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01300060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
                    teq(condition, Register(rn), Operand(Register(rm), RRX));
                    if (((instr & 0xff0fff0) != 0x1300060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
                    teq(condition,
                        Register(rn),
                        Operand(Register(rm),
                                shift_operand.GetType(),
                                shift_operand.GetAmount()));
                    if (((instr & 0xff0f010) != 0x1300000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01400000: {
                // 0x01500000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01500060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
                    cmp(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), RRX));
                    if (((instr & 0xff0fff0) != 0x1500060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
                    cmp(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm),
                                shift_operand.GetType(),
                                shift_operand.GetAmount()));
                    if (((instr & 0xff0f010) != 0x1500000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01600000: {
                // 0x01700000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01700060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
                    cmn(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), RRX));
                    if (((instr & 0xff0fff0) != 0x1700060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
                    cmn(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm),
                                shift_operand.GetType(),
                                shift_operand.GetAmount()));
                    if (((instr & 0xff0f010) != 0x1700000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01800000: {
                // 0x01900000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01900060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    orrs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    orrs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x01a00000: {
                // 0x01b00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01b00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
                      rrxs(condition, Register(rd), Register(rm));
                      if (((instr & 0xfff0ff0) != 0x1b00060)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
                    movs(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm), RRX));
                    if (((instr & 0xfff0ff0) != 0x1b00060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      uint32_t amount = (instr >> 7) & 0x1f;
                      if (amount == 0) amount = 32;
                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                      asrs(condition, Best, Register(rd), Register(rm), amount);
                      if (((instr & 0xfff0070) != 0x1b00040)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
                        ((instr & 0xf0000000) != 0xf0000000) &&
                        ((instr & 0x00000f80) != 0x00000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      uint32_t amount = (instr >> 7) & 0x1f;
                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                      lsls(condition, Best, Register(rd), Register(rm), amount);
                      if (((instr & 0xfff0070) != 0x1b00000)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      uint32_t amount = (instr >> 7) & 0x1f;
                      if (amount == 0) amount = 32;
                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                      lsrs(condition, Best, Register(rd), Register(rm), amount);
                      if (((instr & 0xfff0070) != 0x1b00020)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
                        ((instr & 0xf0000000) != 0xf0000000) &&
                        ((instr & 0x00000f80) != 0x00000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      uint32_t amount = (instr >> 7) & 0x1f;
                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
                      rors(condition, Best, Register(rd), Register(rm), amount);
                      if (((instr & 0xfff0070) != 0x1b00060)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
                    movs(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    if (((instr & 0xfff0010) != 0x1b00000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x01c00000: {
                // 0x01d00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01d00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
                    bics(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), RRX));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
                    bics(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    break;
                  }
                }
                break;
              }
              case 0x01e00000: {
                // 0x01f00000
                switch (instr & 0x00000fe0) {
                  case 0x00000060: {
                    // 0x01f00060
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
                    mvns(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm), RRX));
                    if (((instr & 0xfff0ff0) != 0x1f00060)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xfe0) == 0x60)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
                                                        (instr >> 7) & 0x1f);
                    // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
                    mvns(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm),
                                 shift_operand.GetType(),
                                 shift_operand.GetAmount()));
                    if (((instr & 0xfff0010) != 0x1f00000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00100010: {
            // 0x00100010
            switch (instr & 0x00400080) {
              case 0x00000000: {
                // 0x00100010
                switch (instr & 0x01a00000) {
                  case 0x00000000: {
                    // 0x00100010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    ands(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00200000: {
                    // 0x00300010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    eors(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00800000: {
                    // 0x00900010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    adds(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x00b00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    adcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01000000: {
                    // 0x01100010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
                    tst(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xff0f090) != 0x1100010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01300010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
                    teq(condition,
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xff0f090) != 0x1300010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01800000: {
                    // 0x01900010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    orrs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01a00000: {
                    // 0x01b00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      asrs(condition,
                           Best,
                           Register(rd),
                           Register(rm),
                           Register(rs));
                      if (((instr & 0xfff00f0) != 0x1b00050)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      lsls(condition,
                           Best,
                           Register(rd),
                           Register(rm),
                           Register(rs));
                      if (((instr & 0xfff00f0) != 0x1b00010)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      lsrs(condition,
                           Best,
                           Register(rd),
                           Register(rm),
                           Register(rs));
                      if (((instr & 0xfff00f0) != 0x1b00030)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rd = (instr >> 12) & 0xf;
                      unsigned rm = instr & 0xf;
                      unsigned rs = (instr >> 8) & 0xf;
                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
                      rors(condition,
                           Best,
                           Register(rd),
                           Register(rm),
                           Register(rs));
                      if (((instr & 0xfff00f0) != 0x1b00070)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
                    movs(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xfff0090) != 0x1b00010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000080: {
                // 0x00100090
                switch (instr & 0x01200060) {
                  case 0x00000000: {
                    // 0x00100090
                    switch (instr & 0x00800000) {
                      case 0x00000000: {
                        // 0x00100090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
                        muls(condition,
                             Register(rd),
                             Register(rn),
                             Register(rm));
                        if (((instr & 0xff0f0f0) != 0x100090)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800000: {
                        // 0x00900090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        umulls(condition,
                               Register(rdlo),
                               Register(rdhi),
                               Register(rn),
                               Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000020: {
                    // 0x001000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
                    ldrh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    PostIndex));
                    if (((instr & 0xf700ff0) != 0x1000b0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x001000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
                    ldrsb(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     PostIndex));
                    if (((instr & 0xf700ff0) != 0x1000d0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000060: {
                    // 0x001000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
                    ldrsh(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     PostIndex));
                    if (((instr & 0xf700ff0) != 0x1000f0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00200000: {
                    // 0x00300090
                    switch (instr & 0x00800000) {
                      case 0x00000000: {
                        // 0x00300090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        mlas(condition,
                             Register(rd),
                             Register(rn),
                             Register(rm),
                             Register(ra));
                        break;
                      }
                      case 0x00800000: {
                        // 0x00b00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        umlals(condition,
                               Register(rdlo),
                               Register(rdhi),
                               Register(rn),
                               Register(rm));
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00200020: {
                    // 0x003000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("LDRHT", instr);
                    break;
                  }
                  case 0x00200040: {
                    // 0x003000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("LDRSBT", instr);
                    break;
                  }
                  case 0x00200060: {
                    // 0x003000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("LDRSHT", instr);
                    break;
                  }
                  case 0x01000000: {
                    // 0x01100090
                    switch (instr & 0x00800300) {
                      case 0x00800000: {
                        // 0x01900090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
                        lda(condition,
                            Register(rt),
                            MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00fff) != 0x1900c9f)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800200: {
                        // 0x01900290
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
                        ldaex(condition,
                              Register(rt),
                              MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00fff) != 0x1900e9f)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800300: {
                        // 0x01900390
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
                        ldrex(condition,
                              Register(rt),
                              MemOperand(Register(rn), plus, 0, Offset));
                        if (((instr & 0xff00fff) != 0x1900f9f)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01000020: {
                    // 0x011000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
                    ldrh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x11000b0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01000040: {
                    // 0x011000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
                    ldrsb(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     addrmode));
                    if (((instr & 0xf700ff0) != 0x11000d0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01000060: {
                    // 0x011000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = Offset;
                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
                    ldrsh(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     addrmode));
                    if (((instr & 0xf700ff0) != 0x11000f0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01300090
                    switch (instr & 0x00800300) {
                      case 0x00800200: {
                        // 0x01b00290
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
                        ldaexd(condition,
                               Register(rt),
                               Register(rt + 1),
                               MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00fff) != 0x1b00e9f)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00800300: {
                        // 0x01b00390
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
                        ldrexd(condition,
                               Register(rt),
                               Register(rt + 1),
                               MemOperand(Register(rn), Offset));
                        if (((instr & 0xff00fff) != 0x1b00f9f)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x01200020: {
                    // 0x013000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
                    ldrh(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn),
                                    sign,
                                    Register(rm),
                                    addrmode));
                    if (((instr & 0xf700ff0) != 0x13000b0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200040: {
                    // 0x013000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
                    ldrsb(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     addrmode));
                    if (((instr & 0xf700ff0) != 0x13000d0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200060: {
                    // 0x013000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                    unsigned rm = instr & 0xf;
                    AddrMode addrmode = PreIndex;
                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
                    ldrsh(condition,
                          Best,
                          Register(rt),
                          MemOperand(Register(rn),
                                     sign,
                                     Register(rm),
                                     addrmode));
                    if (((instr & 0xf700ff0) != 0x13000f0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00400000: {
                // 0x00500010
                switch (instr & 0x01a00000) {
                  case 0x00000000: {
                    // 0x00500010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    subs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00200000: {
                    // 0x00700010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    rsbs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00800000: {
                    // 0x00d00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    sbcs(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x00f00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    rscs(condition,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01000000: {
                    // 0x01500010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
                    cmp(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xff0f090) != 0x1500010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01200000: {
                    // 0x01700010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
                    cmn(condition,
                        Best,
                        Register(rn),
                        Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xff0f090) != 0x1700010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x01800000: {
                    // 0x01d00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
                    bics(condition,
                         Best,
                         Register(rd),
                         Register(rn),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    break;
                  }
                  case 0x01a00000: {
                    // 0x01f00010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    Shift shift((instr >> 5) & 0x3);
                    unsigned rs = (instr >> 8) & 0xf;
                    // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
                    mvns(condition,
                         Best,
                         Register(rd),
                         Operand(Register(rm), shift.GetType(), Register(rs)));
                    if (((instr & 0xfff0090) != 0x1f00010)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00400080: {
                // 0x00500090
                switch (instr & 0x00000060) {
                  case 0x00000000: {
                    // 0x00500090
                    switch (instr & 0x01a00000) {
                      case 0x00800000: {
                        // 0x00d00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smulls(condition,
                               Register(rdlo),
                               Register(rdhi),
                               Register(rn),
                               Register(rm));
                        break;
                      }
                      case 0x00a00000: {
                        // 0x00f00090
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rdlo = (instr >> 12) & 0xf;
                        unsigned rdhi = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                        smlals(condition,
                               Register(rdlo),
                               Register(rdhi),
                               Register(rn),
                               Register(rm));
                        break;
                      }
                      case 0x01800000: {
                        // 0x01d00090
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0x01d00090
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldab(condition,
                                 Register(rt),
                                 MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1d00c9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0x01d00290
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldaexb(condition,
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1d00e9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000300: {
                            // 0x01d00390
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldrexb(condition,
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1d00f9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      case 0x01a00000: {
                        // 0x01f00090
                        switch (instr & 0x00000300) {
                          case 0x00000000: {
                            // 0x01f00090
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldah(condition,
                                 Register(rt),
                                 MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1f00c9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000200: {
                            // 0x01f00290
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldaexh(condition,
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1f00e9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00000300: {
                            // 0x01f00390
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
                            ldrexh(condition,
                                   Register(rt),
                                   MemOperand(Register(rn), Offset));
                            if (((instr & 0xff00fff) != 0x1f00f9f)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000020: {
                    // 0x005000b0
                    switch (instr & 0x01200000) {
                      case 0x00000000: {
                        // 0x005000b0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x005f00b0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrh(condition,
                                   Best,
                                   Register(rt),
                                   MemOperand(pc, minus, 0));
                            } else {
                              ldrh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                            ldrh(condition,
                                 Best,
                                 Register(rt),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00200000: {
                        // 0x007000b0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("LDRHT", instr);
                        break;
                      }
                      case 0x01000000: {
                        // 0x015000b0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x015f00b0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrh(condition,
                                   Best,
                                   Register(rt),
                                   MemOperand(pc, minus, 0));
                            } else {
                              ldrh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                            ldrh(condition,
                                 Best,
                                 Register(rt),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            Offset));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x01200000: {
                        // 0x017000b0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x017f00b0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrh(condition,
                                   Best,
                                   Register(rt),
                                   MemOperand(pc, minus, 0));
                            } else {
                              ldrh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
                            ldrh(condition,
                                 Best,
                                 Register(rt),
                                 MemOperand(Register(rn),
                                            sign,
                                            offset,
                                            PreIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000040: {
                    // 0x005000d0
                    switch (instr & 0x01200000) {
                      case 0x00000000: {
                        // 0x005000d0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x005f00d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsb(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsb(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
                            ldrsb(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00200000: {
                        // 0x007000d0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("LDRSBT", instr);
                        break;
                      }
                      case 0x01000000: {
                        // 0x015000d0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x015f00d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsb(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsb(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
                            ldrsb(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             Offset));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x01200000: {
                        // 0x017000d0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x017f00d0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsb(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsb(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
                            ldrsb(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             PreIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00000060: {
                    // 0x005000f0
                    switch (instr & 0x01200000) {
                      case 0x00000000: {
                        // 0x005000f0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x005f00f0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsh(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
                            ldrsh(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             PostIndex));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00200000: {
                        // 0x007000f0
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("LDRSHT", instr);
                        break;
                      }
                      case 0x01000000: {
                        // 0x015000f0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x015f00f0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsh(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
                            ldrsh(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             Offset));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x01200000: {
                        // 0x017000f0
                        switch (instr & 0x000f0000) {
                          case 0x000f0000: {
                            // 0x017f00f0
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0x1200000) == 0x200000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            uint32_t U = (instr >> 23) & 0x1;
                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
                            if (U == 0) imm = -imm;
                            bool minus_zero = (imm == 0) && (U == 0);
                            Location location(imm, kA32PcDelta);
                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
                            if (minus_zero) {
                              ldrsh(condition,
                                    Best,
                                    Register(rt),
                                    MemOperand(pc, minus, 0));
                            } else {
                              ldrsh(condition, Register(rt), &location);
                            }
                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default: {
                            if (((instr & 0xf0000000) == 0xf0000000) ||
                                ((instr & 0xf0000) == 0xf0000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rt = (instr >> 12) & 0xf;
                            unsigned rn = (instr >> 16) & 0xf;
                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
                                                                   : plus);
                            int32_t offset =
                                (instr & 0xf) | ((instr >> 4) & 0xf0);
                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
                            ldrsh(condition,
                                  Best,
                                  Register(rt),
                                  MemOperand(Register(rn),
                                             sign,
                                             offset,
                                             PreIndex));
                            break;
                          }
                        }
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
        }
        break;
      }
      case 0x02000000: {
        // 0x02000000
        switch (instr & 0x01b00000) {
          case 0x00000000: {
            // 0x02000000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                and_(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02400000
                switch (instr & 0x000d0000) {
                  case 0x000d0000: {
                    // 0x024d0000
                    switch (instr & 0x00020000) {
                      case 0x00000000: {
                        // 0x024d0000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                        // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
                        sub(condition, Best, Register(rd), sp, imm);
                        break;
                      }
                      case 0x00020000: {
                        // 0x024f0000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr & 0xf0000000) != 0xf0000000) &&
                            ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
                          Condition condition((instr >> 28) & 0xf);
                          unsigned rd = (instr >> 12) & 0xf;
                          uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                          // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
                          sub(condition, Best, Register(rd), pc, imm);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                        Location location(UnsignedNegate(imm), kA32PcDelta);
                        // ADR{<c>}{<q>} <Rd>, <label> ; A2
                        adr(condition, Best, Register(rd), &location);
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xd0000) == 0xd0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                    sub(condition, Best, Register(rd), Register(rn), imm);
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00100000: {
            // 0x02100000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                ands(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02500000
                switch (instr & 0x000f0000) {
                  case 0x000d0000: {
                    // 0x025d0000
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
                    subs(condition, Best, Register(rd), sp, imm);
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xd0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                    subs(condition, Best, Register(rd), Register(rn), imm);
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00200000: {
            // 0x02200000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02200000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                eor(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02600000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                rsb(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x00300000: {
            // 0x02300000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02300000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                eors(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02700000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                rsbs(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x00800000: {
            // 0x02800000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02800000
                switch (instr & 0x000d0000) {
                  case 0x000d0000: {
                    // 0x028d0000
                    switch (instr & 0x00020000) {
                      case 0x00000000: {
                        // 0x028d0000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                        // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
                        add(condition, Best, Register(rd), sp, imm);
                        break;
                      }
                      case 0x00020000: {
                        // 0x028f0000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                        Location location(imm, kA32PcDelta);
                        // ADR{<c>}{<q>} <Rd>, <label> ; A1
                        adr(condition, Best, Register(rd), &location);
                        break;
                      }
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xd0000) == 0xd0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                    add(condition, Best, Register(rd), Register(rn), imm);
                    break;
                  }
                }
                break;
              }
              case 0x00400000: {
                // 0x02c00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                sbc(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x00900000: {
            // 0x02900000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02900000
                switch (instr & 0x000f0000) {
                  case 0x000d0000: {
                    // 0x029d0000
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
                    adds(condition, Best, Register(rd), sp, imm);
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xd0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                    adds(condition, Best, Register(rd), Register(rn), imm);
                    break;
                  }
                }
                break;
              }
              case 0x00400000: {
                // 0x02d00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                sbcs(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x00a00000: {
            // 0x02a00000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02a00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                adc(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02e00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                rsc(condition, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x00b00000: {
            // 0x02b00000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x02b00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                adcs(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x02f00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                rscs(condition, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x01000000: {
            // 0x03000000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
                if (!ImmediateA32::IsImmediateA32(imm)) {
                  // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
                  mov(condition, Best, Register(rd), imm);
                } else {
                  // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
                  movw(condition, Register(rd), imm);
                }
                break;
              }
              case 0x00400000: {
                // 0x03400000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
                // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
                movt(condition, Register(rd), imm);
                break;
              }
            }
            break;
          }
          case 0x01100000: {
            // 0x03100000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // TST{<c>}{<q>} <Rn>, #<const> ; A1
                tst(condition, Best, Register(rn), imm);
                if (((instr & 0xff0f000) != 0x3100000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x03500000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // CMP{<c>}{<q>} <Rn>, #<const> ; A1
                cmp(condition, Best, Register(rn), imm);
                if (((instr & 0xff0f000) != 0x3500000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01200000: {
            // 0x03200000
            switch (instr & 0x004f0000) {
              case 0x00000000: {
                // 0x03200000
                switch (instr & 0x000000f0) {
                  case 0x00000000: {
                    // 0x03200000
                    switch (instr & 0x0000000f) {
                      case 0x00000000: {
                        // 0x03200000
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        // NOP{<c>}{<q>} ; A1
                        nop(condition, Best);
                        if (((instr & 0xfffffff) != 0x320f000)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000001: {
                        // 0x03200001
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        // YIELD{<c>}{<q>} ; A1
                        yield(condition, Best);
                        if (((instr & 0xfffffff) != 0x320f001)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00000002: {
                        // 0x03200002
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("WFE", instr);
                        break;
                      }
                      case 0x00000003: {
                        // 0x03200003
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("WFI", instr);
                        break;
                      }
                      case 0x00000004: {
                        // 0x03200004
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("SEV", instr);
                        break;
                      }
                      case 0x00000005: {
                        // 0x03200005
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("SEVL", instr);
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x000000f0: {
                    // 0x032000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("DBG", instr);
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              default: {
                if (((instr & 0xf0000000) == 0xf0000000) ||
                    ((instr & 0x4f0000) == 0x0)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned spec_reg =
                    ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
                msr(condition, MaskedSpecialRegister(spec_reg), imm);
                if (((instr & 0xfb0f000) != 0x320f000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01300000: {
            // 0x03300000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03300000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
                teq(condition, Register(rn), imm);
                if (((instr & 0xff0f000) != 0x3300000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x03700000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // CMN{<c>}{<q>} <Rn>, #<const> ; A1
                cmn(condition, Best, Register(rn), imm);
                if (((instr & 0xff0f000) != 0x3700000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01800000: {
            // 0x03800000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03800000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                orr(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x03c00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                bic(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x01900000: {
            // 0x03900000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03900000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                orrs(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
              case 0x00400000: {
                // 0x03d00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
                bics(condition, Best, Register(rd), Register(rn), imm);
                break;
              }
            }
            break;
          }
          case 0x01a00000: {
            // 0x03a00000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03a00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // MOV{<c>}{<q>} <Rd>, #<const> ; A1
                mov(condition, Best, Register(rd), imm);
                if (((instr & 0xfff0000) != 0x3a00000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x03e00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // MVN{<c>}{<q>} <Rd>, #<const> ; A1
                mvn(condition, Best, Register(rd), imm);
                if (((instr & 0xfff0000) != 0x3e00000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
          case 0x01b00000: {
            // 0x03b00000
            switch (instr & 0x00400000) {
              case 0x00000000: {
                // 0x03b00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
                movs(condition, Best, Register(rd), imm);
                if (((instr & 0xfff0000) != 0x3b00000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x03f00000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
                // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
                mvns(condition, Best, Register(rd), imm);
                if (((instr & 0xfff0000) != 0x3f00000)) {
                  UnpredictableA32(instr);
                }
                break;
              }
            }
            break;
          }
        }
        break;
      }
      case 0x04000000: {
        // 0x04000000
        switch (instr & 0x00500000) {
          case 0x00000000: {
            // 0x04000000
            switch (instr & 0x01200000) {
              case 0x00000000: {
                // 0x04000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn), sign, offset, PostIndex));
                break;
              }
              case 0x00200000: {
                // 0x04200000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STRT", instr);
                break;
              }
              case 0x01000000: {
                // 0x05000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn), sign, offset, Offset));
                break;
              }
              case 0x01200000: {
                // 0x05200000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
                    ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
                    ((instr & 0xf0000000) != 0xf0000000)) {
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rt = (instr >> 12) & 0xf;
                  // PUSH{<c>}{<q>} <single_register_list> ; A1
                  push(condition, Best, Register(rt));
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn), sign, offset, PreIndex));
                break;
              }
            }
            break;
          }
          case 0x00100000: {
            // 0x04100000
            switch (instr & 0x01200000) {
              case 0x00000000: {
                // 0x04100000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x041f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldr(condition,
                          Best,
                          Register(rt),
                          MemOperand(pc, minus, 0));
                    } else {
                      ldr(condition, Best, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x51f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
                         Uint32(0x1)) &&
                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                         Uint32(0xd)) &&
                        ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rt = (instr >> 12) & 0xf;
                      // POP{<c>}{<q>} <single_register_list> ; A1
                      pop(condition, Best, Register(rt));
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                    ldr(condition,
                        Best,
                        Register(rt),
                        MemOperand(Register(rn), sign, offset, PostIndex));
                    break;
                  }
                }
                break;
              }
              case 0x00200000: {
                // 0x04300000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDRT", instr);
                break;
              }
              case 0x01000000: {
                // 0x05100000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x051f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldr(condition,
                          Best,
                          Register(rt),
                          MemOperand(pc, minus, 0));
                    } else {
                      ldr(condition, Best, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x51f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                    ldr(condition,
                        Best,
                        Register(rt),
                        MemOperand(Register(rn), sign, offset, Offset));
                    break;
                  }
                }
                break;
              }
              case 0x01200000: {
                // 0x05300000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x053f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldr(condition,
                          Best,
                          Register(rt),
                          MemOperand(pc, minus, 0));
                    } else {
                      ldr(condition, Best, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x51f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
                    ldr(condition,
                        Best,
                        Register(rt),
                        MemOperand(Register(rn), sign, offset, PreIndex));
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00400000: {
            // 0x04400000
            switch (instr & 0x01200000) {
              case 0x00000000: {
                // 0x04400000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn), sign, offset, PostIndex));
                break;
              }
              case 0x00200000: {
                // 0x04600000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STRBT", instr);
                break;
              }
              case 0x01000000: {
                // 0x05400000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn), sign, offset, Offset));
                break;
              }
              case 0x01200000: {
                // 0x05600000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = instr & 0xfff;
                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn), sign, offset, PreIndex));
                break;
              }
            }
            break;
          }
          case 0x00500000: {
            // 0x04500000
            switch (instr & 0x01200000) {
              case 0x00000000: {
                // 0x04500000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x045f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldrb(condition,
                           Best,
                           Register(rt),
                           MemOperand(pc, minus, 0));
                    } else {
                      ldrb(condition, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x55f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
                    ldrb(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn), sign, offset, PostIndex));
                    break;
                  }
                }
                break;
              }
              case 0x00200000: {
                // 0x04700000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDRBT", instr);
                break;
              }
              case 0x01000000: {
                // 0x05500000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x055f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldrb(condition,
                           Best,
                           Register(rt),
                           MemOperand(pc, minus, 0));
                    } else {
                      ldrb(condition, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x55f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
                    ldrb(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn), sign, offset, Offset));
                    break;
                  }
                }
                break;
              }
              case 0x01200000: {
                // 0x05700000
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x057f0000
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0x1200000) == 0x200000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xfff;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
                    if (minus_zero) {
                      ldrb(condition,
                           Best,
                           Register(rt),
                           MemOperand(pc, minus, 0));
                    } else {
                      ldrb(condition, Register(rt), &location);
                    }
                    if (((instr & 0xf7f0000) != 0x55f0000)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = instr & 0xfff;
                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
                    ldrb(condition,
                         Best,
                         Register(rt),
                         MemOperand(Register(rn), sign, offset, PreIndex));
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
        }
        break;
      }
      case 0x06000000: {
        // 0x06000000
        switch (instr & 0x01600010) {
          case 0x00000000: {
            // 0x06000000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x06000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               PostIndex));
                break;
              }
              case 0x00100000: {
                // 0x06100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
                ldr(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               PostIndex));
                break;
              }
            }
            break;
          }
          case 0x00000010: {
            // 0x06000010
            switch (instr & 0x00900060) {
              case 0x00100000: {
                // 0x06100010
                switch (instr & 0x00000080) {
                  case 0x00000000: {
                    // 0x06100010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    sadd16(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6100f10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x06100090
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    sadd8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6100f90)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00100020: {
                // 0x06100030
                if ((instr & 0x00000080) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rd = (instr >> 12) & 0xf;
                  unsigned rn = (instr >> 16) & 0xf;
                  unsigned rm = instr & 0xf;
                  // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                  sasx(condition, Register(rd), Register(rn), Register(rm));
                  if (((instr & 0xff00ff0) != 0x6100f30)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00100040: {
                // 0x06100050
                if ((instr & 0x00000080) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rd = (instr >> 12) & 0xf;
                  unsigned rn = (instr >> 16) & 0xf;
                  unsigned rm = instr & 0xf;
                  // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                  ssax(condition, Register(rd), Register(rn), Register(rm));
                  if (((instr & 0xff00ff0) != 0x6100f50)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00100060: {
                // 0x06100070
                switch (instr & 0x00000080) {
                  case 0x00000000: {
                    // 0x06100070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    ssub16(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6100f70)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x061000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    ssub8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6100ff0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0x06800010
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
                pkhbt(condition,
                      Register(rd),
                      Register(rn),
                      Operand(Register(rm), LSL, amount));
                break;
              }
              case 0x00800020: {
                // 0x06800030
                if ((instr & 0x00000080) == 0x00000080) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rd = (instr >> 12) & 0xf;
                  unsigned rn = (instr >> 16) & 0xf;
                  unsigned rm = instr & 0xf;
                  // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                  sel(condition, Register(rd), Register(rn), Register(rm));
                  if (((instr & 0xff00ff0) != 0x6800fb0)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00800040: {
                // 0x06800050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                if (amount == 0) amount = 32;
                // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
                pkhtb(condition,
                      Register(rd),
                      Register(rn),
                      Operand(Register(rm), ASR, amount));
                break;
              }
              case 0x00800060: {
                // 0x06800070
                switch (instr & 0x00000080) {
                  case 0x00000000: {
                    // 0x06800070
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x068f0070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                        sxtb16(condition,
                               Register(rd),
                               Operand(Register(rm), ROR, amount));
                        if (((instr & 0xfff03f0) != 0x68f0070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                        sxtab16(condition,
                                Register(rd),
                                Register(rn),
                                Operand(Register(rm), ROR, amount));
                        if (((instr & 0xff003f0) != 0x6800070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00200000: {
            // 0x06200000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x06200000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STRT", instr);
                break;
              }
              case 0x00100000: {
                // 0x06300000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDRT", instr);
                break;
              }
            }
            break;
          }
          case 0x00200010: {
            // 0x06200010
            switch (instr & 0x00800060) {
              case 0x00000000: {
                // 0x06200010
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06200010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qadd16(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200f10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x06200090
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qadd8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200f90)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06300010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shadd16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300f10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x06300090
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shadd8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300f90)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000020: {
                // 0x06200030
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06200030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qasx(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06300030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shasx(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000040: {
                // 0x06200050
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06200050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qsax(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200f50)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06300050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shsax(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300f50)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000060: {
                // 0x06200070
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06200070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qsub16(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200f70)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x062000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    qsub8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6200ff0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06300070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shsub16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300f70)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x063000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    shsub8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6300ff0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0x06a00010
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
                unsigned rn = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
                ssat(condition,
                     Register(rd),
                     imm,
                     Operand(Register(rn), LSL, amount));
                break;
              }
              case 0x00800020: {
                // 0x06a00030
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06a00030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    uint32_t imm = ((instr >> 16) & 0xf) + 1;
                    unsigned rn = instr & 0xf;
                    // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
                    ssat16(condition, Register(rd), imm, Register(rn));
                    if (((instr & 0xff00ff0) != 0x6a00f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06b00030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // REV{<c>}{<q>} <Rd>, <Rm> ; A1
                    rev(condition, Best, Register(rd), Register(rm));
                    if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x06b000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
                    rev16(condition, Best, Register(rd), Register(rm));
                    if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00800040: {
                // 0x06a00050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
                unsigned rn = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                if (amount == 0) amount = 32;
                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
                ssat(condition,
                     Register(rd),
                     imm,
                     Operand(Register(rn), ASR, amount));
                break;
              }
              case 0x00800060: {
                // 0x06a00070
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06a00070
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x06af0070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                        sxtb(condition,
                             Best,
                             Register(rd),
                             Operand(Register(rm), ROR, amount));
                        if (((instr & 0xfff03f0) != 0x6af0070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                        sxtab(condition,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), ROR, amount));
                        if (((instr & 0xff003f0) != 0x6a00070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06b00070
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x06bf0070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                        sxth(condition,
                             Best,
                             Register(rd),
                             Operand(Register(rm), ROR, amount));
                        if (((instr & 0xfff03f0) != 0x6bf0070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                        sxtah(condition,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), ROR, amount));
                        if (((instr & 0xff003f0) != 0x6b00070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
            }
            break;
          }
          case 0x00400000: {
            // 0x06400000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x06400000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                PostIndex));
                break;
              }
              case 0x00100000: {
                // 0x06500000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
                ldrb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                PostIndex));
                break;
              }
            }
            break;
          }
          case 0x00400010: {
            // 0x06400010
            switch (instr & 0x009000e0) {
              case 0x00100000: {
                // 0x06500010
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                uadd16(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500f10)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00100020: {
                // 0x06500030
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                uasx(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500f30)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00100040: {
                // 0x06500050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                usax(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500f50)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00100060: {
                // 0x06500070
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                usub16(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500f70)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00100080: {
                // 0x06500090
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                uadd8(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500f90)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x001000e0: {
                // 0x065000f0
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                unsigned rm = instr & 0xf;
                // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                usub8(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff00ff0) != 0x6500ff0)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00800060: {
                // 0x06c00070
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x06cf0070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
                    // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                    uxtb16(condition,
                           Register(rd),
                           Operand(Register(rm), ROR, amount));
                    if (((instr & 0xfff03f0) != 0x6cf0070)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
                    // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                    uxtab16(condition,
                            Register(rd),
                            Register(rn),
                            Operand(Register(rm), ROR, amount));
                    if (((instr & 0xff003f0) != 0x6c00070)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00600000: {
            // 0x06600000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x06600000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STRBT", instr);
                break;
              }
              case 0x00100000: {
                // 0x06700000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDRBT", instr);
                break;
              }
            }
            break;
          }
          case 0x00600010: {
            // 0x06600010
            switch (instr & 0x00800060) {
              case 0x00000000: {
                // 0x06600010
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06600010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqadd16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600f10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x06600090
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqadd8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600f90)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06700010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhadd16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700f10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x06700090
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhadd8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700f90)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000020: {
                // 0x06600030
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06600030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqasx(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06700030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhasx(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000040: {
                // 0x06600050
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06600050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqsax(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600f50)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06700050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhsax(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700f50)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000060: {
                // 0x06600070
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06600070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqsub16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600f70)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000080: {
                    // 0x066000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uqsub8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6600ff0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06700070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhsub16(condition,
                            Register(rd),
                            Register(rn),
                            Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700f70)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x067000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned rm = instr & 0xf;
                    // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    uhsub8(condition, Register(rd), Register(rn), Register(rm));
                    if (((instr & 0xff00ff0) != 0x6700ff0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00800000: {
                // 0x06e00010
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = (instr >> 16) & 0x1f;
                unsigned rn = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
                usat(condition,
                     Register(rd),
                     imm,
                     Operand(Register(rn), LSL, amount));
                break;
              }
              case 0x00800020: {
                // 0x06e00030
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06e00030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    uint32_t imm = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
                    usat16(condition, Register(rd), imm, Register(rn));
                    if (((instr & 0xff00ff0) != 0x6e00f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06f00030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
                    rbit(condition, Register(rd), Register(rm));
                    if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00100080: {
                    // 0x06f000b0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rm = instr & 0xf;
                    // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
                    revsh(condition, Best, Register(rd), Register(rm));
                    if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00800040: {
                // 0x06e00050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                uint32_t imm = (instr >> 16) & 0x1f;
                unsigned rn = instr & 0xf;
                uint32_t amount = (instr >> 7) & 0x1f;
                if (amount == 0) amount = 32;
                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
                usat(condition,
                     Register(rd),
                     imm,
                     Operand(Register(rn), ASR, amount));
                break;
              }
              case 0x00800060: {
                // 0x06e00070
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x06e00070
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x06ef0070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                        uxtb(condition,
                             Best,
                             Register(rd),
                             Operand(Register(rm), ROR, amount));
                        if (((instr & 0xfff03f0) != 0x6ef0070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                        uxtab(condition,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), ROR, amount));
                        if (((instr & 0xff003f0) != 0x6e00070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00100000: {
                    // 0x06f00070
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x06ff0070
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
                        uxth(condition,
                             Best,
                             Register(rd),
                             Operand(Register(rm), ROR, amount));
                        if (((instr & 0xfff03f0) != 0x6ff0070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 12) & 0xf;
                        unsigned rn = (instr >> 16) & 0xf;
                        unsigned rm = instr & 0xf;
                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
                        // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
                        uxtah(condition,
                              Register(rd),
                              Register(rn),
                              Operand(Register(rm), ROR, amount));
                        if (((instr & 0xff003f0) != 0x6f00070)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
            }
            break;
          }
          case 0x01000000: {
            // 0x07000000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x07000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                break;
              }
              case 0x00100000: {
                // 0x07100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
                ldr(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                break;
              }
            }
            break;
          }
          case 0x01000010: {
            // 0x07000010
            switch (instr & 0x009000e0) {
              case 0x00000000: {
                // 0x07000010
                switch (instr & 0x0000f000) {
                  case 0x0000f000: {
                    // 0x0700f010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    smuad(condition, Register(rd), Register(rn), Register(rm));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf000) == 0xf000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smlad(condition,
                          Register(rd),
                          Register(rn),
                          Register(rm),
                          Register(ra));
                    break;
                  }
                }
                break;
              }
              case 0x00000020: {
                // 0x07000030
                switch (instr & 0x0000f000) {
                  case 0x0000f000: {
                    // 0x0700f030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    smuadx(condition, Register(rd), Register(rn), Register(rm));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf000) == 0xf000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smladx(condition,
                           Register(rd),
                           Register(rn),
                           Register(rm),
                           Register(ra));
                    break;
                  }
                }
                break;
              }
              case 0x00000040: {
                // 0x07000050
                switch (instr & 0x0000f000) {
                  case 0x0000f000: {
                    // 0x0700f050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    smusd(condition, Register(rd), Register(rn), Register(rm));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf000) == 0xf000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smlsd(condition,
                          Register(rd),
                          Register(rn),
                          Register(rm),
                          Register(ra));
                    break;
                  }
                }
                break;
              }
              case 0x00000060: {
                // 0x07000070
                switch (instr & 0x0000f000) {
                  case 0x0000f000: {
                    // 0x0700f070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    smusdx(condition, Register(rd), Register(rn), Register(rm));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf000) == 0xf000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smlsdx(condition,
                           Register(rd),
                           Register(rn),
                           Register(rm),
                           Register(ra));
                    break;
                  }
                }
                break;
              }
              case 0x00100000: {
                // 0x07100010
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 16) & 0xf;
                unsigned rn = instr & 0xf;
                unsigned rm = (instr >> 8) & 0xf;
                // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                sdiv(condition, Register(rd), Register(rn), Register(rm));
                if (((instr & 0xff0f0f0) != 0x710f010)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00800000: {
                // 0x07800010
                switch (instr & 0x0000f000) {
                  case 0x0000f000: {
                    // 0x0780f010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                    usad8(condition, Register(rd), Register(rn), Register(rm));
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf000) == 0xf000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    usada8(condition,
                           Register(rd),
                           Register(rn),
                           Register(rm),
                           Register(ra));
                    break;
                  }
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01200000: {
            // 0x07200000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x07200000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = PreIndex;
                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
                str(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                break;
              }
              case 0x00100000: {
                // 0x07300000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = PreIndex;
                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
                ldr(condition,
                    Best,
                    Register(rt),
                    MemOperand(Register(rn),
                               sign,
                               Register(rm),
                               shift,
                               amount,
                               addrmode));
                break;
              }
            }
            break;
          }
          case 0x01200010: {
            // 0x07200010
            switch (instr & 0x00800060) {
              case 0x00000000: {
                // 0x07200010
                if ((instr & 0x00100080) == 0x00100000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rd = (instr >> 16) & 0xf;
                  unsigned rn = instr & 0xf;
                  unsigned rm = (instr >> 8) & 0xf;
                  // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                  udiv(condition, Register(rd), Register(rn), Register(rm));
                  if (((instr & 0xff0f0f0) != 0x730f010)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00800040: {
                // 0x07a00050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = instr & 0xf;
                uint32_t lsb = (instr >> 7) & 0x1f;
                uint32_t widthm1 = (instr >> 16) & 0x1f;
                uint32_t width = widthm1 + 1;
                // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
                sbfx(condition, Register(rd), Register(rn), lsb, width);
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01400000: {
            // 0x07400000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x07400000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                break;
              }
              case 0x00100000: {
                // 0x07500000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = Offset;
                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
                ldrb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                break;
              }
            }
            break;
          }
          case 0x01400010: {
            // 0x07400010
            switch (instr & 0x00800060) {
              case 0x00000000: {
                // 0x07400010
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x07400010
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rdlo = (instr >> 12) & 0xf;
                    unsigned rdhi = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                    smlald(condition,
                           Register(rdlo),
                           Register(rdhi),
                           Register(rn),
                           Register(rm));
                    break;
                  }
                  case 0x00100000: {
                    // 0x07500010
                    switch (instr & 0x0000f000) {
                      case 0x0000f000: {
                        // 0x0750f010
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smmul(condition,
                              Register(rd),
                              Register(rn),
                              Register(rm));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf000) == 0xf000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smmla(condition,
                              Register(rd),
                              Register(rn),
                              Register(rm),
                              Register(ra));
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000020: {
                // 0x07400030
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x07400030
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rdlo = (instr >> 12) & 0xf;
                    unsigned rdhi = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                    smlaldx(condition,
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                    break;
                  }
                  case 0x00100000: {
                    // 0x07500030
                    switch (instr & 0x0000f000) {
                      case 0x0000f000: {
                        // 0x0750f030
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
                        smmulr(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm));
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf000) == 0xf000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rd = (instr >> 16) & 0xf;
                        unsigned rn = instr & 0xf;
                        unsigned rm = (instr >> 8) & 0xf;
                        unsigned ra = (instr >> 12) & 0xf;
                        // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                        smmlar(condition,
                               Register(rd),
                               Register(rn),
                               Register(rm),
                               Register(ra));
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000040: {
                // 0x07400050
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x07400050
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rdlo = (instr >> 12) & 0xf;
                    unsigned rdhi = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                    smlsld(condition,
                           Register(rdlo),
                           Register(rdhi),
                           Register(rn),
                           Register(rm));
                    break;
                  }
                  case 0x00100080: {
                    // 0x075000d0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smmls(condition,
                          Register(rd),
                          Register(rn),
                          Register(rm),
                          Register(ra));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000060: {
                // 0x07400070
                switch (instr & 0x00100080) {
                  case 0x00000000: {
                    // 0x07400070
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rdlo = (instr >> 12) & 0xf;
                    unsigned rdhi = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
                    smlsldx(condition,
                            Register(rdlo),
                            Register(rdhi),
                            Register(rn),
                            Register(rm));
                    break;
                  }
                  case 0x00100080: {
                    // 0x075000f0
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 16) & 0xf;
                    unsigned rn = instr & 0xf;
                    unsigned rm = (instr >> 8) & 0xf;
                    unsigned ra = (instr >> 12) & 0xf;
                    // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
                    smmlsr(condition,
                           Register(rd),
                           Register(rn),
                           Register(rm),
                           Register(ra));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00800000: {
                // 0x07c00010
                switch (instr & 0x0000000f) {
                  case 0x0000000f: {
                    // 0x07c0001f
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    uint32_t lsb = (instr >> 7) & 0x1f;
                    uint32_t msb = (instr >> 16) & 0x1f;
                    uint32_t width = msb - lsb + 1;
                    // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
                    bfc(condition, Register(rd), lsb, width);
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf) == 0xf)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = (instr >> 12) & 0xf;
                    unsigned rn = instr & 0xf;
                    uint32_t lsb = (instr >> 7) & 0x1f;
                    uint32_t msb = (instr >> 16) & 0x1f;
                    uint32_t width = msb - lsb + 1;
                    // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
                    bfi(condition, Register(rd), Register(rn), lsb, width);
                    break;
                  }
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01600000: {
            // 0x07600000
            switch (instr & 0x00100000) {
              case 0x00000000: {
                // 0x07600000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = PreIndex;
                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
                strb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                break;
              }
              case 0x00100000: {
                // 0x07700000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rt = (instr >> 12) & 0xf;
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
                unsigned rm = instr & 0xf;
                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
                                                    (imm_and_type_ & 0x7c) >>
                                                        2);
                Shift shift = shift_operand.GetShift();
                uint32_t amount = shift_operand.GetAmount();
                AddrMode addrmode = PreIndex;
                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
                ldrb(condition,
                     Best,
                     Register(rt),
                     MemOperand(Register(rn),
                                sign,
                                Register(rm),
                                shift,
                                amount,
                                addrmode));
                break;
              }
            }
            break;
          }
          case 0x01600010: {
            // 0x07600010
            switch (instr & 0x00800060) {
              case 0x00800040: {
                // 0x07e00050
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = (instr >> 12) & 0xf;
                unsigned rn = instr & 0xf;
                uint32_t lsb = (instr >> 7) & 0x1f;
                uint32_t widthm1 = (instr >> 16) & 0x1f;
                uint32_t width = widthm1 + 1;
                // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
                ubfx(condition, Register(rd), Register(rn), lsb, width);
                break;
              }
              case 0x00800060: {
                // 0x07e00070
                if ((instr & 0xf0100080) == 0xe0100080) {
                  uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
                  // UDF{<c>}{<q>} {#}<imm> ; A1
                  udf(al, Best, imm);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
        }
        break;
      }
      case 0x08000000: {
        // 0x08000000
        switch (instr & 0x00500000) {
          case 0x00000000: {
            // 0x08000000
            switch (instr & 0x01800000) {
              case 0x00000000: {
                // 0x08000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
                stmda(condition, Register(rn), write_back, registers);
                break;
              }
              case 0x00800000: {
                // 0x08800000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
                stm(condition, Best, Register(rn), write_back, registers);
                break;
              }
              case 0x01000000: {
                // 0x09000000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
                    ((instr & 0xf0000000) != 0xf0000000) &&
                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
                  Condition condition((instr >> 28) & 0xf);
                  RegisterList registers((instr & 0xffff));
                  // PUSH{<c>}{<q>} <registers> ; A1
                  push(condition, Best, registers);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
                stmdb(condition, Best, Register(rn), write_back, registers);
                break;
              }
              case 0x01800000: {
                // 0x09800000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
                stmib(condition, Register(rn), write_back, registers);
                break;
              }
            }
            break;
          }
          case 0x00100000: {
            // 0x08100000
            switch (instr & 0x01800000) {
              case 0x00000000: {
                // 0x08100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
                ldmda(condition, Register(rn), write_back, registers);
                break;
              }
              case 0x00800000: {
                // 0x08900000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
                    ((instr & 0xf0000000) != 0xf0000000) &&
                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
                  Condition condition((instr >> 28) & 0xf);
                  RegisterList registers((instr & 0xffff));
                  // POP{<c>}{<q>} <registers> ; A1
                  pop(condition, Best, registers);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
                ldm(condition, Best, Register(rn), write_back, registers);
                break;
              }
              case 0x01000000: {
                // 0x09100000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
                ldmdb(condition, Register(rn), write_back, registers);
                break;
              }
              case 0x01800000: {
                // 0x09900000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                RegisterList registers((instr & 0xffff));
                // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
                ldmib(condition, Register(rn), write_back, registers);
                break;
              }
            }
            break;
          }
          case 0x00400000: {
            // 0x08400000
            if (((instr & 0xf0000000) == 0xf0000000)) {
              UnallocatedA32(instr);
              return;
            }
            UnimplementedA32("STM", instr);
            break;
          }
          case 0x00500000: {
            // 0x08500000
            switch (instr & 0x00008000) {
              case 0x00000000: {
                // 0x08500000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDM", instr);
                break;
              }
              case 0x00008000: {
                // 0x08508000
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDM", instr);
                break;
              }
            }
            break;
          }
        }
        break;
      }
      case 0x0a000000: {
        // 0x0a000000
        switch (instr & 0x01000000) {
          case 0x00000000: {
            // 0x0a000000
            if (((instr & 0xf0000000) == 0xf0000000)) {
              UnallocatedA32(instr);
              return;
            }
            Condition condition((instr >> 28) & 0xf);
            int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
            Location location(imm, kA32PcDelta);
            // B{<c>}{<q>} <label> ; A1
            b(condition, Best, &location);
            break;
          }
          case 0x01000000: {
            // 0x0b000000
            if (((instr & 0xf0000000) == 0xf0000000)) {
              UnallocatedA32(instr);
              return;
            }
            Condition condition((instr >> 28) & 0xf);
            int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
            Location location(imm, kA32PcDelta);
            // BL{<c>}{<q>} <label> ; A1
            bl(condition, &location);
            break;
          }
        }
        break;
      }
      case 0x0c000000: {
        // 0x0c000000
        switch (instr & 0x01100e00) {
          case 0x00000a00: {
            // 0x0c000a00
            switch (instr & 0x00800100) {
              case 0x00000000: {
                // 0x0c000a00
                if ((instr & 0x006000d0) == 0x00400010) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  unsigned rt = (instr >> 12) & 0xf;
                  unsigned rt2 = (instr >> 16) & 0xf;
                  // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
                  vmov(condition,
                       SRegister(rm),
                       SRegister(rm + 1),
                       Register(rt),
                       Register(rt2));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00000100: {
                // 0x0c000b00
                if ((instr & 0x006000d0) == 0x00400010) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  unsigned rt = (instr >> 12) & 0xf;
                  unsigned rt2 = (instr >> 16) & 0xf;
                  // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
                  vmov(condition, DRegister(rm), Register(rt), Register(rt2));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00800000: {
                // 0x0c800a00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                unsigned first = ExtractSRegister(instr, 22, 12);
                unsigned len = instr & 0xff;
                // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
                vstm(condition,
                     kDataTypeValueNone,
                     Register(rn),
                     write_back,
                     SRegisterList(SRegister(first), len));
                if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00800100: {
                // 0x0c800b00
                switch (instr & 0x00000001) {
                  case 0x00000000: {
                    // 0x0c800b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    WriteBack write_back((instr >> 21) & 0x1);
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
                    vstm(condition,
                         kDataTypeValueNone,
                         Register(rn),
                         write_back,
                         DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) ||
                        (end > kMaxNumberOfDRegisters)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000001: {
                    // 0x0c800b01
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    WriteBack write_back((instr >> 21) & 0x1);
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
                    fstmiax(condition,
                            Register(rn),
                            write_back,
                            DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) || (end > 16)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00000e00: {
            // 0x0c000e00
            switch (instr & 0x00600000) {
              case 0x00000000: {
                // 0x0c000e00
                if ((instr & 0x0080f100) == 0x00805000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  UnimplementedA32("STC", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00200000: {
                // 0x0c200e00
                if ((instr & 0x0000f100) == 0x00005000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  UnimplementedA32("STC", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x0c400e00
                if ((instr & 0x00800000) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  UnimplementedA32("MCRR", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x00100a00: {
            // 0x0c100a00
            switch (instr & 0x00800100) {
              case 0x00000000: {
                // 0x0c100a00
                if ((instr & 0x006000d0) == 0x00400010) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rt = (instr >> 12) & 0xf;
                  unsigned rt2 = (instr >> 16) & 0xf;
                  unsigned rm = ExtractSRegister(instr, 5, 0);
                  // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
                  vmov(condition,
                       Register(rt),
                       Register(rt2),
                       SRegister(rm),
                       SRegister(rm + 1));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00000100: {
                // 0x0c100b00
                if ((instr & 0x006000d0) == 0x00400010) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rt = (instr >> 12) & 0xf;
                  unsigned rt2 = (instr >> 16) & 0xf;
                  unsigned rm = ExtractDRegister(instr, 5, 0);
                  // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
                  vmov(condition, Register(rt), Register(rt2), DRegister(rm));
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00800000: {
                // 0x0c900a00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
                    ((instr & 0xf0000000) != 0xf0000000)) {
                  Condition condition((instr >> 28) & 0xf);
                  unsigned first = ExtractSRegister(instr, 22, 12);
                  unsigned len = instr & 0xff;
                  // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
                  vpop(condition,
                       kDataTypeValueNone,
                       SRegisterList(SRegister(first), len));
                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                    UnpredictableA32(instr);
                  }
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rn = (instr >> 16) & 0xf;
                WriteBack write_back((instr >> 21) & 0x1);
                unsigned first = ExtractSRegister(instr, 22, 12);
                unsigned len = instr & 0xff;
                // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
                vldm(condition,
                     kDataTypeValueNone,
                     Register(rn),
                     write_back,
                     SRegisterList(SRegister(first), len));
                if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                  UnpredictableA32(instr);
                }
                break;
              }
              case 0x00800100: {
                // 0x0c900b00
                switch (instr & 0x00000001) {
                  case 0x00000000: {
                    // 0x0c900b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
                         Uint32(0x1)) &&
                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
                         Uint32(0xd)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned first = ExtractDRegister(instr, 22, 12);
                      unsigned imm8 = (instr & 0xff);
                      unsigned len = imm8 / 2;
                      unsigned end = first + len;
                      // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
                      vpop(condition,
                           kDataTypeValueNone,
                           DRegisterList(DRegister(first), len));
                      if ((len == 0) || (len > 16) ||
                          (end > kMaxNumberOfDRegisters)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    WriteBack write_back((instr >> 21) & 0x1);
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
                    vldm(condition,
                         kDataTypeValueNone,
                         Register(rn),
                         write_back,
                         DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) ||
                        (end > kMaxNumberOfDRegisters)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000001: {
                    // 0x0c900b01
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    WriteBack write_back((instr >> 21) & 0x1);
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
                    fldmiax(condition,
                            Register(rn),
                            write_back,
                            DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) || (end > 16)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
            }
            break;
          }
          case 0x00100e00: {
            // 0x0c100e00
            switch (instr & 0x00600000) {
              case 0x00000000: {
                // 0x0c100e00
                switch (instr & 0x0080f100) {
                  case 0x00805000: {
                    // 0x0c905e00
                    switch (instr & 0x000f0000) {
                      case 0x000f0000: {
                        // 0x0c9f5e00
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("LDC", instr);
                        break;
                      }
                      default: {
                        if (((instr & 0xf0000000) == 0xf0000000) ||
                            ((instr & 0xf0000) == 0xf0000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        UnimplementedA32("LDC", instr);
                        break;
                      }
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00200000: {
                // 0x0c300e00
                if ((instr & 0x0000f100) == 0x00005000) {
                  if (((instr & 0xf0000000) == 0xf0000000) ||
                      ((instr & 0xf0000) == 0xf0000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  UnimplementedA32("LDC", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00400000: {
                // 0x0c500e00
                if ((instr & 0x00800000) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  UnimplementedA32("MRRC", instr);
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01000a00: {
            // 0x0d000a00
            switch (instr & 0x00200100) {
              case 0x00000000: {
                // 0x0d000a00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = ExtractSRegister(instr, 22, 12);
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = (instr & 0xff) << 2;
                // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
                vstr(condition,
                     Untyped32,
                     SRegister(rd),
                     MemOperand(Register(rn), sign, offset, Offset));
                break;
              }
              case 0x00000100: {
                // 0x0d000b00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                Condition condition((instr >> 28) & 0xf);
                unsigned rd = ExtractDRegister(instr, 22, 12);
                unsigned rn = (instr >> 16) & 0xf;
                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                int32_t offset = (instr & 0xff) << 2;
                // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
                vstr(condition,
                     Untyped64,
                     DRegister(rd),
                     MemOperand(Register(rn), sign, offset, Offset));
                break;
              }
              case 0x00200000: {
                // 0x0d200a00
                if ((instr & 0x00800000) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  if (((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
                      ((instr & 0xf0000000) != 0xf0000000)) {
                    Condition condition((instr >> 28) & 0xf);
                    unsigned first = ExtractSRegister(instr, 22, 12);
                    unsigned len = instr & 0xff;
                    // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
                    vpush(condition,
                          kDataTypeValueNone,
                          SRegisterList(SRegister(first), len));
                    if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                      UnpredictableA32(instr);
                    }
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rn = (instr >> 16) & 0xf;
                  unsigned first = ExtractSRegister(instr, 22, 12);
                  unsigned len = instr & 0xff;
                  // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
                  vstmdb(condition,
                         kDataTypeValueNone,
                         Register(rn),
                         WriteBack(WRITE_BACK),
                         SRegisterList(SRegister(first), len));
                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00200100: {
                // 0x0d200b00
                switch (instr & 0x00800001) {
                  case 0x00000000: {
                    // 0x0d200b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
                         Uint32(0xd)) &&
                        ((instr & 0xf0000000) != 0xf0000000)) {
                      Condition condition((instr >> 28) & 0xf);
                      unsigned first = ExtractDRegister(instr, 22, 12);
                      unsigned imm8 = (instr & 0xff);
                      unsigned len = imm8 / 2;
                      unsigned end = first + len;
                      // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
                      vpush(condition,
                            kDataTypeValueNone,
                            DRegisterList(DRegister(first), len));
                      if ((len == 0) || (len > 16) ||
                          (end > kMaxNumberOfDRegisters)) {
                        UnpredictableA32(instr);
                      }
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
                    vstmdb(condition,
                           kDataTypeValueNone,
                           Register(rn),
                           WriteBack(WRITE_BACK),
                           DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) ||
                        (end > kMaxNumberOfDRegisters)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000001: {
                    // 0x0d200b01
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
                    fstmdbx(condition,
                            Register(rn),
                            WriteBack(WRITE_BACK),
                            DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) || (end > 16)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
            }
            break;
          }
          case 0x01000e00: {
            // 0x0d000e00
            switch (instr & 0x0060f100) {
              case 0x00005000: {
                // 0x0d005e00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STC", instr);
                break;
              }
              case 0x00205000: {
                // 0x0d205e00
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("STC", instr);
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01100a00: {
            // 0x0d100a00
            switch (instr & 0x00200100) {
              case 0x00000000: {
                // 0x0d100a00
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x0d1f0a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xff;
                    imm <<= 2;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
                    if (minus_zero) {
                      vldr(condition,
                           Untyped32,
                           SRegister(rd),
                           MemOperand(pc, minus, 0));
                    } else {
                      vldr(condition, Untyped32, SRegister(rd), &location);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = (instr & 0xff) << 2;
                    // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
                    vldr(condition,
                         Untyped32,
                         SRegister(rd),
                         MemOperand(Register(rn), sign, offset, Offset));
                    break;
                  }
                }
                break;
              }
              case 0x00000100: {
                // 0x0d100b00
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x0d1f0b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    uint32_t U = (instr >> 23) & 0x1;
                    int32_t imm = instr & 0xff;
                    imm <<= 2;
                    if (U == 0) imm = -imm;
                    bool minus_zero = (imm == 0) && (U == 0);
                    Location location(imm, kA32PcDelta);
                    // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
                    if (minus_zero) {
                      vldr(condition,
                           Untyped64,
                           DRegister(rd),
                           MemOperand(pc, minus, 0));
                    } else {
                      vldr(condition, Untyped64, DRegister(rd), &location);
                    }
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = (instr >> 16) & 0xf;
                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
                    int32_t offset = (instr & 0xff) << 2;
                    // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
                    vldr(condition,
                         Untyped64,
                         DRegister(rd),
                         MemOperand(Register(rn), sign, offset, Offset));
                    break;
                  }
                }
                break;
              }
              case 0x00200000: {
                // 0x0d300a00
                if ((instr & 0x00800000) == 0x00000000) {
                  if (((instr & 0xf0000000) == 0xf0000000)) {
                    UnallocatedA32(instr);
                    return;
                  }
                  Condition condition((instr >> 28) & 0xf);
                  unsigned rn = (instr >> 16) & 0xf;
                  unsigned first = ExtractSRegister(instr, 22, 12);
                  unsigned len = instr & 0xff;
                  // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
                  vldmdb(condition,
                         kDataTypeValueNone,
                         Register(rn),
                         WriteBack(WRITE_BACK),
                         SRegisterList(SRegister(first), len));
                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
                    UnpredictableA32(instr);
                  }
                } else {
                  UnallocatedA32(instr);
                }
                break;
              }
              case 0x00200100: {
                // 0x0d300b00
                switch (instr & 0x00800001) {
                  case 0x00000000: {
                    // 0x0d300b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
                    vldmdb(condition,
                           kDataTypeValueNone,
                           Register(rn),
                           WriteBack(WRITE_BACK),
                           DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) ||
                        (end > kMaxNumberOfDRegisters)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00000001: {
                    // 0x0d300b01
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rn = (instr >> 16) & 0xf;
                    unsigned first = ExtractDRegister(instr, 22, 12);
                    unsigned imm8 = (instr & 0xff);
                    unsigned len = imm8 / 2;
                    unsigned end = first + len;
                    // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
                    fldmdbx(condition,
                            Register(rn),
                            WriteBack(WRITE_BACK),
                            DRegisterList(DRegister(first), len));
                    if ((len == 0) || (len > 16) || (end > 16)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
            }
            break;
          }
          case 0x01100e00: {
            // 0x0d100e00
            switch (instr & 0x0060f100) {
              case 0x00005000: {
                // 0x0d105e00
                switch (instr & 0x000f0000) {
                  case 0x000f0000: {
                    // 0x0d1f5e00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("LDC", instr);
                    break;
                  }
                  default: {
                    if (((instr & 0xf0000000) == 0xf0000000) ||
                        ((instr & 0xf0000) == 0xf0000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    UnimplementedA32("LDC", instr);
                    break;
                  }
                }
                break;
              }
              case 0x00205000: {
                // 0x0d305e00
                if (((instr & 0xf0000000) == 0xf0000000) ||
                    ((instr & 0xf0000) == 0xf0000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("LDC", instr);
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          default:
            UnallocatedA32(instr);
            break;
        }
        break;
      }
      case 0x0e000000: {
        // 0x0e000000
        switch (instr & 0x01000000) {
          case 0x00000000: {
            // 0x0e000000
            switch (instr & 0x00100e10) {
              case 0x00000a00: {
                // 0x0e000a00
                switch (instr & 0x00a00140) {
                  case 0x00000000: {
                    // 0x0e000a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
                    vmla(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00000040: {
                    // 0x0e000a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
                    vmls(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00000100: {
                    // 0x0e000b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
                    vmla(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00000140: {
                    // 0x0e000b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
                    vmls(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0x0e200a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
                    vmul(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00200040: {
                    // 0x0e200a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
                    vnmul(condition,
                          F32,
                          SRegister(rd),
                          SRegister(rn),
                          SRegister(rm));
                    break;
                  }
                  case 0x00200100: {
                    // 0x0e200b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
                    vmul(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00200140: {
                    // 0x0e200b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
                    vnmul(condition,
                          F64,
                          DRegister(rd),
                          DRegister(rn),
                          DRegister(rm));
                    break;
                  }
                  case 0x00800000: {
                    // 0x0e800a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
                    vdiv(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00800100: {
                    // 0x0e800b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
                    vdiv(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x0ea00a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
                    vfma(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00a00040: {
                    // 0x0ea00a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
                    vfms(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00a00100: {
                    // 0x0ea00b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
                    vfma(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00a00140: {
                    // 0x0ea00b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
                    vfms(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  default:
                    UnallocatedA32(instr);
                    break;
                }
                break;
              }
              case 0x00000a10: {
                // 0x0e000a10
                switch (instr & 0x00800100) {
                  case 0x00000000: {
                    // 0x0e000a10
                    if ((instr & 0x00600000) == 0x00000000) {
                      if (((instr & 0xf0000000) == 0xf0000000)) {
                        UnallocatedA32(instr);
                        return;
                      }
                      Condition condition((instr >> 28) & 0xf);
                      unsigned rn = ExtractSRegister(instr, 7, 16);
                      unsigned rt = (instr >> 12) & 0xf;
                      // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
                      vmov(condition, SRegister(rn), Register(rt));
                      if (((instr & 0xff00f7f) != 0xe000a10)) {
                        UnpredictableA32(instr);
                      }
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x00000100: {
                    // 0x0e000b10
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned lane;
                    DataType dt =
                        Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
                                                  ((instr >> 19) & 0xc),
                                              &lane);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rd = ExtractDRegister(instr, 7, 16);
                    unsigned rt = (instr >> 12) & 0xf;
                    // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
                    vmov(condition, dt, DRegisterLane(rd, lane), Register(rt));
                    if (((instr & 0xf900f1f) != 0xe000b10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00800000: {
                    // 0x0e800a10
                    if ((instr & 0x00600000) == 0x00600000) {
                      if (((instr & 0xf0000000) == 0xf0000000)) {
                        UnallocatedA32(instr);
                        return;
                      }
                      Condition condition((instr >> 28) & 0xf);
                      unsigned spec_reg = (instr >> 16) & 0xf;
                      unsigned rt = (instr >> 12) & 0xf;
                      switch (spec_reg) {
                        case 0x0:
                        case 0x1:
                        case 0x8: {
                          // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
                          vmsr(condition,
                               SpecialFPRegister(spec_reg),
                               Register(rt));
                          if (((instr & 0xff00fff) != 0xee00a10)) {
                            UnpredictableA32(instr);
                          }
                          break;
                        }
                        default:
                          UnallocatedA32(instr);
                          break;
                      }
                    } else {
                      UnallocatedA32(instr);
                    }
                    break;
                  }
                  case 0x00800100: {
                    // 0x0e800b10
                    switch (instr & 0x00200040) {
                      case 0x00000000: {
                        // 0x0e800b10
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
                                                      ((instr >> 21) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 7, 16);
                        unsigned rt = (instr >> 12) & 0xf;
                        // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
                        vdup(condition, dt, DRegister(rd), Register(rt));
                        if (((instr & 0xfb00f5f) != 0xe800b10)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00200000: {
                        // 0x0ea00b10
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
                                                      ((instr >> 21) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        if (((instr >> 16) & 1) != 0) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractQRegister(instr, 7, 16);
                        unsigned rt = (instr >> 12) & 0xf;
                        // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
                        vdup(condition, dt, QRegister(rd), Register(rt));
                        if (((instr & 0xfb00f5f) != 0xea00b10)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00000e10: {
                // 0x0e000e10
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("MCR", instr);
                break;
              }
              case 0x00100a00: {
                // 0x0e100a00
                switch (instr & 0x00a00140) {
                  case 0x00000000: {
                    // 0x0e100a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
                    vnmls(condition,
                          F32,
                          SRegister(rd),
                          SRegister(rn),
                          SRegister(rm));
                    break;
                  }
                  case 0x00000040: {
                    // 0x0e100a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
                    vnmla(condition,
                          F32,
                          SRegister(rd),
                          SRegister(rn),
                          SRegister(rm));
                    break;
                  }
                  case 0x00000100: {
                    // 0x0e100b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
                    vnmls(condition,
                          F64,
                          DRegister(rd),
                          DRegister(rn),
                          DRegister(rm));
                    break;
                  }
                  case 0x00000140: {
                    // 0x0e100b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
                    vnmla(condition,
                          F64,
                          DRegister(rd),
                          DRegister(rn),
                          DRegister(rm));
                    break;
                  }
                  case 0x00200000: {
                    // 0x0e300a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
                    vadd(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00200040: {
                    // 0x0e300a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
                    vsub(condition,
                         F32,
                         SRegister(rd),
                         SRegister(rn),
                         SRegister(rm));
                    break;
                  }
                  case 0x00200100: {
                    // 0x0e300b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
                    vadd(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00200140: {
                    // 0x0e300b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
                    vsub(condition,
                         F64,
                         DRegister(rd),
                         DRegister(rn),
                         DRegister(rm));
                    break;
                  }
                  case 0x00800000: {
                    // 0x0e900a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
                    vfnms(condition,
                          F32,
                          SRegister(rd),
                          SRegister(rn),
                          SRegister(rm));
                    break;
                  }
                  case 0x00800040: {
                    // 0x0e900a40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    unsigned rn = ExtractSRegister(instr, 7, 16);
                    unsigned rm = ExtractSRegister(instr, 5, 0);
                    // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
                    vfnma(condition,
                          F32,
                          SRegister(rd),
                          SRegister(rn),
                          SRegister(rm));
                    break;
                  }
                  case 0x00800100: {
                    // 0x0e900b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
                    vfnms(condition,
                          F64,
                          DRegister(rd),
                          DRegister(rn),
                          DRegister(rm));
                    break;
                  }
                  case 0x00800140: {
                    // 0x0e900b40
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    unsigned rm = ExtractDRegister(instr, 5, 0);
                    // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
                    vfnma(condition,
                          F64,
                          DRegister(rd),
                          DRegister(rn),
                          DRegister(rm));
                    break;
                  }
                  case 0x00a00000: {
                    // 0x0eb00a00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractSRegister(instr, 22, 12);
                    uint32_t encoded_imm =
                        (instr & 0xf) | ((instr >> 12) & 0xf0);
                    NeonImmediate imm =
                        ImmediateVFP::Decode<float>(encoded_imm);
                    // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
                    vmov(condition, F32, SRegister(rd), imm);
                    if (((instr & 0xfb00ff0) != 0xeb00a00)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00a00040: {
                    // 0x0eb00a40
                    switch (instr & 0x000e0000) {
                      case 0x00000000: {
                        // 0x0eb00a40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb00a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
                            vmov(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb00ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
                            vabs(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb10a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
                            vneg(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb10ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vsqrt(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00020000: {
                        // 0x0eb20a40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb20a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
                            vcvtb(condition,
                                  F32,
                                  F16,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb20ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
                            vcvtt(condition,
                                  F32,
                                  F16,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb30a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
                            vcvtb(condition,
                                  F16,
                                  F32,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb30ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
                            vcvtt(condition,
                                  F16,
                                  F32,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00040000: {
                        // 0x0eb40a40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb40a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vcmp(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb40ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vcmpe(condition, F32, SRegister(rd), SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb50a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
                            vcmp(condition, F32, SRegister(rd), 0.0);
                            if (((instr & 0xfbf0fff) != 0xeb50a40)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb50ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
                            vcmpe(condition, F32, SRegister(rd), 0.0);
                            if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00060000: {
                        // 0x0eb60a40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb60a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vrintr(condition,
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb60ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vrintz(condition,
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb70a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
                            vrintx(condition,
                                   F32,
                                   SRegister(rd),
                                   SRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb70ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
                            vcvt(condition,
                                 F64,
                                 F32,
                                 DRegister(rd),
                                 SRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00080000: {
                        // 0x0eb80a40
                        if ((instr & 0x00010000) == 0x00000000) {
                          if (((instr & 0xf0000000) == 0xf0000000)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          Condition condition((instr >> 28) & 0xf);
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          unsigned rd = ExtractSRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
                          vcvt(condition,
                               F32,
                               dt,
                               SRegister(rd),
                               SRegister(rm));
                        } else {
                          UnallocatedA32(instr);
                        }
                        break;
                      }
                      case 0x000a0000: {
                        // 0x0eba0a40
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                       ((instr >> 15) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractSRegister(instr, 22, 12);
                        unsigned offset = 32;
                        if (dt.Is(S16) || dt.Is(U16)) {
                          offset = 16;
                        }
                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                   ((instr << 1) & 0x1e));
                        // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1
                        vcvt(condition,
                             F32,
                             dt,
                             SRegister(rd),
                             SRegister(rd),
                             fbits);
                        break;
                      }
                      case 0x000c0000: {
                        // 0x0ebc0a40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0ebc0a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
                            vcvtr(condition,
                                  U32,
                                  F32,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0ebc0ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
                            vcvt(condition,
                                 U32,
                                 F32,
                                 SRegister(rd),
                                 SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0ebd0a40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
                            vcvtr(condition,
                                  S32,
                                  F32,
                                  SRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0ebd0ac0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
                            vcvt(condition,
                                 S32,
                                 F32,
                                 SRegister(rd),
                                 SRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x000e0000: {
                        // 0x0ebe0a40
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                       ((instr >> 15) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractSRegister(instr, 22, 12);
                        unsigned offset = 32;
                        if (dt.Is(S16) || dt.Is(U16)) {
                          offset = 16;
                        }
                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                   ((instr << 1) & 0x1e));
                        // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1
                        vcvt(condition,
                             dt,
                             F32,
                             SRegister(rd),
                             SRegister(rd),
                             fbits);
                        break;
                      }
                    }
                    break;
                  }
                  case 0x00a00100: {
                    // 0x0eb00b00
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned rd = ExtractDRegister(instr, 22, 12);
                    uint32_t encoded_imm =
                        (instr & 0xf) | ((instr >> 12) & 0xf0);
                    NeonImmediate imm =
                        ImmediateVFP::Decode<double>(encoded_imm);
                    // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
                    vmov(condition, F64, DRegister(rd), imm);
                    if (((instr & 0xfb00ff0) != 0xeb00b00)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                  case 0x00a00140: {
                    // 0x0eb00b40
                    switch (instr & 0x000e0000) {
                      case 0x00000000: {
                        // 0x0eb00b40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb00b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
                            vmov(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb00bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
                            vabs(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb10b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
                            vneg(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb10bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vsqrt(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00020000: {
                        // 0x0eb20b40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb20b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
                            vcvtb(condition,
                                  F64,
                                  F16,
                                  DRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb20bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractSRegister(instr, 5, 0);
                            // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
                            vcvtt(condition,
                                  F64,
                                  F16,
                                  DRegister(rd),
                                  SRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb30b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
                            vcvtb(condition,
                                  F16,
                                  F64,
                                  SRegister(rd),
                                  DRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb30bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
                            vcvtt(condition,
                                  F16,
                                  F64,
                                  SRegister(rd),
                                  DRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00040000: {
                        // 0x0eb40b40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb40b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vcmp(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb40bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vcmpe(condition, F64, DRegister(rd), DRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb50b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
                            vcmp(condition, F64, DRegister(rd), 0.0);
                            if (((instr & 0xfbf0fff) != 0xeb50b40)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb50bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
                            vcmpe(condition, F64, DRegister(rd), 0.0);
                            if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00060000: {
                        // 0x0eb60b40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0eb60b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vrintr(condition,
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0eb60bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vrintz(condition,
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0eb70b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractDRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
                            vrintx(condition,
                                   F64,
                                   DRegister(rd),
                                   DRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0eb70bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
                            vcvt(condition,
                                 F32,
                                 F64,
                                 SRegister(rd),
                                 DRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x00080000: {
                        // 0x0eb80b40
                        if ((instr & 0x00010000) == 0x00000000) {
                          if (((instr & 0xf0000000) == 0xf0000000)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          Condition condition((instr >> 28) & 0xf);
                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
                          if (dt.Is(kDataTypeValueInvalid)) {
                            UnallocatedA32(instr);
                            return;
                          }
                          unsigned rd = ExtractDRegister(instr, 22, 12);
                          unsigned rm = ExtractSRegister(instr, 5, 0);
                          // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
                          vcvt(condition,
                               F64,
                               dt,
                               DRegister(rd),
                               SRegister(rm));
                        } else {
                          UnallocatedA32(instr);
                        }
                        break;
                      }
                      case 0x000a0000: {
                        // 0x0eba0b40
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                       ((instr >> 15) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 22, 12);
                        unsigned offset = 32;
                        if (dt.Is(S16) || dt.Is(U16)) {
                          offset = 16;
                        }
                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                   ((instr << 1) & 0x1e));
                        // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1
                        vcvt(condition,
                             F64,
                             dt,
                             DRegister(rd),
                             DRegister(rd),
                             fbits);
                        break;
                      }
                      case 0x000c0000: {
                        // 0x0ebc0b40
                        switch (instr & 0x00010080) {
                          case 0x00000000: {
                            // 0x0ebc0b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
                            vcvtr(condition,
                                  U32,
                                  F64,
                                  SRegister(rd),
                                  DRegister(rm));
                            break;
                          }
                          case 0x00000080: {
                            // 0x0ebc0bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
                            vcvt(condition,
                                 U32,
                                 F64,
                                 SRegister(rd),
                                 DRegister(rm));
                            break;
                          }
                          case 0x00010000: {
                            // 0x0ebd0b40
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
                            vcvtr(condition,
                                  S32,
                                  F64,
                                  SRegister(rd),
                                  DRegister(rm));
                            break;
                          }
                          case 0x00010080: {
                            // 0x0ebd0bc0
                            if (((instr & 0xf0000000) == 0xf0000000)) {
                              UnallocatedA32(instr);
                              return;
                            }
                            Condition condition((instr >> 28) & 0xf);
                            unsigned rd = ExtractSRegister(instr, 22, 12);
                            unsigned rm = ExtractDRegister(instr, 5, 0);
                            // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
                            vcvt(condition,
                                 S32,
                                 F64,
                                 SRegister(rd),
                                 DRegister(rm));
                            break;
                          }
                        }
                        break;
                      }
                      case 0x000e0000: {
                        // 0x0ebe0b40
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
                                                       ((instr >> 15) & 0x2));
                        if (dt.Is(kDataTypeValueInvalid)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        unsigned rd = ExtractDRegister(instr, 22, 12);
                        unsigned offset = 32;
                        if (dt.Is(S16) || dt.Is(U16)) {
                          offset = 16;
                        }
                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
                                                   ((instr << 1) & 0x1e));
                        // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1
                        vcvt(condition,
                             dt,
                             F64,
                             DRegister(rd),
                             DRegister(rd),
                             fbits);
                        break;
                      }
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00100a10: {
                // 0x0e100a10
                switch (instr & 0x00000100) {
                  case 0x00000000: {
                    // 0x0e100a10
                    switch (instr & 0x00e00000) {
                      case 0x00000000: {
                        // 0x0e100a10
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned rn = ExtractSRegister(instr, 7, 16);
                        // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
                        vmov(condition, Register(rt), SRegister(rn));
                        if (((instr & 0xff00f7f) != 0xe100a10)) {
                          UnpredictableA32(instr);
                        }
                        break;
                      }
                      case 0x00e00000: {
                        // 0x0ef00a10
                        if (((instr & 0xf0000000) == 0xf0000000)) {
                          UnallocatedA32(instr);
                          return;
                        }
                        Condition condition((instr >> 28) & 0xf);
                        unsigned rt = (instr >> 12) & 0xf;
                        unsigned spec_reg = (instr >> 16) & 0xf;
                        switch (spec_reg) {
                          case 0x0:
                          case 0x1:
                          case 0x5:
                          case 0x6:
                          case 0x7:
                          case 0x8: {
                            // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
                            vmrs(condition,
                                 RegisterOrAPSR_nzcv(rt),
                                 SpecialFPRegister(spec_reg));
                            if (((instr & 0xff00fff) != 0xef00a10)) {
                              UnpredictableA32(instr);
                            }
                            break;
                          }
                          default:
                            UnallocatedA32(instr);
                            break;
                        }
                        break;
                      }
                      default:
                        UnallocatedA32(instr);
                        break;
                    }
                    break;
                  }
                  case 0x00000100: {
                    // 0x0e100b10
                    if (((instr & 0xf0000000) == 0xf0000000)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    Condition condition((instr >> 28) & 0xf);
                    unsigned lane;
                    DataType dt =
                        Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
                                                    ((instr >> 19) & 0xc) |
                                                    ((instr >> 19) & 0x10),
                                                &lane);
                    if (dt.Is(kDataTypeValueInvalid)) {
                      UnallocatedA32(instr);
                      return;
                    }
                    unsigned rt = (instr >> 12) & 0xf;
                    unsigned rn = ExtractDRegister(instr, 7, 16);
                    // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
                    vmov(condition, dt, Register(rt), DRegisterLane(rn, lane));
                    if (((instr & 0xf100f1f) != 0xe100b10)) {
                      UnpredictableA32(instr);
                    }
                    break;
                  }
                }
                break;
              }
              case 0x00100e10: {
                // 0x0e100e10
                if (((instr & 0xf0000000) == 0xf0000000)) {
                  UnallocatedA32(instr);
                  return;
                }
                UnimplementedA32("MRC", instr);
                break;
              }
              default:
                UnallocatedA32(instr);
                break;
            }
            break;
          }
          case 0x01000000: {
            // 0x0f000000
            if (((instr & 0xf0000000) == 0xf0000000)) {
              UnallocatedA32(instr);
              return;
            }
            Condition condition((instr >> 28) & 0xf);
            uint32_t imm = instr & 0xffffff;
            // SVC{<c>}{<q>} {#}<imm> ; A1
            svc(condition, imm);
            break;
          }
        }
        break;
      }
    }
  }
}  // NOLINT(readability/fn_size)
// End of generated code.

const uint16_t* PrintDisassembler::DecodeT32At(
    const uint16_t* instruction_address, const uint16_t* buffer_end) {
  uint32_t instruction = *instruction_address++ << 16;

  if (instruction >= kLowestT32_32Opcode) {
    if (instruction_address >= buffer_end) {
      os() << "?\n";
      return instruction_address;
    }
    instruction |= *instruction_address++;
  }

  DecodeT32(instruction);
  return instruction_address;
}

void PrintDisassembler::DecodeT32(uint32_t instruction) {
  PrintCodeAddress(GetCodeAddress());
  if (T32Size(instruction) == 2) {
    PrintOpcode16(instruction >> 16);
    Disassembler::DecodeT32(instruction);
  } else {
    PrintOpcode32(instruction);
    Disassembler::DecodeT32(instruction);
  }
  os() << "\n";
}


void PrintDisassembler::DecodeA32(uint32_t instruction) {
  PrintCodeAddress(GetCodeAddress());
  PrintOpcode32(instruction);
  Disassembler::DecodeA32(instruction);
  os() << "\n";
}


void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
                                             size_t size_in_bytes) {
  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
  const uint32_t* const end_buffer =
      buffer + (size_in_bytes / sizeof(uint32_t));
  while (buffer < end_buffer) {
    DecodeA32(*buffer++);
  }
}


void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
                                             size_t size_in_bytes) {
  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
  const uint16_t* const end_buffer =
      buffer + (size_in_bytes / sizeof(uint16_t));
  while (buffer < end_buffer) {
    buffer = DecodeT32At(buffer, end_buffer);
  }
  VIXL_ASSERT(buffer == end_buffer);
}

}  // namespace aarch32
}  // namespace vixl
