v6intARM.c revision b32f58018498ea2225959b0ba11c18f0c433deef
1 2/* How to compile: 3 gcc -O -g -Wall -mcpu=cortex-a8 -o testarmv6int testarmv6int.c 4*/ 5 6#include <stdio.h> 7 8/* test macros to generate and output the result of a single instruction */ 9#define TESTINST2(instruction, RMval, RD, RM, carryin) \ 10{ \ 11 unsigned int out; \ 12 unsigned int cpsr; \ 13\ 14 __asm__ volatile( \ 15 "movs %3,%3;" \ 16 "msrne cpsr_f,#(1<<29);" \ 17 "msreq cpsr_f,#0;" \ 18 "mov " #RM ",%2;" \ 19 /* set #RD to 0x55555555 so we can see which parts get overwritten */ \ 20 "mov " #RD ", #0x55" "\n\t" \ 21 "orr " #RD "," #RD "," #RD ", LSL #8" "\n\t" \ 22 "orr " #RD "," #RD "," #RD ", LSL #16" "\n\t" \ 23 instruction ";" \ 24 "mov %0," #RD ";" \ 25 "mrs %1,cpsr;" \ 26 : "=&r" (out), "=&r" (cpsr) \ 27 : "r" (RMval), "r" (carryin) \ 28 : #RD, #RM, "cc", "memory" \ 29 ); \ 30 printf("%s :: rd 0x%08x rm 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 31 instruction, out, RMval, \ 32 carryin ? 1 : 0, \ 33 cpsr & 0xffff0000, \ 34 ((1<<31) & cpsr) ? 'N' : ' ', \ 35 ((1<<30) & cpsr) ? 'Z' : ' ', \ 36 ((1<<29) & cpsr) ? 'C' : ' ', \ 37 ((1<<28) & cpsr) ? 'V' : ' ' \ 38 ); \ 39} 40 41#define TESTINST3(instruction, RMval, RNval, RD, RM, RN, carryin) \ 42{ \ 43 unsigned int out; \ 44 unsigned int cpsr; \ 45\ 46 __asm__ volatile( \ 47 "movs %4,%4;" \ 48 "msrne cpsr_f,#(1<<29);" \ 49 "msreq cpsr_f,#0;" \ 50 "mov " #RM ",%2;" \ 51 "mov " #RN ",%3;" \ 52 instruction ";" \ 53 "mov %0," #RD ";" \ 54 "mrs %1,cpsr;" \ 55 : "=&r" (out), "=&r" (cpsr) \ 56 : "r" (RMval), "r" (RNval), "r" (carryin) \ 57 : #RD, #RM, #RN, "cc", "memory" \ 58 ); \ 59 printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 60 instruction, out, RMval, RNval, \ 61 carryin ? 1 : 0, \ 62 cpsr & 0xffff0000, \ 63 ((1<<31) & cpsr) ? 'N' : ' ', \ 64 ((1<<30) & cpsr) ? 'Z' : ' ', \ 65 ((1<<29) & cpsr) ? 'C' : ' ', \ 66 ((1<<28) & cpsr) ? 'V' : ' ' \ 67 ); \ 68} 69 70#define TESTINST4(instruction, RMval, RNval, RSval, RD, RM, RN, RS, carryin) \ 71{ \ 72 unsigned int out; \ 73 unsigned int cpsr; \ 74\ 75 __asm__ volatile( \ 76 "movs %5,%5;" \ 77 "msrne cpsr_f,#(1<<29);" \ 78 "msreq cpsr_f,#0;" \ 79 "mov " #RM ",%2;" \ 80 "mov " #RN ",%3;" \ 81 "mov " #RS ",%4;" \ 82 instruction ";" \ 83 "mov %0," #RD ";" \ 84 "mrs %1,cpsr;" \ 85 : "=&r" (out), "=&r" (cpsr) \ 86 : "r" (RMval), "r" (RNval), "r" (RSval), "r" (carryin) \ 87 : #RD, #RM, #RN, #RS, "cc", "memory" \ 88 ); \ 89 printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 90 instruction, out, RMval, RNval, RSval, \ 91 carryin ? 1 : 0, \ 92 cpsr & 0xffff0000, \ 93 ((1<<31) & cpsr) ? 'N' : ' ', \ 94 ((1<<30) & cpsr) ? 'Z' : ' ', \ 95 ((1<<29) & cpsr) ? 'C' : ' ', \ 96 ((1<<28) & cpsr) ? 'V' : ' ' \ 97 ); \ 98} 99 100#define TESTINST4_2OUT(instruction, RDval, RD2val, RMval, RSval, RD, RD2, RM, RS, carryin) \ 101{ \ 102 unsigned int out; \ 103 unsigned int out2; \ 104 unsigned int cpsr; \ 105\ 106 __asm__ volatile( \ 107 "movs %7,%7;" \ 108 "msrne cpsr_f,#(1<<29);" \ 109 "msreq cpsr_f,#0;" \ 110 "mov " #RD ",%3;" \ 111 "mov " #RD2 ",%4;" \ 112 "mov " #RM ",%5;" \ 113 "mov " #RS ",%6;" \ 114 instruction ";" \ 115 "mov %0," #RD ";" \ 116 "mov %1," #RD2 ";" \ 117 "mrs %2,cpsr;" \ 118 : "=&r" (out), "=&r" (out2), "=&r" (cpsr) \ 119 : "r" (RDval), "r" (RD2val), "r" (RMval), "r" (RSval), "r" (carryin) \ 120 : #RD, #RD2, #RM, #RS, "cc", "memory" \ 121 ); \ 122 printf("%s :: rd 0x%08x rd2 0x%08x, rm 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 123 instruction, out, out2, RMval, RSval, \ 124 carryin ? 1 : 0, \ 125 cpsr & 0xffff0000, \ 126 ((1<<31) & cpsr) ? 'N' : ' ', \ 127 ((1<<30) & cpsr) ? 'Z' : ' ', \ 128 ((1<<29) & cpsr) ? 'C' : ' ', \ 129 ((1<<28) & cpsr) ? 'V' : ' ' \ 130 ); \ 131} 132 133/* helpers */ 134#define TESTCARRY { int c = 0; for (c = 0; c < 2; c++) { 135#define TESTCARRYEND }} 136 137 138 139 140int main(int argc, char **argv) 141{ 142 143 printf("MOV\n"); 144 TESTINST2("mov r0, r1", 1, r0, r1, 0); 145 TESTINST2("cpy r0, r1", 1, r0, r1, 0); 146 TESTINST2("mov r0, #0", 0, r0, r1, 0); 147 TESTINST2("mov r0, #1", 0, r0, r1, 0); 148 TESTCARRY 149 TESTINST2("movs r0, r1", 1, r0, r1, c); 150 TESTINST2("movs r0, r1", 0, r0, r1, c); 151 TESTINST2("movs r0, r1", 0x80000000, r0, r1, c); 152 TESTINST2("movs r0, #0", 0, r0, r1, c); 153 TESTINST2("movs r0, #1", 0, r0, r1, c); 154 TESTCARRYEND 155 156 printf("MVN\n"); 157 TESTINST2("mvn r0, r1", 1, r0, r1, 0); 158 TESTCARRY 159 TESTINST2("mvns r0, r1", 1, r0, r1, c); 160 TESTINST2("mvns r0, r1", 0, r0, r1, c); 161 TESTINST2("mvns r0, r1", 0x80000000, r0, r1, c); 162 TESTCARRYEND 163 164 printf("ADD\n"); 165 TESTINST3("adds r0, r1, r2", 0, 0, r0, r1, r2, 0); 166 TESTINST3("adds r0, r1, r2", 0, 1, r0, r1, r2, 0); 167 TESTINST3("adds r0, r1, r2", 1, 0, r0, r1, r2, 0); 168 TESTINST3("adds r0, r1, r2", 1, 1, r0, r1, r2, 0); 169 TESTINST3("adds r0, r1, r2", 0, -1, r0, r1, r2, 0); 170 TESTINST3("adds r0, r1, r2", 1, -1, r0, r1, r2, 0); 171 TESTINST3("adds r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, 0); 172 TESTINST3("adds r0, r1, r2", 0x80000000, -1, r0, r1, r2, 0); 173 TESTINST3("adds r0, r1, r2", 0x80000000, 0, r0, r1, r2, 0); 174 175 printf("ADC\n"); 176 TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 0); 177 TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 1); 178 179 printf("LSL\n"); 180 TESTINST3("lsl r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 181 TESTINST3("lsl r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0); 182 TESTINST3("lsl r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0); 183 TESTINST3("lsl r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0); 184 TESTINST3("lsl r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0); 185 TESTINST3("lsl r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0); 186 TESTINST3("lsl r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0); 187 TESTINST3("lsl r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0); 188 TESTINST3("lsl r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0); 189 TESTINST3("lsl r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0); 190 191 TESTINST3("lsl r0, r1, r2", 0x1, 0, r0, r1, r2, 0); 192 TESTINST3("lsl r0, r1, r2", 0x1, 1, r0, r1, r2, 0); 193 TESTINST3("lsl r0, r1, r2", 0x1, 31, r0, r1, r2, 0); 194 TESTINST3("lsl r0, r1, r2", 0x2, 31, r0, r1, r2, 0); 195 196 printf("LSLS\n"); 197 TESTCARRY 198 TESTINST3("lsls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 199 TESTINST3("lsls r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 200 TESTINST3("lsls r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 201 TESTINST3("lsls r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 202 TESTINST3("lsls r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 203 TESTINST3("lsls r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 204 TESTINST3("lsls r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 205 TESTINST3("lsls r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 206 TESTINST3("lsls r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 207 TESTINST3("lsls r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 208 TESTINST3("lsls r0, r1, r2", 0x1, 0, r0, r1, r2, c); 209 TESTINST3("lsls r0, r1, r2", 0x1, 1, r0, r1, r2, c); 210 TESTINST3("lsls r0, r1, r2", 0x1, 31, r0, r1, r2, c); 211 TESTINST3("lsls r0, r1, r2", 0x2, 31, r0, r1, r2, c); 212 TESTCARRYEND 213 214 printf("LSL immediate\n"); 215 TESTCARRY 216 TESTINST2("lsl r0, r1, #0", 0xffffffff, r0, r1, c); 217 TESTINST2("lsl r0, r1, #1", 0xffffffff, r0, r1, c); 218 TESTINST2("lsl r0, r1, #31", 0xffffffff, r0, r1, c); 219 TESTINST2("lsl r0, r1, #0", 0x1, r0, r1, c); 220 TESTINST2("lsl r0, r1, #1", 0x1, r0, r1, c); 221 TESTINST2("lsl r0, r1, #31", 0x1, r0, r1, c); 222 TESTINST2("lsl r0, r1, #31", 0x2, r0, r1, c); 223 TESTCARRYEND 224 225 printf("LSLS immediate\n"); 226 TESTCARRY 227 TESTINST2("lsls r0, r1, #0", 0xffffffff, r0, r1, c); 228 TESTINST2("lsls r0, r1, #1", 0xffffffff, r0, r1, c); 229 TESTINST2("lsls r0, r1, #31", 0xffffffff, r0, r1, c); 230 TESTINST2("lsls r0, r1, #0", 0x1, r0, r1, c); 231 TESTINST2("lsls r0, r1, #1", 0x1, r0, r1, c); 232 TESTINST2("lsls r0, r1, #31", 0x1, r0, r1, c); 233 TESTINST2("lsls r0, r1, #31", 0x2, r0, r1, c); 234 TESTCARRYEND 235 236 printf("LSR\n"); 237 TESTINST3("lsr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 238 TESTINST3("lsr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0); 239 TESTINST3("lsr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0); 240 TESTINST3("lsr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0); 241 TESTINST3("lsr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0); 242 TESTINST3("lsr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0); 243 TESTINST3("lsr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0); 244 TESTINST3("lsr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0); 245 TESTINST3("lsr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0); 246 TESTINST3("lsr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0); 247 248 printf("LSRS\n"); 249 TESTCARRY 250 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 251 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 252 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 253 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 254 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 255 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 256 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 257 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 258 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 259 TESTCARRYEND 260 261 printf("LSR immediate\n"); 262 TESTINST2("lsr r0, r1, #0", 0xffffffff, r0, r1, 0); 263 TESTINST2("lsr r0, r1, #1", 0xffffffff, r0, r1, 0); 264 TESTINST2("lsr r0, r1, #31", 0xffffffff, r0, r1, 0); 265 TESTINST2("lsr r0, r1, #32", 0xffffffff, r0, r1, 0); 266 TESTINST2("lsr r0, r1, #16", 0x00010000, r0, r1, 0); 267 TESTINST2("lsr r0, r1, #17", 0x00010000, r0, r1, 0); 268 TESTINST2("lsr r0, r1, #18", 0x00010000, r0, r1, 0); 269 270 printf("LSRS immediate\n"); 271 TESTCARRY 272 TESTINST2("lsrs r0, r1, #0", 0xffffffff, r0, r1, c); 273 TESTINST2("lsrs r0, r1, #1", 0xffffffff, r0, r1, c); 274 TESTINST2("lsrs r0, r1, #31", 0xffffffff, r0, r1, c); 275 TESTINST2("lsrs r0, r1, #32", 0xffffffff, r0, r1, c); 276 TESTINST2("lsrs r0, r1, #16", 0x00010000, r0, r1, c); 277 TESTINST2("lsrs r0, r1, #17", 0x00010000, r0, r1, c); 278 TESTINST2("lsrs r0, r1, #18", 0x00010000, r0, r1, c); 279 TESTCARRYEND 280 281 printf("ASR\n"); 282 TESTCARRY 283 TESTINST3("asr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 284 TESTINST3("asr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 285 TESTINST3("asr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 286 TESTINST3("asr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 287 TESTINST3("asr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 288 TESTINST3("asr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 289 TESTINST3("asr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 290 TESTINST3("asr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 291 TESTINST3("asr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 292 TESTINST3("asr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 293 TESTINST3("asr r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c); 294 TESTINST3("asr r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c); 295 TESTINST3("asr r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c); 296 TESTINST3("asr r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c); 297 TESTINST3("asr r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c); 298 TESTINST3("asr r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c); 299 TESTINST3("asr r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c); 300 TESTINST3("asr r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c); 301 TESTINST3("asr r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c); 302 TESTINST3("asr r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c); 303 TESTCARRYEND 304 305 printf("ASRS\n"); 306 TESTCARRY 307 TESTINST3("asrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 308 TESTINST3("asrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 309 TESTINST3("asrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 310 TESTINST3("asrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 311 TESTINST3("asrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 312 TESTINST3("asrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 313 TESTINST3("asrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 314 TESTINST3("asrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 315 TESTINST3("asrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 316 TESTINST3("asrs r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 317 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c); 318 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c); 319 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c); 320 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c); 321 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c); 322 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c); 323 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c); 324 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c); 325 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c); 326 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c); 327 TESTCARRYEND 328 329 TESTCARRY 330 TESTINST3("asrs r0, r1, r2", 0x8, 0, r0, r1, r2, c); 331 TESTINST3("asrs r0, r1, r2", 0x8, 1, r0, r1, r2, c); 332 TESTINST3("asrs r0, r1, r2", 0x8, 2, r0, r1, r2, c); 333 TESTINST3("asrs r0, r1, r2", 0x8, 3, r0, r1, r2, c); 334 TESTINST3("asrs r0, r1, r2", 0x8, 4, r0, r1, r2, c); 335 TESTINST3("asrs r0, r1, r2", 0x8, 5, r0, r1, r2, c); 336 TESTCARRYEND 337 338 TESTINST3("asrs r0, r1, r2", 0x80000001, 1, r0, r1, r2, 0); 339 TESTINST3("asrs r0, r1, r2", 0x80000001, 2, r0, r1, r2, 0); 340 341 printf("ASR immediate\n"); 342 TESTINST2("asr r0, r1, #0", 0xffffffff, r0, r1, 0); 343 TESTINST2("asr r0, r1, #1", 0xffffffff, r0, r1, 0); 344 TESTINST2("asr r0, r1, #31", 0xffffffff, r0, r1, 0); 345 TESTINST2("asr r0, r1, #32", 0xffffffff, r0, r1, 0); 346 TESTINST2("asr r0, r1, #0", 0x7fffffff, r0, r1, 0); 347 TESTINST2("asr r0, r1, #1", 0x7fffffff, r0, r1, 0); 348 TESTINST2("asr r0, r1, #31", 0x7fffffff, r0, r1, 0); 349 TESTINST2("asr r0, r1, #32", 0x7fffffff, r0, r1, 0); 350 TESTINST2("asr r0, r1, #16", 0x00010000, r0, r1, 0); 351 TESTINST2("asr r0, r1, #17", 0x00010000, r0, r1, 0); 352 TESTINST2("asr r0, r1, #18", 0x00010000, r0, r1, 0); 353 354 printf("ASRS immediate\n"); 355 TESTCARRY 356 TESTINST2("asrs r0, r1, #0", 0xffffffff, r0, r1, c); 357 TESTINST2("asrs r0, r1, #1", 0xffffffff, r0, r1, c); 358 TESTINST2("asrs r0, r1, #31", 0xffffffff, r0, r1, c); 359 TESTINST2("asrs r0, r1, #32", 0xffffffff, r0, r1, c); 360 TESTINST2("asrs r0, r1, #0", 0x7fffffff, r0, r1, c); 361 TESTINST2("asrs r0, r1, #1", 0x7fffffff, r0, r1, c); 362 TESTINST2("asrs r0, r1, #31", 0x7fffffff, r0, r1, c); 363 TESTINST2("asrs r0, r1, #32", 0x7fffffff, r0, r1, c); 364 TESTINST2("asrs r0, r1, #16", 0x00010000, r0, r1, c); 365 TESTINST2("asrs r0, r1, #17", 0x00010000, r0, r1, c); 366 TESTINST2("asrs r0, r1, #18", 0x00010000, r0, r1, c); 367 TESTCARRYEND 368 369 printf("ROR\n"); 370 TESTCARRY 371 TESTINST3("ror r0, r1, r2", 0x00088000, 0, r0, r1, r2, c); 372 TESTINST3("ror r0, r1, r2", 0x80088000, 1, r0, r1, r2, c); 373 TESTINST3("ror r0, r1, r2", 0x00088000, 1, r0, r1, r2, c); 374 TESTINST3("ror r0, r1, r2", 0x00088000, 2, r0, r1, r2, c); 375 TESTINST3("ror r0, r1, r2", 0x00088000, 31, r0, r1, r2, c); 376 TESTINST3("ror r0, r1, r2", 0x00088000, 32, r0, r1, r2, c); 377 TESTINST3("ror r0, r1, r2", 0x00088000, 33, r0, r1, r2, c); 378 TESTINST3("ror r0, r1, r2", 0x00088000, 63, r0, r1, r2, c); 379 TESTINST3("ror r0, r1, r2", 0x00088000, 64, r0, r1, r2, c); 380 TESTINST3("ror r0, r1, r2", 0x00088000, 255, r0, r1, r2, c); 381 TESTINST3("ror r0, r1, r2", 0x00088000, 256, r0, r1, r2, c); 382 TESTINST3("ror r0, r1, r2", 0x80088000, 256, r0, r1, r2, c); 383 TESTINST3("ror r0, r1, r2", 0x00088000, 257, r0, r1, r2, c); 384 TESTCARRYEND 385 386 printf("RORS\n"); 387 TESTCARRY 388 TESTINST3("rors r0, r1, r2", 0x00088000, 0, r0, r1, r2, c); 389 TESTINST3("rors r0, r1, r2", 0x80088000, 0, r0, r1, r2, c); 390 TESTINST3("rors r0, r1, r2", 0x00088000, 1, r0, r1, r2, c); 391 TESTINST3("rors r0, r1, r2", 0x00088000, 2, r0, r1, r2, c); 392 TESTINST3("rors r0, r1, r2", 0x00088000, 31, r0, r1, r2, c); 393 TESTINST3("rors r0, r1, r2", 0x00088000, 32, r0, r1, r2, c); 394 TESTINST3("rors r0, r1, r2", 0x00088000, 33, r0, r1, r2, c); 395 TESTINST3("rors r0, r1, r2", 0x00088000, 63, r0, r1, r2, c); 396 TESTINST3("rors r0, r1, r2", 0x00088000, 64, r0, r1, r2, c); 397 TESTINST3("rors r0, r1, r2", 0x00088000, 255, r0, r1, r2, c); 398 TESTINST3("rors r0, r1, r2", 0x00088000, 256, r0, r1, r2, c); 399 TESTINST3("rors r0, r1, r2", 0x80088000, 256, r0, r1, r2, c); 400 TESTINST3("rors r0, r1, r2", 0x00088000, 257, r0, r1, r2, c); 401 TESTCARRYEND 402 403 printf("ROR immediate\n"); 404 TESTCARRY 405 TESTINST2("ror r0, r1, #0", 0x00088000, r0, r1, c); 406 TESTINST2("ror r0, r1, #1", 0x00088000, r0, r1, c); 407 TESTINST2("ror r0, r1, #31", 0x00088000, r0, r1, c); 408 TESTINST2("ror r0, r1, #16", 0x00010000, r0, r1, c); 409 TESTINST2("ror r0, r1, #17", 0x00010000, r0, r1, c); 410 TESTINST2("ror r0, r1, #18", 0x00010000, r0, r1, c); 411 TESTCARRYEND 412 413 printf("RORS immediate\n"); 414 TESTCARRY 415 TESTINST2("rors r0, r1, #0", 0x00088000, r0, r1, c); 416 TESTINST2("rors r0, r1, #1", 0x00088000, r0, r1, c); 417 TESTINST2("rors r0, r1, #31", 0x00088000, r0, r1, c); 418 TESTINST2("rors r0, r1, #16", 0x00010000, r0, r1, c); 419 TESTINST2("rors r0, r1, #17", 0x00010000, r0, r1, c); 420 TESTINST2("rors r0, r1, #18", 0x00010000, r0, r1, c); 421 TESTCARRYEND 422 423 printf("shift with barrel shifter\n"); 424 TESTCARRY 425 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 426 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 427 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 428 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 429 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 430 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 431 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 432 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 433 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 434 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 435 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 436 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 437 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 0, r0, r1, r2, r3, c); 438 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 1, r0, r1, r2, r3, c); 439 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 31, r0, r1, r2, r3, c); 440 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 32, r0, r1, r2, r3, c); 441 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 255, r0, r1, r2, r3, c); 442 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 256, r0, r1, r2, r3, c); 443 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 444 TESTCARRYEND 445 446 TESTCARRY 447 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 0, r0, r1, r2, r3, c); 448 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 1, r0, r1, r2, r3, c); 449 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 2, r0, r1, r2, r3, c); 450 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 3, r0, r1, r2, r3, c); 451 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 4, r0, r1, r2, r3, c); 452 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 5, r0, r1, r2, r3, c); 453 TESTCARRYEND 454 455 TESTCARRY 456 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c); 457 TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c); 458 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c); 459 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c); 460 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c); 461 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c); 462 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c); 463 TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c); 464 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c); 465 TESTCARRYEND 466 467 TESTCARRY 468 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 469 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 470 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 471 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 472 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 473 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 474 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 475 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 476 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 477 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 478 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 479 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 480 481 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c); 482 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c); 483 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c); 484 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c); 485 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c); 486 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c); 487 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c); 488 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c); 489 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c); 490 TESTCARRYEND 491 492 TESTCARRY 493 TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 494 TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 495 TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 496 TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 497 TESTCARRYEND 498 499 printf("MUL\n"); 500 TESTINST3("mul r0, r1, r2", 0, 0, r0, r1, r2, 0); 501 TESTINST3("mul r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 502 TESTINST3("mul r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0); 503 TESTINST3("mul r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0); 504 TESTINST3("mul r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0); 505 TESTINST3("mul r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0); 506 507 printf("MULS\n"); 508 TESTINST3("muls r0, r1, r2", 0, 0, r0, r1, r2, 0); 509 TESTINST3("muls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 510 TESTINST3("muls r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0); 511 TESTINST3("muls r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0); 512 TESTINST3("muls r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0); 513 TESTINST3("muls r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0); 514 515 printf("MLA\n"); 516 TESTINST4("mla r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 517 TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 518 TESTINST4("mla r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 519 TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 520 TESTINST4("mla r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 521 TESTINST4("mla r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 522 523 printf("MLAS\n"); 524 TESTINST4("mlas r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 525 TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 526 TESTINST4("mlas r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 527 TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 528 TESTINST4("mlas r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 529 TESTINST4("mlas r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 530 531 printf("MLS\n"); 532 TESTINST4("mls r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 533 TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 534 TESTINST4("mls r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 535 TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 536 TESTINST4("mls r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 537 TESTINST4("mls r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 538 539 printf("UMULL\n"); 540 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 541 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 542 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 543 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 544 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 545 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 546 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 547 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 548 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 549 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 550 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 551 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 552 553 printf("SMULL\n"); 554 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 555 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 556 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 557 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 558 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 559 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 560 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 561 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 562 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 563 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 564 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 565 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 566 567 printf("UMLAL\n"); 568 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 569 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 570 TESTINST4_2OUT("umlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 571 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 572 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 573 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 574 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 575 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 576 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 577 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 578 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 579 TESTINST4_2OUT("umlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 580 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 581 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 582 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 583 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 584 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 585 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 586 587 printf("SMLAL\n"); 588 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 589 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 590 TESTINST4_2OUT("smlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 591 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 592 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 593 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 594 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 595 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 596 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 597 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 598 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 599 TESTINST4_2OUT("smlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 600 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 601 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 602 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 603 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 604 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 605 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 606 607 printf("CLZ\n"); 608 TESTCARRY 609 TESTINST2("clz r0, r1", 0, r0, r1, c); 610 TESTINST2("clz r0, r1", 1, r0, r1, c); 611 TESTINST2("clz r0, r1", 0x10, r0, r1, c); 612 TESTINST2("clz r0, r1", 0xffffffff, r0, r1, c); 613 TESTCARRYEND 614 615 printf("extend instructions\n"); 616 TESTINST2("uxtb r0, r1", 0, r0, r1, 0); 617 TESTINST2("uxtb r0, r1", 1, r0, r1, 0); 618 TESTINST2("uxtb r0, r1", 0xff, r0, r1, 0); 619 TESTINST2("uxtb r0, r1", 0xffffffff, r0, r1, 0); 620 TESTINST2("sxtb r0, r1", 0, r0, r1, 0); 621 TESTINST2("sxtb r0, r1", 1, r0, r1, 0); 622 TESTINST2("sxtb r0, r1", 0xff, r0, r1, 0); 623 TESTINST2("sxtb r0, r1", 0xffffffff, r0, r1, 0); 624 625 TESTINST2("uxth r0, r1", 0, r0, r1, 0); 626 TESTINST2("uxth r0, r1", 1, r0, r1, 0); 627 TESTINST2("uxth r0, r1", 0xffff, r0, r1, 0); 628 TESTINST2("uxth r0, r1", 0xffffffff, r0, r1, 0); 629 TESTINST2("sxth r0, r1", 0, r0, r1, 0); 630 TESTINST2("sxth r0, r1", 1, r0, r1, 0); 631 TESTINST2("sxth r0, r1", 0x7fff, r0, r1, 0); 632 TESTINST2("sxth r0, r1", 0xffff, r0, r1, 0); 633 TESTINST2("sxth r0, r1", 0x10ffff, r0, r1, 0); 634 TESTINST2("sxth r0, r1", 0x107fff, r0, r1, 0); 635 TESTINST2("sxth r0, r1", 0xffffffff, r0, r1, 0); 636 637 TESTINST2("uxtb r0, r1, ror #0", 0x000000ff, r0, r1, 0); 638 TESTINST2("uxtb r0, r1, ror #8", 0x000000ff, r0, r1, 0); 639 TESTINST2("uxtb r0, r1, ror #8", 0x0000ff00, r0, r1, 0); 640 TESTINST2("uxtb r0, r1, ror #16", 0x00ff0000, r0, r1, 0); 641 TESTINST2("uxtb r0, r1, ror #24", 0xff000000, r0, r1, 0); 642 643 TESTINST2("uxtb16 r0, r1", 0xffffffff, r0, r1, 0); 644 TESTINST2("uxtb16 r0, r1, ror #16", 0x0000ffff, r0, r1, 0); 645 TESTINST2("sxtb16 r0, r1", 0xffffffff, r0, r1, 0); 646 TESTINST2("sxtb16 r0, r1", 0x00ff00ff, r0, r1, 0); 647 TESTINST2("sxtb16 r0, r1", 0x007f007f, r0, r1, 0); 648 649 printf("------------ BFI ------------\n"); 650 651 /* bfi rDst, rSrc, #lsb-in-dst, #number-of-bits-to-copy */ 652 TESTINST2("bfi r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 653 TESTINST2("bfi r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 654 TESTINST2("bfi r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 655 656 TESTINST2("bfi r0, r1, #19, #11", 0xFFFFFFFF, r0, r1, 0); 657 TESTINST2("bfi r0, r1, #20, #11", 0xFFFFFFFF, r0, r1, 0); 658 TESTINST2("bfi r0, r1, #21, #11", 0xFFFFFFFF, r0, r1, 0); 659 660 TESTINST2("bfi r0, r1, #0, #32", 0xFFFFFFFF, r0, r1, 0); 661 TESTINST2("bfi r0, r1, #1, #31", 0xFFFFFFFF, r0, r1, 0); 662 663 TESTINST2("bfi r0, r1, #29, #3", 0xFFFFFFFF, r0, r1, 0); 664 TESTINST2("bfi r0, r1, #30, #2", 0xFFFFFFFF, r0, r1, 0); 665 TESTINST2("bfi r0, r1, #31, #1", 0xFFFFFFFF, r0, r1, 0); 666 667 printf("------------ BFC ------------\n"); 668 669 /* bfi rDst, #lsb-in-dst, #number-of-bits-to-copy */ 670 TESTINST2("bfc r0, #0, #11", 0xAAAAAAAA, r0, r1, 0); 671 TESTINST2("bfc r0, #1, #11", 0xAAAAAAAA, r0, r1, 0); 672 TESTINST2("bfc r0, #2, #11", 0xAAAAAAAA, r0, r1, 0); 673 674 TESTINST2("bfc r0, #19, #11", 0xFFFFFFFF, r0, r1, 0); 675 TESTINST2("bfc r0, #20, #11", 0xFFFFFFFF, r0, r1, 0); 676 TESTINST2("bfc r0, #21, #11", 0xFFFFFFFF, r0, r1, 0); 677 678 TESTINST2("bfc r0, #0, #32", 0xFFFFFFFF, r0, r1, 0); 679 TESTINST2("bfc r0, #1, #31", 0xFFFFFFFF, r0, r1, 0); 680 681 TESTINST2("bfc r0, #29, #3", 0xFFFFFFFF, r0, r1, 0); 682 TESTINST2("bfc r0, #30, #2", 0xFFFFFFFF, r0, r1, 0); 683 TESTINST2("bfc r0, #31, #1", 0xFFFFFFFF, r0, r1, 0); 684 685 printf("------------ SBFX ------------\n"); 686 687 /* sbfx rDst, rSrc, #lsb, #width */ 688 TESTINST2("sbfx r0, r1, #0, #1", 0x00000000, r0, r1, 0); 689 TESTINST2("sbfx r0, r1, #0, #1", 0x00000001, r0, r1, 0); 690 TESTINST2("sbfx r0, r1, #1, #1", 0x00000000, r0, r1, 0); 691 TESTINST2("sbfx r0, r1, #1, #1", 0x00000001, r0, r1, 0); 692 TESTINST2("sbfx r0, r1, #1, #1", 0x00000002, r0, r1, 0); 693 TESTINST2("sbfx r0, r1, #1, #1", 0x00000003, r0, r1, 0); 694 695 TESTINST2("sbfx r0, r1, #0, #2", 0x00000000, r0, r1, 0); 696 TESTINST2("sbfx r0, r1, #0, #2", 0x00000001, r0, r1, 0); 697 TESTINST2("sbfx r0, r1, #1, #2", 0x00000000, r0, r1, 0); 698 TESTINST2("sbfx r0, r1, #1, #2", 0x00000001, r0, r1, 0); 699 TESTINST2("sbfx r0, r1, #1, #2", 0x00000002, r0, r1, 0); 700 TESTINST2("sbfx r0, r1, #1, #2", 0x00000003, r0, r1, 0); 701 702 TESTINST2("sbfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 703 TESTINST2("sbfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 704 TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 705 706 TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 707 708 TESTINST2("sbfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0); 709 TESTINST2("sbfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0); 710 711 printf("------------ UBFX ------------\n"); 712 713 /* ubfx rDst, rSrc, #lsb, #width */ 714 TESTINST2("ubfx r0, r1, #0, #1", 0x00000000, r0, r1, 0); 715 TESTINST2("ubfx r0, r1, #0, #1", 0x00000001, r0, r1, 0); 716 TESTINST2("ubfx r0, r1, #1, #1", 0x00000000, r0, r1, 0); 717 TESTINST2("ubfx r0, r1, #1, #1", 0x00000001, r0, r1, 0); 718 TESTINST2("ubfx r0, r1, #1, #1", 0x00000002, r0, r1, 0); 719 TESTINST2("ubfx r0, r1, #1, #1", 0x00000003, r0, r1, 0); 720 721 TESTINST2("ubfx r0, r1, #0, #2", 0x00000000, r0, r1, 0); 722 TESTINST2("ubfx r0, r1, #0, #2", 0x00000001, r0, r1, 0); 723 TESTINST2("ubfx r0, r1, #1, #2", 0x00000000, r0, r1, 0); 724 TESTINST2("ubfx r0, r1, #1, #2", 0x00000001, r0, r1, 0); 725 TESTINST2("ubfx r0, r1, #1, #2", 0x00000002, r0, r1, 0); 726 TESTINST2("ubfx r0, r1, #1, #2", 0x00000003, r0, r1, 0); 727 728 TESTINST2("ubfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 729 TESTINST2("ubfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 730 TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 731 732 TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 733 734 TESTINST2("ubfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0); 735 TESTINST2("ubfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0); 736 737 printf("------------ SMULL{B,T}{B,T} ------------\n"); 738 /* SMULxx rD, rN, rM */ 739 740 TESTINST3("smulbb r0, r1, r2", 0x00030000, 0x00040000, r0, r1, r2, 0); 741 TESTINST3("smulbb r0, r1, r2", 0x00030001, 0x00040002, r0, r1, r2, 0); 742 TESTINST3("smulbb r0, r1, r2", 0x00038001, 0x00047fff, r0, r1, r2, 0); 743 TESTINST3("smulbb r0, r1, r2", 0x00037fff, 0x00047fff, r0, r1, r2, 0); 744 TESTINST3("smulbb r0, r1, r2", 0x0003ffff, 0x0004ffff, r0, r1, r2, 0); 745 746 printf("------------ SXTAB ------------\n"); 747 TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 748 r0, r1, r2, 0); 749 TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 750 r0, r1, r2, 0); 751 TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819, 752 r0, r1, r2, 0); 753 TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819, 754 r0, r1, r2, 0); 755 756 TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899, 757 r0, r1, r2, 0); 758 TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899, 759 r0, r1, r2, 0); 760 TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899, 761 r0, r1, r2, 0); 762 TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899, 763 r0, r1, r2, 0); 764 765 printf("------------ UXTAB ------------\n"); 766 TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 767 r0, r1, r2, 0); 768 TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 769 r0, r1, r2, 0); 770 TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819, 771 r0, r1, r2, 0); 772 TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819, 773 r0, r1, r2, 0); 774 775 TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899, 776 r0, r1, r2, 0); 777 TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899, 778 r0, r1, r2, 0); 779 TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899, 780 r0, r1, r2, 0); 781 TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899, 782 r0, r1, r2, 0); 783 784 printf("------------ SXTAH ------------\n"); 785 TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 786 r0, r1, r2, 0); 787 TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 788 r0, r1, r2, 0); 789 TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819, 790 r0, r1, r2, 0); 791 TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819, 792 r0, r1, r2, 0); 793 794 TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819, 795 r0, r1, r2, 0); 796 TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819, 797 r0, r1, r2, 0); 798 TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819, 799 r0, r1, r2, 0); 800 TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819, 801 r0, r1, r2, 0); 802 803 printf("------------ UXTAH ------------\n"); 804 TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 805 r0, r1, r2, 0); 806 TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 807 r0, r1, r2, 0); 808 TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819, 809 r0, r1, r2, 0); 810 TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819, 811 r0, r1, r2, 0); 812 813 TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819, 814 r0, r1, r2, 0); 815 TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819, 816 r0, r1, r2, 0); 817 TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819, 818 r0, r1, r2, 0); 819 TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819, 820 r0, r1, r2, 0); 821 822 printf("------------ PLD/PLDW (begin) ------------\n"); 823 /* These don't have any effect on the architected state, so, 824 uh, there's no result values to check. Just _do_ some of 825 them and check Valgrind's instruction decoder eats them up 826 without complaining. */ 827 { int alocal; 828 printf("pld reg +/- imm12 cases\n"); 829 __asm__ __volatile__( "pld [%0, #128]" : :/*in*/"r"(&alocal) ); 830 __asm__ __volatile__( "pld [%0, #-128]" : :/*in*/"r"(&alocal) ); 831 __asm__ __volatile__( "pld [r15, #-128]" : :/*in*/"r"(&alocal) ); 832 833 // apparently pldw is v7 only 834 //__asm__ __volatile__( "pldw [%0, #128]" : :/*in*/"r"(&alocal) ); 835 //__asm__ __volatile__( "pldw [%0, #-128]" : :/*in*/"r"(&alocal) ); 836 //__asm__ __volatile__( "pldw [r15, #128]" : :/*in*/"r"(&alocal) ); 837 838 printf("pld reg +/- shifted reg cases\n"); 839 __asm__ __volatile__( "pld [%0, %1]" : : /*in*/"r"(&alocal), "r"(0) ); 840 __asm__ __volatile__( "pld [%0, %1, LSL #1]" : : /*in*/"r"(&alocal), "r"(0) ); 841 __asm__ __volatile__( "pld [%0, %1, LSR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 842 __asm__ __volatile__( "pld [%0, %1, ASR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 843 __asm__ __volatile__( "pld [%0, %1, ROR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 844 __asm__ __volatile__( "pld [%0, %1, RRX]" : : /*in*/"r"(&alocal), "r"(0) ); 845 } 846 printf("------------ PLD/PLDW (done) ------------\n"); 847 848 849 return 0; 850} 851 852/* How to compile: 853 gcc -O -g -Wall -mcpu=cortex-a8 -o testarmv6int testarmv6int.c 854*/ 855 856#include <stdio.h> 857 858/* test macros to generate and output the result of a single instruction */ 859#define TESTINST2(instruction, RMval, RD, RM, carryin) \ 860{ \ 861 unsigned int out; \ 862 unsigned int cpsr; \ 863\ 864 __asm__ volatile( \ 865 "movs %3,%3;" \ 866 "msrne cpsr_f,#(1<<29);" \ 867 "msreq cpsr_f,#0;" \ 868 "mov " #RM ",%2;" \ 869 /* set #RD to 0x55555555 so we can see which parts get overwritten */ \ 870 "mov " #RD ", #0x55" "\n\t" \ 871 "orr " #RD "," #RD "," #RD ", LSL #8" "\n\t" \ 872 "orr " #RD "," #RD "," #RD ", LSL #16" "\n\t" \ 873 instruction ";" \ 874 "mov %0," #RD ";" \ 875 "mrs %1,cpsr;" \ 876 : "=&r" (out), "=&r" (cpsr) \ 877 : "r" (RMval), "r" (carryin) \ 878 : #RD, #RM, "cc", "memory" \ 879 ); \ 880 printf("%s :: rd 0x%08x rm 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 881 instruction, out, RMval, \ 882 carryin ? 1 : 0, \ 883 cpsr & 0xffff0000, \ 884 ((1<<31) & cpsr) ? 'N' : ' ', \ 885 ((1<<30) & cpsr) ? 'Z' : ' ', \ 886 ((1<<29) & cpsr) ? 'C' : ' ', \ 887 ((1<<28) & cpsr) ? 'V' : ' ' \ 888 ); \ 889} 890 891#define TESTINST3(instruction, RMval, RNval, RD, RM, RN, carryin) \ 892{ \ 893 unsigned int out; \ 894 unsigned int cpsr; \ 895\ 896 __asm__ volatile( \ 897 "movs %4,%4;" \ 898 "msrne cpsr_f,#(1<<29);" \ 899 "msreq cpsr_f,#0;" \ 900 "mov " #RM ",%2;" \ 901 "mov " #RN ",%3;" \ 902 instruction ";" \ 903 "mov %0," #RD ";" \ 904 "mrs %1,cpsr;" \ 905 : "=&r" (out), "=&r" (cpsr) \ 906 : "r" (RMval), "r" (RNval), "r" (carryin) \ 907 : #RD, #RM, #RN, "cc", "memory" \ 908 ); \ 909 printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 910 instruction, out, RMval, RNval, \ 911 carryin ? 1 : 0, \ 912 cpsr & 0xffff0000, \ 913 ((1<<31) & cpsr) ? 'N' : ' ', \ 914 ((1<<30) & cpsr) ? 'Z' : ' ', \ 915 ((1<<29) & cpsr) ? 'C' : ' ', \ 916 ((1<<28) & cpsr) ? 'V' : ' ' \ 917 ); \ 918} 919 920#define TESTINST4(instruction, RMval, RNval, RSval, RD, RM, RN, RS, carryin) \ 921{ \ 922 unsigned int out; \ 923 unsigned int cpsr; \ 924\ 925 __asm__ volatile( \ 926 "movs %5,%5;" \ 927 "msrne cpsr_f,#(1<<29);" \ 928 "msreq cpsr_f,#0;" \ 929 "mov " #RM ",%2;" \ 930 "mov " #RN ",%3;" \ 931 "mov " #RS ",%4;" \ 932 instruction ";" \ 933 "mov %0," #RD ";" \ 934 "mrs %1,cpsr;" \ 935 : "=&r" (out), "=&r" (cpsr) \ 936 : "r" (RMval), "r" (RNval), "r" (RSval), "r" (carryin) \ 937 : #RD, #RM, #RN, #RS, "cc", "memory" \ 938 ); \ 939 printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 940 instruction, out, RMval, RNval, RSval, \ 941 carryin ? 1 : 0, \ 942 cpsr & 0xffff0000, \ 943 ((1<<31) & cpsr) ? 'N' : ' ', \ 944 ((1<<30) & cpsr) ? 'Z' : ' ', \ 945 ((1<<29) & cpsr) ? 'C' : ' ', \ 946 ((1<<28) & cpsr) ? 'V' : ' ' \ 947 ); \ 948} 949 950#define TESTINST4_2OUT(instruction, RDval, RD2val, RMval, RSval, RD, RD2, RM, RS, carryin) \ 951{ \ 952 unsigned int out; \ 953 unsigned int out2; \ 954 unsigned int cpsr; \ 955\ 956 __asm__ volatile( \ 957 "movs %7,%7;" \ 958 "msrne cpsr_f,#(1<<29);" \ 959 "msreq cpsr_f,#0;" \ 960 "mov " #RD ",%3;" \ 961 "mov " #RD2 ",%4;" \ 962 "mov " #RM ",%5;" \ 963 "mov " #RS ",%6;" \ 964 instruction ";" \ 965 "mov %0," #RD ";" \ 966 "mov %1," #RD2 ";" \ 967 "mrs %2,cpsr;" \ 968 : "=&r" (out), "=&r" (out2), "=&r" (cpsr) \ 969 : "r" (RDval), "r" (RD2val), "r" (RMval), "r" (RSval), "r" (carryin) \ 970 : #RD, #RD2, #RM, #RS, "cc", "memory" \ 971 ); \ 972 printf("%s :: rd 0x%08x rd2 0x%08x, rm 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \ 973 instruction, out, out2, RMval, RSval, \ 974 carryin ? 1 : 0, \ 975 cpsr & 0xffff0000, \ 976 ((1<<31) & cpsr) ? 'N' : ' ', \ 977 ((1<<30) & cpsr) ? 'Z' : ' ', \ 978 ((1<<29) & cpsr) ? 'C' : ' ', \ 979 ((1<<28) & cpsr) ? 'V' : ' ' \ 980 ); \ 981} 982 983/* helpers */ 984#define TESTCARRY { int c = 0; for (c = 0; c < 2; c++) { 985#define TESTCARRYEND }} 986 987 988 989 990int main(int argc, char **argv) 991{ 992 993 printf("MOV\n"); 994 TESTINST2("mov r0, r1", 1, r0, r1, 0); 995 TESTINST2("cpy r0, r1", 1, r0, r1, 0); 996 TESTINST2("mov r0, #0", 0, r0, r1, 0); 997 TESTINST2("mov r0, #1", 0, r0, r1, 0); 998 TESTCARRY 999 TESTINST2("movs r0, r1", 1, r0, r1, c); 1000 TESTINST2("movs r0, r1", 0, r0, r1, c); 1001 TESTINST2("movs r0, r1", 0x80000000, r0, r1, c); 1002 TESTINST2("movs r0, #0", 0, r0, r1, c); 1003 TESTINST2("movs r0, #1", 0, r0, r1, c); 1004 TESTCARRYEND 1005 1006 printf("MVN\n"); 1007 TESTINST2("mvn r0, r1", 1, r0, r1, 0); 1008 TESTCARRY 1009 TESTINST2("mvns r0, r1", 1, r0, r1, c); 1010 TESTINST2("mvns r0, r1", 0, r0, r1, c); 1011 TESTINST2("mvns r0, r1", 0x80000000, r0, r1, c); 1012 TESTCARRYEND 1013 1014 printf("ADD\n"); 1015 TESTINST3("adds r0, r1, r2", 0, 0, r0, r1, r2, 0); 1016 TESTINST3("adds r0, r1, r2", 0, 1, r0, r1, r2, 0); 1017 TESTINST3("adds r0, r1, r2", 1, 0, r0, r1, r2, 0); 1018 TESTINST3("adds r0, r1, r2", 1, 1, r0, r1, r2, 0); 1019 TESTINST3("adds r0, r1, r2", 0, -1, r0, r1, r2, 0); 1020 TESTINST3("adds r0, r1, r2", 1, -1, r0, r1, r2, 0); 1021 TESTINST3("adds r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, 0); 1022 TESTINST3("adds r0, r1, r2", 0x80000000, -1, r0, r1, r2, 0); 1023 TESTINST3("adds r0, r1, r2", 0x80000000, 0, r0, r1, r2, 0); 1024 1025 printf("ADC\n"); 1026 TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 0); 1027 TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 1); 1028 1029 printf("LSL\n"); 1030 TESTINST3("lsl r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 1031 TESTINST3("lsl r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0); 1032 TESTINST3("lsl r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0); 1033 TESTINST3("lsl r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0); 1034 TESTINST3("lsl r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0); 1035 TESTINST3("lsl r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0); 1036 TESTINST3("lsl r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0); 1037 TESTINST3("lsl r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0); 1038 TESTINST3("lsl r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0); 1039 TESTINST3("lsl r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0); 1040 1041 TESTINST3("lsl r0, r1, r2", 0x1, 0, r0, r1, r2, 0); 1042 TESTINST3("lsl r0, r1, r2", 0x1, 1, r0, r1, r2, 0); 1043 TESTINST3("lsl r0, r1, r2", 0x1, 31, r0, r1, r2, 0); 1044 TESTINST3("lsl r0, r1, r2", 0x2, 31, r0, r1, r2, 0); 1045 1046 printf("LSLS\n"); 1047 TESTCARRY 1048 TESTINST3("lsls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 1049 TESTINST3("lsls r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 1050 TESTINST3("lsls r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 1051 TESTINST3("lsls r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 1052 TESTINST3("lsls r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 1053 TESTINST3("lsls r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 1054 TESTINST3("lsls r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 1055 TESTINST3("lsls r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 1056 TESTINST3("lsls r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 1057 TESTINST3("lsls r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 1058 TESTINST3("lsls r0, r1, r2", 0x1, 0, r0, r1, r2, c); 1059 TESTINST3("lsls r0, r1, r2", 0x1, 1, r0, r1, r2, c); 1060 TESTINST3("lsls r0, r1, r2", 0x1, 31, r0, r1, r2, c); 1061 TESTINST3("lsls r0, r1, r2", 0x2, 31, r0, r1, r2, c); 1062 TESTCARRYEND 1063 1064 printf("LSL immediate\n"); 1065 TESTCARRY 1066 TESTINST2("lsl r0, r1, #0", 0xffffffff, r0, r1, c); 1067 TESTINST2("lsl r0, r1, #1", 0xffffffff, r0, r1, c); 1068 TESTINST2("lsl r0, r1, #31", 0xffffffff, r0, r1, c); 1069 TESTINST2("lsl r0, r1, #0", 0x1, r0, r1, c); 1070 TESTINST2("lsl r0, r1, #1", 0x1, r0, r1, c); 1071 TESTINST2("lsl r0, r1, #31", 0x1, r0, r1, c); 1072 TESTINST2("lsl r0, r1, #31", 0x2, r0, r1, c); 1073 TESTCARRYEND 1074 1075 printf("LSLS immediate\n"); 1076 TESTCARRY 1077 TESTINST2("lsls r0, r1, #0", 0xffffffff, r0, r1, c); 1078 TESTINST2("lsls r0, r1, #1", 0xffffffff, r0, r1, c); 1079 TESTINST2("lsls r0, r1, #31", 0xffffffff, r0, r1, c); 1080 TESTINST2("lsls r0, r1, #0", 0x1, r0, r1, c); 1081 TESTINST2("lsls r0, r1, #1", 0x1, r0, r1, c); 1082 TESTINST2("lsls r0, r1, #31", 0x1, r0, r1, c); 1083 TESTINST2("lsls r0, r1, #31", 0x2, r0, r1, c); 1084 TESTCARRYEND 1085 1086 printf("LSR\n"); 1087 TESTINST3("lsr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 1088 TESTINST3("lsr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0); 1089 TESTINST3("lsr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0); 1090 TESTINST3("lsr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0); 1091 TESTINST3("lsr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0); 1092 TESTINST3("lsr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0); 1093 TESTINST3("lsr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0); 1094 TESTINST3("lsr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0); 1095 TESTINST3("lsr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0); 1096 TESTINST3("lsr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0); 1097 1098 printf("LSRS\n"); 1099 TESTCARRY 1100 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 1101 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 1102 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 1103 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 1104 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 1105 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 1106 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 1107 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 1108 TESTINST3("lsrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 1109 TESTCARRYEND 1110 1111 printf("LSR immediate\n"); 1112 TESTINST2("lsr r0, r1, #0", 0xffffffff, r0, r1, 0); 1113 TESTINST2("lsr r0, r1, #1", 0xffffffff, r0, r1, 0); 1114 TESTINST2("lsr r0, r1, #31", 0xffffffff, r0, r1, 0); 1115 TESTINST2("lsr r0, r1, #32", 0xffffffff, r0, r1, 0); 1116 TESTINST2("lsr r0, r1, #16", 0x00010000, r0, r1, 0); 1117 TESTINST2("lsr r0, r1, #17", 0x00010000, r0, r1, 0); 1118 TESTINST2("lsr r0, r1, #18", 0x00010000, r0, r1, 0); 1119 1120 printf("LSRS immediate\n"); 1121 TESTCARRY 1122 TESTINST2("lsrs r0, r1, #0", 0xffffffff, r0, r1, c); 1123 TESTINST2("lsrs r0, r1, #1", 0xffffffff, r0, r1, c); 1124 TESTINST2("lsrs r0, r1, #31", 0xffffffff, r0, r1, c); 1125 TESTINST2("lsrs r0, r1, #32", 0xffffffff, r0, r1, c); 1126 TESTINST2("lsrs r0, r1, #16", 0x00010000, r0, r1, c); 1127 TESTINST2("lsrs r0, r1, #17", 0x00010000, r0, r1, c); 1128 TESTINST2("lsrs r0, r1, #18", 0x00010000, r0, r1, c); 1129 TESTCARRYEND 1130 1131 printf("ASR\n"); 1132 TESTCARRY 1133 TESTINST3("asr r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 1134 TESTINST3("asr r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 1135 TESTINST3("asr r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 1136 TESTINST3("asr r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 1137 TESTINST3("asr r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 1138 TESTINST3("asr r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 1139 TESTINST3("asr r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 1140 TESTINST3("asr r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 1141 TESTINST3("asr r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 1142 TESTINST3("asr r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 1143 TESTINST3("asr r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c); 1144 TESTINST3("asr r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c); 1145 TESTINST3("asr r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c); 1146 TESTINST3("asr r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c); 1147 TESTINST3("asr r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c); 1148 TESTINST3("asr r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c); 1149 TESTINST3("asr r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c); 1150 TESTINST3("asr r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c); 1151 TESTINST3("asr r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c); 1152 TESTINST3("asr r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c); 1153 TESTCARRYEND 1154 1155 printf("ASRS\n"); 1156 TESTCARRY 1157 TESTINST3("asrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c); 1158 TESTINST3("asrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c); 1159 TESTINST3("asrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c); 1160 TESTINST3("asrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c); 1161 TESTINST3("asrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c); 1162 TESTINST3("asrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c); 1163 TESTINST3("asrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c); 1164 TESTINST3("asrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c); 1165 TESTINST3("asrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c); 1166 TESTINST3("asrs r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c); 1167 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c); 1168 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c); 1169 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c); 1170 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c); 1171 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c); 1172 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c); 1173 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c); 1174 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c); 1175 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c); 1176 TESTINST3("asrs r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c); 1177 TESTCARRYEND 1178 1179 TESTCARRY 1180 TESTINST3("asrs r0, r1, r2", 0x8, 0, r0, r1, r2, c); 1181 TESTINST3("asrs r0, r1, r2", 0x8, 1, r0, r1, r2, c); 1182 TESTINST3("asrs r0, r1, r2", 0x8, 2, r0, r1, r2, c); 1183 TESTINST3("asrs r0, r1, r2", 0x8, 3, r0, r1, r2, c); 1184 TESTINST3("asrs r0, r1, r2", 0x8, 4, r0, r1, r2, c); 1185 TESTINST3("asrs r0, r1, r2", 0x8, 5, r0, r1, r2, c); 1186 TESTCARRYEND 1187 1188 TESTINST3("asrs r0, r1, r2", 0x80000001, 1, r0, r1, r2, 0); 1189 TESTINST3("asrs r0, r1, r2", 0x80000001, 2, r0, r1, r2, 0); 1190 1191 printf("ASR immediate\n"); 1192 TESTINST2("asr r0, r1, #0", 0xffffffff, r0, r1, 0); 1193 TESTINST2("asr r0, r1, #1", 0xffffffff, r0, r1, 0); 1194 TESTINST2("asr r0, r1, #31", 0xffffffff, r0, r1, 0); 1195 TESTINST2("asr r0, r1, #32", 0xffffffff, r0, r1, 0); 1196 TESTINST2("asr r0, r1, #0", 0x7fffffff, r0, r1, 0); 1197 TESTINST2("asr r0, r1, #1", 0x7fffffff, r0, r1, 0); 1198 TESTINST2("asr r0, r1, #31", 0x7fffffff, r0, r1, 0); 1199 TESTINST2("asr r0, r1, #32", 0x7fffffff, r0, r1, 0); 1200 TESTINST2("asr r0, r1, #16", 0x00010000, r0, r1, 0); 1201 TESTINST2("asr r0, r1, #17", 0x00010000, r0, r1, 0); 1202 TESTINST2("asr r0, r1, #18", 0x00010000, r0, r1, 0); 1203 1204 printf("ASRS immediate\n"); 1205 TESTCARRY 1206 TESTINST2("asrs r0, r1, #0", 0xffffffff, r0, r1, c); 1207 TESTINST2("asrs r0, r1, #1", 0xffffffff, r0, r1, c); 1208 TESTINST2("asrs r0, r1, #31", 0xffffffff, r0, r1, c); 1209 TESTINST2("asrs r0, r1, #32", 0xffffffff, r0, r1, c); 1210 TESTINST2("asrs r0, r1, #0", 0x7fffffff, r0, r1, c); 1211 TESTINST2("asrs r0, r1, #1", 0x7fffffff, r0, r1, c); 1212 TESTINST2("asrs r0, r1, #31", 0x7fffffff, r0, r1, c); 1213 TESTINST2("asrs r0, r1, #32", 0x7fffffff, r0, r1, c); 1214 TESTINST2("asrs r0, r1, #16", 0x00010000, r0, r1, c); 1215 TESTINST2("asrs r0, r1, #17", 0x00010000, r0, r1, c); 1216 TESTINST2("asrs r0, r1, #18", 0x00010000, r0, r1, c); 1217 TESTCARRYEND 1218 1219 printf("ROR\n"); 1220 TESTCARRY 1221 TESTINST3("ror r0, r1, r2", 0x00088000, 0, r0, r1, r2, c); 1222 TESTINST3("ror r0, r1, r2", 0x80088000, 1, r0, r1, r2, c); 1223 TESTINST3("ror r0, r1, r2", 0x00088000, 1, r0, r1, r2, c); 1224 TESTINST3("ror r0, r1, r2", 0x00088000, 2, r0, r1, r2, c); 1225 TESTINST3("ror r0, r1, r2", 0x00088000, 31, r0, r1, r2, c); 1226 TESTINST3("ror r0, r1, r2", 0x00088000, 32, r0, r1, r2, c); 1227 TESTINST3("ror r0, r1, r2", 0x00088000, 33, r0, r1, r2, c); 1228 TESTINST3("ror r0, r1, r2", 0x00088000, 63, r0, r1, r2, c); 1229 TESTINST3("ror r0, r1, r2", 0x00088000, 64, r0, r1, r2, c); 1230 TESTINST3("ror r0, r1, r2", 0x00088000, 255, r0, r1, r2, c); 1231 TESTINST3("ror r0, r1, r2", 0x00088000, 256, r0, r1, r2, c); 1232 TESTINST3("ror r0, r1, r2", 0x80088000, 256, r0, r1, r2, c); 1233 TESTINST3("ror r0, r1, r2", 0x00088000, 257, r0, r1, r2, c); 1234 TESTCARRYEND 1235 1236 printf("RORS\n"); 1237 TESTCARRY 1238 TESTINST3("rors r0, r1, r2", 0x00088000, 0, r0, r1, r2, c); 1239 TESTINST3("rors r0, r1, r2", 0x80088000, 0, r0, r1, r2, c); 1240 TESTINST3("rors r0, r1, r2", 0x00088000, 1, r0, r1, r2, c); 1241 TESTINST3("rors r0, r1, r2", 0x00088000, 2, r0, r1, r2, c); 1242 TESTINST3("rors r0, r1, r2", 0x00088000, 31, r0, r1, r2, c); 1243 TESTINST3("rors r0, r1, r2", 0x00088000, 32, r0, r1, r2, c); 1244 TESTINST3("rors r0, r1, r2", 0x00088000, 33, r0, r1, r2, c); 1245 TESTINST3("rors r0, r1, r2", 0x00088000, 63, r0, r1, r2, c); 1246 TESTINST3("rors r0, r1, r2", 0x00088000, 64, r0, r1, r2, c); 1247 TESTINST3("rors r0, r1, r2", 0x00088000, 255, r0, r1, r2, c); 1248 TESTINST3("rors r0, r1, r2", 0x00088000, 256, r0, r1, r2, c); 1249 TESTINST3("rors r0, r1, r2", 0x80088000, 256, r0, r1, r2, c); 1250 TESTINST3("rors r0, r1, r2", 0x00088000, 257, r0, r1, r2, c); 1251 TESTCARRYEND 1252 1253 printf("ROR immediate\n"); 1254 TESTCARRY 1255 TESTINST2("ror r0, r1, #0", 0x00088000, r0, r1, c); 1256 TESTINST2("ror r0, r1, #1", 0x00088000, r0, r1, c); 1257 TESTINST2("ror r0, r1, #31", 0x00088000, r0, r1, c); 1258 TESTINST2("ror r0, r1, #16", 0x00010000, r0, r1, c); 1259 TESTINST2("ror r0, r1, #17", 0x00010000, r0, r1, c); 1260 TESTINST2("ror r0, r1, #18", 0x00010000, r0, r1, c); 1261 TESTCARRYEND 1262 1263 printf("RORS immediate\n"); 1264 TESTCARRY 1265 TESTINST2("rors r0, r1, #0", 0x00088000, r0, r1, c); 1266 TESTINST2("rors r0, r1, #1", 0x00088000, r0, r1, c); 1267 TESTINST2("rors r0, r1, #31", 0x00088000, r0, r1, c); 1268 TESTINST2("rors r0, r1, #16", 0x00010000, r0, r1, c); 1269 TESTINST2("rors r0, r1, #17", 0x00010000, r0, r1, c); 1270 TESTINST2("rors r0, r1, #18", 0x00010000, r0, r1, c); 1271 TESTCARRYEND 1272 1273 printf("shift with barrel shifter\n"); 1274 TESTCARRY 1275 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1276 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1277 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 1278 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 1279 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 1280 TESTINST4("add r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 1281 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1282 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1283 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 1284 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 1285 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 1286 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 1287 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 0, r0, r1, r2, r3, c); 1288 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 1, r0, r1, r2, r3, c); 1289 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 31, r0, r1, r2, r3, c); 1290 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 32, r0, r1, r2, r3, c); 1291 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 255, r0, r1, r2, r3, c); 1292 TESTINST4("add r0, r1, r2, asr r3", 0, 0x7fffffff, 256, r0, r1, r2, r3, c); 1293 TESTINST4("add r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 1294 TESTCARRYEND 1295 1296 TESTCARRY 1297 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 0, r0, r1, r2, r3, c); 1298 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 1, r0, r1, r2, r3, c); 1299 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 2, r0, r1, r2, r3, c); 1300 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 3, r0, r1, r2, r3, c); 1301 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 4, r0, r1, r2, r3, c); 1302 TESTINST4("add r0, r1, r2, asr r3", 0, 0x8, 5, r0, r1, r2, r3, c); 1303 TESTCARRYEND 1304 1305 TESTCARRY 1306 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c); 1307 TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c); 1308 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c); 1309 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c); 1310 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c); 1311 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c); 1312 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c); 1313 TESTINST4("add r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c); 1314 TESTINST4("add r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c); 1315 TESTCARRYEND 1316 1317 TESTCARRY 1318 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1319 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1320 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 1321 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 1322 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 1323 TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 1324 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1325 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1326 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c); 1327 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c); 1328 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c); 1329 TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c); 1330 1331 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c); 1332 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c); 1333 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c); 1334 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c); 1335 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c); 1336 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c); 1337 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c); 1338 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c); 1339 TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c); 1340 TESTCARRYEND 1341 1342 TESTCARRY 1343 TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1344 TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c); 1345 TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1346 TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c); 1347 TESTCARRYEND 1348 1349 printf("MUL\n"); 1350 TESTINST3("mul r0, r1, r2", 0, 0, r0, r1, r2, 0); 1351 TESTINST3("mul r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 1352 TESTINST3("mul r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0); 1353 TESTINST3("mul r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0); 1354 TESTINST3("mul r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0); 1355 TESTINST3("mul r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0); 1356 1357 printf("MULS\n"); 1358 TESTINST3("muls r0, r1, r2", 0, 0, r0, r1, r2, 0); 1359 TESTINST3("muls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0); 1360 TESTINST3("muls r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0); 1361 TESTINST3("muls r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0); 1362 TESTINST3("muls r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0); 1363 TESTINST3("muls r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0); 1364 1365 printf("MLA\n"); 1366 TESTINST4("mla r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 1367 TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 1368 TESTINST4("mla r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 1369 TESTINST4("mla r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 1370 TESTINST4("mla r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 1371 TESTINST4("mla r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 1372 1373 printf("MLAS\n"); 1374 TESTINST4("mlas r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 1375 TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 1376 TESTINST4("mlas r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 1377 TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 1378 TESTINST4("mlas r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 1379 TESTINST4("mlas r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 1380 1381 printf("MLS\n"); 1382 TESTINST4("mls r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0); 1383 TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0); 1384 TESTINST4("mls r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0); 1385 TESTINST4("mls r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0); 1386 TESTINST4("mls r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0); 1387 TESTINST4("mls r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0); 1388 1389 printf("UMULL\n"); 1390 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1391 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1392 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1393 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1394 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1395 TESTINST4_2OUT("umull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1396 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1397 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1398 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1399 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1400 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1401 TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1402 1403 printf("SMULL\n"); 1404 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1405 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1406 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1407 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1408 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1409 TESTINST4_2OUT("smull r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1410 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1411 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1412 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1413 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1414 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1415 TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1416 1417 printf("UMLAL\n"); 1418 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1419 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 1420 TESTINST4_2OUT("umlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 1421 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 1422 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1423 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1424 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1425 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1426 TESTINST4_2OUT("umlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1427 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1428 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 1429 TESTINST4_2OUT("umlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 1430 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 1431 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1432 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1433 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1434 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1435 TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1436 1437 printf("SMLAL\n"); 1438 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1439 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 1440 TESTINST4_2OUT("smlal r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 1441 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 1442 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1443 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1444 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1445 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1446 TESTINST4_2OUT("smlal r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1447 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0); 1448 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0); 1449 TESTINST4_2OUT("smlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0); 1450 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0); 1451 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0); 1452 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0); 1453 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0); 1454 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0); 1455 TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0); 1456 1457 printf("CLZ\n"); 1458 TESTCARRY 1459 TESTINST2("clz r0, r1", 0, r0, r1, c); 1460 TESTINST2("clz r0, r1", 1, r0, r1, c); 1461 TESTINST2("clz r0, r1", 0x10, r0, r1, c); 1462 TESTINST2("clz r0, r1", 0xffffffff, r0, r1, c); 1463 TESTCARRYEND 1464 1465 printf("extend instructions\n"); 1466 TESTINST2("uxtb r0, r1", 0, r0, r1, 0); 1467 TESTINST2("uxtb r0, r1", 1, r0, r1, 0); 1468 TESTINST2("uxtb r0, r1", 0xff, r0, r1, 0); 1469 TESTINST2("uxtb r0, r1", 0xffffffff, r0, r1, 0); 1470 TESTINST2("sxtb r0, r1", 0, r0, r1, 0); 1471 TESTINST2("sxtb r0, r1", 1, r0, r1, 0); 1472 TESTINST2("sxtb r0, r1", 0xff, r0, r1, 0); 1473 TESTINST2("sxtb r0, r1", 0xffffffff, r0, r1, 0); 1474 1475 TESTINST2("uxth r0, r1", 0, r0, r1, 0); 1476 TESTINST2("uxth r0, r1", 1, r0, r1, 0); 1477 TESTINST2("uxth r0, r1", 0xffff, r0, r1, 0); 1478 TESTINST2("uxth r0, r1", 0xffffffff, r0, r1, 0); 1479 TESTINST2("sxth r0, r1", 0, r0, r1, 0); 1480 TESTINST2("sxth r0, r1", 1, r0, r1, 0); 1481 TESTINST2("sxth r0, r1", 0x7fff, r0, r1, 0); 1482 TESTINST2("sxth r0, r1", 0xffff, r0, r1, 0); 1483 TESTINST2("sxth r0, r1", 0x10ffff, r0, r1, 0); 1484 TESTINST2("sxth r0, r1", 0x107fff, r0, r1, 0); 1485 TESTINST2("sxth r0, r1", 0xffffffff, r0, r1, 0); 1486 1487 TESTINST2("uxtb r0, r1, ror #0", 0x000000ff, r0, r1, 0); 1488 TESTINST2("uxtb r0, r1, ror #8", 0x000000ff, r0, r1, 0); 1489 TESTINST2("uxtb r0, r1, ror #8", 0x0000ff00, r0, r1, 0); 1490 TESTINST2("uxtb r0, r1, ror #16", 0x00ff0000, r0, r1, 0); 1491 TESTINST2("uxtb r0, r1, ror #24", 0xff000000, r0, r1, 0); 1492 1493 TESTINST2("uxtb16 r0, r1", 0xffffffff, r0, r1, 0); 1494 TESTINST2("uxtb16 r0, r1, ror #16", 0x0000ffff, r0, r1, 0); 1495 TESTINST2("sxtb16 r0, r1", 0xffffffff, r0, r1, 0); 1496 TESTINST2("sxtb16 r0, r1", 0x00ff00ff, r0, r1, 0); 1497 TESTINST2("sxtb16 r0, r1", 0x007f007f, r0, r1, 0); 1498 1499 printf("------------ BFI ------------\n"); 1500 1501 /* bfi rDst, rSrc, #lsb-in-dst, #number-of-bits-to-copy */ 1502 TESTINST2("bfi r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 1503 TESTINST2("bfi r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 1504 TESTINST2("bfi r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1505 1506 TESTINST2("bfi r0, r1, #19, #11", 0xFFFFFFFF, r0, r1, 0); 1507 TESTINST2("bfi r0, r1, #20, #11", 0xFFFFFFFF, r0, r1, 0); 1508 TESTINST2("bfi r0, r1, #21, #11", 0xFFFFFFFF, r0, r1, 0); 1509 1510 TESTINST2("bfi r0, r1, #0, #32", 0xFFFFFFFF, r0, r1, 0); 1511 TESTINST2("bfi r0, r1, #1, #31", 0xFFFFFFFF, r0, r1, 0); 1512 1513 TESTINST2("bfi r0, r1, #29, #3", 0xFFFFFFFF, r0, r1, 0); 1514 TESTINST2("bfi r0, r1, #30, #2", 0xFFFFFFFF, r0, r1, 0); 1515 TESTINST2("bfi r0, r1, #31, #1", 0xFFFFFFFF, r0, r1, 0); 1516 1517 printf("------------ BFC ------------\n"); 1518 1519 /* bfi rDst, #lsb-in-dst, #number-of-bits-to-copy */ 1520 TESTINST2("bfc r0, #0, #11", 0xAAAAAAAA, r0, r1, 0); 1521 TESTINST2("bfc r0, #1, #11", 0xAAAAAAAA, r0, r1, 0); 1522 TESTINST2("bfc r0, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1523 1524 TESTINST2("bfc r0, #19, #11", 0xFFFFFFFF, r0, r1, 0); 1525 TESTINST2("bfc r0, #20, #11", 0xFFFFFFFF, r0, r1, 0); 1526 TESTINST2("bfc r0, #21, #11", 0xFFFFFFFF, r0, r1, 0); 1527 1528 TESTINST2("bfc r0, #0, #32", 0xFFFFFFFF, r0, r1, 0); 1529 TESTINST2("bfc r0, #1, #31", 0xFFFFFFFF, r0, r1, 0); 1530 1531 TESTINST2("bfc r0, #29, #3", 0xFFFFFFFF, r0, r1, 0); 1532 TESTINST2("bfc r0, #30, #2", 0xFFFFFFFF, r0, r1, 0); 1533 TESTINST2("bfc r0, #31, #1", 0xFFFFFFFF, r0, r1, 0); 1534 1535 printf("------------ SBFX ------------\n"); 1536 1537 /* sbfx rDst, rSrc, #lsb, #width */ 1538 TESTINST2("sbfx r0, r1, #0, #1", 0x00000000, r0, r1, 0); 1539 TESTINST2("sbfx r0, r1, #0, #1", 0x00000001, r0, r1, 0); 1540 TESTINST2("sbfx r0, r1, #1, #1", 0x00000000, r0, r1, 0); 1541 TESTINST2("sbfx r0, r1, #1, #1", 0x00000001, r0, r1, 0); 1542 TESTINST2("sbfx r0, r1, #1, #1", 0x00000002, r0, r1, 0); 1543 TESTINST2("sbfx r0, r1, #1, #1", 0x00000003, r0, r1, 0); 1544 1545 TESTINST2("sbfx r0, r1, #0, #2", 0x00000000, r0, r1, 0); 1546 TESTINST2("sbfx r0, r1, #0, #2", 0x00000001, r0, r1, 0); 1547 TESTINST2("sbfx r0, r1, #1, #2", 0x00000000, r0, r1, 0); 1548 TESTINST2("sbfx r0, r1, #1, #2", 0x00000001, r0, r1, 0); 1549 TESTINST2("sbfx r0, r1, #1, #2", 0x00000002, r0, r1, 0); 1550 TESTINST2("sbfx r0, r1, #1, #2", 0x00000003, r0, r1, 0); 1551 1552 TESTINST2("sbfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 1553 TESTINST2("sbfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 1554 TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1555 1556 TESTINST2("sbfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1557 1558 TESTINST2("sbfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0); 1559 TESTINST2("sbfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0); 1560 1561 printf("------------ UBFX ------------\n"); 1562 1563 /* ubfx rDst, rSrc, #lsb, #width */ 1564 TESTINST2("ubfx r0, r1, #0, #1", 0x00000000, r0, r1, 0); 1565 TESTINST2("ubfx r0, r1, #0, #1", 0x00000001, r0, r1, 0); 1566 TESTINST2("ubfx r0, r1, #1, #1", 0x00000000, r0, r1, 0); 1567 TESTINST2("ubfx r0, r1, #1, #1", 0x00000001, r0, r1, 0); 1568 TESTINST2("ubfx r0, r1, #1, #1", 0x00000002, r0, r1, 0); 1569 TESTINST2("ubfx r0, r1, #1, #1", 0x00000003, r0, r1, 0); 1570 1571 TESTINST2("ubfx r0, r1, #0, #2", 0x00000000, r0, r1, 0); 1572 TESTINST2("ubfx r0, r1, #0, #2", 0x00000001, r0, r1, 0); 1573 TESTINST2("ubfx r0, r1, #1, #2", 0x00000000, r0, r1, 0); 1574 TESTINST2("ubfx r0, r1, #1, #2", 0x00000001, r0, r1, 0); 1575 TESTINST2("ubfx r0, r1, #1, #2", 0x00000002, r0, r1, 0); 1576 TESTINST2("ubfx r0, r1, #1, #2", 0x00000003, r0, r1, 0); 1577 1578 TESTINST2("ubfx r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0); 1579 TESTINST2("ubfx r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0); 1580 TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1581 1582 TESTINST2("ubfx r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0); 1583 1584 TESTINST2("ubfx r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0); 1585 TESTINST2("ubfx r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0); 1586 1587 printf("------------ SMULL{B,T}{B,T} ------------\n"); 1588 /* SMULxx rD, rN, rM */ 1589 1590 TESTINST3("smulbb r0, r1, r2", 0x00030000, 0x00040000, r0, r1, r2, 0); 1591 TESTINST3("smulbb r0, r1, r2", 0x00030001, 0x00040002, r0, r1, r2, 0); 1592 TESTINST3("smulbb r0, r1, r2", 0x00038001, 0x00047fff, r0, r1, r2, 0); 1593 TESTINST3("smulbb r0, r1, r2", 0x00037fff, 0x00047fff, r0, r1, r2, 0); 1594 TESTINST3("smulbb r0, r1, r2", 0x0003ffff, 0x0004ffff, r0, r1, r2, 0); 1595 1596 printf("------------ SXTAB ------------\n"); 1597 TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 1598 r0, r1, r2, 0); 1599 TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 1600 r0, r1, r2, 0); 1601 TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819, 1602 r0, r1, r2, 0); 1603 TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819, 1604 r0, r1, r2, 0); 1605 1606 TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899, 1607 r0, r1, r2, 0); 1608 TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899, 1609 r0, r1, r2, 0); 1610 TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899, 1611 r0, r1, r2, 0); 1612 TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899, 1613 r0, r1, r2, 0); 1614 1615 printf("------------ UXTAB ------------\n"); 1616 TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 1617 r0, r1, r2, 0); 1618 TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 1619 r0, r1, r2, 0); 1620 TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819, 1621 r0, r1, r2, 0); 1622 TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819, 1623 r0, r1, r2, 0); 1624 1625 TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899, 1626 r0, r1, r2, 0); 1627 TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899, 1628 r0, r1, r2, 0); 1629 TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899, 1630 r0, r1, r2, 0); 1631 TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899, 1632 r0, r1, r2, 0); 1633 1634 printf("------------ SXTAH ------------\n"); 1635 TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 1636 r0, r1, r2, 0); 1637 TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 1638 r0, r1, r2, 0); 1639 TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819, 1640 r0, r1, r2, 0); 1641 TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819, 1642 r0, r1, r2, 0); 1643 1644 TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819, 1645 r0, r1, r2, 0); 1646 TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819, 1647 r0, r1, r2, 0); 1648 TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819, 1649 r0, r1, r2, 0); 1650 TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819, 1651 r0, r1, r2, 0); 1652 1653 printf("------------ UXTAH ------------\n"); 1654 TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819, 1655 r0, r1, r2, 0); 1656 TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819, 1657 r0, r1, r2, 0); 1658 TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819, 1659 r0, r1, r2, 0); 1660 TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819, 1661 r0, r1, r2, 0); 1662 1663 TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819, 1664 r0, r1, r2, 0); 1665 TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819, 1666 r0, r1, r2, 0); 1667 TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819, 1668 r0, r1, r2, 0); 1669 TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819, 1670 r0, r1, r2, 0); 1671 1672 printf("------------ PLD/PLDW (begin) ------------\n"); 1673 /* These don't have any effect on the architected state, so, 1674 uh, there's no result values to check. Just _do_ some of 1675 them and check Valgrind's instruction decoder eats them up 1676 without complaining. */ 1677 { int alocal; 1678 printf("pld reg +/- imm12 cases\n"); 1679 __asm__ __volatile__( "pld [%0, #128]" : :/*in*/"r"(&alocal) ); 1680 __asm__ __volatile__( "pld [%0, #-128]" : :/*in*/"r"(&alocal) ); 1681 __asm__ __volatile__( "pld [r15, #-128]" : :/*in*/"r"(&alocal) ); 1682 1683 // apparently pldw is v7 only 1684 //__asm__ __volatile__( "pldw [%0, #128]" : :/*in*/"r"(&alocal) ); 1685 //__asm__ __volatile__( "pldw [%0, #-128]" : :/*in*/"r"(&alocal) ); 1686 //__asm__ __volatile__( "pldw [r15, #128]" : :/*in*/"r"(&alocal) ); 1687 1688 printf("pld reg +/- shifted reg cases\n"); 1689 __asm__ __volatile__( "pld [%0, %1]" : : /*in*/"r"(&alocal), "r"(0) ); 1690 __asm__ __volatile__( "pld [%0, %1, LSL #1]" : : /*in*/"r"(&alocal), "r"(0) ); 1691 __asm__ __volatile__( "pld [%0, %1, LSR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 1692 __asm__ __volatile__( "pld [%0, %1, ASR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 1693 __asm__ __volatile__( "pld [%0, %1, ROR #1]" : : /*in*/"r"(&alocal), "r"(0) ); 1694 __asm__ __volatile__( "pld [%0, %1, RRX]" : : /*in*/"r"(&alocal), "r"(0) ); 1695 } 1696 printf("------------ PLD/PLDW (done) ------------\n"); 1697 1698 printf("------------ RBIT ------------\n"); 1699 TESTINST2("rbit r0, r1", 0x00000000, r0, r1, 0); 1700 TESTINST2("rbit r0, r1", 0xFFFFFFFF, r0, r1, 0); 1701 TESTINST2("rbit r0, r1", 0x80000000, r0, r1, 0); 1702 TESTINST2("rbit r0, r1", 0x00000001, r0, r1, 0); 1703 TESTINST2("rbit r0, r1", 0x31415927, r0, r1, 0); 1704 TESTINST2("rbit r0, r1", 0x14141562, r0, r1, 0); 1705 TESTINST2("rbit r0, r1", 0xabe8391f, r0, r1, 0); 1706 TESTINST2("rbit r0, r1", 0x9028aa80, r0, r1, 0); 1707 TESTINST2("rbit r0, r1", 0xead1fc6d, r0, r1, 0); 1708 TESTINST2("rbit r0, r1", 0x35c98c55, r0, r1, 0); 1709 TESTINST2("rbit r0, r1", 0x534af1eb, r0, r1, 0); 1710 TESTINST2("rbit r0, r1", 0x45511b08, r0, r1, 0); 1711 TESTINST2("rbit r0, r1", 0x90077f71, r0, r1, 0); 1712 TESTINST2("rbit r0, r1", 0xde8ca84b, r0, r1, 0); 1713 TESTINST2("rbit r0, r1", 0xe37a0dda, r0, r1, 0); 1714 TESTINST2("rbit r0, r1", 0xe5b83d4b, r0, r1, 0); 1715 TESTINST2("rbit r0, r1", 0xbb6d14ec, r0, r1, 0); 1716 TESTINST2("rbit r0, r1", 0x68983cc9, r0, r1, 0); 1717 1718 printf("------------ REV ------------\n"); 1719 TESTINST2("rev r0, r1", 0x00000000, r0, r1, 0); 1720 TESTINST2("rev r0, r1", 0xFFFFFFFF, r0, r1, 0); 1721 TESTINST2("rev r0, r1", 0x80000000, r0, r1, 0); 1722 TESTINST2("rev r0, r1", 0x00000001, r0, r1, 0); 1723 TESTINST2("rev r0, r1", 0x31415927, r0, r1, 0); 1724 TESTINST2("rev r0, r1", 0x14141562, r0, r1, 0); 1725 TESTINST2("rev r0, r1", 0xabe8391f, r0, r1, 0); 1726 TESTINST2("rev r0, r1", 0x9028aa80, r0, r1, 0); 1727 TESTINST2("rev r0, r1", 0xead1fc6d, r0, r1, 0); 1728 TESTINST2("rev r0, r1", 0x35c98c55, r0, r1, 0); 1729 TESTINST2("rev r0, r1", 0x534af1eb, r0, r1, 0); 1730 TESTINST2("rev r0, r1", 0x45511b08, r0, r1, 0); 1731 TESTINST2("rev r0, r1", 0x90077f71, r0, r1, 0); 1732 TESTINST2("rev r0, r1", 0xde8ca84b, r0, r1, 0); 1733 TESTINST2("rev r0, r1", 0xe37a0dda, r0, r1, 0); 1734 TESTINST2("rev r0, r1", 0xe5b83d4b, r0, r1, 0); 1735 TESTINST2("rev r0, r1", 0xbb6d14ec, r0, r1, 0); 1736 TESTINST2("rev r0, r1", 0x68983cc9, r0, r1, 0); 1737 1738 printf("------------ REV16 ------------\n"); 1739 TESTINST2("rev16 r0, r1", 0x00000000, r0, r1, 0); 1740 TESTINST2("rev16 r0, r1", 0xFFFFFFFF, r0, r1, 0); 1741 TESTINST2("rev16 r0, r1", 0x80000000, r0, r1, 0); 1742 TESTINST2("rev16 r0, r1", 0x00000001, r0, r1, 0); 1743 TESTINST2("rev16 r0, r1", 0x31415927, r0, r1, 0); 1744 TESTINST2("rev16 r0, r1", 0x14141562, r0, r1, 0); 1745 TESTINST2("rev16 r0, r1", 0xabe8391f, r0, r1, 0); 1746 TESTINST2("rev16 r0, r1", 0x9028aa80, r0, r1, 0); 1747 TESTINST2("rev16 r0, r1", 0xead1fc6d, r0, r1, 0); 1748 TESTINST2("rev16 r0, r1", 0x35c98c55, r0, r1, 0); 1749 TESTINST2("rev16 r0, r1", 0x534af1eb, r0, r1, 0); 1750 TESTINST2("rev16 r0, r1", 0x45511b08, r0, r1, 0); 1751 TESTINST2("rev16 r0, r1", 0x90077f71, r0, r1, 0); 1752 TESTINST2("rev16 r0, r1", 0xde8ca84b, r0, r1, 0); 1753 TESTINST2("rev16 r0, r1", 0xe37a0dda, r0, r1, 0); 1754 TESTINST2("rev16 r0, r1", 0xe5b83d4b, r0, r1, 0); 1755 TESTINST2("rev16 r0, r1", 0xbb6d14ec, r0, r1, 0); 1756 TESTINST2("rev16 r0, r1", 0x68983cc9, r0, r1, 0); 1757 1758 printf("------------ NOP (begin) ------------\n"); 1759 printf("nop\n"); 1760 __asm__ __volatile__("nop" ::: "memory","cc"); 1761 printf("nopeq\n"); 1762 __asm__ __volatile__("nopeq" ::: "memory","cc"); 1763 printf("nopne\n"); 1764 __asm__ __volatile__("nopne" ::: "memory","cc"); 1765 printf("------------ NOP (end) ------------\n"); 1766 1767 return 0; 1768} 1769