Files
ftmemsim-valgrind/none/tests/arm/v6intARM.c
Julian Seward 25e9b5634b Add test cases pertaining to vex r2731, for the following instructions:
SSAX SXTAB16 SHASX SHSAX SHSUB16 SHSUB8
  UASX USAX UQADD16 UQASX UQSAX UHASX UHSAX REVSH

Pertaining to
  321363 321364 321466 321467 321468 321619 321704
  321620 321621 321692 321694 321696 321697 321703

(Vasily, w.golubev@mail.ru)



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13447
2013-07-04 20:39:53 +00:00

1215 lines
59 KiB
C

/* How to compile:
gcc -O -g -Wall -mcpu=cortex-a8 -o testarmv6int testarmv6int.c
*/
#include <stdio.h>
/* test macros to generate and output the result of a single instruction */
#define TESTINST2(instruction, RMval, RD, RM, carryin) \
{ \
unsigned int out; \
unsigned int cpsr; \
\
__asm__ volatile( \
"movs %3,%3;" \
"msrne cpsr_f,#(1<<29);" \
"msreq cpsr_f,#0;" \
"mov " #RM ",%2;" \
/* set #RD to 0x55555555 so we can see which parts get overwritten */ \
"mov " #RD ", #0x55" "\n\t" \
"orr " #RD "," #RD "," #RD ", LSL #8" "\n\t" \
"orr " #RD "," #RD "," #RD ", LSL #16" "\n\t" \
instruction ";" \
"mov %0," #RD ";" \
"mrs %1,cpsr;" \
: "=&r" (out), "=&r" (cpsr) \
: "r" (RMval), "r" (carryin) \
: #RD, #RM, "cc", "memory" \
); \
printf("%s :: rd 0x%08x rm 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
instruction, out, RMval, \
carryin ? 1 : 0, \
cpsr & 0xffff0000, \
((1<<31) & cpsr) ? 'N' : ' ', \
((1<<30) & cpsr) ? 'Z' : ' ', \
((1<<29) & cpsr) ? 'C' : ' ', \
((1<<28) & cpsr) ? 'V' : ' ' \
); \
}
#define TESTINST3(instruction, RMval, RNval, RD, RM, RN, carryin) \
{ \
unsigned int out; \
unsigned int cpsr; \
\
__asm__ volatile( \
"movs %4,%4;" \
"msrne cpsr_f,#(1<<29);" \
"msreq cpsr_f,#0;" \
"mov " #RM ",%2;" \
"mov " #RN ",%3;" \
instruction ";" \
"mov %0," #RD ";" \
"mrs %1,cpsr;" \
: "=&r" (out), "=&r" (cpsr) \
: "r" (RMval), "r" (RNval), "r" (carryin) \
: #RD, #RM, #RN, "cc", "memory" \
); \
printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
instruction, out, RMval, RNval, \
carryin ? 1 : 0, \
cpsr & 0xffff0000, \
((1<<31) & cpsr) ? 'N' : ' ', \
((1<<30) & cpsr) ? 'Z' : ' ', \
((1<<29) & cpsr) ? 'C' : ' ', \
((1<<28) & cpsr) ? 'V' : ' ' \
); \
}
#define TESTINST4(instruction, RMval, RNval, RSval, RD, RM, RN, RS, carryin) \
{ \
unsigned int out; \
unsigned int cpsr; \
\
__asm__ volatile( \
"movs %5,%5;" \
"msrne cpsr_f,#(1<<29);" \
"msreq cpsr_f,#0;" \
"mov " #RM ",%2;" \
"mov " #RN ",%3;" \
"mov " #RS ",%4;" \
instruction ";" \
"mov %0," #RD ";" \
"mrs %1,cpsr;" \
: "=&r" (out), "=&r" (cpsr) \
: "r" (RMval), "r" (RNval), "r" (RSval), "r" (carryin) \
: #RD, #RM, #RN, #RS, "cc", "memory" \
); \
printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
instruction, out, RMval, RNval, RSval, \
carryin ? 1 : 0, \
cpsr & 0xffff0000, \
((1<<31) & cpsr) ? 'N' : ' ', \
((1<<30) & cpsr) ? 'Z' : ' ', \
((1<<29) & cpsr) ? 'C' : ' ', \
((1<<28) & cpsr) ? 'V' : ' ' \
); \
}
#define TESTINST4_2OUT(instruction, RDval, RD2val, RMval, RSval, RD, RD2, RM, RS, carryin) \
{ \
unsigned int out; \
unsigned int out2; \
unsigned int cpsr; \
\
__asm__ volatile( \
"movs %7,%7;" \
"msrne cpsr_f,#(1<<29);" \
"msreq cpsr_f,#0;" \
"mov " #RD ",%3;" \
"mov " #RD2 ",%4;" \
"mov " #RM ",%5;" \
"mov " #RS ",%6;" \
instruction ";" \
"mov %0," #RD ";" \
"mov %1," #RD2 ";" \
"mrs %2,cpsr;" \
: "=&r" (out), "=&r" (out2), "=&r" (cpsr) \
: "r" (RDval), "r" (RD2val), "r" (RMval), "r" (RSval), "r" (carryin) \
: #RD, #RD2, #RM, #RS, "cc", "memory" \
); \
printf("%s :: rd 0x%08x rd2 0x%08x, rm 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
instruction, out, out2, RMval, RSval, \
carryin ? 1 : 0, \
cpsr & 0xffff0000, \
((1<<31) & cpsr) ? 'N' : ' ', \
((1<<30) & cpsr) ? 'Z' : ' ', \
((1<<29) & cpsr) ? 'C' : ' ', \
((1<<28) & cpsr) ? 'V' : ' ' \
); \
}
/* helpers */
#define TESTCARRY { int c = 0; for (c = 0; c < 2; c++) {
#define TESTCARRYEND }}
int main(int argc, char **argv)
{
printf("MOV\n");
TESTINST2("mov r0, r1", 1, r0, r1, 0);
TESTINST2("cpy r0, r1", 1, r0, r1, 0);
TESTINST2("mov r0, #0", 0, r0, r1, 0);
TESTINST2("mov r0, #1", 0, r0, r1, 0);
TESTCARRY
TESTINST2("movs r0, r1", 1, r0, r1, c);
TESTINST2("movs r0, r1", 0, r0, r1, c);
TESTINST2("movs r0, r1", 0x80000000, r0, r1, c);
TESTINST2("movs r0, #0", 0, r0, r1, c);
TESTINST2("movs r0, #1", 0, r0, r1, c);
TESTCARRYEND
printf("MVN\n");
TESTINST2("mvn r0, r1", 1, r0, r1, 0);
TESTCARRY
TESTINST2("mvns r0, r1", 1, r0, r1, c);
TESTINST2("mvns r0, r1", 0, r0, r1, c);
TESTINST2("mvns r0, r1", 0x80000000, r0, r1, c);
TESTCARRYEND
printf("ADD\n");
TESTINST3("adds r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 0, 1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 1, 0, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 1, 1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 0, -1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 1, -1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 0x80000000, -1, r0, r1, r2, 0);
TESTINST3("adds r0, r1, r2", 0x80000000, 0, r0, r1, r2, 0);
printf("ADC\n");
TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 1);
printf("LSL\n");
TESTINST3("lsl r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0x1, 0, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0x1, 1, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0x1, 31, r0, r1, r2, 0);
TESTINST3("lsl r0, r1, r2", 0x2, 31, r0, r1, r2, 0);
printf("LSLS\n");
TESTCARRY
TESTINST3("lsls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0x1, 0, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0x1, 1, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0x1, 31, r0, r1, r2, c);
TESTINST3("lsls r0, r1, r2", 0x2, 31, r0, r1, r2, c);
TESTCARRYEND
printf("LSL immediate\n");
TESTCARRY
TESTINST2("lsl r0, r1, #0", 0xffffffff, r0, r1, c);
TESTINST2("lsl r0, r1, #1", 0xffffffff, r0, r1, c);
TESTINST2("lsl r0, r1, #31", 0xffffffff, r0, r1, c);
TESTINST2("lsl r0, r1, #0", 0x1, r0, r1, c);
TESTINST2("lsl r0, r1, #1", 0x1, r0, r1, c);
TESTINST2("lsl r0, r1, #31", 0x1, r0, r1, c);
TESTINST2("lsl r0, r1, #31", 0x2, r0, r1, c);
TESTCARRYEND
printf("LSLS immediate\n");
TESTCARRY
TESTINST2("lsls r0, r1, #0", 0xffffffff, r0, r1, c);
TESTINST2("lsls r0, r1, #1", 0xffffffff, r0, r1, c);
TESTINST2("lsls r0, r1, #31", 0xffffffff, r0, r1, c);
TESTINST2("lsls r0, r1, #0", 0x1, r0, r1, c);
TESTINST2("lsls r0, r1, #1", 0x1, r0, r1, c);
TESTINST2("lsls r0, r1, #31", 0x1, r0, r1, c);
TESTINST2("lsls r0, r1, #31", 0x2, r0, r1, c);
TESTCARRYEND
printf("LSR\n");
TESTINST3("lsr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
TESTINST3("lsr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
printf("LSRS\n");
TESTCARRY
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
TESTINST3("lsrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
TESTCARRYEND
printf("LSR immediate\n");
TESTINST2("lsr r0, r1, #0", 0xffffffff, r0, r1, 0);
TESTINST2("lsr r0, r1, #1", 0xffffffff, r0, r1, 0);
TESTINST2("lsr r0, r1, #31", 0xffffffff, r0, r1, 0);
TESTINST2("lsr r0, r1, #32", 0xffffffff, r0, r1, 0);
TESTINST2("lsr r0, r1, #16", 0x00010000, r0, r1, 0);
TESTINST2("lsr r0, r1, #17", 0x00010000, r0, r1, 0);
TESTINST2("lsr r0, r1, #18", 0x00010000, r0, r1, 0);
printf("LSRS immediate\n");
TESTCARRY
TESTINST2("lsrs r0, r1, #0", 0xffffffff, r0, r1, c);
TESTINST2("lsrs r0, r1, #1", 0xffffffff, r0, r1, c);
TESTINST2("lsrs r0, r1, #31", 0xffffffff, r0, r1, c);
TESTINST2("lsrs r0, r1, #32", 0xffffffff, r0, r1, c);
TESTINST2("lsrs r0, r1, #16", 0x00010000, r0, r1, c);
TESTINST2("lsrs r0, r1, #17", 0x00010000, r0, r1, c);
TESTINST2("lsrs r0, r1, #18", 0x00010000, r0, r1, c);
TESTCARRYEND
printf("ASR\n");
TESTCARRY
TESTINST3("asr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
TESTINST3("asr r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
TESTCARRYEND
printf("ASRS\n");
TESTCARRY
TESTINST3("asrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
TESTCARRYEND
TESTCARRY
TESTINST3("asrs r0, r1, r2", 0x8, 0, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x8, 1, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x8, 2, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x8, 3, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x8, 4, r0, r1, r2, c);
TESTINST3("asrs r0, r1, r2", 0x8, 5, r0, r1, r2, c);
TESTCARRYEND
TESTINST3("asrs r0, r1, r2", 0x80000001, 1, r0, r1, r2, 0);
TESTINST3("asrs r0, r1, r2", 0x80000001, 2, r0, r1, r2, 0);
printf("ASR immediate\n");
TESTINST2("asr r0, r1, #0", 0xffffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #1", 0xffffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #31", 0xffffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #32", 0xffffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #0", 0x7fffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #1", 0x7fffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #31", 0x7fffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #32", 0x7fffffff, r0, r1, 0);
TESTINST2("asr r0, r1, #16", 0x00010000, r0, r1, 0);
TESTINST2("asr r0, r1, #17", 0x00010000, r0, r1, 0);
TESTINST2("asr r0, r1, #18", 0x00010000, r0, r1, 0);
printf("ASRS immediate\n");
TESTCARRY
TESTINST2("asrs r0, r1, #0", 0xffffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #1", 0xffffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #31", 0xffffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #32", 0xffffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #0", 0x7fffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #1", 0x7fffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #31", 0x7fffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #32", 0x7fffffff, r0, r1, c);
TESTINST2("asrs r0, r1, #16", 0x00010000, r0, r1, c);
TESTINST2("asrs r0, r1, #17", 0x00010000, r0, r1, c);
TESTINST2("asrs r0, r1, #18", 0x00010000, r0, r1, c);
TESTCARRYEND
printf("ROR\n");
TESTCARRY
TESTINST3("ror r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x80088000, 1, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
TESTINST3("ror r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
TESTCARRYEND
printf("RORS\n");
TESTCARRY
TESTINST3("rors r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x80088000, 0, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
TESTINST3("rors r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
TESTCARRYEND
printf("ROR immediate\n");
TESTCARRY
TESTINST2("ror r0, r1, #0", 0x00088000, r0, r1, c);
TESTINST2("ror r0, r1, #1", 0x00088000, r0, r1, c);
TESTINST2("ror r0, r1, #31", 0x00088000, r0, r1, c);
TESTINST2("ror r0, r1, #16", 0x00010000, r0, r1, c);
TESTINST2("ror r0, r1, #17", 0x00010000, r0, r1, c);
TESTINST2("ror r0, r1, #18", 0x00010000, r0, r1, c);
TESTCARRYEND
printf("RORS immediate\n");
TESTCARRY
TESTINST2("rors r0, r1, #0", 0x00088000, r0, r1, c);
TESTINST2("rors r0, r1, #1", 0x00088000, r0, r1, c);
TESTINST2("rors r0, r1, #31", 0x00088000, r0, r1, c);
TESTINST2("rors r0, r1, #16", 0x00010000, r0, r1, c);
TESTINST2("rors r0, r1, #17", 0x00010000, r0, r1, c);
TESTINST2("rors r0, r1, #18", 0x00010000, r0, r1, c);
TESTCARRYEND
printf("shift with barrel shifter\n");
TESTCARRY
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 1, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 31, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 32, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 255, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 256, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
TESTCARRYEND
TESTCARRY
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 1, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 2, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 3, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 4, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 5, r0, r1, r2, r3, c);
TESTCARRYEND
TESTCARRY
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
TESTCARRYEND
TESTCARRY
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
TESTCARRYEND
TESTCARRY
TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
TESTCARRYEND
printf("MUL\n");
TESTINST3("mul r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("mul r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("mul r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
TESTINST3("mul r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
TESTINST3("mul r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
TESTINST3("mul r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
printf("MULS\n");
TESTINST3("muls r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("muls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("muls r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
TESTINST3("muls r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
TESTINST3("muls r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
TESTINST3("muls r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
printf("MLA\n");
TESTINST4("mla r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mla r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mla r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mla r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
printf("MLAS\n");
TESTINST4("mlas r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mlas r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mlas r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mlas r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
printf("MLS\n");
TESTINST4("mls r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
TESTINST4("mls r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mls r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
TESTINST4("mls r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
printf("UMULL\n");
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
printf("SMULL\n");
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
printf("UMLAL\n");
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
printf("SMLAL\n");
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
printf("CLZ\n");
TESTCARRY
TESTINST2("clz r0, r1", 0, r0, r1, c);
TESTINST2("clz r0, r1", 1, r0, r1, c);
TESTINST2("clz r0, r1", 0x10, r0, r1, c);
TESTINST2("clz r0, r1", 0xffffffff, r0, r1, c);
TESTCARRYEND
printf("extend instructions\n");
TESTINST2("uxtb r0, r1", 0, r0, r1, 0);
TESTINST2("uxtb r0, r1", 1, r0, r1, 0);
TESTINST2("uxtb r0, r1", 0xff, r0, r1, 0);
TESTINST2("uxtb r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("sxtb r0, r1", 0, r0, r1, 0);
TESTINST2("sxtb r0, r1", 1, r0, r1, 0);
TESTINST2("sxtb r0, r1", 0xff, r0, r1, 0);
TESTINST2("sxtb r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("uxth r0, r1", 0, r0, r1, 0);
TESTINST2("uxth r0, r1", 1, r0, r1, 0);
TESTINST2("uxth r0, r1", 0xffff, r0, r1, 0);
TESTINST2("uxth r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("sxth r0, r1", 0, r0, r1, 0);
TESTINST2("sxth r0, r1", 1, r0, r1, 0);
TESTINST2("sxth r0, r1", 0x7fff, r0, r1, 0);
TESTINST2("sxth r0, r1", 0xffff, r0, r1, 0);
TESTINST2("sxth r0, r1", 0x10ffff, r0, r1, 0);
TESTINST2("sxth r0, r1", 0x107fff, r0, r1, 0);
TESTINST2("sxth r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("uxtb r0, r1, ror #0", 0x000000ff, r0, r1, 0);
TESTINST2("uxtb r0, r1, ror #8", 0x000000ff, r0, r1, 0);
TESTINST2("uxtb r0, r1, ror #8", 0x0000ff00, r0, r1, 0);
TESTINST2("uxtb r0, r1, ror #16", 0x00ff0000, r0, r1, 0);
TESTINST2("uxtb r0, r1, ror #24", 0xff000000, r0, r1, 0);
TESTINST2("uxtb16 r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("uxtb16 r0, r1, ror #16", 0x0000ffff, r0, r1, 0);
TESTINST2("sxtb16 r0, r1", 0xffffffff, r0, r1, 0);
TESTINST2("sxtb16 r0, r1", 0x00ff00ff, r0, r1, 0);
TESTINST2("sxtb16 r0, r1", 0x007f007f, r0, r1, 0);
printf("------------ BFI ------------\n");
/* bfi rDst, rSrc, #lsb-in-dst, #number-of-bits-to-copy */
TESTINST2("bfi r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfi r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfi r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfi r0, r1, #19, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #20, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #21, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #0, #32", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #1, #31", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #29, #3", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #30, #2", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfi r0, r1, #31, #1", 0xFFFFFFFF, r0, r1, 0);
printf("------------ BFC ------------\n");
/* bfi rDst, #lsb-in-dst, #number-of-bits-to-copy */
TESTINST2("bfc r0, #0, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfc r0, #1, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfc r0, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("bfc r0, #19, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #20, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #21, #11", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #0, #32", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #1, #31", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #29, #3", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #30, #2", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("bfc r0, #31, #1", 0xFFFFFFFF, r0, r1, 0);
printf("------------ SBFX ------------\n");
/* sbfx rDst, rSrc, #lsb, #width */
TESTINST2("sbfx r0, r1, #0, #1", 0x00000000, r0, r1, 0);
TESTINST2("sbfx r0, r1, #0, #1", 0x00000001, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #1", 0x00000000, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #1", 0x00000001, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #1", 0x00000002, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #1", 0x00000003, r0, r1, 0);
TESTINST2("sbfx r0, r1, #0, #2", 0x00000000, r0, r1, 0);
TESTINST2("sbfx r0, r1, #0, #2", 0x00000001, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #2", 0x00000000, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #2", 0x00000001, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #2", 0x00000002, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #2", 0x00000003, r0, r1, 0);
TESTINST2("sbfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("sbfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("sbfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("sbfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
printf("------------ UBFX ------------\n");
/* ubfx rDst, rSrc, #lsb, #width */
TESTINST2("ubfx r0, r1, #0, #1", 0x00000000, r0, r1, 0);
TESTINST2("ubfx r0, r1, #0, #1", 0x00000001, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #1", 0x00000000, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #1", 0x00000001, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #1", 0x00000002, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #1", 0x00000003, r0, r1, 0);
TESTINST2("ubfx r0, r1, #0, #2", 0x00000000, r0, r1, 0);
TESTINST2("ubfx r0, r1, #0, #2", 0x00000001, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #2", 0x00000000, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #2", 0x00000001, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #2", 0x00000002, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #2", 0x00000003, r0, r1, 0);
TESTINST2("ubfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("ubfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("ubfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
TESTINST2("ubfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
printf("------------ SMULL{B,T}{B,T} ------------\n");
/* SMULxx rD, rN, rM */
TESTINST3("smulbb r0, r1, r2", 0x00030000, 0x00040000, r0, r1, r2, 0);
TESTINST3("smulbb r0, r1, r2", 0x00030001, 0x00040002, r0, r1, r2, 0);
TESTINST3("smulbb r0, r1, r2", 0x00038001, 0x00047fff, r0, r1, r2, 0);
TESTINST3("smulbb r0, r1, r2", 0x00037fff, 0x00047fff, r0, r1, r2, 0);
TESTINST3("smulbb r0, r1, r2", 0x0003ffff, 0x0004ffff, r0, r1, r2, 0);
printf("------------ SXTAB ------------\n");
TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
r0, r1, r2, 0);
printf("------------ UXTAB ------------\n");
TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
r0, r1, r2, 0);
TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
r0, r1, r2, 0);
printf("------------ SXTAH ------------\n");
TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
r0, r1, r2, 0);
printf("------------ UXTAH ------------\n");
TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
r0, r1, r2, 0);
TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
r0, r1, r2, 0);
printf("------------ PLD/PLDW (begin) ------------\n");
/* These don't have any effect on the architected state, so,
uh, there's no result values to check. Just _do_ some of
them and check Valgrind's instruction decoder eats them up
without complaining. */
{ int alocal;
printf("pld reg +/- imm12 cases\n");
__asm__ __volatile__( "pld [%0, #128]" : :/*in*/"r"(&alocal) );
__asm__ __volatile__( "pld [%0, #-128]" : :/*in*/"r"(&alocal) );
__asm__ __volatile__( "pld [r15, #-128]" : :/*in*/"r"(&alocal) );
// apparently pldw is v7 only
//__asm__ __volatile__( "pldw [%0, #128]" : :/*in*/"r"(&alocal) );
//__asm__ __volatile__( "pldw [%0, #-128]" : :/*in*/"r"(&alocal) );
//__asm__ __volatile__( "pldw [r15, #128]" : :/*in*/"r"(&alocal) );
printf("pld reg +/- shifted reg cases\n");
__asm__ __volatile__( "pld [%0, %1]" : : /*in*/"r"(&alocal), "r"(0) );
__asm__ __volatile__( "pld [%0, %1, LSL #1]" : : /*in*/"r"(&alocal), "r"(0) );
__asm__ __volatile__( "pld [%0, %1, LSR #1]" : : /*in*/"r"(&alocal), "r"(0) );
__asm__ __volatile__( "pld [%0, %1, ASR #1]" : : /*in*/"r"(&alocal), "r"(0) );
__asm__ __volatile__( "pld [%0, %1, ROR #1]" : : /*in*/"r"(&alocal), "r"(0) );
__asm__ __volatile__( "pld [%0, %1, RRX]" : : /*in*/"r"(&alocal), "r"(0) );
}
printf("------------ PLD/PLDW (done) ------------\n");
printf("------------ RBIT ------------\n");
TESTINST2("rbit r0, r1", 0x00000000, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x80000000, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x00000001, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x31415927, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x14141562, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xabe8391f, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x9028aa80, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xead1fc6d, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x35c98c55, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x534af1eb, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x45511b08, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x90077f71, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xde8ca84b, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xe37a0dda, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xe5b83d4b, r0, r1, 0);
TESTINST2("rbit r0, r1", 0xbb6d14ec, r0, r1, 0);
TESTINST2("rbit r0, r1", 0x68983cc9, r0, r1, 0);
printf("------------ REV ------------\n");
TESTINST2("rev r0, r1", 0x00000000, r0, r1, 0);
TESTINST2("rev r0, r1", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("rev r0, r1", 0x80000000, r0, r1, 0);
TESTINST2("rev r0, r1", 0x00000001, r0, r1, 0);
TESTINST2("rev r0, r1", 0x31415927, r0, r1, 0);
TESTINST2("rev r0, r1", 0x14141562, r0, r1, 0);
TESTINST2("rev r0, r1", 0xabe8391f, r0, r1, 0);
TESTINST2("rev r0, r1", 0x9028aa80, r0, r1, 0);
TESTINST2("rev r0, r1", 0xead1fc6d, r0, r1, 0);
TESTINST2("rev r0, r1", 0x35c98c55, r0, r1, 0);
TESTINST2("rev r0, r1", 0x534af1eb, r0, r1, 0);
TESTINST2("rev r0, r1", 0x45511b08, r0, r1, 0);
TESTINST2("rev r0, r1", 0x90077f71, r0, r1, 0);
TESTINST2("rev r0, r1", 0xde8ca84b, r0, r1, 0);
TESTINST2("rev r0, r1", 0xe37a0dda, r0, r1, 0);
TESTINST2("rev r0, r1", 0xe5b83d4b, r0, r1, 0);
TESTINST2("rev r0, r1", 0xbb6d14ec, r0, r1, 0);
TESTINST2("rev r0, r1", 0x68983cc9, r0, r1, 0);
printf("------------ REV16 ------------\n");
TESTINST2("rev16 r0, r1", 0x00000000, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x80000000, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x00000001, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x31415927, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x14141562, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xabe8391f, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x9028aa80, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xead1fc6d, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x35c98c55, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x534af1eb, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x45511b08, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x90077f71, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xde8ca84b, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xe37a0dda, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xe5b83d4b, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0xbb6d14ec, r0, r1, 0);
TESTINST2("rev16 r0, r1", 0x68983cc9, r0, r1, 0);
printf("------------ REVSH ------------\n");
TESTINST2("revsh r0, r1", 0x00000000, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xFFFFFFFF, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x80000000, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x00000001, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x31415927, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x14141562, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xabe8391f, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x9028aa80, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xead1fc6d, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x35c98c55, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x534af1eb, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x45511b08, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x90077f71, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xde8ca84b, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xe37a0dda, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xe5b83d4b, r0, r1, 0);
TESTINST2("revsh r0, r1", 0xbb6d14ec, r0, r1, 0);
TESTINST2("revsh r0, r1", 0x68983cc9, r0, r1, 0);
printf("------------ NOP (begin) ------------\n");
printf("nop\n");
__asm__ __volatile__("nop" ::: "memory","cc");
printf("nopeq\n");
__asm__ __volatile__("nopeq" ::: "memory","cc");
printf("nopne\n");
__asm__ __volatile__("nopne" ::: "memory","cc");
printf("------------ NOP (end) ------------\n");
printf("------------ SMMUL ------------\n");
TESTINST3("smmul r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0xe444dc25, 0xd5eef620, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0x06ea9b2a, 0xa2108661, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0x448f3a5f, 0x17aecf57, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0x4b0c2337, 0xffa63d6c, r0, r1, r2, 0);
TESTINST3("smmul r0, r1, r2", 0xf91d5f56, 0x088bc0f9, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0, 0, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0xe444dc25, 0xd5eef620, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0x06ea9b2a, 0xa2108661, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0x448f3a5f, 0x17aecf57, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0x4b0c2337, 0xffa63d6c, r0, r1, r2, 0);
TESTINST3("smmulr r0, r1, r2", 0xf91d5f56, 0x088bc0f9, r0, r1, r2, 0);
printf("------------ UMAAL ------------\n");
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0x27182846, 0x31415927, 0x14141356, 0x1773250A,
r0, r1, r2, r3, 0);
TESTINST4_2OUT("umaal r0, r1, r2, r3", 0x01415927, 0x74141356, 0x5773250A, 0xA7182846,
r0, r1, r2, r3, 1);
printf("----------------- SMMLA{R} ----------------- \n");
TESTINST4("smmla r0, r1, r2, r3",
0x80008000, 0x80008000, 0x00000000, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x7fff7fff, 0x00000000, 0x00000000, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x7fff7fff, 0x00010001, 0x00000001, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x80008000, 0xffffffff, 0x0000001f, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x00640064, 0x00030003, 0x00000020, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xffffffff, 0xfffc0001, 0x000000ff, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xfff70fff, 0x00030003, 0x00000100, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xb8035b5b, 0xce0ce1ed, 0x5f986e68, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x35232047, 0x146275d8, 0xaae3433f, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xe7aa57b4, 0x1584bd74, 0x2c07a5b4, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x32fa0095, 0x36f26261, 0x89d2ef86, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x8ed8287c, 0x02c90120, 0xd4b64d54, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xc53aaba9, 0x29300837, 0x0b02c58a, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x216158cb, 0x57a50a01, 0xb0d20777, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x3e2e1bd7, 0x3cd6cd94, 0x7e376198, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xd5fe2dc4, 0xdd914bf7, 0xd5dc5407, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xf87b961e, 0x1d66879f, 0xf2b64835, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xd65db979, 0xc61b323b, 0xae930a1a, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x5ef1f1a8, 0xbf73f0a5, 0x2fb714c9, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x1ffe53d9, 0x815bb75b, 0xa3268abe, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xed2cbf78, 0xc6ffabb6, 0xef9e9fd9, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xeaa652c7, 0x137741f4, 0x3dba1164, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x3ada0280, 0x71fbde8b, 0xdba5bd25, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xda4ba05b, 0x90f9833d, 0x884c0ad8, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xc00b821a, 0x7fa1d5a6, 0x9a4ff1b8, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xe1bb8606, 0x58293969, 0x81616d13, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x51f31d95, 0xa3cfd624, 0x6077fb1f, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x0849a0c2, 0x0872f25a, 0x40b094e2, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x17913309, 0xf1e03d7e, 0x91edc21d, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x5388b5cd, 0x86582032, 0x6034078d, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x181c436b, 0x5de41558, 0xccfa1c7e, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x23ba1b46, 0x4437983c, 0x48d06549, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xa9085781, 0xc6b4ac58, 0xb2aead21, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xc2bdf597, 0xdde1e6a4, 0x852e3a72, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x157b0dea, 0xf0d5ff94, 0xe7b87e39, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x3edad6b6, 0x82aceb7a, 0x0557c6fc, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x6cc9bfa8, 0x7f808c15, 0x81874a02, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x6b1422c7, 0x33921b00, 0x3ccad3f7, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xd7ce1909, 0x3e435701, 0x85fbf196, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xb4e16b6e, 0x6e13680a, 0x89436f88, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x44858efc, 0x9002bc30, 0x390d2c2f, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xbea121ab, 0x953ff6ec, 0x80657c40, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x6ffed89f, 0x3e8c49b7, 0x11bd07d1, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x7795635d, 0x5e6e32dd, 0xe4999bf2, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xec0c2f30, 0x5736ed46, 0x231348c0, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x4f9ddd1b, 0x95bca5d8, 0x5765b203, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xc1553709, 0x0112b30a, 0x69ec0212, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x74bd0223, 0x03fa9bb5, 0x899d9192, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xf52e9fbf, 0xb4c510a7, 0x7fcbe5a9, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x64a365ef, 0x2dd01366, 0xf7b0b13e, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x5e4b1cbf, 0x44de5ca9, 0x464a21cc, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x299da970, 0xe8108f1b, 0xf5818cfb, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xcd90d604, 0xaa5e9444, 0x8217b7df, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xe60743c3, 0x7acb4de3, 0x73c29060, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x868e7c7d, 0x5f77532e, 0x1d133d3d, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0x4e5e0760, 0x8f6d3264, 0x21ba2fb3, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xde99ac2f, 0x0be36f70, 0xeda5110c, r0, r1, r2, r3, 0);
TESTINST4("smmla r0, r1, r2, r3",
0xc57243b7, 0xcf1e4487, 0xf20fb90f, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x80008000, 0x80008000, 0x00000000, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x7fff7fff, 0x00000000, 0x00000000, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x7fff7fff, 0x00010001, 0x00000001, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x80008000, 0xffffffff, 0x0000001f, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x00640064, 0x00030003, 0x00000020, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xffffffff, 0xfffc0001, 0x000000ff, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xfff70fff, 0x00030003, 0x00000100, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xb8035b5b, 0xce0ce1ed, 0x5f986e68, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x35232047, 0x146275d8, 0xaae3433f, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xe7aa57b4, 0x1584bd74, 0x2c07a5b4, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x32fa0095, 0x36f26261, 0x89d2ef86, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x8ed8287c, 0x02c90120, 0xd4b64d54, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xc53aaba9, 0x29300837, 0x0b02c58a, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x216158cb, 0x57a50a01, 0xb0d20777, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x3e2e1bd7, 0x3cd6cd94, 0x7e376198, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xd5fe2dc4, 0xdd914bf7, 0xd5dc5407, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xf87b961e, 0x1d66879f, 0xf2b64835, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xd65db979, 0xc61b323b, 0xae930a1a, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x5ef1f1a8, 0xbf73f0a5, 0x2fb714c9, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x1ffe53d9, 0x815bb75b, 0xa3268abe, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xed2cbf78, 0xc6ffabb6, 0xef9e9fd9, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xeaa652c7, 0x137741f4, 0x3dba1164, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x3ada0280, 0x71fbde8b, 0xdba5bd25, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xda4ba05b, 0x90f9833d, 0x884c0ad8, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xc00b821a, 0x7fa1d5a6, 0x9a4ff1b8, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xe1bb8606, 0x58293969, 0x81616d13, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x51f31d95, 0xa3cfd624, 0x6077fb1f, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x0849a0c2, 0x0872f25a, 0x40b094e2, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x17913309, 0xf1e03d7e, 0x91edc21d, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x5388b5cd, 0x86582032, 0x6034078d, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x181c436b, 0x5de41558, 0xccfa1c7e, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x23ba1b46, 0x4437983c, 0x48d06549, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xa9085781, 0xc6b4ac58, 0xb2aead21, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xc2bdf597, 0xdde1e6a4, 0x852e3a72, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x157b0dea, 0xf0d5ff94, 0xe7b87e39, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x3edad6b6, 0x82aceb7a, 0x0557c6fc, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x6cc9bfa8, 0x7f808c15, 0x81874a02, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x6b1422c7, 0x33921b00, 0x3ccad3f7, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xd7ce1909, 0x3e435701, 0x85fbf196, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xb4e16b6e, 0x6e13680a, 0x89436f88, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x44858efc, 0x9002bc30, 0x390d2c2f, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xbea121ab, 0x953ff6ec, 0x80657c40, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x6ffed89f, 0x3e8c49b7, 0x11bd07d1, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x7795635d, 0x5e6e32dd, 0xe4999bf2, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xec0c2f30, 0x5736ed46, 0x231348c0, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x4f9ddd1b, 0x95bca5d8, 0x5765b203, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xc1553709, 0x0112b30a, 0x69ec0212, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x74bd0223, 0x03fa9bb5, 0x899d9192, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xf52e9fbf, 0xb4c510a7, 0x7fcbe5a9, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x64a365ef, 0x2dd01366, 0xf7b0b13e, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x5e4b1cbf, 0x44de5ca9, 0x464a21cc, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x299da970, 0xe8108f1b, 0xf5818cfb, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xcd90d604, 0xaa5e9444, 0x8217b7df, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xe60743c3, 0x7acb4de3, 0x73c29060, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x868e7c7d, 0x5f77532e, 0x1d133d3d, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0x4e5e0760, 0x8f6d3264, 0x21ba2fb3, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xde99ac2f, 0x0be36f70, 0xeda5110c, r0, r1, r2, r3, 0);
TESTINST4("smmlar r0, r1, r2, r3",
0xc57243b7, 0xcf1e4487, 0xf20fb90f, r0, r1, r2, r3, 0);
return 0;
}