Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * arch/arm/probes/kprobes/test-thumb.c
0004  *
0005  * Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>.
0006  */
0007 
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010 #include <asm/opcodes.h>
0011 #include <asm/probes.h>
0012 
0013 #include "test-core.h"
0014 
0015 
0016 #define TEST_ISA "16"
0017 
0018 #define DONT_TEST_IN_ITBLOCK(tests)         \
0019     kprobe_test_flags |= TEST_FLAG_NO_ITBLOCK;  \
0020     tests                       \
0021     kprobe_test_flags &= ~TEST_FLAG_NO_ITBLOCK;
0022 
0023 #define CONDITION_INSTRUCTIONS(cc_pos, tests)       \
0024     kprobe_test_cc_position = cc_pos;       \
0025     DONT_TEST_IN_ITBLOCK(tests)         \
0026     kprobe_test_cc_position = 0;
0027 
0028 #define TEST_ITBLOCK(code)              \
0029     kprobe_test_flags |= TEST_FLAG_FULL_ITBLOCK;    \
0030     TESTCASE_START(code)                \
0031     TEST_ARG_END("")                \
0032     "50:    nop         \n\t"       \
0033     "1: "code"          \n\t"       \
0034     "   mov r1, #0x11       \n\t"       \
0035     "   mov r2, #0x22       \n\t"       \
0036     "   mov r3, #0x33       \n\t"       \
0037     "2: nop         \n\t"       \
0038     TESTCASE_END                    \
0039     kprobe_test_flags &= ~TEST_FLAG_FULL_ITBLOCK;
0040 
0041 #define TEST_THUMB_TO_ARM_INTERWORK_P(code1, reg, val, code2)   \
0042     TESTCASE_START(code1 #reg code2)            \
0043     TEST_ARG_PTR(reg, val)                  \
0044     TEST_ARG_REG(14, 99f+1)                 \
0045     TEST_ARG_MEM(15, 3f)                    \
0046     TEST_ARG_END("")                    \
0047     "   nop         \n\t" /* To align 1f */ \
0048     "50:    nop         \n\t"           \
0049     "1: "code1 #reg code2"  \n\t"           \
0050     "   bx  lr      \n\t"           \
0051     ".arm               \n\t"           \
0052     "3: adr lr, 2f+1    \n\t"           \
0053     "   bx  lr      \n\t"           \
0054     ".thumb             \n\t"           \
0055     "2: nop         \n\t"           \
0056     TESTCASE_END
0057 
0058 
0059 void kprobe_thumb16_test_cases(void)
0060 {
0061     kprobe_test_flags = TEST_FLAG_NARROW_INSTR;
0062 
0063     TEST_GROUP("Shift (immediate), add, subtract, move, and compare")
0064 
0065     TEST_R(    "lsls    r7, r",0,VAL1,", #5")
0066     TEST_R(    "lsls    r0, r",7,VAL2,", #11")
0067     TEST_R(    "lsrs    r7, r",0,VAL1,", #5")
0068     TEST_R(    "lsrs    r0, r",7,VAL2,", #11")
0069     TEST_R(    "asrs    r7, r",0,VAL1,", #5")
0070     TEST_R(    "asrs    r0, r",7,VAL2,", #11")
0071     TEST_RR(   "adds    r2, r",0,VAL1,", r",7,VAL2,"")
0072     TEST_RR(   "adds    r5, r",7,VAL2,", r",0,VAL2,"")
0073     TEST_RR(   "subs    r2, r",0,VAL1,", r",7,VAL2,"")
0074     TEST_RR(   "subs    r5, r",7,VAL2,", r",0,VAL2,"")
0075     TEST_R(    "adds    r7, r",0,VAL1,", #5")
0076     TEST_R(    "adds    r0, r",7,VAL2,", #2")
0077     TEST_R(    "subs    r7, r",0,VAL1,", #5")
0078     TEST_R(    "subs    r0, r",7,VAL2,", #2")
0079     TEST(      "movs.n  r0, #0x5f")
0080     TEST(      "movs.n  r7, #0xa0")
0081     TEST_R(    "cmp.n   r",0,0x5e, ", #0x5f")
0082     TEST_R(    "cmp.n   r",5,0x15f,", #0x5f")
0083     TEST_R(    "cmp.n   r",7,0xa0, ", #0xa0")
0084     TEST_R(    "adds.n  r",0,VAL1,", #0x5f")
0085     TEST_R(    "adds.n  r",7,VAL2,", #0xa0")
0086     TEST_R(    "subs.n  r",0,VAL1,", #0x5f")
0087     TEST_R(    "subs.n  r",7,VAL2,", #0xa0")
0088 
0089     TEST_GROUP("16-bit Thumb data-processing instructions")
0090 
0091 #define DATA_PROCESSING16(op,val)           \
0092     TEST_RR(   op"  r",0,VAL1,", r",7,val,"")   \
0093     TEST_RR(   op"  r",7,VAL2,", r",0,val,"")
0094 
0095     DATA_PROCESSING16("ands",0xf00f00ff)
0096     DATA_PROCESSING16("eors",0xf00f00ff)
0097     DATA_PROCESSING16("lsls",11)
0098     DATA_PROCESSING16("lsrs",11)
0099     DATA_PROCESSING16("asrs",11)
0100     DATA_PROCESSING16("adcs",VAL2)
0101     DATA_PROCESSING16("sbcs",VAL2)
0102     DATA_PROCESSING16("rors",11)
0103     DATA_PROCESSING16("tst",0xf00f00ff)
0104     TEST_R("rsbs    r",0,VAL1,", #0")
0105     TEST_R("rsbs    r",7,VAL2,", #0")
0106     DATA_PROCESSING16("cmp",0xf00f00ff)
0107     DATA_PROCESSING16("cmn",0xf00f00ff)
0108     DATA_PROCESSING16("orrs",0xf00f00ff)
0109     DATA_PROCESSING16("muls",VAL2)
0110     DATA_PROCESSING16("bics",0xf00f00ff)
0111     DATA_PROCESSING16("mvns",VAL2)
0112 
0113     TEST_GROUP("Special data instructions and branch and exchange")
0114 
0115     TEST_RR(  "add  r",0, VAL1,", r",7,VAL2,"")
0116     TEST_RR(  "add  r",3, VAL2,", r",8,VAL3,"")
0117     TEST_RR(  "add  r",8, VAL3,", r",0,VAL1,"")
0118     TEST_R(   "add  sp"        ", r",8,-8,  "")
0119     TEST_R(   "add  r",14,VAL1,", pc")
0120     TEST_BF_R("add  pc"        ", r",0,2f-1f-8,"")
0121     TEST_UNSUPPORTED(__inst_thumb16(0x44ff) "   @ add pc, pc")
0122 
0123     TEST_RR(  "cmp  r",3,VAL1,", r",8,VAL2,"")
0124     TEST_RR(  "cmp  r",8,VAL2,", r",0,VAL1,"")
0125     TEST_R(   "cmp  sp"       ", r",8,-8,  "")
0126 
0127     TEST_R(   "mov  r0, r",7,VAL2,"")
0128     TEST_R(   "mov  r3, r",8,VAL3,"")
0129     TEST_R(   "mov  r8, r",0,VAL1,"")
0130     TEST_P(   "mov  sp, r",8,-8,  "")
0131     TEST(     "mov  lr, pc")
0132     TEST_BF_R("mov  pc, r",0,2f,  "")
0133 
0134     TEST_BF_R("bx   r",0, 2f+1,"")
0135     TEST_BF_R("bx   r",14,2f+1,"")
0136     TESTCASE_START("bx  pc")
0137         TEST_ARG_REG(14, 99f+1)
0138         TEST_ARG_END("")
0139         "   nop         \n\t" /* To align the bx pc*/
0140         "50:    nop         \n\t"
0141         "1: bx  pc      \n\t"
0142         "   bx  lr      \n\t"
0143         ".arm               \n\t"
0144         "   adr lr, 2f+1    \n\t"
0145         "   bx  lr      \n\t"
0146         ".thumb             \n\t"
0147         "2: nop         \n\t"
0148     TESTCASE_END
0149 
0150     TEST_BF_R("blx  r",0, 2f+1,"")
0151     TEST_BB_R("blx  r",14,2f+1,"")
0152     TEST_UNSUPPORTED(__inst_thumb16(0x47f8) "   @ blx pc")
0153 
0154     TEST_GROUP("Load from Literal Pool")
0155 
0156     TEST_X( "ldr    r0, 3f",
0157         ".align                 \n\t"
0158         "3: .word   "__stringify(VAL1))
0159     TEST_X( "ldr    r7, 3f",
0160         ".space 128             \n\t"
0161         ".align                 \n\t"
0162         "3: .word   "__stringify(VAL2))
0163 
0164     TEST_GROUP("16-bit Thumb Load/store instructions")
0165 
0166     TEST_RPR("str   r",0, VAL1,", [r",1, 24,", r",2,  48,"]")
0167     TEST_RPR("str   r",7, VAL2,", [r",6, 24,", r",5,  48,"]")
0168     TEST_RPR("strh  r",0, VAL1,", [r",1, 24,", r",2,  48,"]")
0169     TEST_RPR("strh  r",7, VAL2,", [r",6, 24,", r",5,  48,"]")
0170     TEST_RPR("strb  r",0, VAL1,", [r",1, 24,", r",2,  48,"]")
0171     TEST_RPR("strb  r",7, VAL2,", [r",6, 24,", r",5,  48,"]")
0172     TEST_PR( "ldrsb r0, [r",1, 24,", r",2,  48,"]")
0173     TEST_PR( "ldrsb r7, [r",6, 24,", r",5,  50,"]")
0174     TEST_PR( "ldr   r0, [r",1, 24,", r",2,  48,"]")
0175     TEST_PR( "ldr   r7, [r",6, 24,", r",5,  48,"]")
0176     TEST_PR( "ldrh  r0, [r",1, 24,", r",2,  48,"]")
0177     TEST_PR( "ldrh  r7, [r",6, 24,", r",5,  50,"]")
0178     TEST_PR( "ldrb  r0, [r",1, 24,", r",2,  48,"]")
0179     TEST_PR( "ldrb  r7, [r",6, 24,", r",5,  50,"]")
0180     TEST_PR( "ldrsh r0, [r",1, 24,", r",2,  48,"]")
0181     TEST_PR( "ldrsh r7, [r",6, 24,", r",5,  50,"]")
0182 
0183     TEST_RP("str    r",0, VAL1,", [r",1, 24,", #120]")
0184     TEST_RP("str    r",7, VAL2,", [r",6, 24,", #120]")
0185     TEST_P( "ldr    r0, [r",1, 24,", #120]")
0186     TEST_P( "ldr    r7, [r",6, 24,", #120]")
0187     TEST_RP("strb   r",0, VAL1,", [r",1, 24,", #30]")
0188     TEST_RP("strb   r",7, VAL2,", [r",6, 24,", #30]")
0189     TEST_P( "ldrb   r0, [r",1, 24,", #30]")
0190     TEST_P( "ldrb   r7, [r",6, 24,", #30]")
0191     TEST_RP("strh   r",0, VAL1,", [r",1, 24,", #60]")
0192     TEST_RP("strh   r",7, VAL2,", [r",6, 24,", #60]")
0193     TEST_P( "ldrh   r0, [r",1, 24,", #60]")
0194     TEST_P( "ldrh   r7, [r",6, 24,", #60]")
0195 
0196     TEST_R( "str    r",0, VAL1,", [sp, #0]")
0197     TEST_R( "str    r",7, VAL2,", [sp, #160]")
0198     TEST(   "ldr    r0, [sp, #0]")
0199     TEST(   "ldr    r7, [sp, #160]")
0200 
0201     TEST_RP("str    r",0, VAL1,", [r",0, 24,"]")
0202     TEST_P( "ldr    r0, [r",0, 24,"]")
0203 
0204     TEST_GROUP("Generate PC-/SP-relative address")
0205 
0206     TEST("add   r0, pc, #4")
0207     TEST("add   r7, pc, #1020")
0208     TEST("add   r0, sp, #4")
0209     TEST("add   r7, sp, #1020")
0210 
0211     TEST_GROUP("Miscellaneous 16-bit instructions")
0212 
0213     TEST_UNSUPPORTED( "cpsie    i")
0214     TEST_UNSUPPORTED( "cpsid    i")
0215     TEST_UNSUPPORTED( "setend   le")
0216     TEST_UNSUPPORTED( "setend   be")
0217 
0218     TEST("add   sp, #"__stringify(TEST_MEMORY_SIZE)) /* Assumes TEST_MEMORY_SIZE < 0x400 */
0219     TEST("sub   sp, #0x7f*4")
0220 
0221 DONT_TEST_IN_ITBLOCK(
0222     TEST_BF_R(  "cbnz   r",0,0, ", 2f")
0223     TEST_BF_R(  "cbz    r",2,-1,", 2f")
0224     TEST_BF_RX( "cbnz   r",4,1, ", 2f", SPACE_0x20)
0225     TEST_BF_RX( "cbz    r",7,0, ", 2f", SPACE_0x40)
0226 )
0227     TEST_R("sxth    r0, r",7, HH1,"")
0228     TEST_R("sxth    r7, r",0, HH2,"")
0229     TEST_R("sxtb    r0, r",7, HH1,"")
0230     TEST_R("sxtb    r7, r",0, HH2,"")
0231     TEST_R("uxth    r0, r",7, HH1,"")
0232     TEST_R("uxth    r7, r",0, HH2,"")
0233     TEST_R("uxtb    r0, r",7, HH1,"")
0234     TEST_R("uxtb    r7, r",0, HH2,"")
0235     TEST_R("rev r0, r",7, VAL1,"")
0236     TEST_R("rev r7, r",0, VAL2,"")
0237     TEST_R("rev16   r0, r",7, VAL1,"")
0238     TEST_R("rev16   r7, r",0, VAL2,"")
0239     TEST_UNSUPPORTED(__inst_thumb16(0xba80) "")
0240     TEST_UNSUPPORTED(__inst_thumb16(0xbabf) "")
0241     TEST_R("revsh   r0, r",7, VAL1,"")
0242     TEST_R("revsh   r7, r",0, VAL2,"")
0243 
0244 #define TEST_POPPC(code, offset)    \
0245     TESTCASE_START(code)        \
0246     TEST_ARG_PTR(13, offset)    \
0247     TEST_ARG_END("")        \
0248     TEST_BRANCH_F(code)     \
0249     TESTCASE_END
0250 
0251     TEST("push  {r0}")
0252     TEST("push  {r7}")
0253     TEST("push  {r14}")
0254     TEST("push  {r0-r7,r14}")
0255     TEST("push  {r0,r2,r4,r6,r14}")
0256     TEST("push  {r1,r3,r5,r7}")
0257     TEST("pop   {r0}")
0258     TEST("pop   {r7}")
0259     TEST("pop   {r0,r2,r4,r6}")
0260     TEST_POPPC("pop {pc}",15*4)
0261     TEST_POPPC("pop {r0-r7,pc}",7*4)
0262     TEST_POPPC("pop {r1,r3,r5,r7,pc}",11*4)
0263     TEST_THUMB_TO_ARM_INTERWORK_P("pop  {pc}    @ ",13,15*4,"")
0264     TEST_THUMB_TO_ARM_INTERWORK_P("pop  {r0-r7,pc}  @ ",13,7*4,"")
0265 
0266     TEST_UNSUPPORTED("bkpt.n    0")
0267     TEST_UNSUPPORTED("bkpt.n    255")
0268 
0269     TEST_SUPPORTED("yield")
0270     TEST("sev")
0271     TEST("nop")
0272     TEST("wfi")
0273     TEST_SUPPORTED("wfe")
0274     TEST_UNSUPPORTED(__inst_thumb16(0xbf50) "") /* Unassigned hints */
0275     TEST_UNSUPPORTED(__inst_thumb16(0xbff0) "") /* Unassigned hints */
0276 
0277 #define TEST_IT(code, code2)            \
0278     TESTCASE_START(code)            \
0279     TEST_ARG_END("")            \
0280     "50:    nop         \n\t"   \
0281     "1: "code"          \n\t"   \
0282     "   "code2"         \n\t"   \
0283     "2: nop         \n\t"   \
0284     TESTCASE_END
0285 
0286 DONT_TEST_IN_ITBLOCK(
0287     TEST_IT("it eq","moveq r0,#0")
0288     TEST_IT("it vc","movvc r0,#0")
0289     TEST_IT("it le","movle r0,#0")
0290     TEST_IT("ite    eq","moveq r0,#0\n\t  movne r1,#1")
0291     TEST_IT("itet   vc","movvc r0,#0\n\t  movvs r1,#1\n\t  movvc r2,#2")
0292     TEST_IT("itete  le","movle r0,#0\n\t  movgt r1,#1\n\t  movle r2,#2\n\t  movgt r3,#3")
0293     TEST_IT("itttt  le","movle r0,#0\n\t  movle r1,#1\n\t  movle r2,#2\n\t  movle r3,#3")
0294     TEST_IT("iteee  le","movle r0,#0\n\t  movgt r1,#1\n\t  movgt r2,#2\n\t  movgt r3,#3")
0295 )
0296 
0297     TEST_GROUP("Load and store multiple")
0298 
0299     TEST_P("ldmia   r",4, 16*4,"!, {r0,r7}")
0300     TEST_P("ldmia   r",7, 16*4,"!, {r0-r6}")
0301     TEST_P("stmia   r",4, 16*4,"!, {r0,r7}")
0302     TEST_P("stmia   r",0, 16*4,"!, {r0-r7}")
0303 
0304     TEST_GROUP("Conditional branch and Supervisor Call instructions")
0305 
0306 CONDITION_INSTRUCTIONS(8,
0307     TEST_BF("beq    2f")
0308     TEST_BB("bne    2b")
0309     TEST_BF("bgt    2f")
0310     TEST_BB("blt    2b")
0311 )
0312     TEST_UNSUPPORTED(__inst_thumb16(0xde00) "")
0313     TEST_UNSUPPORTED(__inst_thumb16(0xdeff) "")
0314     TEST_UNSUPPORTED("svc   #0x00")
0315     TEST_UNSUPPORTED("svc   #0xff")
0316 
0317     TEST_GROUP("Unconditional branch")
0318 
0319     TEST_BF(  "b    2f")
0320     TEST_BB(  "b    2b")
0321     TEST_BF_X("b    2f", SPACE_0x400)
0322     TEST_BB_X("b    2b", SPACE_0x400)
0323 
0324     TEST_GROUP("Testing instructions in IT blocks")
0325 
0326     TEST_ITBLOCK("subs.n r0, r0")
0327 
0328     verbose("\n");
0329 }
0330 
0331 
0332 void kprobe_thumb32_test_cases(void)
0333 {
0334     kprobe_test_flags = 0;
0335 
0336     TEST_GROUP("Load/store multiple")
0337 
0338     TEST_UNSUPPORTED("rfedb sp")
0339     TEST_UNSUPPORTED("rfeia sp")
0340     TEST_UNSUPPORTED("rfedb sp!")
0341     TEST_UNSUPPORTED("rfeia sp!")
0342 
0343     TEST_P(   "stmia    r",0, 16*4,", {r0,r8}")
0344     TEST_P(   "stmia    r",4, 16*4,", {r0-r12,r14}")
0345     TEST_P(   "stmia    r",7, 16*4,"!, {r8-r12,r14}")
0346     TEST_P(   "stmia    r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
0347 
0348     TEST_P(   "ldmia    r",0, 16*4,", {r0,r8}")
0349     TEST_P(   "ldmia    r",4, 0,   ", {r0-r12,r14}")
0350     TEST_BF_P("ldmia    r",5, 8*4, "!, {r6-r12,r15}")
0351     TEST_P(   "ldmia    r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
0352     TEST_BF_P("ldmia    r",14,14*4,"!, {r4,pc}")
0353 
0354     TEST_P(   "stmdb    r",0, 16*4,", {r0,r8}")
0355     TEST_P(   "stmdb    r",4, 16*4,", {r0-r12,r14}")
0356     TEST_P(   "stmdb    r",5, 16*4,"!, {r8-r12,r14}")
0357     TEST_P(   "stmdb    r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
0358 
0359     TEST_P(   "ldmdb    r",0, 16*4,", {r0,r8}")
0360     TEST_P(   "ldmdb    r",4, 16*4,", {r0-r12,r14}")
0361     TEST_BF_P("ldmdb    r",5, 16*4,"!, {r6-r12,r15}")
0362     TEST_P(   "ldmdb    r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
0363     TEST_BF_P("ldmdb    r",14,16*4,"!, {r4,pc}")
0364 
0365     TEST_P(   "stmdb    r",13,16*4,"!, {r3-r12,lr}")
0366     TEST_P(   "stmdb    r",13,16*4,"!, {r3-r12}")
0367     TEST_P(   "stmdb    r",2, 16*4,", {r3-r12,lr}")
0368     TEST_P(   "stmdb    r",13,16*4,"!, {r2-r12,lr}")
0369     TEST_P(   "stmdb    r",0, 16*4,", {r0-r12}")
0370     TEST_P(   "stmdb    r",0, 16*4,", {r0-r12,lr}")
0371 
0372     TEST_BF_P("ldmia    r",13,5*4, "!, {r3-r12,pc}")
0373     TEST_P(   "ldmia    r",13,5*4, "!, {r3-r12}")
0374     TEST_BF_P("ldmia    r",2, 5*4, "!, {r3-r12,pc}")
0375     TEST_BF_P("ldmia    r",13,4*4, "!, {r2-r12,pc}")
0376     TEST_P(   "ldmia    r",0, 16*4,", {r0-r12}")
0377     TEST_P(   "ldmia    r",0, 16*4,", {r0-r12,lr}")
0378 
0379     TEST_THUMB_TO_ARM_INTERWORK_P("ldmia    r",0,14*4,", {r12,pc}")
0380     TEST_THUMB_TO_ARM_INTERWORK_P("ldmia    r",13,2*4,", {r0-r12,pc}")
0381 
0382     TEST_UNSUPPORTED(__inst_thumb32(0xe88f0101) "   @ stmia pc, {r0,r8}")
0383     TEST_UNSUPPORTED(__inst_thumb32(0xe92f5f00) "   @ stmdb pc!, {r8-r12,r14}")
0384     TEST_UNSUPPORTED(__inst_thumb32(0xe8bdc000) "   @ ldmia r13!, {r14,pc}")
0385     TEST_UNSUPPORTED(__inst_thumb32(0xe93ec000) "   @ ldmdb r14!, {r14,pc}")
0386     TEST_UNSUPPORTED(__inst_thumb32(0xe8a73f00) "   @ stmia r7!, {r8-r12,sp}")
0387     TEST_UNSUPPORTED(__inst_thumb32(0xe8a79f00) "   @ stmia r7!, {r8-r12,pc}")
0388     TEST_UNSUPPORTED(__inst_thumb32(0xe93e2010) "   @ ldmdb r14!, {r4,sp}")
0389 
0390     TEST_GROUP("Load/store double or exclusive, table branch")
0391 
0392     TEST_P(  "ldrd  r0, r1, [r",1, 24,", #-16]")
0393     TEST(    "ldrd  r12, r14, [sp, #16]")
0394     TEST_P(  "ldrd  r1, r0, [r",7, 24,", #-16]!")
0395     TEST(    "ldrd  r14, r12, [sp, #16]!")
0396     TEST_P(  "ldrd  r1, r0, [r",7, 24,"], #16")
0397     TEST(    "ldrd  r7, r8, [sp], #-16")
0398 
0399     TEST_X( "ldrd   r12, r14, 3f",
0400         ".align 3               \n\t"
0401         "3: .word   "__stringify(VAL1)" \n\t"
0402         "   .word   "__stringify(VAL2))
0403 
0404     TEST_UNSUPPORTED(__inst_thumb32(0xe9ffec04) "   @ ldrd  r14, r12, [pc, #16]!")
0405     TEST_UNSUPPORTED(__inst_thumb32(0xe8ffec04) "   @ ldrd  r14, r12, [pc], #16")
0406     TEST_UNSUPPORTED(__inst_thumb32(0xe9d4d800) "   @ ldrd  sp, r8, [r4]")
0407     TEST_UNSUPPORTED(__inst_thumb32(0xe9d4f800) "   @ ldrd  pc, r8, [r4]")
0408     TEST_UNSUPPORTED(__inst_thumb32(0xe9d47d00) "   @ ldrd  r7, sp, [r4]")
0409     TEST_UNSUPPORTED(__inst_thumb32(0xe9d47f00) "   @ ldrd  r7, pc, [r4]")
0410 
0411     TEST_RRP("strd  r",0, VAL1,", r",1, VAL2,", [r",1, 24,", #-16]")
0412     TEST_RR( "strd  r",12,VAL2,", r",14,VAL1,", [sp, #16]")
0413     TEST_RRP("strd  r",1, VAL1,", r",0, VAL2,", [r",7, 24,", #-16]!")
0414     TEST_RR( "strd  r",14,VAL2,", r",12,VAL1,", [sp, #16]!")
0415     TEST_RRP("strd  r",1, VAL1,", r",0, VAL2,", [r",7, 24,"], #16")
0416     TEST_RR( "strd  r",7, VAL2,", r",8, VAL1,", [sp], #-16")
0417     TEST_RRP("strd  r",6, VAL1,", r",7, VAL2,", [r",13, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
0418     TEST_UNSUPPORTED("strd r6, r7, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!")
0419     TEST_RRP("strd  r",4, VAL1,", r",5, VAL2,", [r",14, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!")
0420     TEST_UNSUPPORTED(__inst_thumb32(0xe9efec04) "   @ strd  r14, r12, [pc, #16]!")
0421     TEST_UNSUPPORTED(__inst_thumb32(0xe8efec04) "   @ strd  r14, r12, [pc], #16")
0422 
0423     TEST_RX("tbb    [pc, r",0, (9f-(1f+4)),"]",
0424         "9:         \n\t"
0425         ".byte  (2f-1b-4)>>1    \n\t"
0426         ".byte  (3f-1b-4)>>1    \n\t"
0427         "3: mvn r0, r0  \n\t"
0428         "2: nop     \n\t")
0429 
0430     TEST_RX("tbb    [pc, r",4, (9f-(1f+4)+1),"]",
0431         "9:         \n\t"
0432         ".byte  (2f-1b-4)>>1    \n\t"
0433         ".byte  (3f-1b-4)>>1    \n\t"
0434         "3: mvn r0, r0  \n\t"
0435         "2: nop     \n\t")
0436 
0437     TEST_RRX("tbb   [r",1,9f,", r",2,0,"]",
0438         "9:         \n\t"
0439         ".byte  (2f-1b-4)>>1    \n\t"
0440         ".byte  (3f-1b-4)>>1    \n\t"
0441         "3: mvn r0, r0  \n\t"
0442         "2: nop     \n\t")
0443 
0444     TEST_RX("tbh    [pc, r",7, (9f-(1f+4))>>1,", lsl #1]",
0445         "9:         \n\t"
0446         ".short (2f-1b-4)>>1    \n\t"
0447         ".short (3f-1b-4)>>1    \n\t"
0448         "3: mvn r0, r0  \n\t"
0449         "2: nop     \n\t")
0450 
0451     TEST_RX("tbh    [pc, r",12, ((9f-(1f+4))>>1)+1,", lsl #1]",
0452         "9:         \n\t"
0453         ".short (2f-1b-4)>>1    \n\t"
0454         ".short (3f-1b-4)>>1    \n\t"
0455         "3: mvn r0, r0  \n\t"
0456         "2: nop     \n\t")
0457 
0458     TEST_RRX("tbh   [r",1,9f, ", r",14,1,", lsl #1]",
0459         "9:         \n\t"
0460         ".short (2f-1b-4)>>1    \n\t"
0461         ".short (3f-1b-4)>>1    \n\t"
0462         "3: mvn r0, r0  \n\t"
0463         "2: nop     \n\t")
0464 
0465     TEST_UNSUPPORTED(__inst_thumb32(0xe8d1f01f) "   @ tbh [r1, pc]")
0466     TEST_UNSUPPORTED(__inst_thumb32(0xe8d1f01d) "   @ tbh [r1, sp]")
0467     TEST_UNSUPPORTED(__inst_thumb32(0xe8ddf012) "   @ tbh [sp, r2]")
0468 
0469     TEST_UNSUPPORTED("strexb    r0, r1, [r2]")
0470     TEST_UNSUPPORTED("strexh    r0, r1, [r2]")
0471     TEST_UNSUPPORTED("strexd    r0, r1, r2, [r2]")
0472     TEST_UNSUPPORTED("ldrexb    r0, [r1]")
0473     TEST_UNSUPPORTED("ldrexh    r0, [r1]")
0474     TEST_UNSUPPORTED("ldrexd    r0, r1, [r1]")
0475 
0476     TEST_GROUP("Data-processing (shifted register) and (modified immediate)")
0477 
0478 #define _DATA_PROCESSING32_DNM(op,s,val)                    \
0479     TEST_RR(op s".w r0,  r",1, VAL1,", r",2, val, "")           \
0480     TEST_RR(op s"   r1,  r",1, VAL1,", r",2, val, ", lsl #3")       \
0481     TEST_RR(op s"   r2,  r",3, VAL1,", r",2, val, ", lsr #4")       \
0482     TEST_RR(op s"   r3,  r",3, VAL1,", r",2, val, ", asr #5")       \
0483     TEST_RR(op s"   r4,  r",5, VAL1,", r",2, N(val),", asr #6")     \
0484     TEST_RR(op s"   r5,  r",5, VAL1,", r",2, val, ", ror #7")       \
0485     TEST_RR(op s"   r8,  r",9, VAL1,", r",10,val, ", rrx")          \
0486     TEST_R( op s"   r0,  r",11,VAL1,", #0x00010001")            \
0487     TEST_R( op s"   r11, r",0, VAL1,", #0xf5000000")            \
0488     TEST_R( op s"   r7,  r",8, VAL2,", #0x000af000")
0489 
0490 #define DATA_PROCESSING32_DNM(op,val)       \
0491     _DATA_PROCESSING32_DNM(op,"",val)   \
0492     _DATA_PROCESSING32_DNM(op,"s",val)
0493 
0494 #define DATA_PROCESSING32_NM(op,val)                    \
0495     TEST_RR(op".w   r",1, VAL1,", r",2, val, "")            \
0496     TEST_RR(op" r",1, VAL1,", r",2, val, ", lsl #3")        \
0497     TEST_RR(op" r",3, VAL1,", r",2, val, ", lsr #4")        \
0498     TEST_RR(op" r",3, VAL1,", r",2, val, ", asr #5")        \
0499     TEST_RR(op" r",5, VAL1,", r",2, N(val),", asr #6")      \
0500     TEST_RR(op" r",5, VAL1,", r",2, val, ", ror #7")        \
0501     TEST_RR(op" r",9, VAL1,", r",10,val, ", rrx")       \
0502     TEST_R( op" r",11,VAL1,", #0x00010001")         \
0503     TEST_R( op" r",0, VAL1,", #0xf5000000")         \
0504     TEST_R( op" r",8, VAL2,", #0x000af000")
0505 
0506 #define _DATA_PROCESSING32_DM(op,s,val)             \
0507     TEST_R( op s".w r0,  r",14, val, "")            \
0508     TEST_R( op s"   r1,  r",12, val, ", lsl #3")        \
0509     TEST_R( op s"   r2,  r",11, val, ", lsr #4")        \
0510     TEST_R( op s"   r3,  r",10, val, ", asr #5")        \
0511     TEST_R( op s"   r4,  r",9, N(val),", asr #6")       \
0512     TEST_R( op s"   r5,  r",8, val, ", ror #7")     \
0513     TEST_R( op s"   r8,  r",7,val, ", rrx")         \
0514     TEST(   op s"   r0,  #0x00010001")          \
0515     TEST(   op s"   r11, #0xf5000000")          \
0516     TEST(   op s"   r7,  #0x000af000")          \
0517     TEST(   op s"   r4,  #0x00005a00")
0518 
0519 #define DATA_PROCESSING32_DM(op,val)        \
0520     _DATA_PROCESSING32_DM(op,"",val)    \
0521     _DATA_PROCESSING32_DM(op,"s",val)
0522 
0523     DATA_PROCESSING32_DNM("and",0xf00f00ff)
0524     DATA_PROCESSING32_NM("tst",0xf00f00ff)
0525     DATA_PROCESSING32_DNM("bic",0xf00f00ff)
0526     DATA_PROCESSING32_DNM("orr",0xf00f00ff)
0527     DATA_PROCESSING32_DM("mov",VAL2)
0528     DATA_PROCESSING32_DNM("orn",0xf00f00ff)
0529     DATA_PROCESSING32_DM("mvn",VAL2)
0530     DATA_PROCESSING32_DNM("eor",0xf00f00ff)
0531     DATA_PROCESSING32_NM("teq",0xf00f00ff)
0532     DATA_PROCESSING32_DNM("add",VAL2)
0533     DATA_PROCESSING32_NM("cmn",VAL2)
0534     DATA_PROCESSING32_DNM("adc",VAL2)
0535     DATA_PROCESSING32_DNM("sbc",VAL2)
0536     DATA_PROCESSING32_DNM("sub",VAL2)
0537     DATA_PROCESSING32_NM("cmp",VAL2)
0538     DATA_PROCESSING32_DNM("rsb",VAL2)
0539 
0540     TEST_RR("pkhbt  r0, r",0,  HH1,", r",1, HH2,"")
0541     TEST_RR("pkhbt  r14,r",12, HH1,", r",10,HH2,", lsl #2")
0542     TEST_RR("pkhtb  r0, r",0,  HH1,", r",1, HH2,"")
0543     TEST_RR("pkhtb  r14,r",12, HH1,", r",10,HH2,", asr #2")
0544 
0545     TEST_UNSUPPORTED(__inst_thumb32(0xea170f0d) "   @ tst.w r7, sp")
0546     TEST_UNSUPPORTED(__inst_thumb32(0xea170f0f) "   @ tst.w r7, pc")
0547     TEST_UNSUPPORTED(__inst_thumb32(0xea1d0f07) "   @ tst.w sp, r7")
0548     TEST_UNSUPPORTED(__inst_thumb32(0xea1f0f07) "   @ tst.w pc, r7")
0549     TEST_UNSUPPORTED(__inst_thumb32(0xf01d1f08) "   @ tst sp, #0x00080008")
0550     TEST_UNSUPPORTED(__inst_thumb32(0xf01f1f08) "   @ tst pc, #0x00080008")
0551 
0552     TEST_UNSUPPORTED(__inst_thumb32(0xea970f0d) "   @ teq.w r7, sp")
0553     TEST_UNSUPPORTED(__inst_thumb32(0xea970f0f) "   @ teq.w r7, pc")
0554     TEST_UNSUPPORTED(__inst_thumb32(0xea9d0f07) "   @ teq.w sp, r7")
0555     TEST_UNSUPPORTED(__inst_thumb32(0xea9f0f07) "   @ teq.w pc, r7")
0556     TEST_UNSUPPORTED(__inst_thumb32(0xf09d1f08) "   @ tst sp, #0x00080008")
0557     TEST_UNSUPPORTED(__inst_thumb32(0xf09f1f08) "   @ tst pc, #0x00080008")
0558 
0559     TEST_UNSUPPORTED(__inst_thumb32(0xeb170f0d) "   @ cmn.w r7, sp")
0560     TEST_UNSUPPORTED(__inst_thumb32(0xeb170f0f) "   @ cmn.w r7, pc")
0561     TEST_P("cmn.w   sp, r",7,0,"")
0562     TEST_UNSUPPORTED(__inst_thumb32(0xeb1f0f07) "   @ cmn.w pc, r7")
0563     TEST(  "cmn sp, #0x00080008")
0564     TEST_UNSUPPORTED(__inst_thumb32(0xf11f1f08) "   @ cmn pc, #0x00080008")
0565 
0566     TEST_UNSUPPORTED(__inst_thumb32(0xebb70f0d) "   @ cmp.w r7, sp")
0567     TEST_UNSUPPORTED(__inst_thumb32(0xebb70f0f) "   @ cmp.w r7, pc")
0568     TEST_P("cmp.w   sp, r",7,0,"")
0569     TEST_UNSUPPORTED(__inst_thumb32(0xebbf0f07) "   @ cmp.w pc, r7")
0570     TEST(  "cmp sp, #0x00080008")
0571     TEST_UNSUPPORTED(__inst_thumb32(0xf1bf1f08) "   @ cmp pc, #0x00080008")
0572 
0573     TEST_UNSUPPORTED(__inst_thumb32(0xea5f070d) "   @ movs.w r7, sp")
0574     TEST_UNSUPPORTED(__inst_thumb32(0xea5f070f) "   @ movs.w r7, pc")
0575     TEST_UNSUPPORTED(__inst_thumb32(0xea5f0d07) "   @ movs.w sp, r7")
0576     TEST_UNSUPPORTED(__inst_thumb32(0xea4f0f07) "   @ mov.w  pc, r7")
0577     TEST_UNSUPPORTED(__inst_thumb32(0xf04f1d08) "   @ mov sp, #0x00080008")
0578     TEST_UNSUPPORTED(__inst_thumb32(0xf04f1f08) "   @ mov pc, #0x00080008")
0579 
0580     TEST_R("add.w   r0, sp, r",1, 4,"")
0581     TEST_R("adds    r0, sp, r",1, 4,", asl #3")
0582     TEST_R("add r0, sp, r",1, 4,", asl #4")
0583     TEST_R("add r0, sp, r",1, 16,", ror #1")
0584     TEST_R("add.w   sp, sp, r",1, 4,"")
0585     TEST_R("add sp, sp, r",1, 4,", asl #3")
0586     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d1d01) "   @ add sp, sp, r1, asl #4")
0587     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d0d71) "   @ add sp, sp, r1, ror #1")
0588     TEST(  "add.w   r0, sp, #24")
0589     TEST(  "add.w   sp, sp, #24")
0590     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d0f01) "   @ add pc, sp, r1")
0591     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d000f) "   @ add r0, sp, pc")
0592     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d000d) "   @ add r0, sp, sp")
0593     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d0d0f) "   @ add sp, sp, pc")
0594     TEST_UNSUPPORTED(__inst_thumb32(0xeb0d0d0d) "   @ add sp, sp, sp")
0595 
0596     TEST_R("sub.w   r0, sp, r",1, 4,"")
0597     TEST_R("subs    r0, sp, r",1, 4,", asl #3")
0598     TEST_R("sub r0, sp, r",1, 4,", asl #4")
0599     TEST_R("sub r0, sp, r",1, 16,", ror #1")
0600     TEST_R("sub.w   sp, sp, r",1, 4,"")
0601     TEST_R("sub sp, sp, r",1, 4,", asl #3")
0602     TEST_UNSUPPORTED(__inst_thumb32(0xebad1d01) "   @ sub sp, sp, r1, asl #4")
0603     TEST_UNSUPPORTED(__inst_thumb32(0xebad0d71) "   @ sub sp, sp, r1, ror #1")
0604     TEST_UNSUPPORTED(__inst_thumb32(0xebad0f01) "   @ sub pc, sp, r1")
0605     TEST(  "sub.w   r0, sp, #24")
0606     TEST(  "sub.w   sp, sp, #24")
0607 
0608     TEST_UNSUPPORTED(__inst_thumb32(0xea02010f) "   @ and r1, r2, pc")
0609     TEST_UNSUPPORTED(__inst_thumb32(0xea0f0103) "   @ and r1, pc, r3")
0610     TEST_UNSUPPORTED(__inst_thumb32(0xea020f03) "   @ and pc, r2, r3")
0611     TEST_UNSUPPORTED(__inst_thumb32(0xea02010d) "   @ and r1, r2, sp")
0612     TEST_UNSUPPORTED(__inst_thumb32(0xea0d0103) "   @ and r1, sp, r3")
0613     TEST_UNSUPPORTED(__inst_thumb32(0xea020d03) "   @ and sp, r2, r3")
0614     TEST_UNSUPPORTED(__inst_thumb32(0xf00d1108) "   @ and r1, sp, #0x00080008")
0615     TEST_UNSUPPORTED(__inst_thumb32(0xf00f1108) "   @ and r1, pc, #0x00080008")
0616     TEST_UNSUPPORTED(__inst_thumb32(0xf0021d08) "   @ and sp, r8, #0x00080008")
0617     TEST_UNSUPPORTED(__inst_thumb32(0xf0021f08) "   @ and pc, r8, #0x00080008")
0618 
0619     TEST_UNSUPPORTED(__inst_thumb32(0xeb02010f) "   @ add r1, r2, pc")
0620     TEST_UNSUPPORTED(__inst_thumb32(0xeb0f0103) "   @ add r1, pc, r3")
0621     TEST_UNSUPPORTED(__inst_thumb32(0xeb020f03) "   @ add pc, r2, r3")
0622     TEST_UNSUPPORTED(__inst_thumb32(0xeb02010d) "   @ add r1, r2, sp")
0623     TEST_SUPPORTED(  __inst_thumb32(0xeb0d0103) "   @ add r1, sp, r3")
0624     TEST_UNSUPPORTED(__inst_thumb32(0xeb020d03) "   @ add sp, r2, r3")
0625     TEST_SUPPORTED(  __inst_thumb32(0xf10d1108) "   @ add r1, sp, #0x00080008")
0626     TEST_UNSUPPORTED(__inst_thumb32(0xf10d1f08) "   @ add pc, sp, #0x00080008")
0627     TEST_UNSUPPORTED(__inst_thumb32(0xf10f1108) "   @ add r1, pc, #0x00080008")
0628     TEST_UNSUPPORTED(__inst_thumb32(0xf1021d08) "   @ add sp, r8, #0x00080008")
0629     TEST_UNSUPPORTED(__inst_thumb32(0xf1021f08) "   @ add pc, r8, #0x00080008")
0630 
0631     TEST_UNSUPPORTED(__inst_thumb32(0xeaa00000) "")
0632     TEST_UNSUPPORTED(__inst_thumb32(0xeaf00000) "")
0633     TEST_UNSUPPORTED(__inst_thumb32(0xeb200000) "")
0634     TEST_UNSUPPORTED(__inst_thumb32(0xeb800000) "")
0635     TEST_UNSUPPORTED(__inst_thumb32(0xebe00000) "")
0636 
0637     TEST_UNSUPPORTED(__inst_thumb32(0xf0a00000) "")
0638     TEST_UNSUPPORTED(__inst_thumb32(0xf0c00000) "")
0639     TEST_UNSUPPORTED(__inst_thumb32(0xf0f00000) "")
0640     TEST_UNSUPPORTED(__inst_thumb32(0xf1200000) "")
0641     TEST_UNSUPPORTED(__inst_thumb32(0xf1800000) "")
0642     TEST_UNSUPPORTED(__inst_thumb32(0xf1e00000) "")
0643 
0644     TEST_GROUP("Coprocessor instructions")
0645 
0646     TEST_UNSUPPORTED(__inst_thumb32(0xec000000) "")
0647     TEST_UNSUPPORTED(__inst_thumb32(0xeff00000) "")
0648     TEST_UNSUPPORTED(__inst_thumb32(0xfc000000) "")
0649     TEST_UNSUPPORTED(__inst_thumb32(0xfff00000) "")
0650 
0651     TEST_GROUP("Data-processing (plain binary immediate)")
0652 
0653     TEST_R("addw    r0,  r",1, VAL1,", #0x123")
0654     TEST(  "addw    r14, sp, #0xf5a")
0655     TEST(  "addw    sp, sp, #0x20")
0656     TEST(  "addw    r7,  pc, #0x888")
0657     TEST_UNSUPPORTED(__inst_thumb32(0xf20f1f20) "   @ addw pc, pc, #0x120")
0658     TEST_UNSUPPORTED(__inst_thumb32(0xf20d1f20) "   @ addw pc, sp, #0x120")
0659     TEST_UNSUPPORTED(__inst_thumb32(0xf20f1d20) "   @ addw sp, pc, #0x120")
0660     TEST_UNSUPPORTED(__inst_thumb32(0xf2001d20) "   @ addw sp, r0, #0x120")
0661 
0662     TEST_R("subw    r0,  r",1, VAL1,", #0x123")
0663     TEST(  "subw    r14, sp, #0xf5a")
0664     TEST(  "subw    sp, sp, #0x20")
0665     TEST(  "subw    r7,  pc, #0x888")
0666     TEST_UNSUPPORTED(__inst_thumb32(0xf2af1f20) "   @ subw pc, pc, #0x120")
0667     TEST_UNSUPPORTED(__inst_thumb32(0xf2ad1f20) "   @ subw pc, sp, #0x120")
0668     TEST_UNSUPPORTED(__inst_thumb32(0xf2af1d20) "   @ subw sp, pc, #0x120")
0669     TEST_UNSUPPORTED(__inst_thumb32(0xf2a01d20) "   @ subw sp, r0, #0x120")
0670 
0671     TEST("movw  r0, #0")
0672     TEST("movw  r0, #0xffff")
0673     TEST("movw  lr, #0xffff")
0674     TEST_UNSUPPORTED(__inst_thumb32(0xf2400d00) "   @ movw sp, #0")
0675     TEST_UNSUPPORTED(__inst_thumb32(0xf2400f00) "   @ movw pc, #0")
0676 
0677     TEST_R("movt    r",0, VAL1,", #0")
0678     TEST_R("movt    r",0, VAL2,", #0xffff")
0679     TEST_R("movt    r",14,VAL1,", #0xffff")
0680     TEST_UNSUPPORTED(__inst_thumb32(0xf2c00d00) "   @ movt sp, #0")
0681     TEST_UNSUPPORTED(__inst_thumb32(0xf2c00f00) "   @ movt pc, #0")
0682 
0683     TEST_R(     "ssat   r0, #24, r",0,   VAL1,"")
0684     TEST_R(     "ssat   r14, #24, r",12, VAL2,"")
0685     TEST_R(     "ssat   r0, #24, r",0,   VAL1,", lsl #8")
0686     TEST_R(     "ssat   r14, #24, r",12, VAL2,", asr #8")
0687     TEST_UNSUPPORTED(__inst_thumb32(0xf30c0d17) "   @ ssat  sp, #24, r12")
0688     TEST_UNSUPPORTED(__inst_thumb32(0xf30c0f17) "   @ ssat  pc, #24, r12")
0689     TEST_UNSUPPORTED(__inst_thumb32(0xf30d0c17) "   @ ssat  r12, #24, sp")
0690     TEST_UNSUPPORTED(__inst_thumb32(0xf30f0c17) "   @ ssat  r12, #24, pc")
0691 
0692     TEST_R(     "usat   r0, #24, r",0,   VAL1,"")
0693     TEST_R(     "usat   r14, #24, r",12, VAL2,"")
0694     TEST_R(     "usat   r0, #24, r",0,   VAL1,", lsl #8")
0695     TEST_R(     "usat   r14, #24, r",12, VAL2,", asr #8")
0696     TEST_UNSUPPORTED(__inst_thumb32(0xf38c0d17) "   @ usat  sp, #24, r12")
0697     TEST_UNSUPPORTED(__inst_thumb32(0xf38c0f17) "   @ usat  pc, #24, r12")
0698     TEST_UNSUPPORTED(__inst_thumb32(0xf38d0c17) "   @ usat  r12, #24, sp")
0699     TEST_UNSUPPORTED(__inst_thumb32(0xf38f0c17) "   @ usat  r12, #24, pc")
0700 
0701     TEST_R(     "ssat16 r0, #12, r",0,   HH1,"")
0702     TEST_R(     "ssat16 r14, #12, r",12, HH2,"")
0703     TEST_UNSUPPORTED(__inst_thumb32(0xf32c0d0b) "   @ ssat16    sp, #12, r12")
0704     TEST_UNSUPPORTED(__inst_thumb32(0xf32c0f0b) "   @ ssat16    pc, #12, r12")
0705     TEST_UNSUPPORTED(__inst_thumb32(0xf32d0c0b) "   @ ssat16    r12, #12, sp")
0706     TEST_UNSUPPORTED(__inst_thumb32(0xf32f0c0b) "   @ ssat16    r12, #12, pc")
0707 
0708     TEST_R(     "usat16 r0, #12, r",0,   HH1,"")
0709     TEST_R(     "usat16 r14, #12, r",12, HH2,"")
0710     TEST_UNSUPPORTED(__inst_thumb32(0xf3ac0d0b) "   @ usat16    sp, #12, r12")
0711     TEST_UNSUPPORTED(__inst_thumb32(0xf3ac0f0b) "   @ usat16    pc, #12, r12")
0712     TEST_UNSUPPORTED(__inst_thumb32(0xf3ad0c0b) "   @ usat16    r12, #12, sp")
0713     TEST_UNSUPPORTED(__inst_thumb32(0xf3af0c0b) "   @ usat16    r12, #12, pc")
0714 
0715     TEST_R(     "sbfx   r0, r",0  , VAL1,", #0, #31")
0716     TEST_R(     "sbfx   r14, r",12, VAL2,", #8, #16")
0717     TEST_R(     "sbfx   r4, r",10,  VAL1,", #16, #15")
0718     TEST_UNSUPPORTED(__inst_thumb32(0xf34c2d0f) "   @ sbfx  sp, r12, #8, #16")
0719     TEST_UNSUPPORTED(__inst_thumb32(0xf34c2f0f) "   @ sbfx  pc, r12, #8, #16")
0720     TEST_UNSUPPORTED(__inst_thumb32(0xf34d2c0f) "   @ sbfx  r12, sp, #8, #16")
0721     TEST_UNSUPPORTED(__inst_thumb32(0xf34f2c0f) "   @ sbfx  r12, pc, #8, #16")
0722 
0723     TEST_R(     "ubfx   r0, r",0  , VAL1,", #0, #31")
0724     TEST_R(     "ubfx   r14, r",12, VAL2,", #8, #16")
0725     TEST_R(     "ubfx   r4, r",10,  VAL1,", #16, #15")
0726     TEST_UNSUPPORTED(__inst_thumb32(0xf3cc2d0f) "   @ ubfx  sp, r12, #8, #16")
0727     TEST_UNSUPPORTED(__inst_thumb32(0xf3cc2f0f) "   @ ubfx  pc, r12, #8, #16")
0728     TEST_UNSUPPORTED(__inst_thumb32(0xf3cd2c0f) "   @ ubfx  r12, sp, #8, #16")
0729     TEST_UNSUPPORTED(__inst_thumb32(0xf3cf2c0f) "   @ ubfx  r12, pc, #8, #16")
0730 
0731     TEST_R(     "bfc    r",0, VAL1,", #4, #20")
0732     TEST_R(     "bfc    r",14,VAL2,", #4, #20")
0733     TEST_R(     "bfc    r",7, VAL1,", #0, #31")
0734     TEST_R(     "bfc    r",8, VAL2,", #0, #31")
0735     TEST_UNSUPPORTED(__inst_thumb32(0xf36f0d1e) "   @ bfc   sp, #0, #31")
0736     TEST_UNSUPPORTED(__inst_thumb32(0xf36f0f1e) "   @ bfc   pc, #0, #31")
0737 
0738     TEST_RR(    "bfi    r",0, VAL1,", r",0  , VAL2,", #0, #31")
0739     TEST_RR(    "bfi    r",12,VAL1,", r",14 , VAL2,", #4, #20")
0740     TEST_UNSUPPORTED(__inst_thumb32(0xf36e1d17) "   @ bfi   sp, r14, #4, #20")
0741     TEST_UNSUPPORTED(__inst_thumb32(0xf36e1f17) "   @ bfi   pc, r14, #4, #20")
0742     TEST_UNSUPPORTED(__inst_thumb32(0xf36d1e17) "   @ bfi   r14, sp, #4, #20")
0743 
0744     TEST_GROUP("Branches and miscellaneous control")
0745 
0746 CONDITION_INSTRUCTIONS(22,
0747     TEST_BF("beq.w  2f")
0748     TEST_BB("bne.w  2b")
0749     TEST_BF("bgt.w  2f")
0750     TEST_BB("blt.w  2b")
0751     TEST_BF_X("bpl.w    2f", SPACE_0x1000)
0752 )
0753 
0754     TEST_UNSUPPORTED("msr   cpsr, r0")
0755     TEST_UNSUPPORTED("msr   cpsr_f, r1")
0756     TEST_UNSUPPORTED("msr   spsr, r2")
0757 
0758     TEST_UNSUPPORTED("cpsie.w   i")
0759     TEST_UNSUPPORTED("cpsid.w   i")
0760     TEST_UNSUPPORTED("cps   0x13")
0761 
0762     TEST_SUPPORTED("yield.w")
0763     TEST("sev.w")
0764     TEST("nop.w")
0765     TEST("wfi.w")
0766     TEST_SUPPORTED("wfe.w")
0767     TEST_UNSUPPORTED("dbg.w #0")
0768 
0769     TEST_UNSUPPORTED("clrex")
0770     TEST_UNSUPPORTED("dsb")
0771     TEST_UNSUPPORTED("dmb")
0772     TEST_UNSUPPORTED("isb")
0773 
0774     TEST_UNSUPPORTED("bxj   r0")
0775 
0776     TEST_UNSUPPORTED("subs  pc, lr, #4")
0777 
0778     TEST_RMASKED("mrs   r",0,~PSR_IGNORE_BITS,", cpsr")
0779     TEST_RMASKED("mrs   r",14,~PSR_IGNORE_BITS,", cpsr")
0780     TEST_UNSUPPORTED(__inst_thumb32(0xf3ef8d00) "   @ mrs   sp, spsr")
0781     TEST_UNSUPPORTED(__inst_thumb32(0xf3ef8f00) "   @ mrs   pc, spsr")
0782     TEST_UNSUPPORTED("mrs   r0, spsr")
0783     TEST_UNSUPPORTED("mrs   lr, spsr")
0784 
0785     TEST_UNSUPPORTED(__inst_thumb32(0xf7f08000) " @ smc #0")
0786 
0787     TEST_UNSUPPORTED(__inst_thumb32(0xf7f0a000) " @ undefeined")
0788 
0789     TEST_BF(  "b.w  2f")
0790     TEST_BB(  "b.w  2b")
0791     TEST_BF_X("b.w  2f", SPACE_0x1000)
0792 
0793     TEST_BF(  "bl.w 2f")
0794     TEST_BB(  "bl.w 2b")
0795     TEST_BB_X("bl.w 2b", SPACE_0x1000)
0796 
0797     TEST_X( "blx    __dummy_arm_subroutine",
0798         ".arm               \n\t"
0799         ".align             \n\t"
0800         ".type __dummy_arm_subroutine, %%function \n\t"
0801         "__dummy_arm_subroutine:    \n\t"
0802         "mov    r0, pc          \n\t"
0803         "bx lr          \n\t"
0804         ".thumb             \n\t"
0805     )
0806     TEST(   "blx    __dummy_arm_subroutine")
0807 
0808     TEST_GROUP("Store single data item")
0809 
0810 #define SINGLE_STORE(size)                          \
0811     TEST_RP( "str"size" r",0, VAL1,", [r",11,-1024,", #1024]")      \
0812     TEST_RP( "str"size" r",14,VAL2,", [r",1, -1024,", #1080]")      \
0813     TEST_RP( "str"size" r",0, VAL1,", [r",11,256,  ", #-120]")      \
0814     TEST_RP( "str"size" r",14,VAL2,", [r",1, 256,  ", #-128]")      \
0815     TEST_RP( "str"size" r",0, VAL1,", [r",11,24,  "], #120")        \
0816     TEST_RP( "str"size" r",14,VAL2,", [r",1, 24,  "], #128")        \
0817     TEST_RP( "str"size" r",0, VAL1,", [r",11,24,  "], #-120")       \
0818     TEST_RP( "str"size" r",14,VAL2,", [r",1, 24,  "], #-128")       \
0819     TEST_RP( "str"size" r",0, VAL1,", [r",11,24,   ", #120]!")      \
0820     TEST_RP( "str"size" r",14,VAL2,", [r",1, 24,   ", #128]!")      \
0821     TEST_RP( "str"size" r",0, VAL1,", [r",11,256,  ", #-120]!")     \
0822     TEST_RP( "str"size" r",14,VAL2,", [r",1, 256,  ", #-128]!")     \
0823     TEST_RPR("str"size".w   r",0, VAL1,", [r",1, 0,", r",2, 4,"]")      \
0824     TEST_RPR("str"size" r",14,VAL2,", [r",10,0,", r",11,4,", lsl #1]")  \
0825     TEST_UNSUPPORTED("str"size" r0, [r13, r1]")             \
0826     TEST_R(  "str"size".w   r",7, VAL1,", [sp, #24]")           \
0827     TEST_RP( "str"size".w   r",0, VAL2,", [r",0,0, "]")         \
0828     TEST_RP( "str"size" r",6, VAL1,", [r",13, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!") \
0829     TEST_UNSUPPORTED("str"size" r6, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!")         \
0830     TEST_RP( "str"size" r",4, VAL2,", [r",12, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!") \
0831     TEST_UNSUPPORTED("str"size"t    r0, [r1, #4]")
0832 
0833     SINGLE_STORE("b")
0834     SINGLE_STORE("h")
0835     SINGLE_STORE("")
0836 
0837     TEST_UNSUPPORTED(__inst_thumb32(0xf801000d) "   @ strb  r0, [r1, r13]")
0838     TEST_UNSUPPORTED(__inst_thumb32(0xf821000d) "   @ strh  r0, [r1, r13]")
0839     TEST_UNSUPPORTED(__inst_thumb32(0xf841000d) "   @ str   r0, [r1, r13]")
0840 
0841     TEST("str   sp, [sp]")
0842     TEST_UNSUPPORTED(__inst_thumb32(0xf8cfe000) "   @ str   r14, [pc]")
0843     TEST_UNSUPPORTED(__inst_thumb32(0xf8cef000) "   @ str   pc, [r14]")
0844 
0845     TEST_GROUP("Advanced SIMD element or structure load/store instructions")
0846 
0847     TEST_UNSUPPORTED(__inst_thumb32(0xf9000000) "")
0848     TEST_UNSUPPORTED(__inst_thumb32(0xf92fffff) "")
0849     TEST_UNSUPPORTED(__inst_thumb32(0xf9800000) "")
0850     TEST_UNSUPPORTED(__inst_thumb32(0xf9efffff) "")
0851 
0852     TEST_GROUP("Load single data item and memory hints")
0853 
0854 #define SINGLE_LOAD(size)                       \
0855     TEST_P( "ldr"size"  r0, [r",11,-1024, ", #1024]")       \
0856     TEST_P( "ldr"size"  r14, [r",1, -1024,", #1080]")       \
0857     TEST_P( "ldr"size"  r0, [r",11,256,   ", #-120]")       \
0858     TEST_P( "ldr"size"  r14, [r",1, 256,  ", #-128]")       \
0859     TEST_P( "ldr"size"  r0, [r",11,24,   "], #120")     \
0860     TEST_P( "ldr"size"  r14, [r",1, 24,  "], #128")     \
0861     TEST_P( "ldr"size"  r0, [r",11,24,   "], #-120")        \
0862     TEST_P( "ldr"size"  r14, [r",1,24,   "], #-128")        \
0863     TEST_P( "ldr"size"  r0, [r",11,24,    ", #120]!")       \
0864     TEST_P( "ldr"size"  r14, [r",1, 24,   ", #128]!")       \
0865     TEST_P( "ldr"size"  r0, [r",11,256,   ", #-120]!")      \
0866     TEST_P( "ldr"size"  r14, [r",1, 256,  ", #-128]!")      \
0867     TEST_PR("ldr"size".w    r0, [r",1, 0,", r",2, 4,"]")        \
0868     TEST_PR("ldr"size"  r14, [r",10,0,", r",11,4,", lsl #1]")   \
0869     TEST_X( "ldr"size".w    r0, 3f",                \
0870         ".align 3               \n\t"       \
0871         "3: .word   "__stringify(VAL1))         \
0872     TEST_X( "ldr"size".w    r14, 3f",               \
0873         ".align 3               \n\t"       \
0874         "3: .word   "__stringify(VAL2))         \
0875     TEST(   "ldr"size".w    r7, 3b")                \
0876     TEST(   "ldr"size".w    r7, [sp, #24]")             \
0877     TEST_P( "ldr"size".w    r0, [r",0,0, "]")           \
0878     TEST_UNSUPPORTED("ldr"size"t    r0, [r1, #4]")
0879 
0880     SINGLE_LOAD("b")
0881     SINGLE_LOAD("sb")
0882     SINGLE_LOAD("h")
0883     SINGLE_LOAD("sh")
0884     SINGLE_LOAD("")
0885 
0886     TEST_BF_P("ldr  pc, [r",14, 15*4,"]")
0887     TEST_P(   "ldr  sp, [r",14, 13*4,"]")
0888     TEST_BF_R("ldr  pc, [sp, r",14, 15*4,"]")
0889     TEST_R(   "ldr  sp, [sp, r",14, 13*4,"]")
0890     TEST_THUMB_TO_ARM_INTERWORK_P("ldr  pc, [r",0,0,", #15*4]")
0891     TEST_SUPPORTED("ldr sp, 99f")
0892     TEST_SUPPORTED("ldr pc, 99f")
0893 
0894     TEST_UNSUPPORTED(__inst_thumb32(0xf854700d) "   @ ldr   r7, [r4, sp]")
0895     TEST_UNSUPPORTED(__inst_thumb32(0xf854700f) "   @ ldr   r7, [r4, pc]")
0896     TEST_UNSUPPORTED(__inst_thumb32(0xf814700d) "   @ ldrb  r7, [r4, sp]")
0897     TEST_UNSUPPORTED(__inst_thumb32(0xf814700f) "   @ ldrb  r7, [r4, pc]")
0898     TEST_UNSUPPORTED(__inst_thumb32(0xf89fd004) "   @ ldrb  sp, 99f")
0899     TEST_UNSUPPORTED(__inst_thumb32(0xf814d008) "   @ ldrb  sp, [r4, r8]")
0900     TEST_UNSUPPORTED(__inst_thumb32(0xf894d000) "   @ ldrb  sp, [r4]")
0901 
0902     TEST_UNSUPPORTED(__inst_thumb32(0xf8600000) "") /* Unallocated space */
0903     TEST_UNSUPPORTED(__inst_thumb32(0xf9ffffff) "") /* Unallocated space */
0904     TEST_UNSUPPORTED(__inst_thumb32(0xf9500000) "") /* Unallocated space */
0905     TEST_UNSUPPORTED(__inst_thumb32(0xf95fffff) "") /* Unallocated space */
0906     TEST_UNSUPPORTED(__inst_thumb32(0xf8000800) "") /* Unallocated space */
0907     TEST_UNSUPPORTED(__inst_thumb32(0xf97ffaff) "") /* Unallocated space */
0908 
0909     TEST(   "pli    [pc, #4]")
0910     TEST(   "pli    [pc, #-4]")
0911     TEST(   "pld    [pc, #4]")
0912     TEST(   "pld    [pc, #-4]")
0913 
0914     TEST_P( "pld    [r",0,-1024,", #1024]")
0915     TEST(   __inst_thumb32(0xf8b0f400) "    @ pldw  [r0, #1024]")
0916     TEST_P( "pli    [r",4, 0b,", #1024]")
0917     TEST_P( "pld    [r",7, 120,", #-120]")
0918     TEST(   __inst_thumb32(0xf837fc78) "    @ pldw  [r7, #-120]")
0919     TEST_P( "pli    [r",11,120,", #-120]")
0920     TEST(   "pld    [sp, #0]")
0921 
0922     TEST_PR("pld    [r",7, 24, ", r",0, 16,"]")
0923     TEST_PR("pld    [r",8, 24, ", r",12,16,", lsl #3]")
0924     TEST_SUPPORTED(__inst_thumb32(0xf837f000) " @ pldw  [r7, r0]")
0925     TEST_SUPPORTED(__inst_thumb32(0xf838f03c) " @ pldw  [r8, r12, lsl #3]");
0926     TEST_RR("pli    [r",12,0b,", r",0, 16,"]")
0927     TEST_RR("pli    [r",0, 0b,", r",12,16,", lsl #3]")
0928     TEST_R( "pld    [sp, r",1, 16,"]")
0929     TEST_UNSUPPORTED(__inst_thumb32(0xf817f00d) "  @pld [r7, sp]")
0930     TEST_UNSUPPORTED(__inst_thumb32(0xf817f00f) "  @pld [r7, pc]")
0931 
0932     TEST_GROUP("Data-processing (register)")
0933 
0934 #define SHIFTS32(op)                    \
0935     TEST_RR(op" r0,  r",1, VAL1,", r",2, 3, "") \
0936     TEST_RR(op" r14, r",12,VAL2,", r",11,10,"")
0937 
0938     SHIFTS32("lsl")
0939     SHIFTS32("lsls")
0940     SHIFTS32("lsr")
0941     SHIFTS32("lsrs")
0942     SHIFTS32("asr")
0943     SHIFTS32("asrs")
0944     SHIFTS32("ror")
0945     SHIFTS32("rors")
0946 
0947     TEST_UNSUPPORTED(__inst_thumb32(0xfa01ff02) "   @ lsl   pc, r1, r2")
0948     TEST_UNSUPPORTED(__inst_thumb32(0xfa01fd02) "   @ lsl   sp, r1, r2")
0949     TEST_UNSUPPORTED(__inst_thumb32(0xfa0ff002) "   @ lsl   r0, pc, r2")
0950     TEST_UNSUPPORTED(__inst_thumb32(0xfa0df002) "   @ lsl   r0, sp, r2")
0951     TEST_UNSUPPORTED(__inst_thumb32(0xfa01f00f) "   @ lsl   r0, r1, pc")
0952     TEST_UNSUPPORTED(__inst_thumb32(0xfa01f00d) "   @ lsl   r0, r1, sp")
0953 
0954     TEST_RR(    "sxtah  r0, r",0,  HH1,", r",1, HH2,"")
0955     TEST_RR(    "sxtah  r14,r",12, HH2,", r",10,HH1,", ror #8")
0956     TEST_R(     "sxth   r8, r",7,  HH1,"")
0957 
0958     TEST_UNSUPPORTED(__inst_thumb32(0xfa0fff87) "   @ sxth  pc, r7");
0959     TEST_UNSUPPORTED(__inst_thumb32(0xfa0ffd87) "   @ sxth  sp, r7");
0960     TEST_UNSUPPORTED(__inst_thumb32(0xfa0ff88f) "   @ sxth  r8, pc");
0961     TEST_UNSUPPORTED(__inst_thumb32(0xfa0ff88d) "   @ sxth  r8, sp");
0962 
0963     TEST_RR(    "uxtah  r0, r",0,  HH1,", r",1, HH2,"")
0964     TEST_RR(    "uxtah  r14,r",12, HH2,", r",10,HH1,", ror #8")
0965     TEST_R(     "uxth   r8, r",7,  HH1,"")
0966 
0967     TEST_RR(    "sxtab16    r0, r",0,  HH1,", r",1, HH2,"")
0968     TEST_RR(    "sxtab16    r14,r",12, HH2,", r",10,HH1,", ror #8")
0969     TEST_R(     "sxtb16 r8, r",7,  HH1,"")
0970 
0971     TEST_RR(    "uxtab16    r0, r",0,  HH1,", r",1, HH2,"")
0972     TEST_RR(    "uxtab16    r14,r",12, HH2,", r",10,HH1,", ror #8")
0973     TEST_R(     "uxtb16 r8, r",7,  HH1,"")
0974 
0975     TEST_RR(    "sxtab  r0, r",0,  HH1,", r",1, HH2,"")
0976     TEST_RR(    "sxtab  r14,r",12, HH2,", r",10,HH1,", ror #8")
0977     TEST_R(     "sxtb   r8, r",7,  HH1,"")
0978 
0979     TEST_RR(    "uxtab  r0, r",0,  HH1,", r",1, HH2,"")
0980     TEST_RR(    "uxtab  r14,r",12, HH2,", r",10,HH1,", ror #8")
0981     TEST_R(     "uxtb   r8, r",7,  HH1,"")
0982 
0983     TEST_UNSUPPORTED(__inst_thumb32(0xfa6000f0) "")
0984     TEST_UNSUPPORTED(__inst_thumb32(0xfa7fffff) "")
0985 
0986 #define PARALLEL_ADD_SUB(op)                    \
0987     TEST_RR(  op"add16  r0, r",0,  HH1,", r",1, HH2,"") \
0988     TEST_RR(  op"add16  r14, r",12,HH2,", r",10,HH1,"") \
0989     TEST_RR(  op"asx    r0, r",0,  HH1,", r",1, HH2,"") \
0990     TEST_RR(  op"asx    r14, r",12,HH2,", r",10,HH1,"") \
0991     TEST_RR(  op"sax    r0, r",0,  HH1,", r",1, HH2,"") \
0992     TEST_RR(  op"sax    r14, r",12,HH2,", r",10,HH1,"") \
0993     TEST_RR(  op"sub16  r0, r",0,  HH1,", r",1, HH2,"") \
0994     TEST_RR(  op"sub16  r14, r",12,HH2,", r",10,HH1,"") \
0995     TEST_RR(  op"add8   r0, r",0,  HH1,", r",1, HH2,"") \
0996     TEST_RR(  op"add8   r14, r",12,HH2,", r",10,HH1,"") \
0997     TEST_RR(  op"sub8   r0, r",0,  HH1,", r",1, HH2,"") \
0998     TEST_RR(  op"sub8   r14, r",12,HH2,", r",10,HH1,"")
0999 
1000     TEST_GROUP("Parallel addition and subtraction, signed")
1001 
1002     PARALLEL_ADD_SUB("s")
1003     PARALLEL_ADD_SUB("q")
1004     PARALLEL_ADD_SUB("sh")
1005 
1006     TEST_GROUP("Parallel addition and subtraction, unsigned")
1007 
1008     PARALLEL_ADD_SUB("u")
1009     PARALLEL_ADD_SUB("uq")
1010     PARALLEL_ADD_SUB("uh")
1011 
1012     TEST_GROUP("Miscellaneous operations")
1013 
1014     TEST_RR("qadd   r0, r",1, VAL1,", r",2, VAL2,"")
1015     TEST_RR("qadd   lr, r",9, VAL2,", r",8, VAL1,"")
1016     TEST_RR("qsub   r0, r",1, VAL1,", r",2, VAL2,"")
1017     TEST_RR("qsub   lr, r",9, VAL2,", r",8, VAL1,"")
1018     TEST_RR("qdadd  r0, r",1, VAL1,", r",2, VAL2,"")
1019     TEST_RR("qdadd  lr, r",9, VAL2,", r",8, VAL1,"")
1020     TEST_RR("qdsub  r0, r",1, VAL1,", r",2, VAL2,"")
1021     TEST_RR("qdsub  lr, r",9, VAL2,", r",8, VAL1,"")
1022 
1023     TEST_R("rev.w   r0, r",0,   VAL1,"")
1024     TEST_R("rev r14, r",12, VAL2,"")
1025     TEST_R("rev16.w r0, r",0,   VAL1,"")
1026     TEST_R("rev16   r14, r",12, VAL2,"")
1027     TEST_R("rbit    r0, r",0,   VAL1,"")
1028     TEST_R("rbit    r14, r",12, VAL2,"")
1029     TEST_R("revsh.w r0, r",0,   VAL1,"")
1030     TEST_R("revsh   r14, r",12, VAL2,"")
1031 
1032     TEST_UNSUPPORTED(__inst_thumb32(0xfa9cff8c) "   @ rev   pc, r12");
1033     TEST_UNSUPPORTED(__inst_thumb32(0xfa9cfd8c) "   @ rev   sp, r12");
1034     TEST_UNSUPPORTED(__inst_thumb32(0xfa9ffe8f) "   @ rev   r14, pc");
1035     TEST_UNSUPPORTED(__inst_thumb32(0xfa9dfe8d) "   @ rev   r14, sp");
1036 
1037     TEST_RR("sel    r0, r",0,  VAL1,", r",1, VAL2,"")
1038     TEST_RR("sel    r14, r",12,VAL1,", r",10, VAL2,"")
1039 
1040     TEST_R("clz r0, r",0, 0x0,"")
1041     TEST_R("clz r7, r",14,0x1,"")
1042     TEST_R("clz lr, r",7, 0xffffffff,"")
1043 
1044     TEST_UNSUPPORTED(__inst_thumb32(0xfa80f030) "") /* Unallocated space */
1045     TEST_UNSUPPORTED(__inst_thumb32(0xfaffff7f) "") /* Unallocated space */
1046     TEST_UNSUPPORTED(__inst_thumb32(0xfab0f000) "") /* Unallocated space */
1047     TEST_UNSUPPORTED(__inst_thumb32(0xfaffff7f) "") /* Unallocated space */
1048 
1049     TEST_GROUP("Multiply, multiply accumulate, and absolute difference operations")
1050 
1051     TEST_RR(    "mul    r0, r",1, VAL1,", r",2, VAL2,"")
1052     TEST_RR(    "mul    r7, r",8, VAL2,", r",9, VAL2,"")
1053     TEST_UNSUPPORTED(__inst_thumb32(0xfb08ff09) "   @ mul   pc, r8, r9")
1054     TEST_UNSUPPORTED(__inst_thumb32(0xfb08fd09) "   @ mul   sp, r8, r9")
1055     TEST_UNSUPPORTED(__inst_thumb32(0xfb0ff709) "   @ mul   r7, pc, r9")
1056     TEST_UNSUPPORTED(__inst_thumb32(0xfb0df709) "   @ mul   r7, sp, r9")
1057     TEST_UNSUPPORTED(__inst_thumb32(0xfb08f70f) "   @ mul   r7, r8, pc")
1058     TEST_UNSUPPORTED(__inst_thumb32(0xfb08f70d) "   @ mul   r7, r8, sp")
1059 
1060     TEST_RRR(   "mla    r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1061     TEST_RRR(   "mla    r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1062     TEST_UNSUPPORTED(__inst_thumb32(0xfb08af09) "   @ mla   pc, r8, r9, r10");
1063     TEST_UNSUPPORTED(__inst_thumb32(0xfb08ad09) "   @ mla   sp, r8, r9, r10");
1064     TEST_UNSUPPORTED(__inst_thumb32(0xfb0fa709) "   @ mla   r7, pc, r9, r10");
1065     TEST_UNSUPPORTED(__inst_thumb32(0xfb0da709) "   @ mla   r7, sp, r9, r10");
1066     TEST_UNSUPPORTED(__inst_thumb32(0xfb08a70f) "   @ mla   r7, r8, pc, r10");
1067     TEST_UNSUPPORTED(__inst_thumb32(0xfb08a70d) "   @ mla   r7, r8, sp, r10");
1068     TEST_UNSUPPORTED(__inst_thumb32(0xfb08d709) "   @ mla   r7, r8, r9, sp");
1069 
1070     TEST_RRR(   "mls    r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1071     TEST_RRR(   "mls    r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1072 
1073     TEST_RRR(   "smlabb r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1074     TEST_RRR(   "smlabb r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1075     TEST_RRR(   "smlatb r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1076     TEST_RRR(   "smlatb r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1077     TEST_RRR(   "smlabt r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1078     TEST_RRR(   "smlabt r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1079     TEST_RRR(   "smlatt r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1080     TEST_RRR(   "smlatt r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1081     TEST_RR(    "smulbb r0, r",1, VAL1,", r",2, VAL2,"")
1082     TEST_RR(    "smulbb r7, r",8, VAL3,", r",9, VAL1,"")
1083     TEST_RR(    "smultb r0, r",1, VAL1,", r",2, VAL2,"")
1084     TEST_RR(    "smultb r7, r",8, VAL3,", r",9, VAL1,"")
1085     TEST_RR(    "smulbt r0, r",1, VAL1,", r",2, VAL2,"")
1086     TEST_RR(    "smulbt r7, r",8, VAL3,", r",9, VAL1,"")
1087     TEST_RR(    "smultt r0, r",1, VAL1,", r",2, VAL2,"")
1088     TEST_RR(    "smultt r7, r",8, VAL3,", r",9, VAL1,"")
1089 
1090     TEST_RRR(   "smlad  r0, r",0,  HH1,", r",1, HH2,", r",2, VAL1,"")
1091     TEST_RRR(   "smlad  r14, r",12,HH2,", r",10,HH1,", r",8, VAL2,"")
1092     TEST_RRR(   "smladx r0, r",0,  HH1,", r",1, HH2,", r",2, VAL1,"")
1093     TEST_RRR(   "smladx r14, r",12,HH2,", r",10,HH1,", r",8, VAL2,"")
1094     TEST_RR(    "smuad  r0, r",0,  HH1,", r",1, HH2,"")
1095     TEST_RR(    "smuad  r14, r",12,HH2,", r",10,HH1,"")
1096     TEST_RR(    "smuadx r0, r",0,  HH1,", r",1, HH2,"")
1097     TEST_RR(    "smuadx r14, r",12,HH2,", r",10,HH1,"")
1098 
1099     TEST_RRR(   "smlawb r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1100     TEST_RRR(   "smlawb r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1101     TEST_RRR(   "smlawt r0, r",1, VAL1,", r",2, VAL2,", r",3,  VAL3,"")
1102     TEST_RRR(   "smlawt r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
1103     TEST_RR(    "smulwb r0, r",1, VAL1,", r",2, VAL2,"")
1104     TEST_RR(    "smulwb r7, r",8, VAL3,", r",9, VAL1,"")
1105     TEST_RR(    "smulwt r0, r",1, VAL1,", r",2, VAL2,"")
1106     TEST_RR(    "smulwt r7, r",8, VAL3,", r",9, VAL1,"")
1107 
1108     TEST_RRR(   "smlsd  r0, r",0,  HH1,", r",1, HH2,", r",2, VAL1,"")
1109     TEST_RRR(   "smlsd  r14, r",12,HH2,", r",10,HH1,", r",8, VAL2,"")
1110     TEST_RRR(   "smlsdx r0, r",0,  HH1,", r",1, HH2,", r",2, VAL1,"")
1111     TEST_RRR(   "smlsdx r14, r",12,HH2,", r",10,HH1,", r",8, VAL2,"")
1112     TEST_RR(    "smusd  r0, r",0,  HH1,", r",1, HH2,"")
1113     TEST_RR(    "smusd  r14, r",12,HH2,", r",10,HH1,"")
1114     TEST_RR(    "smusdx r0, r",0,  HH1,", r",1, HH2,"")
1115     TEST_RR(    "smusdx r14, r",12,HH2,", r",10,HH1,"")
1116 
1117     TEST_RRR(   "smmla  r0, r",0,  VAL1,", r",1, VAL2,", r",2, VAL1,"")
1118     TEST_RRR(   "smmla  r14, r",12,VAL2,", r",10,VAL1,", r",8, VAL2,"")
1119     TEST_RRR(   "smmlar r0, r",0,  VAL1,", r",1, VAL2,", r",2, VAL1,"")
1120     TEST_RRR(   "smmlar r14, r",12,VAL2,", r",10,VAL1,", r",8, VAL2,"")
1121     TEST_RR(    "smmul  r0, r",0,  VAL1,", r",1, VAL2,"")
1122     TEST_RR(    "smmul  r14, r",12,VAL2,", r",10,VAL1,"")
1123     TEST_RR(    "smmulr r0, r",0,  VAL1,", r",1, VAL2,"")
1124     TEST_RR(    "smmulr r14, r",12,VAL2,", r",10,VAL1,"")
1125 
1126     TEST_RRR(   "smmls  r0, r",0,  VAL1,", r",1, VAL2,", r",2, VAL1,"")
1127     TEST_RRR(   "smmls  r14, r",12,VAL2,", r",10,VAL1,", r",8, VAL2,"")
1128     TEST_RRR(   "smmlsr r0, r",0,  VAL1,", r",1, VAL2,", r",2, VAL1,"")
1129     TEST_RRR(   "smmlsr r14, r",12,VAL2,", r",10,VAL1,", r",8, VAL2,"")
1130 
1131     TEST_RRR(   "usada8 r0, r",0,  VAL1,", r",1, VAL2,", r",2, VAL3,"")
1132     TEST_RRR(   "usada8 r14, r",12,VAL2,", r",10,VAL1,", r",8, VAL3,"")
1133     TEST_RR(    "usad8  r0, r",0,  VAL1,", r",1, VAL2,"")
1134     TEST_RR(    "usad8  r14, r",12,VAL2,", r",10,VAL1,"")
1135 
1136     TEST_UNSUPPORTED(__inst_thumb32(0xfb00f010) "") /* Unallocated space */
1137     TEST_UNSUPPORTED(__inst_thumb32(0xfb0fff1f) "") /* Unallocated space */
1138     TEST_UNSUPPORTED(__inst_thumb32(0xfb70f010) "") /* Unallocated space */
1139     TEST_UNSUPPORTED(__inst_thumb32(0xfb7fff1f) "") /* Unallocated space */
1140     TEST_UNSUPPORTED(__inst_thumb32(0xfb700010) "") /* Unallocated space */
1141     TEST_UNSUPPORTED(__inst_thumb32(0xfb7fff1f) "") /* Unallocated space */
1142 
1143     TEST_GROUP("Long multiply, long multiply accumulate, and divide")
1144 
1145     TEST_RR(   "smull   r0, r1, r",2, VAL1,", r",3, VAL2,"")
1146     TEST_RR(   "smull   r7, r8, r",9, VAL2,", r",10, VAL1,"")
1147     TEST_UNSUPPORTED(__inst_thumb32(0xfb89f80a) "   @ smull pc, r8, r9, r10");
1148     TEST_UNSUPPORTED(__inst_thumb32(0xfb89d80a) "   @ smull sp, r8, r9, r10");
1149     TEST_UNSUPPORTED(__inst_thumb32(0xfb897f0a) "   @ smull r7, pc, r9, r10");
1150     TEST_UNSUPPORTED(__inst_thumb32(0xfb897d0a) "   @ smull r7, sp, r9, r10");
1151     TEST_UNSUPPORTED(__inst_thumb32(0xfb8f780a) "   @ smull r7, r8, pc, r10");
1152     TEST_UNSUPPORTED(__inst_thumb32(0xfb8d780a) "   @ smull r7, r8, sp, r10");
1153     TEST_UNSUPPORTED(__inst_thumb32(0xfb89780f) "   @ smull r7, r8, r9, pc");
1154     TEST_UNSUPPORTED(__inst_thumb32(0xfb89780d) "   @ smull r7, r8, r9, sp");
1155 
1156     TEST_RR(   "umull   r0, r1, r",2, VAL1,", r",3, VAL2,"")
1157     TEST_RR(   "umull   r7, r8, r",9, VAL2,", r",10, VAL1,"")
1158 
1159     TEST_RRRR( "smlal   r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1160     TEST_RRRR( "smlal   r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1161 
1162     TEST_RRRR( "smlalbb r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1163     TEST_RRRR( "smlalbb r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1164     TEST_RRRR( "smlalbt r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1165     TEST_RRRR( "smlalbt r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1166     TEST_RRRR( "smlaltb r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1167     TEST_RRRR( "smlaltb r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1168     TEST_RRRR( "smlaltt r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1169     TEST_RRRR( "smlaltt r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1170 
1171     TEST_RRRR( "smlald  r",0, VAL1,", r",1, VAL2, ", r",0, HH1,", r",1, HH2)
1172     TEST_RRRR( "smlald  r",11,VAL2,", r",10,VAL1, ", r",9, HH2,", r",8, HH1)
1173     TEST_RRRR( "smlaldx r",0, VAL1,", r",1, VAL2, ", r",0, HH1,", r",1, HH2)
1174     TEST_RRRR( "smlaldx r",11,VAL2,", r",10,VAL1, ", r",9, HH2,", r",8, HH1)
1175 
1176     TEST_RRRR( "smlsld  r",0, VAL1,", r",1, VAL2, ", r",0, HH1,", r",1, HH2)
1177     TEST_RRRR( "smlsld  r",11,VAL2,", r",10,VAL1, ", r",9, HH2,", r",8, HH1)
1178     TEST_RRRR( "smlsldx r",0, VAL1,", r",1, VAL2, ", r",0, HH1,", r",1, HH2)
1179     TEST_RRRR( "smlsldx r",11,VAL2,", r",10,VAL1, ", r",9, HH2,", r",8, HH1)
1180 
1181     TEST_RRRR( "umlal   r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1182     TEST_RRRR( "umlal   r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1183     TEST_RRRR( "umaal   r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
1184     TEST_RRRR( "umaal   r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
1185 
1186     TEST_GROUP("Coprocessor instructions")
1187 
1188     TEST_UNSUPPORTED(__inst_thumb32(0xfc000000) "")
1189     TEST_UNSUPPORTED(__inst_thumb32(0xffffffff) "")
1190 
1191     TEST_GROUP("Testing instructions in IT blocks")
1192 
1193     TEST_ITBLOCK("sub.w r0, r0")
1194 
1195     verbose("\n");
1196 }
1197