}
case ARM::tSTMIA_UPD: {
bool listContainsBase;
- if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase))
+ if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase) && !isThumbTwo())
return Error(Operands[4]->getStartLoc(),
"registers must be in range r0-r7");
break;
}
break;
}
+ case ARM::tSTMIA_UPD: {
+ // If the register list contains any high registers, we need to use
+ // the 32-bit encoding instead if we're in Thumb2. Otherwise, this
+ // should have generated an error in validateInstruction().
+ unsigned Rn = Inst.getOperand(0).getReg();
+ bool listContainsBase;
+ if (checkLowRegisterList(Inst, 4, Rn, 0, listContainsBase)) {
+ // 16-bit encoding isn't sufficient. Switch to the 32-bit version.
+ assert (isThumbTwo());
+ Inst.setOpcode(ARM::t2STMIA_UPD);
+ }
+ break;
+ }
case ARM::t2MOVi: {
// If we can use the 16-bit encoding and the user didn't explicitly
// request the 32-bit variant, transform it here.
@ CHECK: ssub8eq r5, r1, r2 @ encoding: [0xc1,0xfa,0x02,0xf5]
+@------------------------------------------------------------------------------
+@ STMIA
+@------------------------------------------------------------------------------
+ stmia.w r4, {r4, r5, r8, r9}
+ stmia.w r4, {r5, r6}
+ stmia.w r5!, {r3, r8}
+ stm.w r4, {r4, r5, r8, r9}
+ stm.w r4, {r5, r6}
+ stm.w r5!, {r3, r8}
+ stm.w r5!, {r1, r2}
+ stm.w r2, {r1, r2}
+
+ stmia r4, {r4, r5, r8, r9}
+ stmia r4, {r5, r6}
+ stmia r5!, {r3, r8}
+ stm r4, {r4, r5, r8, r9}
+ stm r4, {r5, r6}
+ stm r5!, {r3, r8}
+ stmea r5!, {r3, r8}
+
+@ CHECK: stm.w r4, {r4, r5, r8, r9} @ encoding: [0x84,0xe8,0x30,0x03]
+@ CHECK: stm.w r4, {r5, r6} @ encoding: [0x84,0xe8,0x60,0x00]
+@ CHECK: stm.w r5!, {r3, r8} @ encoding: [0xa5,0xe8,0x08,0x01]
+@ CHECK: stm.w r4, {r4, r5, r8, r9} @ encoding: [0x84,0xe8,0x30,0x03]
+@ CHECK: stm.w r4, {r5, r6} @ encoding: [0x84,0xe8,0x60,0x00]
+@ CHECK: stm.w r5!, {r3, r8} @ encoding: [0xa5,0xe8,0x08,0x01]
+@ CHECK: stm.w r5!, {r1, r2} @ encoding: [0xa5,0xe8,0x06,0x00]
+@ CHECK: stm.w r2, {r1, r2} @ encoding: [0x82,0xe8,0x06,0x00]
+
+@ CHECK: stm.w r4, {r4, r5, r8, r9} @ encoding: [0x84,0xe8,0x30,0x03]
+@ CHECK: stm.w r4, {r5, r6} @ encoding: [0x84,0xe8,0x60,0x00]
+@ CHECK: stm.w r5!, {r3, r8} @ encoding: [0xa5,0xe8,0x08,0x01]
+@ CHECK: stm.w r4, {r4, r5, r8, r9} @ encoding: [0x84,0xe8,0x30,0x03]
+@ CHECK: stm.w r4, {r5, r6} @ encoding: [0x84,0xe8,0x60,0x00]
+@ CHECK: stm.w r5!, {r3, r8} @ encoding: [0xa5,0xe8,0x08,0x01]
+@ CHECK: stm.w r5!, {r3, r8} @ encoding: [0xa5,0xe8,0x08,0x01]
+
+
@------------------------------------------------------------------------------
@ SUB (register)
@------------------------------------------------------------------------------