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