} , , ; T1 add(CurrentCond(), Best, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} {}, , ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} {}, , ; T1 subs(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} {}, , ; T1 subs(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 sub(CurrentCond(), Best, Register(rd), Register(rn), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} {}, , ; T1 subs(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 subs(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 add(CurrentCond(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // ADDS{} , , # ; T1 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 adds(Condition::None(), Best, 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(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 sub(CurrentCond(), Best, Register(rd), Register(rn), imm); } else { VIXL_ASSERT(OutsideITBlock()); // SUBS{} , , # ; T1 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 subs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 asr(CurrentCond(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 asrs(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 lsl(CurrentCond(), Best, 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(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 lsls(Condition::None(), Best, 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(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 lsr(CurrentCond(), Best, 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(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , {, # } ; T2 mov(CurrentCond(), Best, Register(rd), Operand(Register(rm), shift_operand.GetType(), shift_operand.GetAmount())); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , {, # } ; T2 movs(Condition::None(), Best, 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(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 mov(CurrentCond(), Best, Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , # ; T1 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 movs(Condition::None(), Best, Register(rd), imm); } break; } case 0x08000000: { // 0x28000000 unsigned rn = (instr >> 24) & 0x7; uint32_t imm = (instr >> 16) & 0xff; // CMP{}{} , # ; T1 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 cmp(CurrentCond(), Best, 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , # ; T2 add(CurrentCond(), Register(rd), imm); } else if (InITBlock() && ((imm > 7))) { // ADD{} {}, , # ; T2 add(CurrentCond(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 add(CurrentCond(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // ADDS{} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , # ; T2 adds(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // ADDS{} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 adds(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , # ; T2 sub(CurrentCond(), Register(rd), imm); } else if (InITBlock() && ((imm > 7))) { // SUB{} {}, , # ; T2 sub(CurrentCond(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 sub(CurrentCond(), Best, Register(rd), Register(rd), imm); } else if (OutsideITBlock() && ((imm <= 7))) { // SUBS{} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , # ; T2 subs(Register(rd), imm); } else { VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); // SUBS{} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , # ; T2 subs(Condition::None(), Best, Register(rd), Register(rd), imm); } 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 and_(CurrentCond(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ANDS{} {}, , ; T1 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 ands(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 eor(CurrentCond(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // EORS{} {}, , ; T1 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 eors(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 lsl(CurrentCond(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSLS{} {}, , ; T1 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 lsls(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , LSL ; T1 mov(CurrentCond(), Best, Register(rd), Operand(Register(rm), LSL, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , LSL ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 lsr(CurrentCond(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // LSRS{} {}, , ; T1 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 lsrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , LSR ; T1 mov(CurrentCond(), Best, Register(rd), Operand(Register(rm), LSR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , LSR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 asr(CurrentCond(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // ASRS{} {}, , ; T1 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 asrs(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , ASR ; T1 mov(CurrentCond(), Best, Register(rd), Operand(Register(rm), ASR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , ASR ; T1 movs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 adc(CurrentCond(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // ADCS{} {}, , ; T1 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 adcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 sbc(CurrentCond(), Best, Register(rd), Register(rd), Register(rm)); } else { VIXL_ASSERT(OutsideITBlock()); // SBCS{} {}, , ; T1 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 sbcs(Condition::None(), Best, 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(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 ror(CurrentCond(), Best, Register(rd), Register(rd), Register(rs)); return; } if (!InITBlock()) { unsigned rd = (instr >> 16) & 0x7; unsigned rs = (instr >> 19) & 0x7; // RORS{} {}, , ; T1 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 rors(Condition::None(), Best, 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(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , ROR ; T1 mov(CurrentCond(), Best, Register(rd), Operand(Register(rm), ROR, Register(rs))); } else { VIXL_ASSERT(OutsideITBlock()); // MOVS{} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} , , ROR ; T1 movs(Condition::None(), Best, 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(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 tst(CurrentCond(), Best, 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(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , #0 ; T1 rsb(CurrentCond(), Best, Register(rd), Register(rn), UINT32_C(0)); } else { VIXL_ASSERT(OutsideITBlock()); // RSBS{} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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{} {
} {}, , #0 ; T1 rsbs(Condition::None(), Best, 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(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 cmp(CurrentCond(), Best, Register(rn), Register(rm)); break; } case 0x00c00000: { // 0x42c00000 unsigned rn = (instr >> 16) & 0x7; unsigned rm = (instr >> 19) & 0x7; // CMN{}{} , ; T1 cmn(CurrentCond(), Best, 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 cmn(CurrentCond(), Best, 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{} {
} {