18b57c86886020cf0a5331823be4789ee558764e2Georgia Kouveli// Copyright 2017, VIXL authors
288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// All rights reserved.
388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//
488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Redistribution and use in source and binary forms, with or without
588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// modification, are permitted provided that the following conditions are met:
688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//
788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//   * Redistributions of source code must retain the above copyright notice,
888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//     this list of conditions and the following disclaimer.
988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//   * Redistributions in binary form must reproduce the above copyright
1088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//     notice, this list of conditions and the following disclaimer in the
1188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//     documentation and/or other materials provided with the distribution.
1288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//   * Neither the name of ARM Limited nor the names of its contributors may
1388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//     be used to endorse or promote products derived from this software
1488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//     without specific prior written permission.
1588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois//
1688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
1788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// POSSIBILITY OF SUCH DAMAGE.
2788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
2878973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langloisextern "C" {
2988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#include <inttypes.h>
301bce007699e07bd855b7d194ca93fa5504a73edaPierre Langlois#include <stdint.h>
3178973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois}
3278973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois
3378973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois#include <cassert>
3478973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois#include <cmath>
3578973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois#include <cstdio>
3678973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois#include <cstdlib>
3778973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois#include <cstring>
388b57c86886020cf0a5331823be4789ee558764e2Georgia Kouveli#include <iomanip>
3960241a544be0ebf48347789bf0ec268414364627Vincent Belliard#include <iostream>
4078973f258039f6e96eba85f1b5ecdb14b3c51dbbPierre Langlois
4188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#include "utils-vixl.h"
42d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/constants-aarch32.h"
43d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/instructions-aarch32.h"
44989663e3cb7be8ac458d71f8e8d99afd29b13a39Pierre Langlois#include "aarch32/operands-aarch32.h"
4588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
4688c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace vixl {
4788c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace aarch32 {
4888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
4988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Operand
5088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
5188c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const Operand& operand) {
5288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediate()) {
5388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << "#" << operand.GetImmediate();
5488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
5588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediateShiftedRegister()) {
5688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if ((operand.GetShift().IsLSL() || operand.GetShift().IsROR()) &&
5788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        (operand.GetShiftAmount() == 0)) {
5888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return os << operand.GetBaseRegister();
5988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
6088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (operand.GetShift().IsRRX()) {
6188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return os << operand.GetBaseRegister() << ", rrx";
6288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
6388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << operand.GetBaseRegister() << ", " << operand.GetShift() << " #"
6488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              << operand.GetShiftAmount();
6588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
6688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsRegisterShiftedRegister()) {
6788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << operand.GetBaseRegister() << ", " << operand.GetShift() << " "
6888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              << operand.GetShiftRegister();
6988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
7088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
7188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os;
7288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
7388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
7488c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const NeonImmediate& neon_imm) {
7588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsDouble()) {
7688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (neon_imm.imm_.d_ == 0) {
7788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if (copysign(1.0, neon_imm.imm_.d_) < 0.0) {
7888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        return os << "#-0.0";
7988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
8088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return os << "#0.0";
8188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
8288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << "#" << std::setprecision(9) << neon_imm.imm_.d_;
8388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
8488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsFloat()) {
8588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (neon_imm.imm_.f_ == 0) {
8688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if (copysign(1.0, neon_imm.imm_.d_) < 0.0) return os << "#-0.0";
8788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return os << "#0.0";
8888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
8988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << "#" << std::setprecision(9) << neon_imm.imm_.f_;
9088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
9188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsInteger64()) {
9288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << "#0x" << std::hex << std::setw(16) << std::setfill('0')
9388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              << neon_imm.imm_.u64_ << std::dec;
9488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
9588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os << "#" << neon_imm.imm_.u32_;
9688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
9788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
9888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// SOperand
9988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
10088c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const SOperand& operand) {
10188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediate()) {
10288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << operand.GetNeonImmediate();
10388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
10488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os << operand.GetRegister();
10588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
10688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
10788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// DOperand
10888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
10988c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const DOperand& operand) {
11088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediate()) {
11188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << operand.GetNeonImmediate();
11288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
11388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os << operand.GetRegister();
11488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
11588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
11688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// QOperand
11788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
11888c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const QOperand& operand) {
11988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediate()) {
12088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os << operand.GetNeonImmediate();
12188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
12288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os << operand.GetRegister();
12388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
12488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
12588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
12688c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisImmediateVbic::ImmediateVbic(DataType dt, const NeonImmediate& neon_imm) {
12788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsInteger32()) {
12888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
12988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (dt.GetValue() == I16) {
13088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if ((immediate & ~0xff) == 0) {
13188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x9);
13288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate);
13388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff00) == 0) {
13488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0xb);
13588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 8);
13688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
13788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    } else if (dt.GetValue() == I32) {
13888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if ((immediate & ~0xff) == 0) {
13988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x1);
14088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate);
14188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff00) == 0) {
14288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x3);
14388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 8);
14488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff0000) == 0) {
14588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x5);
14688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 16);
14788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff000000) == 0) {
14888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x7);
14988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 24);
15088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
15188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
15288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
15388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
15488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
15588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
15688c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisDataType ImmediateVbic::DecodeDt(uint32_t cmode) {
15788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
15888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x1:
15988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x3:
16088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x5:
16188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x7:
16288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I32;
16388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x9:
16488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xb:
16588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I16;
16688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
16788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
16888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
16988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
17088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return kDataTypeValueInvalid;
17188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
17288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
17388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
17488c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisNeonImmediate ImmediateVbic::DecodeImmediate(uint32_t cmode,
17588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois                                             uint32_t immediate) {
17688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
17788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x1:
17888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x9:
17988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate;
18088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x3:
18188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xb:
18288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 8;
18388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x5:
18488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 16;
18588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x7:
18688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 24;
18788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
18888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
18988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
19088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
19188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return 0;
19288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
19388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
19488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
19588c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisImmediateVmov::ImmediateVmov(DataType dt, const NeonImmediate& neon_imm) {
19688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsInteger()) {
19788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    switch (dt.GetValue()) {
19888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I8:
19988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (neon_imm.CanConvert<uint8_t>()) {
20088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0xe);
20188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(neon_imm.GetImmediate<uint8_t>());
20288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
20388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
20488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I16:
20588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (neon_imm.IsInteger32()) {
20688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
20788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          if ((immediate & ~0xff) == 0) {
20888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0x8);
20988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate);
21088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff00) == 0) {
21188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0xa);
21288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 8);
21388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
21488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
21588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
21688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I32:
21788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (neon_imm.IsInteger32()) {
21888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
21988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          if ((immediate & ~0xff) == 0) {
22088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0x0);
22188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate);
22288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff00) == 0) {
22388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0x2);
22488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 8);
22588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff0000) == 0) {
22688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0x4);
22788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 16);
22888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff000000) == 0) {
22988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0x6);
23088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 24);
23188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff00) == 0xff) {
23288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0xc);
23388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 8);
23488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          } else if ((immediate & ~0xff0000) == 0xffff) {
23588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0xd);
23688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(immediate >> 16);
23788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
23888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
23988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
24088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I64: {
24188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        bool is_valid = true;
24288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        uint32_t encoding = 0;
24388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (neon_imm.IsInteger32()) {
24488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
24588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint32_t mask = 0xff000000;
24688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          for (uint32_t set_bit = 1 << 3; set_bit != 0; set_bit >>= 1) {
24788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            if ((immediate & mask) == mask) {
24888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              encoding |= set_bit;
24988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            } else if ((immediate & mask) != 0) {
25088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              is_valid = false;
25188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              break;
25288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            }
25388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            mask >>= 8;
25488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
25588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else {
25688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint64_t immediate = neon_imm.GetImmediate<uint64_t>();
25788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          uint64_t mask = UINT64_C(0xff) << 56;
25888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          for (uint32_t set_bit = 1 << 7; set_bit != 0; set_bit >>= 1) {
25988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            if ((immediate & mask) == mask) {
26088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              encoding |= set_bit;
26188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            } else if ((immediate & mask) != 0) {
26288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              is_valid = false;
26388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois              break;
26488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            }
26588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            mask >>= 8;
26688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
26788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
26888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (is_valid) {
26988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x1e);
27088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(encoding);
27188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
27288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
27388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
27488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      default:
27588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
27688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
27788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  } else {
27888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    switch (dt.GetValue()) {
27988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case F32:
28088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if (neon_imm.IsFloat() || neon_imm.IsDouble()) {
28188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          ImmediateVFP vfp(neon_imm.GetImmediate<float>());
28288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          if (vfp.IsValid()) {
28388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodingValue(0xf);
28488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            SetEncodedImmediate(vfp.GetEncodingValue());
28588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
28688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
28788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
28888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      default:
28988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
29088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
29188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
29288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
29388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
29488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
29588c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisDataType ImmediateVmov::DecodeDt(uint32_t cmode) {
29688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode & 0xf) {
29788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x0:
29888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x2:
29988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x4:
30088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x6:
30188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xc:
30288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xd:
30388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I32;
30488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x8:
30588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xa:
30688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I16;
30788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xe:
30888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return ((cmode & 0x10) == 0) ? I8 : I64;
30988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xf:
31088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if ((cmode & 0x10) == 0) return F32;
31188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
31288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
31388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
31488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
31588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
31688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return kDataTypeValueInvalid;
31788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
31888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
31988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
32088c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisNeonImmediate ImmediateVmov::DecodeImmediate(uint32_t cmode,
32188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois                                             uint32_t immediate) {
32288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode & 0xf) {
32388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x8:
32488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x0:
32588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate;
32688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x2:
32788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xa:
32888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 8;
32988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x4:
33088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 16;
33188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x6:
33288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 24;
33388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xc:
33488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return (immediate << 8) | 0xff;
33588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xd:
33688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return (immediate << 16) | 0xffff;
33788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xe: {
33888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if (cmode == 0x1e) {
33988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        uint64_t encoding = 0;
34088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        for (uint32_t set_bit = 1 << 7; set_bit != 0; set_bit >>= 1) {
34188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          encoding <<= 8;
34288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          if ((immediate & set_bit) != 0) {
34388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois            encoding |= 0xff;
34488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          }
34588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
34688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        return encoding;
34788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else {
34888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        return immediate;
34988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
35088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
35188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xf: {
35288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return ImmediateVFP::Decode<float>(immediate);
35388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
35488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
35588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
35688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
35788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
35888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return 0;
35988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
36088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
36188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
36288c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisImmediateVmvn::ImmediateVmvn(DataType dt, const NeonImmediate& neon_imm) {
36388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsInteger32()) {
36488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
36588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    switch (dt.GetValue()) {
36688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I16:
36788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if ((immediate & ~0xff) == 0) {
36888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x8);
36988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate);
37088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff00) == 0) {
37188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0xa);
37288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 8);
37388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
37488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
37588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      case I32:
37688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        if ((immediate & ~0xff) == 0) {
37788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x0);
37888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate);
37988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff00) == 0) {
38088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x2);
38188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 8);
38288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff0000) == 0) {
38388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x4);
38488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 16);
38588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff000000) == 0) {
38688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0x6);
38788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 24);
38888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff00) == 0xff) {
38988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0xc);
39088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 8);
39188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        } else if ((immediate & ~0xff0000) == 0xffff) {
39288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodingValue(0xd);
39388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          SetEncodedImmediate(immediate >> 16);
39488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        }
39588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
39688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      default:
39788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        break;
39888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
39988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
40088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
40188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
40288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
40388c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisDataType ImmediateVmvn::DecodeDt(uint32_t cmode) {
40488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
40588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x0:
40688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x2:
40788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x4:
40888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x6:
40988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xc:
41088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xd:
41188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I32;
41288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x8:
41388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xa:
41488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I16;
41588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
41688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
41788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
41888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
41988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return kDataTypeValueInvalid;
42088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
42188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
42288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
42388c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisNeonImmediate ImmediateVmvn::DecodeImmediate(uint32_t cmode,
42488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois                                             uint32_t immediate) {
42588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
42688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x0:
42788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x8:
42888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate;
42988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x2:
43088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xa:
43188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 8;
43288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x4:
43388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 16;
43488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x6:
43588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 24;
43688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xc:
43788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return (immediate << 8) | 0xff;
43888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xd:
43988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return (immediate << 16) | 0xffff;
44088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
44188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
44288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
44388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
44488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return 0;
44588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
44688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
44788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
44888c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisImmediateVorr::ImmediateVorr(DataType dt, const NeonImmediate& neon_imm) {
44988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (neon_imm.IsInteger32()) {
45088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    uint32_t immediate = neon_imm.GetImmediate<uint32_t>();
45188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (dt.GetValue() == I16) {
45288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if ((immediate & ~0xff) == 0) {
45388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x9);
45488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate);
45588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff00) == 0) {
45688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0xb);
45788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 8);
45888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
45988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    } else if (dt.GetValue() == I32) {
46088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if ((immediate & ~0xff) == 0) {
46188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x1);
46288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate);
46388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff00) == 0) {
46488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x3);
46588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 8);
46688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff0000) == 0) {
46788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x5);
46888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 16);
46988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else if ((immediate & ~0xff000000) == 0) {
47088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodingValue(0x7);
47188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        SetEncodedImmediate(immediate >> 24);
47288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
47388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
47488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
47588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
47688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
47788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
47888c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisDataType ImmediateVorr::DecodeDt(uint32_t cmode) {
47988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
48088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x1:
48188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x3:
48288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x5:
48388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x7:
48488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I32;
48588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x9:
48688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xb:
48788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return I16;
48888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
48988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
49088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
49188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
49288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return kDataTypeValueInvalid;
49388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
49488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
49588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
49688c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisNeonImmediate ImmediateVorr::DecodeImmediate(uint32_t cmode,
49788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois                                             uint32_t immediate) {
49888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  switch (cmode) {
49988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x1:
50088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x9:
50188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate;
50288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x3:
50388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0xb:
50488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 8;
50588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x5:
50688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 16;
50788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    case 0x7:
50888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      return immediate << 24;
50988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    default:
51088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      break;
51188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
51288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_UNREACHABLE();
51388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return 0;
51488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
51588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
51688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// MemOperand
51788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
51888c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const MemOperand& operand) {
51988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  os << "[" << operand.GetBaseRegister();
52088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.GetAddrMode() == PostIndex) {
52188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    os << "]";
52236fb1cec5777b87c8c6236dc1cdb9941abc58eadVincent Belliard    if (operand.IsRegisterOnly()) return os << "!";
52388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
52488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.IsImmediate()) {
52588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if ((operand.GetOffsetImmediate() != 0) || operand.GetSign().IsMinus() ||
52688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        ((operand.GetAddrMode() != Offset) && !operand.IsRegisterOnly())) {
52788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      if (operand.GetOffsetImmediate() == 0) {
52888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        os << ", #" << operand.GetSign() << operand.GetOffsetImmediate();
52988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      } else {
53088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois        os << ", #" << operand.GetOffsetImmediate();
53188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      }
53288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
53388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  } else if (operand.IsPlainRegister()) {
53488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    os << ", " << operand.GetSign() << operand.GetOffsetRegister();
53588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  } else if (operand.IsShiftedRegister()) {
53688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    os << ", " << operand.GetSign() << operand.GetOffsetRegister()
53788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois       << ImmediateShiftOperand(operand.GetShift(), operand.GetShiftAmount());
53888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  } else {
53988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    VIXL_UNREACHABLE();
54088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    return os;
54188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
54288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.GetAddrMode() == Offset) {
54388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    os << "]";
54488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  } else if (operand.GetAddrMode() == PreIndex) {
54588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    os << "]!";
54688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
54788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os;
54888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
54988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
55088c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstd::ostream& operator<<(std::ostream& os, const AlignedMemOperand& operand) {
55188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  os << "[" << operand.GetBaseRegister() << operand.GetAlignment() << "]";
55288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (operand.GetAddrMode() == PostIndex) {
55388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (operand.IsPlainRegister()) {
55488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      os << ", " << operand.GetOffsetRegister();
55588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    } else {
55688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      os << "!";
55788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    }
55888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  }
55988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  return os;
56088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}
56188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois
56288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}  // namespace aarch32
56388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}  // namespace vixl
564