// Copyright 2015, VIXL authors // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of ARM Limited nor the names of its contributors may be // used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. extern "C" { #include } #include #include #include #include #include #include #include "utils-vixl.h" #include "aarch32/constants-aarch32.h" #include "aarch32/disasm-aarch32.h" #include "aarch32/instructions-aarch32.h" #include "aarch32/operands-aarch32.h" namespace vixl { namespace aarch32 { using internal::Int64; using internal::Uint32; class T32CodeAddressIncrementer { uint32_t* code_address_; uint32_t increment_; public: T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address) : code_address_(code_address), increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {} ~T32CodeAddressIncrementer() { *code_address_ += increment_; } }; class A32CodeAddressIncrementer { uint32_t* code_address_; public: explicit A32CodeAddressIncrementer(uint32_t* code_address) : code_address_(code_address) {} ~A32CodeAddressIncrementer() { *code_address_ += 4; } }; class DecodeNeon { int lane_; SpacingType spacing_; bool valid_; public: DecodeNeon(int lane, SpacingType spacing) : lane_(lane), spacing_(spacing), valid_(true) {} DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {} int GetLane() const { return lane_; } SpacingType GetSpacing() const { return spacing_; } bool IsValid() const { return valid_; } }; class DecodeNeonAndAlign : public DecodeNeon { public: Alignment align_; DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align) : DecodeNeon(lanes, spacing), align_(align) {} DecodeNeonAndAlign() : align_(kBadAlignment) {} Alignment GetAlign() const { return align_; } }; // Start of generated code. DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) { if ((value & 0xf) == 0x1) { switch (type_value) { case 0x0: return S8; case 0x1: return U8; } } else if ((value & 0xe) == 0x2) { switch (type_value) { case 0x0: return S16; case 0x1: return U16; } } else if ((value & 0xc) == 0x4) { switch (type_value) { case 0x0: return S32; case 0x1: return U32; } } else if ((value & 0x8) == 0x8) { switch (type_value) { case 0x0: return S64; case 0x1: return U64; } } return kDataTypeValueInvalid; } DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) { if ((value & 0xf) == 0x1) { if (type_value == 0x1) return S8; } else if ((value & 0xe) == 0x2) { if (type_value == 0x1) return S16; } else if ((value & 0xc) == 0x4) { if (type_value == 0x1) return S32; } else if ((value & 0x8) == 0x8) { if (type_value == 0x1) return S64; } return kDataTypeValueInvalid; } DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) { if ((value & 0xf) == 0x1) { return I8; } else if ((value & 0xe) == 0x2) { return I16; } else if ((value & 0xc) == 0x4) { return I32; } else if ((value & 0x8) == 0x8) { return I64; } return kDataTypeValueInvalid; } DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) { if ((value & 0xf) == 0x1) { return Untyped8; } else if ((value & 0xe) == 0x2) { return Untyped16; } else if ((value & 0xc) == 0x4) { return Untyped32; } else if ((value & 0x8) == 0x8) { return Untyped64; } return kDataTypeValueInvalid; } DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) { if ((value & 0x7) == 0x1) { switch (type_value) { case 0x0: return S16; case 0x1: return U16; } } else if ((value & 0x6) == 0x2) { switch (type_value) { case 0x0: return S32; case 0x1: return U32; } } else if ((value & 0x4) == 0x4) { switch (type_value) { case 0x0: return S64; case 0x1: return U64; } } return kDataTypeValueInvalid; } DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) { if ((value & 0x7) == 0x1) { if (type_value == 0x1) return S16; } else if ((value & 0x6) == 0x2) { if (type_value == 0x1) return S32; } else if ((value & 0x4) == 0x4) { if (type_value == 0x1) return S64; } return kDataTypeValueInvalid; } DataTypeValue Dt_imm6_3_Decode(uint32_t value) { if ((value & 0x7) == 0x1) { return I16; } else if ((value & 0x6) == 0x2) { return I32; } else if ((value & 0x4) == 0x4) { return I64; } return kDataTypeValueInvalid; } DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) { if ((value & 0x7) == 0x1) { switch (type_value) { case 0x0: return S8; case 0x1: return U8; } } else if ((value & 0x6) == 0x2) { switch (type_value) { case 0x0: return S16; case 0x1: return U16; } } else if ((value & 0x4) == 0x4) { switch (type_value) { case 0x0: return S32; case 0x1: return U32; } } return kDataTypeValueInvalid; } DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; case 0x4: return U8; case 0x5: return U16; case 0x6: return U32; case 0x8: return P8; case 0xa: return P64; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_size_1_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; case 0x4: return P8; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_size_2_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; case 0x4: return U8; case 0x5: return U16; case 0x6: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_size_3_Decode(uint32_t value) { switch (value) { case 0x0: return S16; case 0x1: return S32; case 0x2: return S64; case 0x4: return U16; case 0x5: return U32; case 0x6: return U64; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) { switch (value) { case 0x1: return S8; case 0x2: return S16; case 0x4: return S32; case 0x9: return U8; case 0xa: return U16; case 0xc: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { if ((value & 0x18) == 0x8) { *lane = value & 7; return S8; } if ((value & 0x19) == 0x1) { *lane = (value >> 1) & 3; return S16; } if ((value & 0x18) == 0x18) { *lane = value & 7; return U8; } if ((value & 0x19) == 0x11) { *lane = (value >> 1) & 3; return U16; } if ((value & 0x1b) == 0x0) { *lane = (value >> 2) & 1; return Untyped32; } *lane = -1; return kDataTypeValueInvalid; } DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { if ((value & 0x8) == 0x8) { *lane = value & 7; return Untyped8; } if ((value & 0x9) == 0x1) { *lane = (value >> 1) & 3; return Untyped16; } if ((value & 0xb) == 0x0) { *lane = (value >> 2) & 1; return Untyped32; } *lane = -1; return kDataTypeValueInvalid; } DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) { if ((value & 0x1) == 0x1) { *lane = (value >> 1) & 7; return Untyped8; } if ((value & 0x3) == 0x2) { *lane = (value >> 2) & 3; return Untyped16; } if ((value & 0x7) == 0x4) { *lane = (value >> 3) & 1; return Untyped32; } *lane = -1; return kDataTypeValueInvalid; } DataTypeValue Dt_B_E_1_Decode(uint32_t value) { switch (value) { case 0x2: return Untyped8; case 0x1: return Untyped16; case 0x0: return Untyped32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_1_Decode1(uint32_t value) { switch (value) { case 0x0: return F32; case 0x1: return F32; case 0x2: return S32; case 0x3: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_1_Decode2(uint32_t value) { switch (value) { case 0x0: return S32; case 0x1: return U32; case 0x2: return F32; case 0x3: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_2_Decode(uint32_t value) { switch (value) { case 0x0: return U32; case 0x1: return S32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_3_Decode(uint32_t value) { switch (value) { case 0x0: return S32; case 0x1: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_sx_1_Decode(uint32_t value) { switch (value) { case 0x0: return S16; case 0x1: return S32; case 0x2: return U16; case 0x3: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_U_1_Decode1(uint32_t value) { switch (value) { case 0x0: return F32; case 0x1: return F32; case 0x2: return S32; case 0x3: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_op_U_1_Decode2(uint32_t value) { switch (value) { case 0x0: return S32; case 0x1: return U32; case 0x2: return F32; case 0x3: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_sz_1_Decode(uint32_t value) { switch (value) { case 0x0: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_F_size_1_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; case 0x6: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_F_size_2_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; case 0x6: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_F_size_3_Decode(uint32_t value) { switch (value) { case 0x1: return I16; case 0x2: return I32; case 0x6: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_F_size_4_Decode(uint32_t value) { switch (value) { case 0x2: return U32; case 0x6: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_size_1_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; case 0x4: return U8; case 0x5: return U16; case 0x6: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_size_2_Decode(uint32_t value) { switch (value) { case 0x1: return S16; case 0x2: return S32; case 0x5: return U16; case 0x6: return U32; } return kDataTypeValueInvalid; } DataTypeValue Dt_U_size_3_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; case 0x3: return S64; case 0x4: return U8; case 0x5: return U16; case 0x6: return U32; case 0x7: return U64; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_1_Decode(uint32_t value) { switch (value) { case 0x0: return Untyped8; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_2_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; case 0x3: return I64; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_3_Decode(uint32_t value) { switch (value) { case 0x0: return I16; case 0x1: return I32; case 0x2: return I64; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_4_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_5_Decode(uint32_t value) { switch (value) { case 0x0: return S8; case 0x1: return S16; case 0x2: return S32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_6_Decode(uint32_t value) { switch (value) { case 0x0: return Untyped8; case 0x1: return Untyped16; case 0x2: return Untyped32; case 0x3: return Untyped64; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_7_Decode(uint32_t value) { switch (value) { case 0x0: return Untyped8; case 0x1: return Untyped16; case 0x2: return Untyped32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_8_Decode(uint32_t value) { switch (value) { case 0x0: return Untyped8; case 0x1: return Untyped16; case 0x2: return Untyped32; case 0x3: return Untyped32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) { switch (value) { case 0x1: switch (type_value) { case 0x0: return I16; } break; case 0x2: switch (type_value) { case 0x0: return I32; case 0x1: return F32; } break; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_10_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) { switch (value) { case 0x1: switch (type_value) { case 0x0: return S16; case 0x1: return U16; } break; case 0x2: switch (type_value) { case 0x0: return S32; case 0x1: return U32; } break; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) { switch (value) { case 0x0: switch (type_value) { case 0x0: return S8; case 0x1: return U8; } break; case 0x1: switch (type_value) { case 0x0: return S16; case 0x1: return U16; } break; case 0x2: switch (type_value) { case 0x0: return S32; case 0x1: return U32; } break; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_13_Decode(uint32_t value) { switch (value) { case 0x1: return S16; case 0x2: return S32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_14_Decode(uint32_t value) { switch (value) { case 0x0: return S16; case 0x1: return S32; case 0x2: return S64; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_15_Decode(uint32_t value) { switch (value) { case 0x0: return Untyped8; case 0x1: return Untyped16; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_16_Decode(uint32_t value) { switch (value) { case 0x2: return F32; } return kDataTypeValueInvalid; } DataTypeValue Dt_size_17_Decode(uint32_t value) { switch (value) { case 0x0: return I8; case 0x1: return I16; case 0x2: return I32; } return kDataTypeValueInvalid; } DecodeNeon Index_1_Decode(uint32_t value, DataType dt) { switch (dt.GetValue()) { case Untyped8: { int lane = (value >> 1) & 0x7; if ((value & 1) != 0) break; SpacingType spacing = kSingle; return DecodeNeon(lane, spacing); } case Untyped16: { int lane = (value >> 2) & 0x3; if ((value & 1) != 0) break; SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle; return DecodeNeon(lane, spacing); } case Untyped32: { int lane = (value >> 3) & 0x1; if ((value & 3) != 0) break; SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle; return DecodeNeon(lane, spacing); } default: break; } return DecodeNeon(); } DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) { switch (dt.GetValue()) { case Untyped8: { AlignmentType align; if ((value & 1) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 1) & 0x7; SpacingType spacing = kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped16: { AlignmentType align; if ((value & 3) == 1) { align = k16BitAlign; } else if ((value & 3) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 2) & 0x3; SpacingType spacing = kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped32: { AlignmentType align; if ((value & 7) == 3) { align = k32BitAlign; } else if ((value & 7) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 3) & 0x1; SpacingType spacing = kSingle; return DecodeNeonAndAlign(lane, spacing, align); } default: break; } return DecodeNeonAndAlign(); } DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) { switch (dt.GetValue()) { case Untyped8: { AlignmentType align; if ((value & 1) == 1) { align = k16BitAlign; } else if ((value & 1) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 1) & 0x7; SpacingType spacing = kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped16: { AlignmentType align; if ((value & 1) == 1) { align = k32BitAlign; } else if ((value & 1) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 2) & 0x3; SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped32: { AlignmentType align; if ((value & 3) == 1) { align = k64BitAlign; } else if ((value & 3) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 3) & 0x1; SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; return DecodeNeonAndAlign(lane, spacing, align); } default: break; } return DecodeNeonAndAlign(); } DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) { switch (dt.GetValue()) { case Untyped8: { AlignmentType align; if ((value & 1) == 1) { align = k32BitAlign; } else if ((value & 1) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 1) & 0x7; SpacingType spacing = kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped16: { AlignmentType align; if ((value & 1) == 1) { align = k64BitAlign; } else if ((value & 1) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 2) & 0x3; SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; return DecodeNeonAndAlign(lane, spacing, align); } case Untyped32: { AlignmentType align; if ((value & 3) == 1) { align = k64BitAlign; } else if ((value & 3) == 2) { align = k128BitAlign; } else if ((value & 3) == 0) { align = kNoAlignment; } else { break; } int lane = (value >> 3) & 0x1; SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; return DecodeNeonAndAlign(lane, spacing, align); } default: break; } return DecodeNeonAndAlign(); } Alignment Align_a_1_Decode(uint32_t value, DataType dt) { switch (value) { case 0: return kNoAlignment; case 1: if (dt.Is(Untyped16)) return k16BitAlign; if (dt.Is(Untyped32)) return k32BitAlign; break; default: break; } return kBadAlignment; } Alignment Align_a_2_Decode(uint32_t value, DataType dt) { switch (value) { case 0: return kNoAlignment; case 1: if (dt.Is(Untyped8)) return k16BitAlign; if (dt.Is(Untyped16)) return k32BitAlign; if (dt.Is(Untyped32)) return k64BitAlign; break; default: break; } return kBadAlignment; } Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) { switch (value) { case 0: if (size != 3) return kNoAlignment; break; case 1: if (dt.Is(Untyped8)) return k32BitAlign; if (dt.Is(Untyped16)) return k64BitAlign; if (size == 2) return k64BitAlign; if (size == 3) return k128BitAlign; break; default: break; } return kBadAlignment; } Alignment Align_align_1_Decode(uint32_t value) { switch (value) { case 0: return kNoAlignment; case 1: return k64BitAlign; case 2: return k128BitAlign; case 3: return k256BitAlign; default: break; } return kBadAlignment; } Alignment Align_align_2_Decode(uint32_t value) { switch (value) { case 0: return kNoAlignment; case 1: return k64BitAlign; case 2: return k128BitAlign; case 3: return k256BitAlign; default: break; } return kBadAlignment; } Alignment Align_align_3_Decode(uint32_t value) { switch (value) { case 0: return kNoAlignment; case 1: return k64BitAlign; default: break; } return kBadAlignment; } Alignment Align_align_4_Decode(uint32_t value) { switch (value) { case 0: return kNoAlignment; case 1: return k64BitAlign; case 2: return k128BitAlign; case 3: return k256BitAlign; default: break; } return kBadAlignment; } Alignment Align_align_5_Decode(uint32_t value) { switch (value) { case 0: return kNoAlignment; case 1: return k64BitAlign; case 2: return k128BitAlign; case 3: return k256BitAlign; default: break; } return kBadAlignment; } void Disassembler::adc(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAdc, kArithmetic); os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::adcs(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAdcs, kArithmetic); os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::add(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAdd, kArithmetic); os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::add(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kAdd, kArithmetic); os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << operand; } void Disassembler::adds(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAdds, kArithmetic); os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::adds(Register rd, const Operand& operand) { os().SetCurrentInstruction(kAdds, kArithmetic); os() << ToCString(kAdds) << " " << rd << ", " << operand; } void Disassembler::addw(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAddw, kArithmetic); os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::adr(Condition cond, EncodingSize size, Register rd, Location* location) { os().SetCurrentInstruction(kAdr, kAddress); os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3); } void Disassembler::and_(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAnd, kBitwise); os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::ands(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kAnds, kBitwise); os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::asr(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kAsr, kShift); os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::asrs(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kAsrs, kShift); os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::b(Condition cond, EncodingSize size, Location* location) { os().SetCurrentInstruction(kB, kAddress | kBranch); os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " " << PrintLabel(kCodeLocation, location, GetCodeAddress()); } void Disassembler::bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) { os().SetCurrentInstruction(kBfc, kShift); os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width); } void Disassembler::bfi( Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { os().SetCurrentInstruction(kBfi, kShift); os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width); } void Disassembler::bic(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kBic, kBitwise); os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::bics(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kBics, kBitwise); os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::bkpt(Condition cond, uint32_t imm) { os().SetCurrentInstruction(kBkpt, kSystem); os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " << RawImmediatePrinter(imm); } void Disassembler::bl(Condition cond, Location* location) { os().SetCurrentInstruction(kBl, kAddress | kBranch); os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " " << PrintLabel(kCodeLocation, location, GetCodeAddress()); } void Disassembler::blx(Condition cond, Location* location) { os().SetCurrentInstruction(kBlx, kAddress | kBranch); os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3); } void Disassembler::blx(Condition cond, Register rm) { os().SetCurrentInstruction(kBlx, kAddress | kBranch); os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm; } void Disassembler::bx(Condition cond, Register rm) { os().SetCurrentInstruction(kBx, kAddress | kBranch); os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm; } void Disassembler::bxj(Condition cond, Register rm) { os().SetCurrentInstruction(kBxj, kAddress | kBranch); os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm; } void Disassembler::cbnz(Register rn, Location* location) { os().SetCurrentInstruction(kCbnz, kAddress | kBranch); os() << ToCString(kCbnz) << " " << rn << ", " << PrintLabel(kCodeLocation, location, GetCodeAddress()); } void Disassembler::cbz(Register rn, Location* location) { os().SetCurrentInstruction(kCbz, kAddress | kBranch); os() << ToCString(kCbz) << " " << rn << ", " << PrintLabel(kCodeLocation, location, GetCodeAddress()); } void Disassembler::clrex(Condition cond) { os().SetCurrentInstruction(kClrex, kNoAttribute); os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond); } void Disassembler::clz(Condition cond, Register rd, Register rm) { os().SetCurrentInstruction(kClz, kNoAttribute); os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rm; } void Disassembler::cmn(Condition cond, EncodingSize size, Register rn, const Operand& operand) { os().SetCurrentInstruction(kCmn, kArithmetic); os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " " << rn << ", " << operand; } void Disassembler::cmp(Condition cond, EncodingSize size, Register rn, const Operand& operand) { os().SetCurrentInstruction(kCmp, kArithmetic); os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " " << rn << ", " << operand; } void Disassembler::crc32b(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32b, kNoAttribute); os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::crc32cb(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32cb, kNoAttribute); os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::crc32ch(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32ch, kNoAttribute); os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::crc32cw(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32cw, kNoAttribute); os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::crc32h(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32h, kNoAttribute); os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::crc32w(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kCrc32w, kNoAttribute); os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::dmb(Condition cond, MemoryBarrier option) { os().SetCurrentInstruction(kDmb, kNoAttribute); os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option; } void Disassembler::dsb(Condition cond, MemoryBarrier option) { os().SetCurrentInstruction(kDsb, kNoAttribute); os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option; } void Disassembler::eor(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kEor, kBitwise); os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::eors(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kEors, kBitwise); os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::fldmdbx(Condition cond, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kFldmdbx, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << dreglist; } void Disassembler::fldmiax(Condition cond, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kFldmiax, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << dreglist; } void Disassembler::fstmdbx(Condition cond, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kFstmdbx, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << dreglist; } void Disassembler::fstmiax(Condition cond, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kFstmiax, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << dreglist; } void Disassembler::hlt(Condition cond, uint32_t imm) { os().SetCurrentInstruction(kHlt, kSystem); os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " << RawImmediatePrinter(imm); } void Disassembler::hvc(Condition cond, uint32_t imm) { os().SetCurrentInstruction(kHvc, kSystem); os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " << RawImmediatePrinter(imm); } void Disassembler::isb(Condition cond, MemoryBarrier option) { os().SetCurrentInstruction(kIsb, kNoAttribute); os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option; } void Disassembler::it(Condition cond, uint16_t mask) { os().SetCurrentInstruction(kIt, kNoAttribute); os() << ToCString(kIt); int count; if ((mask & 0x1) != 0) { count = 3; } else if ((mask & 0x2) != 0) { count = 2; } else if ((mask & 0x4) != 0) { count = 1; } else { count = 0; } uint16_t tmp = 0x8; uint16_t ref = (cond.GetCondition() & 0x1) << 3; while (count-- > 0) { os() << (((mask & tmp) == ref) ? "t" : "e"); tmp >>= 1; ref >>= 1; } if (cond.Is(al)) { os() << " al"; } else { os() << " " << cond; } } void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLda, kAddress | kLoadStore); os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); } void Disassembler::ldab(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdab, kAddress | kLoadStore); os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); } void Disassembler::ldaex(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore); os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); } void Disassembler::ldaexb(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore); os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); } void Disassembler::ldaexd(Condition cond, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore); os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << PrintMemOperand(kLoadDoubleWordLocation, operand); } void Disassembler::ldaexh(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore); os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); } void Disassembler::ldah(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdah, kAddress | kLoadStore); os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); } void Disassembler::ldm(Condition cond, EncodingSize size, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " " << rn << write_back << ", " << registers; } void Disassembler::ldmda(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldmdb(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldmea(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldmed(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldmfa(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldmfd(Condition cond, EncodingSize size, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " " << rn << write_back << ", " << registers; } void Disassembler::ldmib(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple); os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::ldr(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); } void Disassembler::ldr(Condition cond, EncodingSize size, Register rt, Location* location) { os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3); } void Disassembler::ldrb(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); } void Disassembler::ldrb(Condition cond, Register rt, Location* location) { os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3); } void Disassembler::ldrd(Condition cond, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << PrintMemOperand(kLoadDoubleWordLocation, operand); } void Disassembler::ldrd(Condition cond, Register rt, Register rt2, Location* location) { os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3); } void Disassembler::ldrex(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore); os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); } void Disassembler::ldrexb(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore); os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); } void Disassembler::ldrexd(Condition cond, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore); os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << PrintMemOperand(kLoadDoubleWordLocation, operand); } void Disassembler::ldrexh(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore); os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); } void Disassembler::ldrh(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); } void Disassembler::ldrh(Condition cond, Register rt, Location* location) { os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3); } void Disassembler::ldrsb(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand); } void Disassembler::ldrsb(Condition cond, Register rt, Location* location) { os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3); } void Disassembler::ldrsh(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand); } void Disassembler::ldrsh(Condition cond, Register rt, Location* location) { os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintLabel(kLoadSignedHalfWordLocation, location, GetCodeAddress() & ~3); } void Disassembler::lsl(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kLsl, kShift); os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::lsls(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kLsls, kShift); os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::lsr(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kLsr, kShift); os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::lsrs(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kLsrs, kShift); os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::mla( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kMla, kArithmetic); os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::mlas( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kMlas, kArithmetic); os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::mls( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kMls, kArithmetic); os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::mov(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMov, kNoAttribute); os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << operand; } void Disassembler::movs(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMovs, kNoAttribute); os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << operand; } void Disassembler::movt(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMovt, kNoAttribute); os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << operand; } void Disassembler::movw(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMovw, kNoAttribute); os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << operand; } void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) { os().SetCurrentInstruction(kMrs, kNoAttribute); os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << spec_reg; } void Disassembler::msr(Condition cond, MaskedSpecialRegister spec_reg, const Operand& operand) { os().SetCurrentInstruction(kMsr, kNoAttribute); os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " " << spec_reg << ", " << operand; } void Disassembler::mul( Condition cond, EncodingSize size, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kMul, kArithmetic); os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << rn << ", " << rm; } void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kMuls, kArithmetic); os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm; } void Disassembler::mvn(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMvn, kNoAttribute); os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << operand; } void Disassembler::mvns(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kMvns, kNoAttribute); os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << operand; } void Disassembler::nop(Condition cond, EncodingSize size) { os().SetCurrentInstruction(kNop, kNoAttribute); os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size; } void Disassembler::orn(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kOrn, kBitwise); os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::orns(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kOrns, kBitwise); os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::orr(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kOrr, kBitwise); os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::orrs(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kOrrs, kBitwise); os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kPkhbt, kNoAttribute); os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kPkhtb, kNoAttribute); os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::pld(Condition cond, Location* location) { os().SetCurrentInstruction(kPld, kAddress); os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3); } void Disassembler::pld(Condition cond, const MemOperand& operand) { os().SetCurrentInstruction(kPld, kAddress); os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " << PrintMemOperand(kDataLocation, operand); } void Disassembler::pldw(Condition cond, const MemOperand& operand) { os().SetCurrentInstruction(kPldw, kAddress); os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " " << PrintMemOperand(kDataLocation, operand); } void Disassembler::pli(Condition cond, const MemOperand& operand) { os().SetCurrentInstruction(kPli, kAddress); os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " << PrintMemOperand(kCodeLocation, operand); } void Disassembler::pli(Condition cond, Location* location) { os().SetCurrentInstruction(kPli, kAddress); os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3); } void Disassembler::pop(Condition cond, EncodingSize size, RegisterList registers) { os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " << registers; } void Disassembler::pop(Condition cond, EncodingSize size, Register rt) { os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " << "{" << rt << "}"; } void Disassembler::push(Condition cond, EncodingSize size, RegisterList registers) { os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " << registers; } void Disassembler::push(Condition cond, EncodingSize size, Register rt) { os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " << "{" << rt << "}"; } void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) { os().SetCurrentInstruction(kQadd, kArithmetic); os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::qadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQadd16, kArithmetic); os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::qadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQadd8, kArithmetic); os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQasx, kArithmetic); os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::qdadd(Condition cond, Register rd, Register rm, Register rn) { os().SetCurrentInstruction(kQdadd, kArithmetic); os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::qdsub(Condition cond, Register rd, Register rm, Register rn) { os().SetCurrentInstruction(kQdsub, kArithmetic); os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQsax, kArithmetic); os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) { os().SetCurrentInstruction(kQsub, kArithmetic); os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::qsub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQsub16, kArithmetic); os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::qsub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kQsub8, kArithmetic); os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::rbit(Condition cond, Register rd, Register rm) { os().SetCurrentInstruction(kRbit, kNoAttribute); os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rm; } void Disassembler::rev(Condition cond, EncodingSize size, Register rd, Register rm) { os().SetCurrentInstruction(kRev, kNoAttribute); os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << rm; } void Disassembler::rev16(Condition cond, EncodingSize size, Register rd, Register rm) { os().SetCurrentInstruction(kRev16, kNoAttribute); os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << rm; } void Disassembler::revsh(Condition cond, EncodingSize size, Register rd, Register rm) { os().SetCurrentInstruction(kRevsh, kNoAttribute); os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " " << rd << ", " << rm; } void Disassembler::ror(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kRor, kShift); os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::rors(Condition cond, EncodingSize size, Register rd, Register rm, const Operand& operand) { os().SetCurrentInstruction(kRors, kShift); os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::rrx(Condition cond, Register rd, Register rm) { os().SetCurrentInstruction(kRrx, kShift); os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm; } void Disassembler::rrxs(Condition cond, Register rd, Register rm) { os().SetCurrentInstruction(kRrxs, kShift); os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm; } void Disassembler::rsb(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kRsb, kArithmetic); os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::rsbs(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kRsbs, kArithmetic); os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::rsc(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kRsc, kArithmetic); os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::rscs(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kRscs, kArithmetic); os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSadd16, kArithmetic); os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::sadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSadd8, kArithmetic); os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSasx, kArithmetic); os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::sbc(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSbc, kArithmetic); os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sbcs(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSbcs, kArithmetic); os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sbfx( Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { os().SetCurrentInstruction(kSbfx, kShift); os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width); } void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSdiv, kArithmetic); os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSel, kNoAttribute); os() << ToCString(kSel) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShadd16, kArithmetic); os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShadd8, kArithmetic); os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShasx, kArithmetic); os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shsax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShsax, kArithmetic); os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shsub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShsub16, kArithmetic); os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::shsub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kShsub8, kArithmetic); os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smlabb( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlabb, kArithmetic); os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlabt( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlabt, kArithmetic); os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlad( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlad, kArithmetic); os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smladx( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmladx, kArithmetic); os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlal( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlal, kArithmetic); os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlalbb( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlalbb, kArithmetic); os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlalbt( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlalbt, kArithmetic); os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlald( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlald, kArithmetic); os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlaldx( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlaldx, kArithmetic); os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlals( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlals, kArithmetic); os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlaltb( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlaltb, kArithmetic); os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlaltt( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlaltt, kArithmetic); os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlatb( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlatb, kArithmetic); os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlatt( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlatt, kArithmetic); os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlawb( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlawb, kArithmetic); os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlawt( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlawt, kArithmetic); os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlsd( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlsd, kArithmetic); os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlsdx( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmlsdx, kArithmetic); os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smlsld( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlsld, kArithmetic); os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smlsldx( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmlsldx, kArithmetic); os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smmla( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmmla, kArithmetic); os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smmlar( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmmlar, kArithmetic); os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smmls( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmmls, kArithmetic); os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smmlsr( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kSmmlsr, kArithmetic); os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::smmul(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmmul, kArithmetic); os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smmulr(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmmulr, kArithmetic); os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smuad(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmuad, kArithmetic); os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smuadx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmuadx, kArithmetic); os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smulbb(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmulbb, kArithmetic); os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smulbt(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmulbt, kArithmetic); os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smull( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmull, kArithmetic); os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smulls( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kSmulls, kArithmetic); os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::smultb(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmultb, kArithmetic); os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smultt(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmultt, kArithmetic); os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smulwb(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmulwb, kArithmetic); os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smulwt(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmulwt, kArithmetic); os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smusd(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmusd, kArithmetic); os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::smusdx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSmusdx, kArithmetic); os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) { os().SetCurrentInstruction(kSsat, kArithmetic); os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << ImmediatePrinter(imm) << ", " << operand; } void Disassembler::ssat16(Condition cond, Register rd, uint32_t imm, Register rn) { os().SetCurrentInstruction(kSsat16, kArithmetic); os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << ImmediatePrinter(imm) << ", " << rn; } void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSsax, kArithmetic); os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::ssub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSsub16, kArithmetic); os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::ssub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kSsub8, kArithmetic); os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStl, kAddress | kLoadStore); os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); } void Disassembler::stlb(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStlb, kAddress | kLoadStore); os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); } void Disassembler::stlex(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStlex, kAddress | kLoadStore); os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); } void Disassembler::stlexb(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore); os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); } void Disassembler::stlexd(Condition cond, Register rd, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore); os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << rt2 << ", " << PrintMemOperand(kStoreDoubleWordLocation, operand); } void Disassembler::stlexh(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore); os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); } void Disassembler::stlh(Condition cond, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStlh, kAddress | kLoadStore); os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); } void Disassembler::stm(Condition cond, EncodingSize size, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " " << rn << write_back << ", " << registers; } void Disassembler::stmda(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::stmdb(Condition cond, EncodingSize size, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " " << rn << write_back << ", " << registers; } void Disassembler::stmea(Condition cond, EncodingSize size, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " " << rn << write_back << ", " << registers; } void Disassembler::stmed(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::stmfa(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::stmfd(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::stmib(Condition cond, Register rn, WriteBack write_back, RegisterList registers) { os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple); os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn << write_back << ", " << registers; } void Disassembler::str(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStr, kAddress | kLoadStore); os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); } void Disassembler::strb(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStrb, kAddress | kLoadStore); os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); } void Disassembler::strd(Condition cond, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kStrd, kAddress | kLoadStore); os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << PrintMemOperand(kStoreDoubleWordLocation, operand); } void Disassembler::strex(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStrex, kAddress | kLoadStore); os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); } void Disassembler::strexb(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore); os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); } void Disassembler::strexd(Condition cond, Register rd, Register rt, Register rt2, const MemOperand& operand) { os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore); os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << rt2 << ", " << PrintMemOperand(kStoreDoubleWordLocation, operand); } void Disassembler::strexh(Condition cond, Register rd, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore); os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); } void Disassembler::strh(Condition cond, EncodingSize size, Register rt, const MemOperand& operand) { os().SetCurrentInstruction(kStrh, kAddress | kLoadStore); os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " " << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); } void Disassembler::sub(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSub, kArithmetic); os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sub(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kSub, kArithmetic); os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << operand; } void Disassembler::subs(Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSubs, kArithmetic); os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::subs(Register rd, const Operand& operand) { os().SetCurrentInstruction(kSubs, kArithmetic); os() << ToCString(kSubs) << " " << rd << ", " << operand; } void Disassembler::subw(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSubw, kArithmetic); os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::svc(Condition cond, uint32_t imm) { os().SetCurrentInstruction(kSvc, kSystem); os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " << RawImmediatePrinter(imm); } void Disassembler::sxtab(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSxtab, kArithmetic); os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sxtab16(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSxtab16, kArithmetic); os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sxtah(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kSxtah, kArithmetic); os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::sxtb(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kSxtb, kArithmetic); os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kSxtb16, kArithmetic); os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::sxth(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kSxth, kArithmetic); os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::tbb(Condition cond, Register rn, Register rm) { os().SetCurrentInstruction(kTbb, kBranch); os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " " << MemOperand(rn, rm); } void Disassembler::tbh(Condition cond, Register rn, Register rm) { os().SetCurrentInstruction(kTbh, kBranch); os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " " << MemOperand(rn, plus, rm, LSL, 1); } void Disassembler::teq(Condition cond, Register rn, const Operand& operand) { os().SetCurrentInstruction(kTeq, kBitwise); os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn << ", " << operand; } void Disassembler::tst(Condition cond, EncodingSize size, Register rn, const Operand& operand) { os().SetCurrentInstruction(kTst, kBitwise); os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " " << rn << ", " << operand; } void Disassembler::uadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUadd16, kArithmetic); os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUadd8, kArithmetic); os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUasx, kArithmetic); os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::ubfx( Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { os().SetCurrentInstruction(kUbfx, kShift); os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width); } void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) { os().SetCurrentInstruction(kUdf, kNoAttribute); os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " " << RawImmediatePrinter(imm); } void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUdiv, kArithmetic); os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhadd16, kArithmetic); os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhadd8, kArithmetic); os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhasx, kArithmetic); os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhsax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhsax, kArithmetic); os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhsub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhsub16, kArithmetic); os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uhsub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUhsub8, kArithmetic); os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::umaal( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kUmaal, kArithmetic); os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::umlal( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kUmlal, kArithmetic); os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::umlals( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kUmlals, kArithmetic); os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::umull( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kUmull, kArithmetic); os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::umulls( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { os().SetCurrentInstruction(kUmulls, kArithmetic); os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo << ", " << rdhi << ", " << rn << ", " << rm; } void Disassembler::uqadd16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqadd16, kArithmetic); os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uqadd8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqadd8, kArithmetic); os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uqasx(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqasx, kArithmetic); os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uqsax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqsax, kArithmetic); os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uqsub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqsub16, kArithmetic); os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uqsub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUqsub8, kArithmetic); os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::usad8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUsad8, kArithmetic); os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::usada8( Condition cond, Register rd, Register rn, Register rm, Register ra) { os().SetCurrentInstruction(kUsada8, kArithmetic); os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << rn << ", " << rm << ", " << ra; } void Disassembler::usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) { os().SetCurrentInstruction(kUsat, kArithmetic); os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << ImmediatePrinter(imm) << ", " << operand; } void Disassembler::usat16(Condition cond, Register rd, uint32_t imm, Register rn) { os().SetCurrentInstruction(kUsat16, kArithmetic); os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd << ", " << ImmediatePrinter(imm) << ", " << rn; } void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUsax, kArithmetic); os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::usub16(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUsub16, kArithmetic); os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::usub8(Condition cond, Register rd, Register rn, Register rm) { os().SetCurrentInstruction(kUsub8, kArithmetic); os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::uxtab(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kUxtab, kArithmetic); os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::uxtab16(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kUxtab16, kArithmetic); os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::uxtah(Condition cond, Register rd, Register rn, const Operand& operand) { os().SetCurrentInstruction(kUxtah, kArithmetic); os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::uxtb(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kUxtb, kArithmetic); os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) { os().SetCurrentInstruction(kUxtb16, kArithmetic); os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond); os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::uxth(Condition cond, EncodingSize size, Register rd, const Operand& operand) { os().SetCurrentInstruction(kUxth, kArithmetic); os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size; os() << " "; if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { os() << rd << ", "; } os() << operand; } void Disassembler::vaba( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVaba, kFpNeon); os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vaba( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVaba, kFpNeon); os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vabal( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVabal, kFpNeon); os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vabd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVabd, kFpNeon); os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vabd( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVabd, kFpNeon); os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vabdl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVabdl, kFpNeon); os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVabs, kFpNeon); os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVabs, kFpNeon); os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVabs, kFpNeon); os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vacge( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVacge, kFpNeon); os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vacge( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVacge, kFpNeon); os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vacgt( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVacgt, kFpNeon); os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vacgt( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVacgt, kFpNeon); os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vacle( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVacle, kFpNeon); os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vacle( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVacle, kFpNeon); os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vaclt( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVaclt, kFpNeon); os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vaclt( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVaclt, kFpNeon); os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vadd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVadd, kFpNeon); os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vadd( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVadd, kFpNeon); os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vadd( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVadd, kFpNeon); os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vaddhn( Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVaddhn, kFpNeon); os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vaddl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVaddl, kFpNeon); os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vaddw( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { os().SetCurrentInstruction(kVaddw, kFpNeon); os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vand(Condition cond, DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { os().SetCurrentInstruction(kVand, kFpNeon); os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vand(Condition cond, DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { os().SetCurrentInstruction(kVand, kFpNeon); os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vbic(Condition cond, DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { os().SetCurrentInstruction(kVbic, kFpNeon); os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vbic(Condition cond, DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { os().SetCurrentInstruction(kVbic, kFpNeon); os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vbif( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVbif, kFpNeon); os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vbif( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVbif, kFpNeon); os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vbit( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVbit, kFpNeon); os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vbit( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVbit, kFpNeon); os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vbsl( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVbsl, kFpNeon); os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vbsl( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVbsl, kFpNeon); os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vceq(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVceq, kFpNeon); os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vceq(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVceq, kFpNeon); os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vceq( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVceq, kFpNeon); os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vceq( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVceq, kFpNeon); os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcge(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVcge, kFpNeon); os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcge(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVcge, kFpNeon); os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcge( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVcge, kFpNeon); os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcge( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVcge, kFpNeon); os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcgt(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVcgt, kFpNeon); os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcgt(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVcgt, kFpNeon); os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcgt( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVcgt, kFpNeon); os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcgt( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVcgt, kFpNeon); os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcle(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVcle, kFpNeon); os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcle(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVcle, kFpNeon); os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vcle( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVcle, kFpNeon); os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcle( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVcle, kFpNeon); os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcls, kFpNeon); os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcls, kFpNeon); os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vclt(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVclt, kFpNeon); os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vclt(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVclt, kFpNeon); os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vclt( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVclt, kFpNeon); os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vclt( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVclt, kFpNeon); os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVclz, kFpNeon); os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVclz, kFpNeon); os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vcmp(Condition cond, DataType dt, SRegister rd, const SOperand& operand) { os().SetCurrentInstruction(kVcmp, kFpNeon); os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vcmp(Condition cond, DataType dt, DRegister rd, const DOperand& operand) { os().SetCurrentInstruction(kVcmp, kFpNeon); os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vcmpe(Condition cond, DataType dt, SRegister rd, const SOperand& operand) { os().SetCurrentInstruction(kVcmpe, kFpNeon); os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vcmpe(Condition cond, DataType dt, DRegister rd, const DOperand& operand) { os().SetCurrentInstruction(kVcmpe, kFpNeon); os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcnt, kFpNeon); os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcnt, kFpNeon); os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt(Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); } void Disassembler::vcvt(Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); } void Disassembler::vcvt(Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvt( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvt, kFpNeon); os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvta, kFpNeon); os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvta, kFpNeon); os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvta, kFpNeon); os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvta, kFpNeon); os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtb( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtb, kFpNeon); os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtb( Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtb, kFpNeon); os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtb( Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtb, kFpNeon); os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtm, kFpNeon); os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvtm, kFpNeon); os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtm, kFpNeon); os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtm, kFpNeon); os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtn, kFpNeon); os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvtn, kFpNeon); os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtn, kFpNeon); os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtn, kFpNeon); os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtp, kFpNeon); os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVcvtp, kFpNeon); os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtp, kFpNeon); os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtp, kFpNeon); os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtr( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtr, kFpNeon); os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtr( Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtr, kFpNeon); os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtt( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtt, kFpNeon); os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtt( Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { os().SetCurrentInstruction(kVcvtt, kFpNeon); os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vcvtt( Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { os().SetCurrentInstruction(kVcvtt, kFpNeon); os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 << " " << rd << ", " << rm; } void Disassembler::vdiv( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVdiv, kFpNeon); os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vdiv( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVdiv, kFpNeon); os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vdup(Condition cond, DataType dt, QRegister rd, Register rt) { os().SetCurrentInstruction(kVdup, kFpNeon); os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rt; } void Disassembler::vdup(Condition cond, DataType dt, DRegister rd, Register rt) { os().SetCurrentInstruction(kVdup, kFpNeon); os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rt; } void Disassembler::vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) { os().SetCurrentInstruction(kVdup, kFpNeon); os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) { os().SetCurrentInstruction(kVdup, kFpNeon); os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::veor( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVeor, kFpNeon); os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::veor( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVeor, kFpNeon); os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vext(Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVext, kFpNeon); os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm << ", " << operand; } void Disassembler::vext(Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVext, kFpNeon); os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm << ", " << operand; } void Disassembler::vfma( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVfma, kFpNeon); os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfma( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVfma, kFpNeon); os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfma( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVfma, kFpNeon); os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfms( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVfms, kFpNeon); os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfms( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVfms, kFpNeon); os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfms( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVfms, kFpNeon); os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfnma( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVfnma, kFpNeon); os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfnma( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVfnma, kFpNeon); os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfnms( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVfnms, kFpNeon); os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vfnms( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVfnms, kFpNeon); os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vhadd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVhadd, kFpNeon); os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vhadd( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVhadd, kFpNeon); os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vhsub( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVhsub, kFpNeon); os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vhsub( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVhsub, kFpNeon); os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vld1(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVld1, kFpNeon); os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand); } void Disassembler::vld2(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVld2, kFpNeon); os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand); } void Disassembler::vld3(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVld3, kFpNeon); os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand); } void Disassembler::vld3(Condition cond, DataType dt, const NeonRegisterList& nreglist, const MemOperand& operand) { os().SetCurrentInstruction(kVld3, kFpNeon); os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintMemOperand(kVld3Location, operand); } void Disassembler::vld4(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVld4, kFpNeon); os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand); } void Disassembler::vldm(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vldm(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vldmdb(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVldmdb, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vldmdb(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVldmdb, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vldmia(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVldmia, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vldmia(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVldmia, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vldr(Condition cond, DataType dt, DRegister rd, Location* location) { os().SetCurrentInstruction(kVldr, kFpNeon); os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped64) << " " << rd << ", " << PrintLabel(kLoadDoublePrecisionLocation, location, GetCodeAddress() & ~3); } void Disassembler::vldr(Condition cond, DataType dt, DRegister rd, const MemOperand& operand) { os().SetCurrentInstruction(kVldr, kFpNeon); os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped64) << " " << rd << ", " << PrintMemOperand(kLoadDoublePrecisionLocation, operand); } void Disassembler::vldr(Condition cond, DataType dt, SRegister rd, Location* location) { os().SetCurrentInstruction(kVldr, kFpNeon); os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped32) << " " << rd << ", " << PrintLabel(kLoadSinglePrecisionLocation, location, GetCodeAddress() & ~3); } void Disassembler::vldr(Condition cond, DataType dt, SRegister rd, const MemOperand& operand) { os().SetCurrentInstruction(kVldr, kFpNeon); os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped32) << " " << rd << ", " << PrintMemOperand(kLoadSinglePrecisionLocation, operand); } void Disassembler::vmax( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmax, kFpNeon); os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmax( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmax, kFpNeon); os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmaxnm, kFpNeon); os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmaxnm, kFpNeon); os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVmaxnm, kFpNeon); os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmin( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmin, kFpNeon); os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmin( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmin, kFpNeon); os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVminnm, kFpNeon); os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVminnm, kFpNeon); os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVminnm, kFpNeon); os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmla( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmla, kFpNeon); os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmla( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmla, kFpNeon); os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmla( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmla, kFpNeon); os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmla( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmla, kFpNeon); os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmla( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVmla, kFpNeon); os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmlal( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmlal, kFpNeon); os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmlal( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmlal, kFpNeon); os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmls( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmls, kFpNeon); os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmls( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmls, kFpNeon); os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmls( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmls, kFpNeon); os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmls( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmls, kFpNeon); os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmls( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVmls, kFpNeon); os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmlsl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVmlsl, kFpNeon); os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmlsl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmlsl, kFpNeon); os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmov(Condition cond, Register rt, SRegister rn) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rn; } void Disassembler::vmov(Condition cond, SRegister rn, Register rt) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn << ", " << rt; } void Disassembler::vmov(Condition cond, Register rt, Register rt2, DRegister rm) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << rm; } void Disassembler::vmov(Condition cond, DRegister rm, Register rt, Register rt2) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm << ", " << rt << ", " << rt2; } void Disassembler::vmov( Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << rt2 << ", " << rm << ", " << rm1; } void Disassembler::vmov( Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm << ", " << rm1 << ", " << rt << ", " << rt2; } void Disassembler::vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rt; } void Disassembler::vmov(Condition cond, DataType dt, DRegister rd, const DOperand& operand) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vmov(Condition cond, DataType dt, QRegister rd, const QOperand& operand) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vmov(Condition cond, DataType dt, SRegister rd, const SOperand& operand) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) { os().SetCurrentInstruction(kVmov, kFpNeon); os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " << rt << ", " << rn; } void Disassembler::vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) { os().SetCurrentInstruction(kVmovl, kFpNeon); os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) { os().SetCurrentInstruction(kVmovn, kFpNeon); os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vmrs(Condition cond, RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) { os().SetCurrentInstruction(kVmrs, kFpNeon); os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt << ", " << spec_reg; } void Disassembler::vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) { os().SetCurrentInstruction(kVmsr, kFpNeon); os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " " << spec_reg << ", " << rt; } void Disassembler::vmul(Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) { os().SetCurrentInstruction(kVmul, kFpNeon); os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << IndexedRegisterPrinter(dm, index); } void Disassembler::vmul(Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) { os().SetCurrentInstruction(kVmul, kFpNeon); os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << IndexedRegisterPrinter(dm, index); } void Disassembler::vmul( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmul, kFpNeon); os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmul( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVmul, kFpNeon); os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmul( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVmul, kFpNeon); os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vmull(Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { os().SetCurrentInstruction(kVmull, kFpNeon); os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); } void Disassembler::vmull( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVmull, kFpNeon); os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vmvn(Condition cond, DataType dt, DRegister rd, const DOperand& operand) { os().SetCurrentInstruction(kVmvn, kFpNeon); os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vmvn(Condition cond, DataType dt, QRegister rd, const QOperand& operand) { os().SetCurrentInstruction(kVmvn, kFpNeon); os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << operand; } void Disassembler::vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVneg, kFpNeon); os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVneg, kFpNeon); os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVneg, kFpNeon); os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vnmla( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVnmla, kFpNeon); os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vnmla( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVnmla, kFpNeon); os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vnmls( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVnmls, kFpNeon); os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vnmls( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVnmls, kFpNeon); os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vnmul( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVnmul, kFpNeon); os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vnmul( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVnmul, kFpNeon); os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vorn(Condition cond, DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { os().SetCurrentInstruction(kVorn, kFpNeon); os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vorn(Condition cond, DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { os().SetCurrentInstruction(kVorn, kFpNeon); os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vorr(Condition cond, DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { os().SetCurrentInstruction(kVorr, kFpNeon); os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vorr(Condition cond, DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { os().SetCurrentInstruction(kVorr, kFpNeon); os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << operand; } void Disassembler::vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVpadal, kFpNeon); os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVpadal, kFpNeon); os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vpadd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVpadd, kFpNeon); os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVpaddl, kFpNeon); os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVpaddl, kFpNeon); os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vpmax( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVpmax, kFpNeon); os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vpmin( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVpmin, kFpNeon); os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) { os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " << dreglist; } void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) { os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " << sreglist; } void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) { os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " << dreglist; } void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) { os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " << sreglist; } void Disassembler::vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVqabs, kFpNeon); os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVqabs, kFpNeon); os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqadd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqadd, kFpNeon); os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqadd( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVqadd, kFpNeon); os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqdmlal( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqdmlal, kFpNeon); os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vqdmlal(Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { os().SetCurrentInstruction(kVqdmlal, kFpNeon); os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); } void Disassembler::vqdmlsl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqdmlsl, kFpNeon); os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vqdmlsl(Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { os().SetCurrentInstruction(kVqdmlsl, kFpNeon); os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); } void Disassembler::vqdmulh( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqdmulh, kFpNeon); os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqdmulh( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVqdmulh, kFpNeon); os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqdmulh( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVqdmulh, kFpNeon); os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqdmulh( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVqdmulh, kFpNeon); os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqdmull( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqdmull, kFpNeon); os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vqdmull( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVqdmull, kFpNeon); os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) { os().SetCurrentInstruction(kVqmovn, kFpNeon); os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) { os().SetCurrentInstruction(kVqmovun, kFpNeon); os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVqneg, kFpNeon); os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVqneg, kFpNeon); os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vqrdmulh( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqrdmulh, kFpNeon); os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqrdmulh( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVqrdmulh, kFpNeon); os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqrdmulh( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVqrdmulh, kFpNeon); os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqrdmulh( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { os().SetCurrentInstruction(kVqrdmulh, kFpNeon); os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqrshl( Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { os().SetCurrentInstruction(kVqrshl, kFpNeon); os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::vqrshl( Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { os().SetCurrentInstruction(kVqrshl, kFpNeon); os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::vqrshrn(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqrshrn, kFpNeon); os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vqrshrun(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqrshrun, kFpNeon); os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vqshl(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVqshl, kFpNeon); os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vqshl(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqshl, kFpNeon); os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vqshlu(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVqshlu, kFpNeon); os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vqshlu(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqshlu, kFpNeon); os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vqshrn(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqshrn, kFpNeon); os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vqshrun(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVqshrun, kFpNeon); os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vqsub( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVqsub, kFpNeon); os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vqsub( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVqsub, kFpNeon); os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vraddhn( Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVraddhn, kFpNeon); os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrecpe, kFpNeon); os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrecpe, kFpNeon); os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrecps( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVrecps, kFpNeon); os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrecps( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVrecps, kFpNeon); os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrev16, kFpNeon); os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrev16, kFpNeon); os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrev32, kFpNeon); os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrev32, kFpNeon); os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrev64, kFpNeon); os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrev64, kFpNeon); os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrhadd( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVrhadd, kFpNeon); os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrhadd( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVrhadd, kFpNeon); os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrinta, kFpNeon); os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; } void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrinta, kFpNeon); os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; } void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrinta, kFpNeon); os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; } void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintm, kFpNeon); os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; } void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrintm, kFpNeon); os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; } void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintm, kFpNeon); os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; } void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintn, kFpNeon); os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; } void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrintn, kFpNeon); os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; } void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintn, kFpNeon); os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; } void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintp, kFpNeon); os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; } void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrintp, kFpNeon); os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; } void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintp, kFpNeon); os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; } void Disassembler::vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintr, kFpNeon); os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintr, kFpNeon); os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintx, kFpNeon); os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrintx, kFpNeon); os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm; } void Disassembler::vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintx, kFpNeon); os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrintz, kFpNeon); os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrintz, kFpNeon); os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm; } void Disassembler::vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVrintz, kFpNeon); os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrshl( Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { os().SetCurrentInstruction(kVrshl, kFpNeon); os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::vrshl( Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { os().SetCurrentInstruction(kVrshl, kFpNeon); os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << rn; } void Disassembler::vrshr(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVrshr, kFpNeon); os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vrshr(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVrshr, kFpNeon); os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vrshrn(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVrshrn, kFpNeon); os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVrsqrte, kFpNeon); os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVrsqrte, kFpNeon); os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vrsqrts( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVrsqrts, kFpNeon); os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrsqrts( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVrsqrts, kFpNeon); os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vrsra(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVrsra, kFpNeon); os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vrsra(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVrsra, kFpNeon); os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vrsubhn( Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVrsubhn, kFpNeon); os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVseleq, kFpNeon); os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVseleq, kFpNeon); os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVselge, kFpNeon); os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVselge, kFpNeon); os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVselgt, kFpNeon); os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVselgt, kFpNeon); os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVselvs, kFpNeon); os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVselvs, kFpNeon); os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vshl(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVshl, kFpNeon); os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vshl(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVshl, kFpNeon); os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vshll(Condition cond, DataType dt, QRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVshll, kFpNeon); os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vshr(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVshr, kFpNeon); os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vshr(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVshr, kFpNeon); os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vshrn(Condition cond, DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVshrn, kFpNeon); os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm << ", " << operand; } void Disassembler::vsli(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVsli, kFpNeon); os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vsli(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVsli, kFpNeon); os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) { os().SetCurrentInstruction(kVsqrt, kFpNeon); os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVsqrt, kFpNeon); os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vsra(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVsra, kFpNeon); os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vsra(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVsra, kFpNeon); os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vsri(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { os().SetCurrentInstruction(kVsri, kFpNeon); os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vsri(Condition cond, DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { os().SetCurrentInstruction(kVsri, kFpNeon); os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rm) || !use_short_hand_form_) { os() << rd << ", "; } os() << rm << ", " << operand; } void Disassembler::vst1(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVst1, kFpNeon); os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand); } void Disassembler::vst2(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVst2, kFpNeon); os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand); } void Disassembler::vst3(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVst3, kFpNeon); os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand); } void Disassembler::vst3(Condition cond, DataType dt, const NeonRegisterList& nreglist, const MemOperand& operand) { os().SetCurrentInstruction(kVst3, kFpNeon); os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintMemOperand(kVst3Location, operand); } void Disassembler::vst4(Condition cond, DataType dt, const NeonRegisterList& nreglist, const AlignedMemOperand& operand) { os().SetCurrentInstruction(kVst4, kFpNeon); os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " " << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand); } void Disassembler::vstm(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vstm(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vstmdb(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVstmdb, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vstmdb(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVstmdb, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vstmia(Condition cond, DataType dt, Register rn, WriteBack write_back, DRegisterList dreglist) { os().SetCurrentInstruction(kVstmia, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << dreglist; } void Disassembler::vstmia(Condition cond, DataType dt, Register rn, WriteBack write_back, SRegisterList sreglist) { os().SetCurrentInstruction(kVstmia, kLoadStore | kLoadStoreMultiple | kFpNeon); os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " << rn << write_back << ", " << sreglist; } void Disassembler::vstr(Condition cond, DataType dt, DRegister rd, const MemOperand& operand) { os().SetCurrentInstruction(kVstr, kFpNeon); os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped64) << " " << rd << ", " << PrintMemOperand(kStoreDoublePrecisionLocation, operand); } void Disassembler::vstr(Condition cond, DataType dt, SRegister rd, const MemOperand& operand) { os().SetCurrentInstruction(kVstr, kFpNeon); os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << DtPrinter(dt, Untyped32) << " " << rd << ", " << PrintMemOperand(kStoreSinglePrecisionLocation, operand); } void Disassembler::vsub( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVsub, kFpNeon); os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vsub( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVsub, kFpNeon); os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vsub( Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { os().SetCurrentInstruction(kVsub, kFpNeon); os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vsubhn( Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVsubhn, kFpNeon); os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vsubl( Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVsubl, kFpNeon); os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rn << ", " << rm; } void Disassembler::vsubw( Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { os().SetCurrentInstruction(kVsubw, kFpNeon); os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVswp, kFpNeon); os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVswp, kFpNeon); os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vtbl(Condition cond, DataType dt, DRegister rd, const NeonRegisterList& nreglist, DRegister rm) { os().SetCurrentInstruction(kVtbl, kFpNeon); os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << nreglist << ", " << rm; } void Disassembler::vtbx(Condition cond, DataType dt, DRegister rd, const NeonRegisterList& nreglist, DRegister rm) { os().SetCurrentInstruction(kVtbx, kFpNeon); os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << nreglist << ", " << rm; } void Disassembler::vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVtrn, kFpNeon); os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVtrn, kFpNeon); os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vtst( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { os().SetCurrentInstruction(kVtst, kFpNeon); os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vtst( Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { os().SetCurrentInstruction(kVtst, kFpNeon); os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; os() << " "; if (!rd.Is(rn) || !use_short_hand_form_) { os() << rd << ", "; } os() << rn << ", " << rm; } void Disassembler::vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVuzp, kFpNeon); os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVuzp, kFpNeon); os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) { os().SetCurrentInstruction(kVzip, kFpNeon); os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) { os().SetCurrentInstruction(kVzip, kFpNeon); os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " << rd << ", " << rm; } void Disassembler::yield(Condition cond, EncodingSize size) { os().SetCurrentInstruction(kYield, kNoAttribute); os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size; } int Disassembler::T32Size(uint32_t instr) { if ((instr & 0xe0000000) == 0xe0000000) { switch (instr & 0x08000000) { case 0x00000000: if ((instr & 0x10000000) == 0x10000000) return 4; return 2; case 0x08000000: return 4; default: return 2; } } return 2; } void Disassembler::DecodeT32(uint32_t instr) { T32CodeAddressIncrementer incrementer(instr, &code_address_); ITBlockScope it_scope(&it_block_); switch (instr & 0xe0000000) { case 0x00000000: { // 0x00000000 switch (instr & 0x18000000) { case 0x18000000: { // 0x18000000 switch (instr & 0x06000000) { case 0x00000000: { // 0x18000000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; unsigned rm = (instr >> 22) & 0x7; if (InITBlock()) { // ADD{} , , ; T1 add(CurrentCond(), Narrow, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} {}, , ; T1 adds(Condition::None(), Narrow, Register(rd), Register(rn), Register(rm)); } break; } case 0x02000000: { // 0x1a000000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; unsigned rm = (instr >> 22) & 0x7; if (InITBlock()) { // SUB{} , , ; T1 sub(CurrentCond(), Narrow, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} {}, , ; T1 subs(Condition::None(), Narrow, Register(rd), Register(rn), Register(rm)); } break; } case 0x04000000: { // 0x1c000000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; uint32_t imm = (instr >> 22) & 0x7; if (InITBlock()) { // ADD{} , , # ; T1 add(CurrentCond(), Narrow, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Narrow, Register(rd), Register(rn), imm); } break; } case 0x06000000: { // 0x1e000000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; uint32_t imm = (instr >> 22) & 0x7; if (InITBlock()) { // SUB{} , , # ; T1 sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Narrow, Register(rd), Register(rn), imm); } break; } } break; } default: { if (((instr & 0x18000000) == 0x18000000)) { UnallocatedT32(instr); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; if (amount == 0) amount = 32; // ASR{} {}, , # ; T2 asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && !InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; if (amount == 0) amount = 32; // ASRS{} {}, , # ; T2 asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && ((instr & 0x07c00000) != 0x00000000) && InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; // LSL{} {}, , # ; T2 lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; // LSLS{} {}, , # ; T2 lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; if (amount == 0) amount = 32; // LSR{} {}, , # ; T2 lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount); return; } if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && !InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; uint32_t amount = (instr >> 22) & 0x1f; if (amount == 0) amount = 32; // LSRS{} {}, , # ; T2 lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount); return; } unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; ImmediateShiftOperand shift_operand((instr >> 27) & 0x3, (instr >> 22) & 0x1f); if (InITBlock()) { // MOV{} , {, # } ; T2 mov(CurrentCond(), Narrow, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Narrow, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } break; } } break; } case 0x20000000: { // 0x20000000 switch (instr & 0x18000000) { case 0x00000000: { // 0x20000000 unsigned rd = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; if (InITBlock()) { // MOV{} , # ; T1 mov(CurrentCond(), Narrow, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Narrow, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Narrow, Register(rn), imm); break; } case 0x10000000: { // 0x30000000 unsigned rd = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; if (InITBlock() && ((imm <= 7))) { // ADD{} , # ; T2 add(CurrentCond(), Register(rd), imm); } else if (InITBlock() && ((imm > 7))) { // ADD{} {}, , # ; T2 add(CurrentCond(), Narrow, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else if (OutsideITBlock() && ((imm > 7))) { // ADDS{} {}, , # ; T2 adds(Condition::None(), Narrow, Register(rd), Register(rd), imm); } else { UnallocatedT32(instr); } break; } case 0x18000000: { // 0x38000000 unsigned rd = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; if (InITBlock() && ((imm <= 7))) { // SUB{} , # ; T2 sub(CurrentCond(), Register(rd), imm); } else if (InITBlock() && ((imm > 7))) { // SUB{} {}, , # ; T2 sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else if (OutsideITBlock() && ((imm > 7))) { // SUBS{} {}, , # ; T2 subs(Condition::None(), Narrow, Register(rd), Register(rd), imm); } else { UnallocatedT32(instr); } break; } } break; } case 0x40000000: { // 0x40000000 switch (instr & 0x18000000) { case 0x00000000: { // 0x40000000 switch (instr & 0x07000000) { case 0x00000000: { // 0x40000000 switch (instr & 0x00c00000) { case 0x00000000: { // 0x40000000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // AND{} {}, , ; T1 and_(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00400000: { // 0x40400000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // EOR{} {}, , ; T1 eor(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00800000: { // 0x40800000 if (InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSL{} {}, , ; T1 lsl(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Narrow, Register(rd), Register(rd), Register(rs)); return; } unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; if (InITBlock()) { // MOV{} , , LSL ; T1 mov(CurrentCond(), Narrow, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Narrow, Register(rd), Operand(Register(rm), LSL, Register(rs))); } break; } case 0x00c00000: { // 0x40c00000 if (InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSR{} {}, , ; T1 lsr(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Narrow, Register(rd), Register(rd), Register(rs)); return; } unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; if (InITBlock()) { // MOV{} , , LSR ; T1 mov(CurrentCond(), Narrow, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Narrow, Register(rd), Operand(Register(rm), LSR, Register(rs))); } break; } } break; } case 0x01000000: { // 0x41000000 switch (instr & 0x00c00000) { case 0x00000000: { // 0x41000000 if (InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASR{} {}, , ; T1 asr(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Narrow, Register(rd), Register(rd), Register(rs)); return; } unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; if (InITBlock()) { // MOV{} , , ASR ; T1 mov(CurrentCond(), Narrow, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Narrow, Register(rd), Operand(Register(rm), ASR, Register(rs))); } break; } case 0x00400000: { // 0x41400000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // ADC{} {}, , ; T1 adc(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00800000: { // 0x41800000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // SBC{} {}, , ; T1 sbc(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00c00000: { // 0x41c00000 if (InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ROR{} {}, , ; T1 ror(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Narrow, Register(rd), Register(rd), Register(rs)); return; } unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; if (InITBlock()) { // MOV{} , , ROR ; T1 mov(CurrentCond(), Narrow, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Narrow, Register(rd), Operand(Register(rm), ROR, Register(rs))); } break; } } break; } case 0x02000000: { // 0x42000000 switch (instr & 0x00c00000) { case 0x00000000: { // 0x42000000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // TST{}{} , ; T1 tst(CurrentCond(), Narrow, Register(rn), Register(rm)); break; } case 0x00400000: { // 0x42400000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; if (InITBlock()) { // RSB{} {}, , #0 ; T1 rsb(CurrentCond(), Narrow, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Narrow, Register(rd), Register(rn), UINT32_C(0)); } break; } case 0x00800000: { // 0x42800000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMP{}{} , ; T1 cmp(CurrentCond(), Narrow, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Narrow, Register(rn), Register(rm)); break; } } break; } case 0x03000000: { // 0x43000000 switch (instr & 0x00c00000) { case 0x00000000: { // 0x43000000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // ORR{} {}, , ; T1 orr(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ORRS{} {}, , ; T1 orrs(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00400000: { // 0x43400000 unsigned rd = (instr >> 16) & 0x7; unsigned rn = (instr >> 19) & 0x7; if (InITBlock()) { // MUL{} , , {} ; T1 mul(CurrentCond(), Narrow, Register(rd), Register(rn), Register(rd)); } else { VIXL_ASSERT(OutsideITBlock()); // MULS{} , , {} ; T1 muls(Condition::None(), Register(rd), Register(rn), Register(rd)); } break; } case 0x00800000: { // 0x43800000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // BIC{} {}, , ; T1 bic(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // BICS{} {}, , ; T1 bics(Condition::None(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } case 0x00c00000: { // 0x43c00000 unsigned rd = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; if (InITBlock()) { // MVN{} , ; T1 mvn(CurrentCond(), Narrow, Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // MVNS{} , ; T1 mvns(Condition::None(), Narrow, Register(rd), Register(rm)); } break; } } break; } case 0x04000000: { // 0x44000000 switch (instr & 0x00780000) { case 0x00680000: { // 0x44680000 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); // ADD{}{} {}, SP, ; T1 add(CurrentCond(), Narrow, Register(rd), sp, Register(rd)); break; } default: { switch (instr & 0x00870000) { case 0x00850000: { // 0x44850000 if (((instr & 0x780000) == 0x680000)) { UnallocatedT32(instr); return; } unsigned rm = (instr >> 19) & 0xf; // ADD{}{} {SP}, SP, ; T2 add(CurrentCond(), Narrow, sp, sp, Register(rm)); break; } default: { if (((instr & 0x780000) == 0x680000) || ((instr & 0x870000) == 0x850000)) { UnallocatedT32(instr); return; } unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); unsigned rm = (instr >> 19) & 0xf; if (InITBlock()) { // ADD{} , ; T2 add(CurrentCond(), Register(rd), Register(rm)); } else { // ADD{}{} {}, , ; T2 add(CurrentCond(), Narrow, Register(rd), Register(rd), Register(rm)); } break; } } break; } } break; } case 0x05000000: { // 0x45000000 unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); unsigned rm = (instr >> 19) & 0xf; // CMP{}{} , ; T2 cmp(CurrentCond(), Narrow, Register(rn), Register(rm)); break; } case 0x06000000: { // 0x46000000 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); unsigned rm = (instr >> 19) & 0xf; // MOV{}{} , ; T1 mov(CurrentCond(), Narrow, Register(rd), Register(rm)); break; } case 0x07000000: { // 0x47000000 switch (instr & 0x00800000) { case 0x00000000: { // 0x47000000 unsigned rm = (instr >> 19) & 0xf; // BX{}{} ; T1 bx(CurrentCond(), Register(rm)); if (((instr & 0xff870000) != 0x47000000)) { UnpredictableT32(instr); } break; } case 0x00800000: { // 0x47800000 unsigned rm = (instr >> 19) & 0xf; // BLX{}{} ; T1 blx(CurrentCond(), Register(rm)); if (((instr & 0xff870000) != 0x47800000)) { UnpredictableT32(instr); } break; } } break; } } break; } case 0x08000000: { // 0x48000000 unsigned rt = (instr >> 24) & 0x7; int32_t imm = ((instr >> 16) & 0xff) << 2; Location location(imm, kT32PcDelta); // LDR{}{} ,